2015年立刻就要过去了,匆匆忙忙地又是一年。回头总结整理,发现这一年还挺充实的。在正常上班工做之余,学习到了很多新东西,不由感到很欣慰!一个多月前就开始写,终于赶在2016年来临以前写完了这篇文章…… 关于本文,尽管叫作流水帐,可是出于程序员条理性的“强迫症”,仍是进行系统分类,分类方法参照Thoughtworks技术雷达的Tecniques、Languages & Frameworks、Tools、Platforms,将其中的Tecniques改成理论。前端
从今年开始逐渐的深刻学习计算机科学的理论,继续按照本身确立的学习路线一步一步走下去。linux
算上今年此次应该已经“冲击”了两三次CSAPP了,此次的效果还算比较满意,几乎读完了厚厚的整本书,收获颇丰!从汇编语言、计算机组成原理、编译连接、系统编程,都算是系统的学习了一遍。具体学习笔记以下,其中(2)和(3)我的感受仍是整理的不错滴:程序员
今年读了几本算法书,但都是按照内容编排一块儿并行看的,都没有看完…… 同时还动手用C++刷了一些Leetcode的题目。C++虽然很是复杂,但作算法题实际上能够只用其中最核心的部分,当作加强版C,就能很快上手了。golang
这段学习中感受最大的收获就是:如何证实程序和算法的正确性,以及实现算法时,如何应对各类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几乎知足了个人各类须要,各类语言的开发、代码库管理以及下面要提到的文章编写。具体请看《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还有更大的挑战!继续加油,珍惜每一分每一秒!