小姜哥的2018年技术总结

前言

真的很快,又到了年根,说是年根儿真的很形象,一年就像是一颗树,消耗的就剩下根儿了说明一年快结束了。

今年打算公开,有一些东西不方便写,也不会太长。

主要会分成旧工作总结,新工作介绍,新技术及我的观点,其他方向技术能力扩展。所有都是从技术视角来写的,非技术会单独总结。

2018年最大的变动是换了一份工作,发生在4月末五月初。

旧工作

离开了旧公司没有啥不舍,见惯了来了又走了,只不过这次是我而已。现在回想起来竟然有点想不起来那几个月干了什么。

似乎记得是做了比较长时间的weex,Vue.js DSL的,感觉坑很多。

后来搞了一段时间Node.js + React,没做完我就离职了。还依稀记得临离职的前一天加班到晚上十点半,一个妹子帮我在公司楼下拍了一张照片。

找了一下还真找到了

我在任何一家公司离职做的都挺厚道的,会好好的交接,这一次也不例外,剩余的年假也没休完。不知道后来的人怎么评价了,毕竟站的立场不同了。

再上一家公司我临离职的下午帮公司看了一个问题,虽然当时我的领导让我早点回家歇着,也正因如此领到了一笔额外的奖金。

新工作

这次换工作面试的次数不算多,有个别不对口的,也没拿到offer,有一些是待遇谈不拢。最后拿到了3个offer,我并不囤offer,做人要厚道,如果有一个公司能顺利的接受了我的薪资要求我就会停止继续找。现实往往没那么理想,每个公司都会有一个比较纠结的谈offer过程,不是我纠结,是公司纠结,甚至会谈几周,有时候谈的很疲劳也就不想在继续谈下去了。

在拿到的offer中我最后选择了现金部分最低的那一家,这中间还有一些有意思的事儿发生。

在新公司负责架构相关工作,入职到现在马上八个月了,做了如下几件事儿。

图片平台

到了小公司觉得什么都缺,阿里有TPS(我估计是Taobao Picture Service的简称),拖一下图片就上CDN了,非常方便,所以也搭了一个图片平台,用了非常少的时间就完成了。

有了图片平台就顺理成章的把代码中的图片抽离了出来,300多张,减少的发布体积非常可观,而且可以更好的利用浏览器缓存。可以多说一句,抽离几乎是用代码完成的,用正则很方便。

规范 & 工程化

这块其实内容很多,怕这次写就太多了,详细的以后写吧。只说两点,第一点,发挥了很大作用,包括减少大家的工作量,统一规范,统一开发环境等;第二点,把基础架构做到的开发套件中,做了分层约束,引入了mobx做状态管理,统一的数据请求接口。

发布系统

这个是到新公司感受最深的,发布速度比较慢。上家公司发布可能一分钟左右,甚至更快。后来也做了一个新的发布系统,基于某一种约定模式来做,最大限度的减少手动操作,而且加了很多校验来防止操作失误和避免出现线上问题,速度也做到了一分钟左右,最快的不到十秒。具备测试、预发和线上三套环境。要想有快速响应能力必须得有这个发布速度才行。

weex

这里得说Rax(React DSL的weex)还是不错的,坑还是有的,文档也有一些欠缺,有一些问题搞不定还找了前同事请教,最后达到的效果还是很棒的。

这也是我现在的公司首次开展混合开发,需要考虑的东西很多,遵循的原则就是如何能搭建通用能力,一锤子买卖向来不是我追求的。

K线

这个是个重头戏,作为一个有证券从业资格证的人刚开始还是觉得有些力不从心。因为之前的K线代码几乎不可维护,一个js文件9000多行,jQuery写的,到处记状态,到处改DOM,完全是一团乱麻。

后来做了全新的改版,整个代码拆分重构,工作量特别大,有过大规模重构经验的应该都有一个感受,就是你希望有一个安静的环境把问题想清楚之后一块一块的拆开重写,所以有一些工作都是周末完成的。

另外,K线的各指标的算法还是挺有意思的,属于技术无关,算是金融和数学知识吧,为此我还买了两本数学方面的书籍,尴尬的是阅读进度不太好,也是工作太忙了。

https

还是那句话,小公司缺的东西比较多,刚来那会儿需要用https来测试,我用自己的域名申请了个免费的https证书来应急。

后来采用了自签名的方式来搞,我花了周末一个下午的时间来研究方案和安全性。后来还带着一个应届的小伙子做一个安装根证书的客户端。这样实现了测试环境的https化。

其实有了这个客户端就可以很容易形成闭环,新员工入职安装客户端,根证书自然安装到设备中,内网的https服务也就可用了。另外可以开发手机客户端,用公司账号密码登录,登录需要短信验证码,登录后安装客户端证书,每个人的客户端证书单独签,这样保证了没有证书无法访问内网的各系统。电脑端的登录需要手机端确认,电脑端也就搞定了。

多说一句,网上说的自签名安全问题都不是技术问题,而是使用问题,我的观点是可以放心大胆的在内网使用来实现公司内网https化。

NPM源

直接用了cnpm,因为他开源,用来共享package还是很爽的,现在这个平台有一百多个package。

校招

只说感受,关于我们会面哪些内容和注意事项在之前的文章有写,毕竟我们不只是招人,我们也想顺便帮助他们一下。

现在学习资源真是太多了,就看你肯不肯学,很多应届生都很棒,比我毕业的时候强,感到很欣慰。

小结

除了这些外,穿插着做了一些其他工作,比如优化和一些公共积累,之前还在知乎上写过相关的内容。这部分就不多写了。

如上我提到的都可以作为公司的基础设施一直使用下去,这就是有效的积累。

技术动向

本部分写一些技术的动向和未来。

总体上我认为前端将会继续融合,我前端入行比较早,大约五六年前跟朋友聊天就说起来前端会分化,会在不同的细分领域有不同的应用应用场景。现在看来我当时表述的不够准确,与其说细分不如说融合,与客户端融合、与服务端融合、与区块链融合、与人工智能融合等等,融合是站在更高的层级来看问题。

工程化相关

webpack发布了4.0版本,依然是主要的bundle工具。虽然出现了parcel和fastpack,但是并未撼动webpack的地位。

parcel主打零配置,webpack很快做了跟进。零配置的另一个问题是默认配置只能满足少量的通用场景,在做通用套件的时候避免不配置。所以零配置也只是降低了初始demo的起步成本。

faskpack主打速度快,这其实不是什么卖点,与webpack相比到底快了多少是个问题,webpack是否真的慢到影响你的工作,其实并没有,所以你的快也没有什么意义。

明年webpack依然会占据霸主地位。

什么时候webpack会被淘汰要看是否能出现一个在理念上能挑战webpack的bundle工具,他的理念webpack无法短期跟进,同时要能经营起来一个不错的社区。这就好比国内有些团队基于Linux做的操作系统,系统本身已经很好了,流畅度、易用性、资源消耗的优化都很棒,问题在于没有生态。

框架

React仍然如日中天,而单从star数来看Vue.js还略胜一筹。也不能只拿star数论成败,毕竟某宝上你可以搜到“高效star/fork”,价格两元。

其实也没太多可说的,因为太火了,大家能看到各种信息,根本不需要我写。现在还看不到有哪个框架能取代React和Vue.js。

React生态圈出现了一些很棒的文档工具,比如Docz,真的很方便。

小程序 & 小游戏

小程序严重影响了很多app的dau,小程序和小游戏开发上线速度更快,试错成本更低,涌现出了一大批各种各样的“轻应用”,也感叹了一下腾讯生态的牛逼之处。

Flutter

今年正式发布了1.0版本,具体怎么样我持观望态度,Dart快十年了,发展的如何都看着呢,Flutter的发展同样需要时间和契机。

ES2018 & ES2019

如下图,Promise的finally太有必要的,好多年前还有没ES2015的时候使用Q.js,有finally,ES2015突然没有了finally感觉还挺不适应。

正则的那几个新特性也会渐渐的让写代码爽起来,比如以前要想匹配所有字符会用[\W\w],以后就可以不再这样写了。

ES2018具体可以读 What’s New in ES2018

ES2019,还有点早,还没正式发布。

babel

自从三月初发布首个alpha版本后,先后经历了20个alpha版本、56个beta版本、4个rc版,最终发布了正式版,改动很大。

  • 不再兼容Node.js 5以下的版本。
  • 启用了@babel namespace,官方package都会放到该namespace下。
  • 抛弃了按年份划分的preset,如preset-es2015
  • 抛弃了按照Stage划分的preset,以后我们必须直接列清楚我们要依赖的proposal。
  • babel 6中所以名字中带有-transform都改为了-proposal,后者更贴合实际。
  • @babel/core中增加了peerDependencies
  • 新引入babel.config.js作为配置文件。非常棒,js环境搞个rc配置文件就很尴尬,很多情况就是需要通过一段代码来动态计算配置,在没有js配置文件的时候我们不得不使用其他方法曲线救国。

可以参考官方文档 https://babeljs.io/blog/2018/08/27/7.0.0

不得不说前端圈还是那样混乱并且欣欣向荣。

Node.js

Node.js还是保持着他的发版节奏在加新特性和加固。

今年一度被炒得沸沸扬扬的是Ryan Dahl大神说他搞了个新runtime叫Deno,运行TypeScript,并且规避了在设计Node.js时的一些考虑不足的地方。一时风言风语,说啥的都有,甚至吵起来了,大可不必这样,每天都在出新东西,也许就在你看我写的文字的时候又出了新东西,到底能发展成什么样还有待观察,不是一朝一夕能见效的,Node.js也是发展了好几年才逐渐被大家拿到生产中大量使用的。

无论Deno发展的怎么样,十年后Ryan可能会说,当初Deno哪里哪里设计的不够好 ……

TypeScript

先说几年前曾经被人追捧的CoffeeScript,当我看到CoffeeScript的时候我就在想它到底是带来的便利大还是给后续带来的麻烦更大,最后我的结论是它的适用面会比较窄。现在受ES6和TypeScript的冲击CoffeeScript比较凉了。

TypeScript发展的要好的多,毕竟大公司背景。但也并不是银弹,有点被吹的过头了,坑还是不少的。TypeScript的强约束更适合需求相对稳定的大型项目,这种项目特点是开发维护周期长,很可能在整个周期内换几波人。或者是开源项目,开源项目相比业务项目变更容易控制且目标明确。我不是一个语言决定论者,你写个简单demo说这东西多牛逼我认为没啥意义,放到复杂项目中试试你就知道了,把多个异构的部分整合起来需要能力和勇气。虽然有坑,从大家投入的激情看,我认为未来TypeScript会发展的越来越好,掉到坑里的人多了坑自然就被填平了,尤其需要大公司大团队掉到坑里,小公司小团队填坑能力弱。

浏览器新技能

这部分是浏览器get的新技能,未来几年前端又会和现在有很大的不同,浏览器的新技能决定了我们可以有更优的交互方式。

  • Server-Timing

是一个http头,给出server端用时情况,可多个值

  • Clear-Site-Data

是一个http头,可以清除浏览器数据,如cookie,Storage

  • AV1 video format

一个免专利费的视频格式,目前仅Chrome支持

  • auxclick

非主键点击事件,一般主键指的是鼠标左键

  • Accelerometer

加速剂重力传感器

  • Picture-in-Picture

画中画,创建一个浮动的video,该video在所有窗口的最顶层,用于满足用户在做其他操作时也能观看video。

  • Orientation Sensor

方向传感器接口

  • createImageBitmap

创建位图并具备裁剪能力,返回Promise

  • magnetometer

磁力信息传感器接口

  • theme-color Meta Tag

定义浏览器标签页的颜色,现在Chrome For Android支持。可用于用户打开多个标签的时候快速找到你。

  • Web Authentication API

是使用非对称加密替代密码或者短信的方案,以后我们注册登录不再使用密码了,直接将公钥发送给服务器,私钥保存在本地。再也不用担心密码被破解了,也不用担心撞库了,你撞我私钥吧。

  • Shared Array Buffer

可实现跨worker内存共享

  • Feature Policy

允许开发人员根据需要开启或者关闭某些浏览器功能

  • Gyroscope

陀螺仪

  • BigInt

可用于表示大于9007199254740991的数值,因为之前js安全表示的最大值是9007199254740991

  • CSS font-family: system-ui

用户当前UI的字体。

  • CSS justify-content: space-evenly

均分空白空间,我一直觉得flex缺少这个功能,Chrome 60开始支持。

  • CSS Paint API

使用CSS以编程的方式生成图片。

点击关键词 安全

选取第三方库的时候要慎重,无论何种形式。以前有一条不成文的规律遵循,就是star数多下载数多,今年这条规律被打破了。

今年出现了两次影响比较大的npm模块安全问题。一个是ESLint,项目维护者的npm帐号被盗,导致被植入恶意代码。另一个是event-stream,这个影响面更大一些,发生的原因也比较有意思。是原作者不愿意继续维护,因此将整个package转交给了其他人,这件事儿引发了社区的反思,估计后续会有一些流程上的改进(推荐做法)来尽可能避免此类事件。

其实npm公司对每一个package都会做扫描,即便这样还是很难完全避免恶意代码,所以每当引入一个package的时候都要想一想。

新技能

本部分写自己get的新技能。

架构

这里指的是后端架构,其实我这些年一直有在做后端,这段时间正在进一步加强这块的能力,不多写,希望以后有机会单独写。

nginx + lua(openresty)

这一部分是有实际需求驱动的,想在nginx层有一些灵活的处理,逻辑不会太重,用lua来写确实很方便,我的博客部署就是使用nginx + lua搞定的,写完直接提交即可完成部署。

优点在于提高了nginx的灵活性和可编程能力,而且性能很棒。

缺点在于不适合写重逻辑的代码,而且写到lua中不是那么好维护。

区块链和dapp开发

区块链从很多人的视角看是虚拟币,是骗人的,现在泡沫破裂了(从将近两万刀到三千刀算破裂吧),开始有一些解决实际问题的技术方案出来了,从发展的角度看这是好事儿。实际场景比如解决商品溯源问题,可以可靠的知道商品的运输路径。但是很多地方的提法真的不敢恭维,说能防止假货,能解决假疫苗问题,其实能做到的只有准确的追踪路径,至于真的还是假的现在还没有技术能将商品与虚拟世界里的哈希对应起来,比如掉包了怎么办。

区块链会在虚拟世界有很好的应用场景,比如游戏。 另外也比较适合博彩,博彩的信任以及防止暗箱操作一直是个问题,这种事纯虚拟的,没有实际产品真假的情形,特别适合用区块链来解决。

今年补充了一些基础知识。

dapp部分,学习了solidity智能合约编程,以及以太坊web3开发。

docker

docker是之前就掌握的,理论实操都有,但是由于之前的公司封装程度较高,还是有一些东西没接触到的,今年得以有机会进一步实践了一下。

感悟

你学习的是编程还是编程语言?

我觉得很多人都是在学习编程语言,而不是编程本身,把特定语言看的太重。

以前有一个老大哥说“要过语言关,一旦你迈过了这个坎你就会发现用啥语言并不是很重要”。

其实我认为学习编程学习的是一种思想,多好的语言都有人用的很low,多low的语言都有人用的很好,完全看用的人水平如何。而中国的现状又比较畸形,所以很多水平很一般的人得以浑水摸鱼。

规范做的好的语言容易使得使用者不至于那么low,所以容易形成生产力,比如Java。

总结

我还在给大家示范如何避免case by case的写代码,不要只看单点,而是要看面,看趋势。

做事的方式、方法和方向比做本身更重要,朝着错误的方向做一般都会挖一个大坑,做的越多越麻烦,坑了自己也坑了别人,为啥说坑了别人,前辈大牛说“一个人的烂代码可以为另一个人创造一份全职的工作”。

什么是架构?每个人给出的答案都不一样,我的答案是架构只有两个字,取和舍。仔细体会,真的只有这两个字。会取舍是一方面,能否取舍好是另外一方面,不要怕麻烦,要怀着“为往圣继绝学,为万世开太平”的信念方能把事情做到极致。

多说一句,年初的时候看了一条新闻,让我感触颇深82-Year-Old Proves You’re Never Too Old to Code

以上是我的2018年总结,如有任何建议意见可在https://github.com/notejs/the2018/issues与我交流。

我的微信lw20170313,添加请注明您是谁,什么公司,什么职位。

推荐文章