一袭青衫闯帝都,回首已然四春秋。
壮志未酬心未老,抚膺身衰发已疏。

转眼间已经工作四年有余,回想刚毕业的懵懂无知,仿佛就在昨日,成长乎?徒增岁月矣。理想中的职业生涯应该是目标明确,按部就班的成长,一步一个脚印,就像游戏打怪升级一样,然而生活毕竟不是游戏,从来没有指导教程。多数时候都是盲人摸象,困苦迷茫自不待言。

因为生活中无师可询,我也曾多次求助于网络,然而多数文章都在推荐一些绝对正确的书籍来看,至于为什么看,怎么看,却罕有言语。今天写文记录下自己的技术感悟,斗胆以进阶做名,也是希望对同样迷茫的同行有所启发或共鸣。

C++的应用领域不胜枚举,我目前主要从事的是Linux 服务器的开发工作,要习得这块儿的开发技能,我以为主要有以下几个模块的知识:

1、计算机语言。

2、计算机网络。

3、操作系统。

4、数据库。

计算机语言

首先要明确一个观点,语言只是工具,没有高低贵贱之分。虽然到处都有计算机语言鄙视链的说辞,权当一笑,谁认真谁就输了。套在武侠世界里,语言算是拳脚功夫,真正重要的是内功,何为内功?窃以为编程思想是为内功。人的行为行事,无不是以思想作为指导,程序编程盖莫如是。只会拳脚而不修内功,犹如作文徒有修辞而缺乏内涵,花哨有余,嚼劲不足。熟练掌握编程思想的人,草木竹石皆可为剑,再论语言之高低,何其谬也。

因为我自己主要使用的语言是C++,所以在这里归纳总结下C++的进阶之路:

第一阶段是语法阶段:任何一门语言都有这个入门阶段,要做到一般代码都能看懂的程度。学语法的过程要了解软件的基本执行流程,你敲进去的东西,为什么会这样。往下走,是计算机操作系统,到最终的CPU指令,感兴趣的读者可以看一下《穿过计算机的迷雾》,详细解释了各种计算机硬件的工作原理,入门科普的不二之选。往上走,则是抽象封装等思想,面向对象编程,这属于编程思想的范畴。入门书籍执牛耳非《C++ primer puls》莫属,若要说其有缺点的话,那实在是太厚了。入门阶段,选书不宜太厚,《C++ primer plus》虽然细节住够仔细,内容足够全面,但是非有大毅力者不能读也。学习的过程中不要给自己设置太高的期许,入门阶段选择任意一部评分不差的大学教材即可。入门一是会写会用,二是培养兴趣。

第二阶段就要做熟练掌握C++的语法技巧,会用STL,知道每种容器的特性,什么情况下用哪种容器,STL都提供了哪些算法?熟练掌握指针的使用。会用boost更好,还需要掌握一些平台相关的接口,操作文件,简单的网络访问等等。因为C++的语言特性,不访问一些操作系统的接口基本做不出看得到的成果。C++语言语法庞杂,这个阶段可以说是漫长,《efective C++》第一条即说可以将C++看作是一个语言联邦,不要强求自己全面掌握。前文所述,语言只是工具,我们只要在需要的领域会用即可,不是非要把豆腐切成丝才可以在厨房做菜。

第三阶段要做到知其然,知其所以然。不仅要知道STL,还要知道STL容器实现的数据结构,最好能自己将这些数据结构实现一遍,毕竟纸上得来终觉浅,实践中得到的知识最为深刻。大家知道std::vector,不用操心其数据容量,可以随心所欲的添加和删除元素,但是你如果知道其底层实现是连续内存的动态数组的话,就可以对整个std::vector占据的内存做整体性的操作,在序列化时可以将整个std::vector的数据全部一次取出而不用遍历。要知道C++继承派生实现的原理,通过向实例中添加指向虚函数表指针来实现运行时多态,要知道构造函数,复制构造函数等都背着你干了些什么,知道什么时候memcpy能行的通,什么时候memcpy会奔溃。如此种种,不甚枚举。这个阶段推荐一本书《深度探索C++对象模型》,读完之后会对C++有一种全新的认识。

第四阶段就要锤炼自己的编程思想。这个阶段是建立在大量实践的基础之上的,非有一定的代码上,上来就硬啃的话,味同嚼蜡。过程式编程,面向对象编程,函数式编程,二十一种设计模式,设计的六大原则等等都是前人趟过无数坑,精心总结的内功宝典,这个阶段可看的书非常多,推荐我比较喜欢的几本《C++沉思录》,《架构整洁之道》,《设计模式》,《大话设计模式》。我目前大概也就处于这个水品,再向上会是什么阶段,在下就不敢妄言了。

计算机网络

计算机网络在后端开发中占据着相当重要的角色,因为网络于后端看来相当于前端用户的角色,是所有逻辑执行的起点,网络性能优化也是重中之重的事情,这就需要对计算机网络有非常深刻的理解。呐,接下来还是给计算机网络归纳几个学习阶段。

第一阶段还是入门阶段,熟悉各个网络接口的使用和调用,最好还能知道调用网络接口之后操作系统都为我们做了哪些事情。socket的接口不多而且比较简单,这里就不再赘述。

第二阶段要深入的理解协议的实现过程,尤其是TCP的很多实现细节,包括滑动窗体是怎么控制数据发送的,什么是快速启动,如何做的拥塞控制,还有面试很喜欢问的三次握手,四次握手。这里的很多控制算法非常值得学习,都是前人无数实践测试下得来的宝贵成果,想想在没有计算机网络之前,写带网络通信的程序还要自己控制如何往网口上写数据,控制传输的可靠性,顿时就能感觉到计算机网络的伟大。这方面可以看的书首推《TCP/IP协议详解》三册,啃完之后就可以掌握TCP/IP的方方面面。但是学习的时候不要要求完美,否则坚持会变得格外吃力,我觉得把自己感兴趣的几章看懂就行,可以点到为止,其他知识需要的时候再回来查阅即可。

第三阶段其实和第二阶段并没有明显的前后关系,这里展示了和第二阶段不同的方面,即操作系统提供的很多多路复用IO接口。为提高网络和操作系统资源的利用率,操作系统都提供了不同的网络IO复用的接口和机制,比较典型的有Linux的epoll,windows的IOCP,这就衍生出了很多知识点,epoll的两种触发模型的区别?epoll底层的实现等等。如何利用这些机制将网络IO的过程封装起来?这就是网络库所干的事情。这里最好能自己封装实现一个网络库,或者找个现场的网络库学习一番,比如libevent, Nginx等,还可以看下我写的CppNet(打个小广告)。推荐下可看的书,包括《深入刨析Nginx》,《Linux高性能服务器编程》,《Linux多线程服务器端编程》。

第四阶段那就是可以自己实现协议的水平了,此等境界自是万中无一,一般人也没有施展的机会,不过倒是可以封装一个RUDP,可靠UDP传输的库,来提高自己对计算机网络的认识。

操作系统

我们所有的开发工作都是操作系统之上的,当然也有人是做操作系统开发的,并不在此列。我们所有的代码,都要向操作系统申请资源,请求接口调用,其扮演了代码的土壤的角色。那么你真的了解这片土地吗?

操作系统为我们提供了内存访问,IPC通信,线程,进程创建的机制,我们通过操作系统提供的接口来调用这些机制,那就有两层的知识需要掌握,一是接口的使用方式,二是这些机制的优点缺点,实现原理。实话讲,我目前处于操作系统的最初级阶段,上学时候的操作系统原理早已忘完,手中的《UNIX环境高级编程》又没有啃完,在此不敢多言,以免贻笑大方。这块儿可以推荐本书《深入理解Linux内核》,我之前囫囵吞枣的过了几章,十分功力里未得一分。

数据库

所有的网络程序,无外乎前端,后端,数据库。天下三分,数据库就占一席,足以见其地位。既然地位如此之高,那知识范畴也是小孩儿没娘,说来话长。往深了说,是数据库设计,往浅了说,是SQL使用优化,往大了说,是分布式数据存储,往快了说,是NoSQL。要展开说那可是三天三夜也说不详尽,这里就对这几个方面做下简单得介绍,各个方面没有前后递进得关系。

关系性数据库,历史最悠久的磁盘数据库存储系统,在工作中接触也非常多,这块儿的知识包括SQL的优化,Schema与数据类型优化,范式,索引实现的原理,B+树B-树等等等,要记住ACID的特点。推荐学习《高性能的MySQL》。

NoSQL不像是关系性数据库,目前也没有什么实践标准,都是各玩个的章法,各有各的特点。我的建议是找一个自己感兴趣的开源数据库,深入的阅读下源码,学学大师们的编程技艺,内存型推荐Redis,可以边看《Redis设计与实现》遍对着源码来理解。持久型的推荐LevelDB,这个也是我下阶段准备学习的一个目标。

分布式存储归到这里主要是因为沾了一个存储的边儿,其实和数据库已经渐行渐远了,首先应该看下分布式存储的起源,google的《Google-File-System》论文,还有分布式里的CAP理论,一致性算法等等,这里的重头戏是分布式架构,这方面也没什么标准可以参考,可以看下《分布式服务架构》。

数据库方向很多,感觉每个点都是走马观花,未能细说。功力未到,想写的深也是有些力不从心。暂且说这些,以后有机会再拓展,记个TODO。

最后

虽然以进阶为名,写到这里感觉多少有点标题党,只是罗列了下各个模块的知识点和可以学习的书籍,也没有明确指出该怎么学习才算是进阶之路。奈何才浅笔拙,也只能到此为止了。

与诸君共勉。