博客内容使用 CC BY-NC-SA 3.0 授权发布。
Powered by Hexo & SimpleBlock .
2015 年终总结
年初的时候还在对 helpful 修修补补,添加手机页面支持、国际化、附件上传和邮件订阅的相关工作。这个时候的我已经会用各种库来实现想要的功能了,对项目的整体架构有了一些认识,能按功能来划分模块,但对面对对象编程的理解还不够透彻。虽然我将 mongoose 作为 ORM 库来使用,但并没有彻底的理解 ORM 的好处。我曾一度不理解 mongoose 返回的 document 除了给人添堵、不能直接取键值以外到底有什么用,对数据的操作全部是用 collection model 上自带的方法完成的。感觉异常的别扭,但又不知道哪里不对劲。
直到三月中下旬开始接手重构 cashier 项目,看到代码里面通过 sequelize 实现的对表的抽象和对数据的抽象感觉打开了一道大门。原来 ORM 提供的是数据的抽象,每个数据实例不单单包含数据内容信息还包括了你期望的这个实例所具有的所有功能,比如一个文章的实例可以自带取作者信息和更新标题的方法。这个数据实例可以在不同模块直接传递,也可以直接调用数据实例上的方法,这样用简直太方便了,代码看起来清晰也容易理解。
cashier 是一个订单管理系统,毕竟跟钱相关需要对数据的可靠性做出保证,所以引入了数据库外键和事务。通过 sequelize 来定义表的关联,数据实例也很容易拿到它的关联数据。虽然是第一次使用事务,但我之前对事务略有耳闻知道是怎么回事。事务一般是将一组 SQL 串行执行,每条语句会带有操作条件,如果其中某个语句执行失败,所有的操作都会回滚。如果在执行事务的过程中程序 crash,事务最终没有被 commit,那这个事务所做的修改也不会被持久化。这样在断电或、程序 crash 等极端情况下或者并发操作同一条记录的情况下都能保证数据的一致和可靠性。
之前我一直是用 async 来搞定流程控制上的问题,没有什么问题,但是用的越多越感觉 callback 在处理 error 的时候实在太繁琐,几乎每个回调函数的首行都是 if(err){callback(err)}
,这样将错误一层一层往上抛,最后被调用者获取并处理。当不同的模块间相互调用太多的时候,错误处理就变得很麻烦。后来在 @jysperm 的影响下开始调研在 cashier 中用 Promise 来处理所有的异步流程,Promise 带来的好处就是统一了回调和错误处理流程。Promise 理解起来并不复杂,每个异步任务都返回一个 Promise 对象,这个对象有三种状态 Pending
、Fulfilled
、Rejected
,then 方法接收回调函数和错误处理回调,catch 方法接收错误处理回调,Promise 可以链式执行,也就避免了回调地狱,代码看起来会清晰很多。
现在遇到的一个问题是是在 Promise 链式调用中无法中断执行流程,只能抛出一个特殊的异常来中断,感觉还是有点别扭。另一个问题是 node.js 标准库还没有支持 Promise,需要自己封装一遍,不过现在社区也在讨论将标准模块 Promise 化的相关事情了。还值得注意的是 Promise 不同的实现在性能上有比较大的差别,可能换个 Promise 类库就能让你的程序速度快几倍。
当订单完成的时候需要给接入的网站发送异步通知和给用户发送订购邮件。这些异步任务的执行时长不定,很容易导致任务堆积和积压,如果执行失败要在合适的时间重试,如果重试失败也要通知开发者。如果不用队列的来处理,单独处理每个任务会很繁琐,也无法简单地横向拓展。最后根据 @orzfly 的建议最后选用了 resque 在 node.js 中的实现 node-resque,并通过 resque-web 来查看和管理异步任务。
五六月的时候梳理了 JavaScript 的原型继承相关概念,调研了 mongoose 里面的一些黑魔法,为了实践一下还写了一个简易的 ORM 原型 cado。ES6 中添加了 class 关键字作为构造函数的语法糖,比较像 CoffeeScript 了。
下半年大部分时间是花在了另一个项目 pomotodo-node 上了。项目虽说大一点,但是因为都模块化了所以整体的复杂度也没有很高,所用到的技术跟 cashier 差不太多,也没太多值得说的。
这一整年我都对网络相关很感兴趣,写了两个小东西 lyssa、PowerProxy。PowerProxy 是参考 Surge 和 anyproxy 实现的网络调试工具,主体是一个 HTTP Proxy Server ,通过中间人攻击 (自制证书) 方法注入 HTTPS 来嗅探所有请求,打算采用 electron 制作跨平台应用。现在思路不是特别清晰,如果能把思路理顺应该会继续。
考虑到五一黄金周人山人海,专门挑了五一前几天跟女朋友去庐山玩了一趟。蜿蜒曲折的山路、险峰,确实也别有一番风味。我们去的时候没有看到山雾,听导游说前几天都有的,总之是错过了。
本来我是不想学驾照的,我对无人驾驶汽车的未来还是很有信心的,人的反应速度和操作能力终归是比不上电脑的。不过依旧是没有拗过,暑假的时候在家里的一再劝说下开始考驾照,暑假学了有一个多月再加上后来又补考了科目三,最后在十一月的时候拿到了驾照。
我们大四有两门选修课,我学分差不多实在不想继续呆学校了,室友同学也开始出去找实习。我就搬到校外跟女朋友租房子住,开始了一起买菜做饭的日子,经过几个月的练习,现在我也能差不多做一些菜了。之前在学校经常是凌晨三四点睡觉的,现在也开始纠正自己的作息习惯了。这样远程工作的日子还是挺舒心的,每天睡到自然醒然后起床吃点东西干点活,有时候跟朋友一起开开黑打游戏,不用打卡不用朝九晚五。
十一月尾的时候 @顾惜朝 姐姐在知乎私信上问我想不想去知乎实习,我的天然后我后来居然就顺利通过了面试,在年底的时候像做梦一样就来到了北京。除了空气,北京的一切都还不错,在北京的具体生活我以后再写吧。
感觉这一年像是分水岭,终于离开了学校,开始了新的生活。