标签 #总结

2016 年终总结

去年 12 月收拾行李来到北京,到现在刚好一整年的样子。

刚到公司的时候是一边学习 Python 一边维护移动端 API 项目,主要是修修 Bug、加接口、调 RPC,还算游刃有余。慢慢熟悉了公司整体的技术架构以后开始独立负责或参与一些其他更有挑战的项目。

值乎 & Live

比如开始给自己挖坑,重构了一把 wechat 项目,设计了一个复杂的插件化框架。将所有的功能模块全部独立开来,每个功能模块都是一个插件包,能方便新加和下线某个功能,还设计了一种依赖注入机制来解决插件间数据交换的问题等等等。

三月的 Hackathon 上值乎项目获奖后,决定要在愚人节的时候把值乎搞上线,可值乎后端是作为一个插件写在 wechat 项目里的。算起来 wechat 项目的插件加载方式和依赖比较奇怪,也不能很好地跟现有的测试框架兼容,只能把测试都注释了才能走通部署流程。然后因为用了比较多的面对对象的特性,导致抽象是够了但缓存不好加,访问量上去以后数据库扛不住,接口变得巨慢。而且也因为没有测试,本地只能跑起来简单看看,很多问题只能到线上才能发现。导致那天平台组都问我为什么我一直在上线,没好意思说我是在线上测试…

到后来公司开始重视值乎以后成立了专门的项目组,代码库也从 wechat 抽出来重写了,后续值乎项目我也没深度参与了。当然这些 wechat 设计上的坑我后来还是去填了一些,去掉了一些冗余的设计,换掉了 ORM,测试也全加上了,现在用起来问题不大了。

Live 项目也是三月尾开始的,工期也特别紧,要求项目能在五一上线。一个月出头的时间要求后端稳定下来,并跟客户端联调测试达到上线的要求,压力还是有点大。基本上四月一整个月都在加班,天天到凌晨回家,周末大部分时候也在加班,累惨了。不过总算是在四月尾勉强达到了上线测试的要求,然后将项目转交给同事就回学校准备毕业了。

加班太多了整个人都感觉不好,脑子整体混混沌沌的,也没法集中精力思考。每天起床就开始干活,到下班只想睡觉,什么都不想做。现在我对加班都有些阴影,不过好在除了那段时间项目赶工期,别的时候倒也没加过班了。

移动网络优化 & 消息推送

到下半年正式入职以后我的职责又有些变化,更聚焦移动相关的技术了。

比如开始研究的就是移动网络优化,期望能在网络层面优化 App 的使用体验。我是野路子程序员,对网络协议的了解非常粗浅,这个时候就很明显地看到自己的短板了。好在领导也没给太多压力,给了我比较充足的时间去学习协议的细节,所以我花了很多时间来补 TCP、HTTP、HTTPS、HTTP2 等等相关的协议知识。关于针对移动网络的一些优化要点,之后有空的话再分享。

但仅仅了解还是不够,等最后测试并得到一些结论了以后,要想办法把想法和结论落地啊。我们打算构建一个跨平台的网络库来解决,最后打算将 Chromium 中的网络栈代码抽离出来打包成库给客户端使用,实际上蘑菇街已经这样在做了。说起来挺简单的,但整个过程对我而言非常痛苦,海量的 C++ 代码让我直接懵逼… 已经打算明年来补 C/C++ 和 Unix 下的网络编程了,希望明年能跟上节奏。

消息推送系统是另一个在做项目,为的是提升推送性能和灵活性。这个项目上我们花了非常多的时间来构思如何构建一个稳健、可拓展、松耦合的系统,这个时候思考的不仅仅是满足当前的需求了,难的是怎么去划分子模块和考虑满足未来可能会增加需求而不用动大的架构。这段时间我积攒了一些项目设计经验,以后遇到其他的设计需求时应该会轻松一些了。

毕业了

毕业流程走得非常顺利,写了份实习报告答辩完就毕业了。室友没到齐,班内也没组织散伙饭,拿到毕业证就各奔东西了。不过好像也没太多不舍和眷念什么的,大概因为早就知道和同学们不是一路人吧。从开始我就不太合群,很少参加班内的活动,也没特意去搞好寝室关系。大学四年也没认真上过课,上课多是去睡觉、玩手机或者看书,其他时间就自己折腾代码。这么想来,这几年时间倒也没荒废,总算是学了点东西。所以这个大学的意义就在于给了我充足的时间去自己学习吧,也挺好的。

大学中值得庆幸的事就是大二的时候进了番茄土豆团队吧,如果没有遇到他们,想不到我会混成什么样子。本来我挺彷徨的,对未来和学习都没有太多方向,两位老板、一尘大牛、精子和逸川给了我很多帮助,带我入门并给了我很多建议和指导,非常感谢!

北京北京

我租的房子刚好在北五环边上,从窗口看北京的夜景正好。刚到北京的时候我特别喜欢趴在窗口看外面的灯火、车流,那种感觉非常奇妙,甚至有种异样的不真实感。啊,我毕业了,我到北京了。

回想了一下今年的日子过得似乎很单调。一方面是实习工资少房租又太贵,还要攒学费、攒路费回学校等等,日子过得太紧吧,不敢出门。另一方面是每到节假日空气就开始变差,外面浓浓的雾霾简直不敢动,只敢开着空气净化器在家里蹲着打游戏。

明年打算空气好的时候多出去转转,出去骑骑车散散步,多运动运动减减身上长得肉,有空的话做做饭锻炼锻炼厨艺就更好了。

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 对象,这个对象有三种状态 PendingFulfilledRejected,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 差不太多,也没太多值得说的。

这一整年我都对网络相关很感兴趣,写了两个小东西 lyssaPowerProxy。PowerProxy 是参考 Surgeanyproxy 实现的网络调试工具,主体是一个 HTTP Proxy Server ,通过中间人攻击 (自制证书) 方法注入 HTTPS 来嗅探所有请求,打算采用 electron 制作跨平台应用。现在思路不是特别清晰,如果能把思路理顺应该会继续。


考虑到五一黄金周人山人海,专门挑了五一前几天跟女朋友去庐山玩了一趟。蜿蜒曲折的山路、险峰,确实也别有一番风味。我们去的时候没有看到山雾,听导游说前几天都有的,总之是错过了。

本来我是不想学驾照的,我对无人驾驶汽车的未来还是很有信心的,人的反应速度和操作能力终归是比不上电脑的。不过依旧是没有拗过,暑假的时候在家里的一再劝说下开始考驾照,暑假学了有一个多月再加上后来又补考了科目三,最后在十一月的时候拿到了驾照。

我们大四有两门选修课,我学分差不多实在不想继续呆学校了,室友同学也开始出去找实习。我就搬到校外跟女朋友租房子住,开始了一起买菜做饭的日子,经过几个月的练习,现在我也能差不多做一些菜了。之前在学校经常是凌晨三四点睡觉的,现在也开始纠正自己的作息习惯了。这样远程工作的日子还是挺舒心的,每天睡到自然醒然后起床吃点东西干点活,有时候跟朋友一起开开黑打游戏,不用打卡不用朝九晚五。

十一月尾的时候 @顾惜朝 姐姐在知乎私信上问我想不想去知乎实习,我的天然后我后来居然就顺利通过了面试,在年底的时候像做梦一样就来到了北京。除了空气,北京的一切都还不错,在北京的具体生活我以后再写吧。


感觉这一年像是分水岭,终于离开了学校,开始了新的生活。

2014 年终总结

好快,今天已然又是这一年的最后一天,回首这一年还是感觉收获颇丰。

年初的前两个月还在懵懵懂懂地学 PHP 框架,虽然对网站有一些理解,但需求稍微复杂一点就有心无力了。这段时间过得比较蛋疼,期间学了些设计模式、还有一些前端框架的使用,有个二手市场的项目做了一半烂掉了。
四月份的时候参加了一个学校的网络新媒体班,如果顺利结业的话貌似是有一个辅修证书,然后有一大堆学分。本来是怕挂科太多毕不了业,打算去混学分来着,后来因为的确太费时间,上了两个月课放弃了。
五月份的时候由黄埔学长带我去百度校园极客大赛打了个酱油,这是我第一次去北京,之前甚至没有出过省。在北京逛了一圈,感觉北京的公共交通还是很发达的,地铁线路比武汉多得多,而且没有武汉挤。再别的也没啥特别的了,好像城市一大就会变得千篇一律。

因为之前暑假、寒假在家过得很不愉快,老是被嫌弃。家里人也无法理解我在做的事情,矛盾冲突不断,所以决定暑假的时候无论如何都不能在家待了。也可以说是一种逃离。
等到四五月份的时候我就在找暑期工作了,先给好几个武汉的公司投了简历,有的没有明确答复、有的直接拒绝、有的杳无音信,这时才感觉自己还是太弱。幸运的是后来在 V2EX 发帖找到了一份番茄土豆的实习,不过却不是 PHP 。

我是进入公司以后才开始学 Node.js 的,老板说相信我能很快学会。。。然后给了我一个新项目的后端让我负责,现在想想他们还是胆子很大啊。之前我用 PHP 都没写过这么完整的项目,而且 Node.js 也是初学,很多地方都不清楚。我已经记不清我自己是怎么一点一点梳理需求,然后一点一点搞定的了。期间踩过很多坑,代码重构过无数遍,进度慢得一塌糊涂,好在他们没有给我太多时间上的压力。
这边的生活比较惬意,我们在昆山的一个小别墅里面办公,人不多所以也没有打卡什么的,时间安排很自由。那时候我一般中午十二点左右起床吃饭,然后晚上十二点睡觉。别的时候写代码或者开黑打 LOL ,或者跟妹子去上海和苏州玩、看电影(小区里就有电影院!)。他们有 PS4 ,配一个大液晶显示屏,玩起来效果很好,不过我太会操作所以玩得也很少。
等到大三开学课也越来越少,所以实习到现在也还在继续。

跟他们厮混了一段时间,他们的一些思想和行为也在影响我,我现在说话的感觉越来越像我们老板了。。。而且因为现在有了工资,我的消费观念也发生了一些改变。我认识到我的时间是有价值的,能花费很少的钱就能搞定的事就不要浪费太多时间。导致的结果就是花钱越来越大手大脚了。。。
下半年换掉了之前的小米手机,换成了 iPhone 5c 。现在用了几个月还是很满意的,应用质量比较高,也都流氓不起来。这样我就少了很多时间在折腾手机本身上了,以前每隔几天就要刷个机不然没法用。
还把笔记本换成了 MacBook Air ,做工不错,屏幕效果也比我之前的电脑好,键盘和触摸板也很好用。现在开始晚上拉闸限电,它续航时间挺长,熄灯以后亮度调低一点可以撑到第二天来电。而且少了很多时间在折腾黑苹果上了,之前笔记本 WIFI 后来老是坏实在太烦。

我对我们学校的微信还是有很深的感情的,毕竟我之前在上面花了很多时间。也怕以后没人接手被荒废了,所以这学期我在大学生网络中心里面建了个编程小组,收了几个大一的小徒弟来教 Node.js ,花了一些时间不过进度还是很慢,前几天才又拉了 @jamlee 加入进来。
现在还在对微信接口用 Node.js 做重构,做了一些性能上的优化,前端框架也换了,支持了自定义菜单,预计期末之前这个版本能上线。明年应该还会继续完善。

现在跟妹子的感情越来越好了,么么哒~