2015年马上就要过去了,匆匆忙忙地又是一年。回头总结整理,发现这一年还挺充实的。在正常上班工作之余,学习到了不少新东西,不禁感到很欣慰!一个多月前就开始写,终于赶在2016年来临之前写完了这篇文章…… 关于本文,尽管叫做流水账,但是出于程序员条理性的“强迫症”,还是进行系统分类,分类方法参照Thoughtworks技术雷达的Tecniques、Languages & Frameworks、Tools、Platforms,将其中的Tecniques改为理论。
从今年开始逐渐的深入学习计算机科学的理论,继续按照自己确立的学习路线一步一步走下去。
算上今年这次应该已经“冲击”了两三次CSAPP了,这次的效果还算比较满意,几乎读完了厚厚的整本书,收获颇丰!从汇编语言、计算机组成原理、编译链接、系统编程,都算是系统的学习了一遍。具体学习笔记如下,其中(2)和(3)个人感觉还是整理的不错滴:
今年读了几本算法书,但都是按照内容编排一起并行看的,都没有看完…… 同时还动手用C++刷了一些Leetcode的题目。C++虽然非常复杂,但做算法题实际上可以只用其中最核心的部分,当做增强版C,就能很快上手了。
这段学习中感觉最大的收获就是:如何证明程序和算法的正确性,以及实现算法时,如何应对各种CornerCase和思维漏洞。虽然理解和研究的都还不够深,但是的确开阔了思路,让我开始系统地思考如何用科学的方法写出正确的代码。具体请看《程序员修炼之路》专题以及几篇Leetcode解题笔记:
项目原因接触到了Netty,的确非常强大。通过对Netty的使用,也整理了开发一个网络通信中间件所需的方方面面的知识。但限于一直没有对TCP/IP等网络知识做系统学习,所以对Netty底层理解的还不够深,希望未来能补充上这一部分。
编译链接一直是让我望而却步的领域。今年借着学习CSAAP之势,顺带给编译链接的学习开了个头。现在也能解决一些汇编及C语言的链接错误了,也算是有点成就。同时还试用了ANTLR,确实不错,以后要是写一些小东西就用它了。对这部分最深的感悟就是:原来从高级语言的多态到汇编的jmp是这么一回事啊!
今年上手了不少新工具,感谢这些工具和作者,让我能更高效地专注于要做的事情。你会发现有时只是简简单单地用上了某一种工具,你的生活却发生了根本的改变。就像只是换成Sublime+Markdown写文章了,才发现原来自己每个月可以写这么多文章,而且排版还比以前漂亮十倍!只是开始在豆瓣读书上看看别人推荐的书和记录自己读的书,一不留神,发现原来自己已经读了这么多好书。
多亏了Mint的多系统支持,让我终于在自己的电脑上安装了Linux,之前一直在Windows下用Cygwin和虚拟机将就着呢。用上了Linux后感觉思维都开放了,想用什么软件看什么源码都行,深深感受到了软件世界里的自由!具体请看《Linux Mint 17一周使用体验》。
在辗转试用了各种文本编辑器后,终于不用再“漂泊”。Sublime Text几乎满足了我的各种需要,各种语言的开发、代码库管理以及下面要提到的文章编写。具体请看《Sublime Text 3下C/C++开发环境搭建》。
可以说是今年最重要的一项改进了!专心写作内容,减少样式和其他琐碎事情的干扰,配合上Sublime Text的编辑和Preview插件简直就是绝配!回头看看以前用Word写完粘贴到CSDN编辑器里的博文,版式简直“惨不忍睹”…… 现在有了Markdown, 写作效率和排版质量都有很大提升,md纯文本文件比doc小多了。再加上CSDN官方的大力支持,虽然渲染出来的效率不是特别漂亮,但完全可以放心使用了(在CSDN推广Markdown的征文活动中还赢了一件文化衫:)。
GitHub上涌现了不少Golang编写的开源项目,让人不得不重视这门语言。趁着研究豌豆荚Codis的机会,也顺带学习了Golang的基础语法。有些地方的确很新颖,比直接用C要方便很多,可能会是一些后台程序员的福音。但有的地方真的还是不习惯…
今年在对一些新技术做预研时,大量使用了Yahoo的YCSB测试框架。一开始还不太了解,后来熟悉了内部源码后用起来感觉得心应手。负载的操作类型和比例、产生数据的分布等等都可以配置或扩展,功能非常齐全!具体请看《YCSB性能测试工具使用》。
基于jgroups网络栈对RAFT一致性协议的实现,试用了一下还是不错的!可以看做是ZooKeeper或Etcd中一致性算法层的对应,算法背后可以连接各种内容,从简单的数据增删改查到复杂的远程操作。这也是今年一个不小的收获,可以在jgroups-raft背后做出各种分布式的小东西,而不用依赖重型的ZooKeeper服务集群。具体请看《分布式一致性协议Raft原理与实例》以及本文最后对分布式开发的一点思考。
Facebook的Thrift还是挺好用的,很方便就能立刻开始多组件以及跨语言的分布式开发,而且对枚举、集合类等数据类型支持的也不错。相比Google的Protobuf,免费提供了从序列化到RPC基础设施的一整套方案。但好像Thrift不提高更加高级的如Watcher等调用方式,同时注意最简单的TSimpleServer是单线程阻塞服务器,一个请求处理完才会接受下一个连接请求,只能用于测试。具体请看《Java程序员的现代RPC指南》。
体验了一把BDD,也许用得不是那么的标准和地道,但的确在使用过程中能有所启发。同时在Mock框架方面,还被PowerMock的强大震撼到了!private,static,final方法都能Mock,专治各种疑难杂症。而且还可直接配合Mockito或EasyMock,JUnit或TestNG等框架使用,不必完全重新学习一套新的API。
IMC是今年的主要研究方向,工作之余写了不少相关的文章,其中很多Redis的文章反响不错,看来Redis依旧是非常火的。我的Redis系列文章的访问链接如下,按内容由浅入深排序:
借着在IMC领域的学习机会,也深入思考了一下分布式系统,具体请看本文后面对分布式开发的思考。在工作多年之后能够有机会进入一个不错的研究领域是幸运的,希望未来能对IMC以及分布式系统理论有更深的研究。
今年抽了一些时间学习了火的不得了的Docker。结果Docker没有让我失望,的确是很好的东西!现在自己写一些东西也会用一下Docker,代码连同环境一起打包提交,在不同地方开发的话简直方便极了!未来还想深入学习一下Docker底层用了哪些技术。具体请看《Docker新手入门:基本用法》。
除了“一本正经”的学习路线外,当然少不了学习一些有趣的新东西来做调剂。
作为CS顶级名校CMU的教材,CSAPP里一些经典的实验都能在网上找到CMU的课件,感觉最为有趣的实验当属缓冲区溢出攻击实验。它让你当一把黑客,尝试攻击一个有安全漏洞的小程序,当你攻击成功后看到CMU的祝贺语时,也许会激动得泪流满面,哈哈!
Linux内核也是我最为感兴趣的一个领域,尽管平时并不做嵌入式开发。今年重新捡起《Orange’s:一个操作系统的实现》,但并没有完全仿造,而是参考了Orange’s和Linux 0.11两个版本的内核,自己动手实现了一个简化版的内核,最后做到了进程调度器没有做完…… 以此为主题,学习了GitHub、GDB、Make、Docker等工具的使用,了解了一个现代化的汇编或C语言项目所需的各种技术。
第一个关于分布式开发的思考就是:代码和数据。在传统软件开发中,代码和数据的含义再普通不过,代码对应应用程序,而数据呢就对应数据库。进入到分布式的世界后,看到眼花缭乱的各种后台中间件不免有些困惑,以下就简述一下我的主流中间件学习过程:
中间件就是应用程序之间的软件胶水,它专注于某一功能,从而使开发者能够集中精力开发业务系统。尽管每款产品的设计初衷和适用场景有很大不同,但我们依然可以按照代码和数据的方式划分。分布式的代码其实就是Web服务、调度任务、MR任务等等,分布式的数据呢就是分布式存储、消息队列、分布式缓存等等。这样追本溯源的去想,也许能清晰不少。
第二个思考是关于分布式开发困难的根本原因,状态管理绝对应该算一个。提到分布式系统的设计目标,我们的大脑中会立刻蹦出性能、伸缩性、可用性、扩展性、安全性等一些耳熟能详的词汇。但仔细思考会发现,其中多个目标都与状态有着千丝万缕的联系。高性能要考虑状态的并发控制,伸缩要考虑状态的一致性保证,高可用要考虑状态的备份和恢复。以开发去中心化(P2P)的分布式系统为例,关于状态管理有如下一些感悟:
今年只做了一个项目,在最近开发了一个无中心化结构的分布式中间件。由于中间了隔了一段时间没有开发具体的业务系统,所以重新上手做项目又对软件开发过程有了一些新的感悟,尤其是如何根据需求做出合理的设计,根据设计产生正确的代码。今年学习到的就是BDD(行为驱动开发),于是重新梳理一下个人对软件工程的各个步骤的理解:
要想顺利开发出软件还离不开基础设施的搭建。所以在上述软件工程进行时,可以尽早地利用公司技术资产或个人经验,提前准备好基础设施:
个人理解,不管是用BDD还是TDD,实践时脑海中都应该至少对关键技术选型、顶层架构设计和中层模块设计有了清晰的认识,而不是直接对着BRD就开始敲代码。此外,不用严格的遵守规则,有一套最适合自己的方法论也很好,你不习惯的实践规则可能确实不那么适用,也可能你的水平还不能理解和驾驭,没有关系慢慢来,不用硬着头皮全盘接受,最后搞得一点写代码的心情都没有了。
现在感觉到软件开发过程就像是下棋,最重要的就是掌控力。如果说前期设计靠的是对业务和技术的理解和经验,那么真正开始着手去做时靠的就是对代码的掌控。在高速开发中,在很多地方都可以“点到即止”,按照整体的设计掌控住细节,让代码去到该去的地方,后期再逐渐重构做到彻底。
总结过后,发现了自己技术路线外的一些盲区,也可以说是欠下的“债务”:
2015的总结就到这里了,2016还有更大的挑战!继续加油,珍惜每一分每一秒!