其实早就想写这篇总结了,无奈双十二买了ns,一直在奥德赛找月亮,后来又不甚入了塞尔达传说,在海拉鲁大陆迷失了自我。
记得是在元旦过后入职的,其实当初我说的是28号入职,结果HR说你元旦过后再来吧,这一定不是为了省钱。所以这么算来到这边刚好一年多了。
初来乍到
刚入职的感觉就像是李姥姥进大观园,虽然那时算上实习差不多工作了一年半,但生平第一次参加需求评审,交互评审,接口评审...各种xxx评审,感受到了专业和新奇。但新鲜感一过我就对这类会议产生了厌恶情绪,我是谁?我在哪儿?为什么直接看文档就好的事情还要开会。
另外一点最直观的感受是原来三天的工作量这边可以安排两个星期。可能当时年轻不懂事,对于一些需求的变动和新增都是来者不拒,这也直接导致了iOS同学的厌恶。因为我实现了,他也只有做了。后来我发现了一个规律,凡是新来的朋友都会搞一波事,无论是设计,产品还是领导,我称之为新人必搞事定律。
因为完成的比较快,导致了拥有大把的闲暇时光。在此之前正好在写react,觉得很好玩,是真的很好玩。又因此接触了node和es6,所以那段时间就一直在看node官方文档。当时选择这家公司也是听闻node团队比较强,希望能有机会跟着他们学习一下。看完node后,正好朋友让我帮他做网站,理所当然的选择了express+react。还记得那段时间正好碰到一位node同学和一位java同学在争论。node同学让java同学直接大量并发轰过去,而java同学觉得开启大量线程会耗费过多的系统资源。其实站在两位同学的角度我都能理解,node的事件队列因为没有上下文切换,确实可以处理好大量的并发,而对于java而言大量的线程占内存不说,上下文切换确实会造成性能的瓶颈。其实作为一个整体,我们应该优先考虑短板,因为这会成为整个系统的瓶颈。
小黑屋之旅
年后回来被告知要做一个在聊天群实现实时竞价的需求,所有相关人员都要去小黑屋进行为期两个月的封闭式开(jia)发(ban)。
这两个月真的是一段非常特别的经历,和当初面试我的周骞大佬有了深度的合♂作。他问我想写业务还是架构,我说架构。然后他说可以,但他的想法是实现一套插件系统,所有额外的功能都由业务方实现相应的插件注册进去,将业务和基础库解耦。我听了也觉得这个想法很好,就试着用代码实现,然后给他review。他指出了很多我代码还有设计上存在的问题。那时我会直接把一个view丢出去,他告诉我这是很危险的,别人可以通过这个view拿到很多不该拿的东西,写代码的时候要把所有使用者想象成坏人,不该暴露view而是相应的操作,诸如此类。
那时每天都和他讨论到很晚。第一次感受到了有一个比自己厉害很多的人指导是一件多么爽的事。之前的公司自己就是天花板了,成长只能靠自学。后来也听周骞和我说他也觉得那次的合作很愉快,很多事情跟我说一次我就能明白他的意思。同样的评价也听王右右说过,大概吸引都是相互的,碰巧他们也是我在这家公司最欣赏的两个人。
在做新功能的时候发现聊天库里面的气泡竟然都是.9图。文字还好,图片的话会有一圈白边,太丑了。然后先去gayhub找了下,发现一个500 star的项目竟然不支持scaleType。然后就看了下ImageView的源码,参考着实现了一个支持scaleType的气泡,iOS同学可能真的很想锤死我。
在小黑屋的时候还尝试用起了vim,一开始真的很痛苦,好在我坚持了下来并熬过了最开始那段困难期。不用鼠标真的太爽了,有小时候玩电脑打格斗游戏的快感。
金融团队
小黑屋加班结束后我就进入了全公司最忙的团队。做的第一个需求是优化首页打开速度,首页是H5,所以是优化webview下载和加载页面的速度,之后又大大小小的做了很多业务和非业务的活。其实我觉得自己在团队的定位更多是一个打杂的。比如项目模块化之后大量通过协议进行模块间的通信,没有文档大家查起来都不是很方便,我就花了一下午用python写了一个自动生成rouuter文档的脚本。还有就是设计师总喜欢升级sketch导致我们突然打不开sketch文件了,只能去下新版本。然后又花了一下午写了一个shell脚本用于降级sketch文件。
模块化之后用上了git submodule,但是遇到了很多的问题。当时右右每天都在看项目管理的东西,试着找寻新的方案,然后看到了google的repo。我也去了解了一下发现repo用到了软链接,突然灵光一闪跟右右说我们也可以用软链接把子模块引进来。这样子模块同时又能作为一个独立的项目运行起来。所以我们最终的方案是软链接+git submodule配合自己写的一个脚本来规范工作流。当然这个脚本是右右写的,右右对于git的工作流真的很严格,我也因此对git和项目管理有了更深入的理解并且用到了很多以前我没使用过的git命令。
公司那时有规定每周某一端必须有人做一次分享。当时我正好因为不想女朋友花太多钱而去破解了她玩的那个手游,我觉得这是一次很有趣的经历。所以我决定分享给大家。分享结束后在大家热烈的掌声中,领导问我:所以你最近上班都在弄这些东西???
好在有同事帮我解围道:亮哥,你这样我们以后都没分享听了。那次之后我还分享了3-4次,虽然我知道大家更多时候都是把这个当作一个任务,但我还是尽量会把我的每一次分享准备的有趣一点(比如现场开车?)。可能是你们第一次听我分享时全神贯注的眼神和挂在脸上的灿烂笑容激励了我?
万恶的996
在一次只谈目标不谈补偿的动员大会后,开启了为期3个月的996,而且动员大会上一个个面带笑容满怀斗志,真的让我有点迷茫。我的想法是工程师需要的是deadline,而不是强制的加班。然而事实证明这个996确实也不忙。其实看着其他组的同事整天早早的下班,我是羡慕的。
但与其抱怨,不如好好利用这些时间,于是在996的时候我每天都会刷一到两题leetcode,看了很多开源库的源码,看完了《Unix编程艺术》,惊艳于Unix中管道的设计。那时正好有一个测试同学跑来问我说他记得adb命令可以把log按特定大小保存成文件,但他忘记是哪个了也查不到。然后我直接用管道连一个split实现了他的需求。
函数式编程
因为Rx和React的缘故了解到了函数式编程,然后看到知乎上的讨论说学习和使用haskell,可以改变你的思维方式。然后就开始了haskell的学习,看的是官方资料里的《Learn You a Haskell for Great Good!》,前几章看的还挺快的,因为我习惯于在书中提出问题后先自己实现一遍,然后再去对比书中给出的答案,所以后面几章随着概念和内容的增多大概2-4天才结束一章。不过haskell真的很有意思,你会得到和面对对象编程,面对过程编程完全不一样的体验,之后我推荐了好几个朋友去看一下haskell,他们都和我说很有趣,真的很值得了解。
然而我并没有停止对于函数式编程的学习,因为真的太有意思了。我开始试着去了解lambda演算,看的是这篇系列博客。里面又提到了《The little schemer》这本书。二话不说直接下单,然后学习了scheme这门lisp方言,语法很简洁但是拥有很强的表达能力。和之前学haskell一样,每一题都自己先做完,然后对比书中的解,这本书也很有意思,全程都是提问的形式,左边是问题,右边是解。当看到第9章Y组合子的时候,我整个人都惊了,有种这tm也可以的感觉。看完《The little schemer》又入了之前一直想买的《SICP》,然后神奇的发现《SICP》里面用的就是scheme。
期间项目要将Rxjava从1.0升级到2.0,为了安全起见(996真的很闲),我把1.0和2.0的源码都看了一遍,也因此对Rx有了更深刻的理解,也了解了之前并没有用到过的乐观锁。加上函数式编程的学习我的思维方式真的有改变,以前那种把数据的一些变化或者判空之类的丢进onNext处理的方式真的太不Rx了,也正因为通过这次源码的阅读,之后有个参数校验的需求我才能在业务方无感知的情况下完美的用Rx处理掉。
第一次PR
996之后右右希望我能多调研一下新技术并且运用项目中,然后这段时间就开始尝试很多之前用的不多或者是社区近期比较活跃的新技术。然后其中有一项是facebook的litho,用react的思想来写android,并且他的measure和layout是在非主线程的,所以速度很快。但是运行他们的demo的时候发现在某些特定情况下会闪退,然后进行了debug,看了他们的源码,定位到了有问题的代码,修改后给他们提了一个PR。他们表示感谢后合并了这个这个PR,然后那个老哥还发了一个表情包恭喜我在这个项目中的第一次贡献。大概觉得很逗,就又去他们issue里找了下,看看还有没有什么我能帮忙的。然后之后又提了两个PR,其中一个大概改了他们1000来行代码,在代码生成那块支持了一个新特性,他们review了大概一星期之后把我代码合进去了,当时还是觉得很开心的。
沉迷代码
996之后休息了没多久,突然进入了一种很奇怪的状态,每天基本除了睡觉,都在写代码或者看自己买的书,周六在家呆着无聊还会主动到公司学习,一直持续到买了ns,果然还是要以毒攻毒。那段时间因为老是有人给自己之前写的库提issue,然后觉得那个库写的挺烂的,就干脆整个重构了。重构之后想起王右右这个4000星大神跟我说过可以加些标签让自己的项目看着专业点,还有可以用travis-ci自动发布之类的。我也跟着加了些标签,然后接了下CI,甚至还画了一个Logo,或者说用代码画了一个Logo(真的不会画画)。然后发现这么包装了一下之后提issue的人更多了。印象最深的是一个不知是伊朗还是阿富汗的小伙子,前前后后给我提了十几个,还让我支持android tv的遥控器。我其实是想喷他的,但还是研究了一下,支持了android tv。
手中无剑
临近年末的时候,右右让我带着实习生做应用内的抓包插件。当时的思路是在应用启动时bind一个service,然后在这个service里画一个悬浮窗作为入口。然后给okhttp加一个intercept用于拦截网络请求并输出给service展示。然后有一天突然实习生跑来跟我说会偶现闪退,思考了一下是因为service启动是异步的,如果还没启动的时候发出网络请求,没判空就会崩。我跟他讲了原因后,问他觉得有什么好的解决方案吗?他说判空,我说可是这样service启动前的网络请求不就丢了吗。当时脑子里闪现了一个方案,写了两个接口解决了这个问题,然后当时一看这不就是观察者模式吗。记得一年前自己还在背着各种设计模式,随着自己代码阅读量和书写量的增加发现已经可以在不自知的情况下把这些模式应用进去,这大概是当初怀叔说的手中无剑,心中有剑吧。
带实习生的同时我自己也在写jenkins的android客户端,其实就是抓了下jenkins的接口然后封装一下。因为是新建的项目就尝试了一下kotlin,还有android新出的architecture components。写kotlin的时候一直逼自己用他的各种语言特性,抛开写java时的旧习惯。一开始很痛苦,但习惯后发现kotlin的lambda,函数作为first-class,各种语法糖真的很爽,和rx的配合也是天衣无缝。不过还是踩到了坑,比如我想在lazy { ... } 里面通过 let { ... } 代码块执行一些初始化的操作,程序直接卡死了。然后看到 lazy 的注释里面说,默认是加了同步锁的,所以导致了死锁。可以通过修改成非同步的模式解决。不过最终没有用这种方式,感觉会引发更大的坑。
面基
今年参加了两次技术会议,一次是android绿色联盟开发者大会,其实是在网易的朋友邀请我去面基,那天聊了很多,临走时他还送了我他在台湾买的草东没有派对的《丑奴儿》,他知道这是我很喜欢的乐队,超开心的。
另一场是公费参加的 Qcon,门票6000+ 本来以为包含住宿,结果并不包含一下子从五星级酒店变成了三星级。讲真这个会议给我的感觉大多都是各个厂商的广告和慢慢带向广告的路上,要我自己是绝对不会花这6000块钱的,不过还是有两场让我印象深刻的分享,一场是阿里巴巴的《jdk协程》,那个小哥哥才毕业三年,要是两年后我也能这么强我就很满足了。另一场是instagram的《python内存优化》,也是个很爱用表情包做ppt的小哥哥,非常的hack。回来之后做了一次面向全公司的分享,为了能同时把这两场内容分享给大家,我绞尽脑汁取了《如何以工程师思维进行性能优化》这种鬼名字。这次Qcon同行的还有死月,之前一直听说他是nodejs的核心开发者,虽然在一家公司但一直不知道是哪个,这次终于见到了真人。
感悟
今年最大的感悟是你之前遇到的人和事都会在之后影响到你,很多事情都能串起来。比如:
如果那段时间没有看Retrofit和公司Router的源码,之后可能没法对litho代码生成那块做出修改,会觉得Rocket是魔法,不会在写代码之前思考能不能把一些模版代码用代码生成抽象掉,现在俨然已经成为了元编程的信徒。
如果没有帮女朋友破解那个游戏,之后亲戚来找我做一个滴滴抢单的软件我可能不会答应。
如果没有给facebook提PR,看到了他们github机器人,就不会想到自己也可以弄一个机器人来拉黑那些乱提issue的人
刚被同学拉去做android时,他很狂热自定义view,我也跟着他了解各种触控绘制机制,觉得写这些复杂的控件很有意思。而右右很对工程化,自动化的东西很感兴趣,我也跟着他一起做一些自动化,持续集成的东西,并且觉得这些东西很有趣。
展望2018
- 看完 《SICP》和 《GEB》
- 重度使用 Rust
- 给开源社区做更多贡献
- 学西语、学日语
- 出国旅行,跳伞
- 理财