2015

2015 年一整年过的很快,没有什么感觉就过去了,转瞬即逝。回头看,写博客的频率也降低了,主要是太忙。忙着各种事情,练琴、画画、写代码什么的,所以博客很少写了,也是觉得没什么好分享的。刚好提前放假了,就忙里偷闲说说这一年来技术上做的事情,也算是对自己有一个总结。

2015 这一年做的事情挺多的,带了两个人,这两个人现在都挺不错的,虽然写的东西经常还是不太让我满意,但至少自己已经能够应付很多的事情,有了自己的想法,是一件非常不错的事情,与其说帮助他们成长,不如说我自己也成长了很多,这算是一件开心的事情吧。

在工作上这一块,负责了一部分架构的事情,负责技术选型和方案决定,至少倒现在,还没有出过什么岔子,除了不靠谱的阿里云经常挂以外,业务非常的稳定,几乎没有挂过,也算对这一年稍微激进的技术选型做了一定的验证吧。(不过某些方面在匿名小伙伴 tony 来看有些不清真)

我们的方案主要是 Python + MySQL + CouchDB + redis,其实这个方案挺普通的,但是我相信深入了解的人会知道里面有什么坑。另外早期也使用了一部分的 Thrift 作为服务,但是 Socket 维护需要服务和客户端对连接非常的了解,我们的客户端经常无厘头的创建连接不回收,服务端虽然有超时和强制回收,但体验也不好,依旧也会经常挂死。

而另外一方面 CouchDB 作为我们的基础 NoSQL 数据库又是基于 HTTP 协议的,当量大起来之后,HTTP 本身就是系能最大的问题。只好对性能做优化,于是提供了 redis 层作为整个 CouchDB 的缓存,对开发透明,事情就变得更加的 smart。当然还有非常多的细节,这里就不详细的说了,总之挖了坑都埋了,也不负这一年做的事情。

说回这一年技术总结,主要还是想说这一年读过的书,对我自己而言,我的总结是这一年是基础的一年。实际上工作4、5年后,我逐渐的发现基础才是最重要的,无论是之前炒的最热的什么大数据,现在什么云化,说白了反而是很好解决的事情,无非看看文档,学习一下 SDK 就可以做了,但是要和搬砖区分开,最主要还是打好基础,其实这两年我已经开始往基础上面准备了,无奈太忙进展也不多。

2014-2015 上半年主要读的书是《Linux 2.6内核实现》,当时看是囫囵吞枣,但也确实有很多醍醐灌顶的地方,比如进程、中断、优先级的实现,后来逐渐的,其实我也不知道怎么的,就能够开始运用在业务中了,这算是一件非常好的事情。2015年读了很多书,都是很细节的东西,比如《HTTP 实现》《TCP/IP 原理》之类的,很后悔大学的时候没有好好读这些书,不过现在想起来,就算大学好好读了,也不一定会好好运用,感觉教育这件事情也是挺无奈的。

在数据库方面,读了《高性能 MySQL》和《MySQL内核实现》这两本书,也是囫囵吞枣,实际上数据结构真的还挺简单的,无非就是B+树,链表和哈希表之类的东西,但是 MySQL 内核在一致性上做的事情确实让我开阔了视野,我估计 MySQL 引擎70%的代码都在保证一致性。这些知识直接帮助我,无论是有意识还是无意识的,在解决问题上有了更多的选择,更开阔的空间。

这些书对我的帮助挺大的,其实有很多人会误解说,我做了很多的项目,用了最新的框架,那么我就越来越 NB,这几年炒什么,我就学什么,如果不学就赶不上时代。其实我早几年就觉得这个观点有问题,一直到现在,我还是觉得基础是最重要的,基础好,学东西反而很快了。

很高兴这一年我们把更多的基础的东西,比如简单的算法,运用在项目中,举例说明,我们网站首页是根据用户的兴趣和小组筛选出一大批符合规则的帖子展现在首页,还有各种奇怪的诡异的排序逻辑,因为各种复杂,我们使用了红黑树作为数据结构,还有日历功能,我们使用了 Segment Tree 作为基础数据结构,都取得了非常好的性能和非常好的效果,数组链表堆栈更是数不胜数。虽然这些都是很基础的东西,我也很开心我们的团队在解决复杂问题的时候能用基础方案去解决,还都能够知道算法复杂度和可能遇到的问题。

后半年主要读的书是《TCP/IP 协议》这本书,说白了都是基础中的基础,早些年挖的坑,只能现在来填补。同时,为了弥补《Linux 2.6内核》中欠缺的知识点,另外也在复读的一本书是《Unix v6 内核实现》,这本书是以 Unix v6 内核代码进行讲解,毕竟 Linux 2.6 之后内核代码已经是百万行了,而 Unix v6 内核代码才差不多一万行,非常适合阅读和进行实践。之前读的话可能是囫囵吞枣,Unix v6 代码直接下载下来跟着书一起看,虽然慢,还是有很多启发的。

在语言方面,本来是打算看 docker 源码的,无奈不太会 GO,于是下半年最后尝试的语言是 GO,我觉得除了 return err 这一点以外,还是不错的语言,产出是 go-couch,GO 语言版的 CouchDB 客户端。算是练手,也算是对 GO 有进一步的了解吧。

总的来说,2015 年能读这些书,我是很开心的,说实话是很有快感的,我常常觉得自己水平太差,而我提问又比较刁钻,比如什么是数据库?一个网络链接是什么?其实大部分人是没办法给我答案的,就好比,我问的问题是,车是怎么跑起来的,我要的答案并不是,给油就能跑起来,就好比数据库不是 MySQL。这就造成很多人不知道我在说什么,也以为我不懂什么,我却觉得别人根本就不懂。

如果说车是怎么跑起来的,我更希望的答案是,发动机里空气和油按照一定的比例燃烧爆炸,推动泵做工,然后通过轴将力传递到车轮,这样车就跑起来了。这才是回答车是怎么跑起来的吧,而不是怎么应用。不过最后我也想明白了,这种东西还是读书最快,问人还真的不一定靠谱。

前些日子参加一个技术分享会,主要是为了 hongqn 教授去的,感觉如沐春风,我觉得教授的风格就是,我们要做什么,遇到了什么问题,如何解决,解决过程中发现方案1、方案2都不行,只好选择方案3,那么需要面对什么问题呢,性能还是自动化,又如何解决,哦哦哦,最后得到一个,方案n 是最好的。这个过程非常的顺畅,而且解决方法说白了就是基础中的基础,没有什么高大上的方案,但是效果却很好。这里我又不得不稍微黑一下 Java 社区了,这帮人什么都不知道,一旦遇到了问题就只知道换框架,反而最后的解决方案是最不好的。

说到这个技术分享,刚好提到有个分享是 GO 语言的高并发分享,感觉挺水的,我觉得分享者应该是不错的,但是说出来就是另一回事了。还是那个意思,GO 为什么能够高并发,我想要的答案不是因为有 go 关键字,而是利用了系统的比如 epoll 或者 select,那么问题就来了,既然 CPU 是顺序执行的,为什么这些就高并发了呢?什么是高并发?这些才是很有意义的话题。可惜现在没什么人喜欢这些基础的这东西,反正能用就好,大不了换个语言。

感觉之前在豆瓣,所有人都在碾压我,出来后发现其实自己也没有那么差。好好读书,把视野放的更广阔一点,觉得心情也更开阔。不过其实技术只是一门手艺而已,说白了还是人,新的一年不仅仅在技术方面继续深挖,还要和团队有更深入更好的合作,希望能和更多聪明人共事和学习,不仅仅是技术,管理和沟通也是要学的能力。

做到现在,想想看,什么是架构能力,对新技术的了解度?用什么框架最好?这仅仅是一部分的能力,我现在觉得架构能力是,大到知道各种技术的优点和缺点并最大化优点和最小化缺点,小到知道具体的算法复杂度,甚至提供简单易用的工具让团队利用某些工具,提升性能,减少错误。除此之外,要架构的不仅仅是技术,还有人。

那么,2015 就这样吧,2016 继续加油。