2014可以算作真正意义上参加工作的第一年(虽然2013毕业,但是毕业后的半年基本是处于迷糊状态),心态上、技术上都有了一个比较大的转变。以前心态上总是比较浮躁,想着捷径啊快速什么的,现在觉得做事情,尤其是做技术得沉淀下来,慢慢积累。
工作上的事情基本是按部就班的进行,感觉没有什么想说的,但是这一年利用业余时间看了一些技术书籍,这里就按时间的顺序简单的总结一下。
- 《C++ Primer》
刚毕业的时候对于C++,嗯,基本就是学校课堂上那一点C with class的东西,以及做过几个课程设计的水平。所以选择了这本经典的大部头来学习,之前在网上看到很多人说这本书太厚读起来困难什么的,其实我觉得只要真的静下来读的话,没那么难,作者写的还是非常简单易懂的。
因为想比较系统的学习一下C++的语法,在阅读学习的时候基本上碰到不太理解的地方就会停下来敲代码实践思考一下,每一道课后习题都敲代码做了一遍。最后读完后统计了一下课后习题的练习代码都有七八千行,这个是一开始没想到的。
学习整本书的的过程大概花了2-3个月的时间,与大学课堂上学的那一点C with class相比,收获非常大。
- 《Effective C++》
读完了C++ Primer之后就寻思着读本进阶一点的书籍,于是另外一本经典的书籍自然的进入了我的视线中。这本书主要是一本谈C++经验、避免踏入各种坑的书籍,里面讲了很多非常好的经验,比如视C++为语言联邦、以对象管理资源(RAII)、尽量以传引用代替传值、尽量以组合代替继承、善用智能指针等等。个人认为。目前来说,对我最为有益和深刻的莫过于RAII了,有了它可以在一定程度上很好的避免资源泄露。当然里面也有一些经验谈目前还理解的不是太深刻,需要一定的经验后再去阅读消化了。大概用了1个半月的时间读完了这本书。
- 《Effective STL》
STL始终是C++绕不开的一个东西,可能有些人是STL洁癖,喜欢用c标准库的东西或者自己造轮子,但我个人来说还是比较喜欢STL的。因为想多了解一些使用STL的技巧、所以就买了这本书回来阅读了,这本书比较详细的介绍了使用STL时了一些需要注意的地方,比如各种容器迭代器失效的情况,比如vector和string的clear函数并没有释放空间,可以用临时对象swap的方式释放空间,比如erase、remove惯用法等等。用了将近一个月的时间来阅读这本书,读完了它后对STL的理解加深了不少。
- 《大话数据结构》
之前用了很多的业余时间学习C++方面的东西,想着大学学的数据结构也都忘的记不起多少了,于是在豆瓣上找了一本评价还不错的书买回来学习了。其实开始的时候是准备学习算法导论的,大概看了前面二三十页,对里面一些数学证明读起来比较吃力,orz。所以就换了本稍微简单易懂点的。
其实这本书我到没有非常仔细的阅读、基本是对书上介绍的每一种数据结构和算法的概念和思想读完理解一下,然后就自己用C++实现敲代码去了。
主要涉及到了线性表、栈、队列、串(暴力匹配、KMP)、二叉树(平衡二叉树树、红黑树、霍夫曼树),图的算法(BFS、DFS、最小生成树、prim、kruskal、dijkstra、floyd、拓扑排序、关键路径)以及各种排序算法(冒泡排序、简单排序、插入排序、希尔排序、堆排序、归并排序、快速排序)。主要是将这些数据结构和算法自己用C++实现了一遍,但是并没有去做一些题目、根据不同的情况来选用、综合这些基本算法。时间一长还是容易忘记,比如在我写下这篇blog的时候,上面的一些算法只能说出基本的思想和思路,要实际手写的话估计还是得费劲想或者再看书熟悉熟悉才行。不过我觉得另一方面的好处是知道这些算法的思想、用途以及时间复杂度,在日常编程中,可以根据情况选用更有效率的标准库算法,在使用各种容器的时候,知道其底层模型是什么、怎么实现的、用起来也更加自如了。
- 《深入理解计算机系统》 又名《CSAPP》
之前在知乎上看到很多大牛推荐这本书,比如老赵在老赵书托系列中就推荐了这本书,所以本着学习瞻仰的目的就买来了这本书学习了,啊哈哈哈。
首先第一章计算机漫游总体介绍了计算机的从硬件到软件的基本组成和架构,第一次让我的脑海里对计算机的整体模型有了一个基本的认识。后面第二章紧接着介绍了计算机数据的二进制表示,虽然在学校的计算机组成原理这门课上学习了一点这些东西,那时候上课也没怎么认真听(现在想想估计光想着哪个妹子和怎么玩wow去了,orz),比如数据的上溢下溢,数据截断等等都是非常有用的东西。
第三章作者用短短100页左右的时间将基本的IA32和x86-64汇编介绍了一遍,读完之后不说能写多好的汇编程序,起码能看懂不少编译器编译的汇编代码,这不仅debug的时候是很有用的,也对理解一些编程语言的机制比较有用,比如通过了解汇编就纠正了之前学C++时候的一个错误的观点,以为pass by reference一定比pass bay value有效,其实当pass value时候数据位的大小没有超过寄存器的一次读取数据的位数上限的话,pass by value实际上会通过pass by register,这样就更加有效率了。同时也知道了临时变量大多时候是存放在寄存器中,对临时变量的理解也更深刻了一些。
第四章依次介绍了处理器的体系结构,包括简单的指令集、流水线结构、分支预测、转发机制等等。第五章介绍了一下程序优化的技巧,例如循环展开、积累变量、减少存储器引用、等技巧都是非常有用的,虽然现代编译器的优化能力非常强大,但是在必要的时候我也是可以通过这些手段去尝试着测试、优化、提高效率的。第六章介绍了存储器的结构、数据存储加载的基本方式以及缓存命中/未命中、数据局部性对程序性能的影响等等。虽然这些底层的东西可能对我们上层的程序编写来说,表面上没有关联,但我个人认为知道一些基本的底层知识能更好的写出对底层机制更亲和的代码。
后面还介绍了异常控制流引申出了操作系统内核和用户态的切换,进程,线程,网络编程,IO等许多东西,这里就不再赘述了。一共花了2个月的时间来阅读这本书、并动手做了每节的课后习题,但是每章的家庭作业并没有做,准备读第二遍的时候把它们做了。
这本书非常好,也不枉许多大牛的推荐,由于书中介绍了知识概念很多,时间一久细节的东西比较容易忘记,有时候需要经常翻出来查找某些概念和知识。
- 《深度探索C++对象模型》
由于读完了CSAPP后对底层比较感兴趣,就搞到了这本书想了解一些C++底层的实现机制,以及编译器在背后做了哪些事情。这本书也花了一个多月的时间来阅读,里面讲解了很多有趣的东西,比如在C++Primer中说的当我们没有为一个类定义构造函数的时候,编译器会自动合成一个默认构造函数,但是读了这本书后才明白,其实编译器这个坏家伙在背后并不一定会合成默认构造函数,例如当这个类的数据成员是内置类型的时候,编译器就神马都不做。C++标准中把这种构造函数叫做trival构造函数、对于trivial默认构造函数编译器是不会合成的,编译器只会合成non-trivial构造函数。再比如多态、虚函数的实现机制、运行时类型识别的实现机制等等。里面很有很多这样有意思的东西。
另外也花了不少业余时间也研究了多线程C++开源网络库muduo的源码、学习陈硕老师的网络编程思想以及代码风格等等。
2015年的展望。希望2015年在技术上有所积累、提升一个档次,主要有三个方面:一方面计划在15年抽空学一门函数式编程语言,比如lisp或者haskell,了解一下另一种范式的语言,开开眼界;另一方面也想系统的学习一下python,了解这这一门动态语言的设计思想,因为目前只是在工作中偶尔用python写写工具脚本,谈不上熟悉,总的来说我比较喜欢C++,但是也想多了解了解不同的语言,熟悉多种范式和内在的语言设计思想;最后,希望在网络编程、多线程方面的技巧、思想有所提升,操作系统、协议栈上的机制有所了解和理解。
(完)