计算机软件后端技术知识体系

臧克家在其诗中说:“有的人活着,他已经死了;有的人死了,他还活着。”
在IT行业有这么一种现象,有的人工作十几年了,仍然是一线程序员,每天还是做着编码和解决Bug的工作。在技术积累上与工作两三年的程序员毫无差异。而有的人工作才三五年,却已经具备架构师的能力。
11.png

同样为人,却有非常大的差异。有些人确定差异在智商,在家境,在机遇。但是如果我们分析一下,前面这些隐私这的能够觉得一个人吗?可能会有影响,但并非绝对吧。我们看看清华北大的生源就清楚了,来自贫困地区和贫困家庭的生源占了不小的比例。

个体的能力差异在哪

那二者的差异在哪里?本号以为差异在思考问题的方式。思维决定行为,行为决定结果。正是因为他们的思维方式的差异,才导致了结果有如此之大的差异。先看看普通人的思维方式,他们通常处于焦虑和没有深度思考的状态。记得刚毕业的时候,大家讨论的最多的问题是程序员30后怎么办?而今天大家讨论的最多的问题是程序员35岁之后该怎么办。他们只知道焦虑,却不考虑问题的根源和解决问题的方法。

如果我们深入思考一下就会发现。诚然,在行业内可能确实存在一些公司有年龄歧视的问题。但是,他们歧视的本质其实并非年龄,而是能力,或者说你所具备能力的不足。举个极端的例子,你觉得吴恩达或者陆奇会失业吗?你可能会反驳道:“那些人都是行业领袖,怎么会失业呢,我们普通人怎么可能达到那个层次!”但是我们要知道,能养得起吴恩达和陆奇的公司也不多。世界上还有数以万计的普通中小公司存在。结论很清楚,大部分IT企业在人才选用方面首先要考虑的问题肯定是能力问题,也就是其能力能否胜任其岗位要求。当然,这个能力要求自然是要与其年龄有一定的匹配度,一个工作十几年的人还只会基本的开发和调试,相信大部分公司都不会考虑。

思维方式是根因,然后就是行动了。有些人也在非常刻苦的学习,但收效甚微。有些人天天在加班,工作时间比其他人每天多出两三个小时。但是,个人能力方面并没有明显的优势,甚至还不如某些不加班的同时,绩效方便也是不尽如人意。因此,这里说的行动并不是简单的努力,而是有方法的努力。一万小时是成功的必要条件,但并不是充分必要条件。

11.png

有些人觉得可能是智商的原因吧。其实本号认为智商并非最主要的原因。有些人可能不以为然,觉得人的智商是有差距的。不可能每个人都能成为吴恩达和李飞飞这样的人。智商有差距不假,但智商的差距并不能导致结果差异如此之大。正如安德斯·艾利克森在《刻意练习》中所描述的那样,通过有方法有目的的练习(刻意练习),一个普通人记忆随机数字的能力可以从七八位提升到数百位。估计对于记忆数百位随机数字的事情,大多数人的第一反应是觉得不可能,或者是天才。实际试验的结果并不是这样,而是告诉我们,通过刻意的联系就可以做到。作者统计了小提琴等普通人认为需要天分领域的数据发现,越是优秀的人在相关领域投入的练习时间越多。也就是说,天赋的影响因素有多大不清楚,但即使你是天才,也是需要投入大量练习才行的。

构建自己的知识体系

如果大家认可前面的内容,那就继续后面的内容。本号以为作为技术人最主要的是构建自己的知识体系(大厦)。这里的知识体系不仅仅是技术知识,还包括很多非技术知识和能力。第一,要将自己的专业知识构建成体系;也就是由点串成线,由线织成面,再由面构成体;第二则是要提升自己的可迁移的能力(更多细节请参考《远见》)。

我们先说可迁移的能力,比如解决问题的能力。大家觉得自己这方面的能力如何?我们举一个简单的例子,假设你所维护的系统代码很大,有一个Bug是内存泄漏的Bug。泄漏的量大概在每天6-9MB的样子,业务是在线业务。现在领导让你尽快(比如3天内)解决这个问题,你怎么解决?

如果对于一个解决问题不佳的程序员,可能就埋头开始干了。先用工具检测,然后走查代码,或者问同事。解决可能是3天到了,问题还没有任何头绪。

如果稍微有点经验的同学都比较清楚,内存泄漏问题解决难度是比较大的。虽然有一些内存泄漏检测工具,但对于复杂的系统这些工具有的时候很难起到作用。由于代码规模比较大,很难一下子定位内存泄漏的具体位置。因此,如果说尽快解决问题几乎是不太可能的事情。

如果我们再分析一下呢?每天泄漏6-9MB,似乎泄漏的量并不太大。然后再考虑一下,具体的业务是否为7*24小时的。因为大部分业务其实晚上,特别是凌晨后基本上没什么人访问。那我们是不是可以每个一周在凌晨三四点重启一下业务就行?这时,它就可以调查这些事情,然后跟领导讨论解决方案的可行性。如果这种方式可以,那他就可以不用着急了,可以先写一个重启脚本把问题解决,然后再分析内存泄漏的根因。

所以说,有的时候问题并不是你看到的问题,这种能力是很重要的。

再回到技术知识体系上来。有些同学工作十几年了,网络相关的代码也写了不少。但仅仅停留在socket接口的调用,却不知道什么是select和epoll。这说明什么问题?这部分很清楚,我们就不介绍了。

为此,本号希望构建一个关于计算机后端技术的知识体系,这样一方面可以方便大家梳理自己的知识体系,另外一方面也是为了更加方便的查漏补缺,了解自己知识的不足。整个知识体系的总图如下图所示。由于篇幅的问题,这里面只是最主要的内容,点击里面的超级链接(参考图中 数据结构与算法 后面的符号)可以进入下一级脑图。最终每个知识点会有一篇文章详细的介绍相关内容。

后端开发知识体系数据结构与算法数据结构算法Linux操作系统Linux操作系统使用Linux内核原理存储子系统文件系统磁盘系统内存子系统网络子系统网络技术TCP/IP协议族RPC协议HTTP协议开源存储系统CephRedisLevelDBRocksDBSQLite读书技术书籍非技术书籍开发调试工具GCCGDBGit分布式原理技术RPC通信分布式协议编程语言与库编程语言系统和第三方库数据库技术基本使用内部原理通用技能可迁移的能力解决问题的能力说服式沟通技巧完成任务的能力帮助和求助的能力学会呼吸情商如何与别人进行眼神交流和握手检索信息英语写作

现在您看到的仅仅是初版,后续我们会不断的充实完善。在这个知识大厦中并没有非常高深的知识,而大多数都是非常基础的知识,比如算法、操作系统、数据库和网络等等。但是本号期望的是能够将这些普通的知识构建成为一个网络,并能够将这些知识用于实践。孔子说:“学而时习之,不亦说乎”,是啊,如果能够学习这些知识,并在自己日常开发实践中使用,那将是非常开心的事情