無標題文檔

万物之中,希望至美

这篇文章是有读者发我邮件,基于我的回复整理了下,散漫之处望谅解。原文如下:

Mail

凮凨你好,见字如面,诚惶诚恐。

其实有点惭愧,我个人已经有一段时间没有专职从事前端了,看老哥想和我了解前端的发展路线,我也只能从我过往的经历和浅见聊聊我对于这块的愚见。

我和兄弟的年纪差不多,稍长几岁。在我们这个年纪家庭和生活的负担不少,能够重新在专业路线上思变,说明兄弟也是很有想法和对自己负责的人。

但是按照我个人的从业经历来说,前端这个职位是属于相对入门容易,但也是很容易碰到「天花板」的职业。

对比和我同期一起从业前端的伙伴,经历了十多年的职业发展,很多有可能都已经不在前端这个行业,有些往前去做产品而也有些和我一样,更偏后端和架构。

这个就要聊到广度和深度的问题。曾经有一段时间,我负责团队招聘是带有非常强烈的个人品好的,尤其当简历看到「培训班」的经历,往往是会被减分的。

但这不是因为什么「歧视」的事情,而是因为在我印象中经历过「培训班」更看中的是操作层面的技术熟练度,而不是对于技术本身的追根溯源。

所以往往有这样子经历的从业者,会在技术的深度上浮于表面。看兄弟还有外包的经历,我更担心您对于技术深度方面的理解会不够深入,需要更加的注意。

很巧,前几天和玉伯聊技术的时候,我个人也聊到从行业上理解。我理解前后端这块的分工会更加不断的细分,会造成前端对于后端的理解也恐怕会出现两极的分化。封装和调用的便利性会造成忽略对于底层实现原理和概念,无形中会让前端更加无法接触技术的底层实现和理解。

同时看到兄弟的学历,是实话起点上来说对于目前的行业要求是相对比较落后,但是从同龄人角度上我理解这样子情况的原因,因此对于这块没有必要对于这块过于的焦虑。

学历和能力

这里搬出来张图,供兄弟参考。学历和能力不是正相关的,甚至可以说通过从业的经历以及对于自身认知的边界突破,往往这块的差距会被不断的拉伸和推平。

这几年,自媒体的发展让造成很多水平差次不齐的从业人员进来,为了眼球和流量贩卖焦虑。

互联网行业仍然是高速发展的行业所以和其他行业一样,30 岁的设计师、35 岁的程序员、40 岁的产品经理绝对不是「见光死」的年纪。

年龄只是代表了自己的经历和过往,这块对于所有人而言是最公平的。按照国人平均年纪 75、从业平均 40 年来算,我们经历过的 10 年职业路线,只是其中的几分之几而已。

有些就业单位对于年龄和学历的筛选会设立门槛,但是相信真实看中个人能力的公司,往往是发展向上的公司,例如在阿里也有很多 P7 甚至 P8 都是专科学历。

至于考虑去公司还是小公司,这往往是带有个人的品好的。

从我个人的从业经历来说,大公司不要求技术的全面要求单点技术的深入,是因为分工变细弱化了人在项目中的影响。而小公司因为资源的制约不可避免个人对总体项目的影响会更大些,所以往往综合能力比大公司的员工稍全面些。

这块兄弟可以根据自己的发展路线多加考虑,选择合适自己的路线。

最后,再聊聊技术人员的综合能力方面的理解。这块从我经历的很多技术管理人员来说,是普遍比较忽略的,网易这边称之为「软性素质」。

但哪怕是阿里和网易这样的平台,无论从技术面试还是职级晋升,对于这块的考核和评价往往技术侧能够给的评价和建议给到个人的意见和建议是不多的。

所以个人建议,除了技术方面对于广度和深度方面的加强,随着我们从业年限的增加,对于「软性素质」例如沟通能力、管理能力、协调能力等各个方面,都可以尝试着锻炼和提升。

「万物之中,希望至美,而至美之物,永不凋零」,三十而立的年龄是充满未来和机遇的年纪,希望共勉。

精简 BASH/ZSH 的条件判断

这个小技巧来自 Youtube 上的个视频,很受用所以记录下。很多时候我们写的 Shell 脚本,都会前置些判断条件,以便正确执行想要的结果,例如:

if [ -x $(which vim) ]; then
    export EDITOR="vim"
fi

这样子写当然没有任何的问题,而且看起来就很直观。但是如果吹毛求疵的话,发现这样子的判断有点繁琐,同时会在写更复杂的 Shell 的时候,会增加更多的判断,这样子会造成整个 Shell 脚本非常的繁琐以及臃肿。

例如,我们可以阅读 neofetch 的源代码,这个脚本用于探测目标系统未知的情况下,获取对应的值,因此其会有非常多的条件判断。

BASH Script

这个例子可能会比较极端,那问题凸显得很明显。那么这种情况下,如何去优化自己的 Shell 代码呢?

首先我们要从返回值说起,我们都知道我们执行的每条 Shell 语句其实都有返回值。一般来说,返回 0 表示正常,返回非 0 表示这条语句可能会有问题。

我们如下做个尝试:

BASH Script

然后,通常我们写的条件判断,其实就是根据返回值的判断这个条件是否成立,下面是我们常见的「与、或、非」的判断:

BASH Script

那么其实我们可以知道当不同的逻辑判断,它们执行的顺序是不一样的。例如,我们需要「与」判断则需要将所有的条件语句都运行完毕,而「或」判断则只需要其中的一条语句满足条件即可(「非」也是类似)。

那么作为条件判断的例子,可以直接写为:

BASH Script

然后,我们将上面的代码结合起来,我们可以写成这个样子:

[ -x $(which vim) ] && export EDITOR="vim"

因为它们之间的条件其实是「与」的关系。然后,我们再多些例子看看这样子的写法是不是对应的精简了很多:

if [ ! -x $(which vim ) ]; then
  exit -1
fi

对比

[ -x $(which vim ) ] || exit -1 # 注意这里的「非」的用法

如果是多条语句,那么可以使用代码块的方式(在 Shell 里面其实就是个函数):

[ -x $(which vim ) ] && {
  export EDITOR="vim"
  echo "vim is installed"
}

既然引入了代码块,那么我们可以用更复杂的用法了,例如可以将两个代码块(函数)结合起来,这样子就可以写出非常短小精悍的条件判断:

{ cmd not found } || { echo "prev statment return value is \$?" }

看起来稍微有点复杂,但又带来了更多的内容:

  1. 你可以将两个代码块(函数)使用逻辑操作符链接起来;
  2. 后面的代码块可以接收前面代码块最后一条语句的返回值。

总体来说,这个小技巧可以精简不少的条件判断的代码,尤其在初始化的时候看起来非常的直观。

不过和很多的技巧一样,我们还是需要酌情的使用它,毕竟代码和脚本的可读性是放在第一位的。

- eof -

家里的内网开发环境(概述)

家里的开发环境越来越复杂了,所以需要复盘和回顾下目前的情况。这个得先从头开始说起:

Stage 1

Stage 1

应该说很上古的时期,和大部分开始的需求一样,需要离线跑些脚本。那时候我简单选用了台树莓派跑 NPM 的些代码。在很长的一段时期内它能很好的满足需求,因为只需要跑些爬虫和通知性质的脚本。

Stage 2

Stage 2

随着任务的增加,树莓派的性能瓶颈越发的明显,因为 NPM 的项目基本上都是些零散的小文件,tf 卡在 4k 的读取方面性能非常的弱。这时候开始考虑使用台「正儿八经」的 x86 小机子用来跑繁重的任务,技术栈这块也切换到了 Golang 以及 Python,而树莓派则退居二线作为通知和监控使用。

再后来数据量越来越「庞大」,达到了几百个 G 的级别,M93P 的硬盘容量明显不够了(SSD 256G、机械硬盘 1T)。加上对于数据安全性方面的考虑,购买了两块 2T 的硬盘以及 USB 的磁盘阵列盒子。

Stage 3

Stage 3

随着数据量的增加,我很快发现数据这块有了冷热的区别。同时,部署的环境也越来越复杂,虽然使用 Docker 搭配 docker─compose 也能很好的完成集成和部署,但在各个应用之间来回的切换 docker─compose 的目录让人感到非常的头痛和麻烦。

所以这时候在操作系统层面加上了 KVM 虚拟机这层,然后再再虚拟机上面跑 Docker。本来考虑上 K8S,但是其实各个应用之间是相对独立的关系,因此还是以单独虚拟机为单位分类各个应用的类别。

Stage 4

Stage 4

不过数据还是在不断的增加,我考虑到 USB 的磁盘阵列盒虽然能够满足目前的需求,但是横向的扩展性以及应用和数据分离做得还不够彻底,因此将数据这块单独部署了台 NAS 去处理

组装这台 NAS 其实走了很多弯路,硬件方面一开始用的是台盘位的 PC 机箱,但是很快发现非常不合适放在家里,一来机箱的体积太大了二来功耗也非常的大但是只能最多安装两到三块的硬盘。

和很多「垃圾佬」一样考虑过星际蜗牛的主机,四盘位的机箱加上 J1900 的四核低功耗的处理器,很适合用来做网络存储。但是还是考虑到数据的重要性,还是选择了单独的四盘位的机箱以及性能相对好点的 AMD 集成主板作为平台使用。

存储的选型方面一开始使用 CentOS + 阵列卡的形式,后面切换到了 FreeBSD + 直通卡配合 ZFS 的方式,各有优劣和千秋这里不展开详细的说明。

Stage 5

Stage 5

于是乎硬件和虚拟机的节点越来越多,怎么去治理和监控就成了纠结的事情了。还有因为国内网络环境的问题,所以我在网络这块考虑使用了 N1 作为旁路由和透明网关作为国际网络加速。原先的树莓派也替换为 N1 同时部署了 Grafana 以及 Prometheus 作为节点的监控和报警

服务发现这块选用了 Consul 和 DNSmasq 汇聚,这样子每个节点启动自举的时候,就可以在内网环境拿到对应的域名而不用去找 IP 地址,很方便。

Stage 6

Stage 6

基础环境搭建好了以后,逐渐的装了 Syncthing、Gitea、Drone 等用于数据同步以及测试代码的托管和 CI。由于测试数据的量逐渐的收敛了下来,所以很多时候 Runner 在空闲的状态,但随时可以调用很方便了。

硬件方面主要是有些补足的设备,例如我后面又购置了台瘦客户机装了 FreeBSD 用来实时给 macOS 做时间胶囊备份使用。

同时,买了两台 UPS 以及写了些对应的脚本,用于在断电的时候主动关机。

@TODO

@TODO

前几天从 @yff666 那边得到块星际蜗牛的「遗产」,组了台双盘位的 Raid1 小 NAS 主机,打算用来存冷数据,不过这块的数据需求还是要看目前的业务情况。

监控这块我觉得还有比较短板的地方,例如如果家里网络不通则无法收到通知邮件了,这里想考虑使用台 Android 手机配合 adb 发送短信,后面想好了再继续做吧。

- 待续 -

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章