优秀程序员修炼必读清单

1. 引言

我的本科专业是自动化,博士专业是控制理论与控制工程,可现在是在做大数据,虽说自动化离不开计算机,与计算机专业有很多课程重叠,应该算是紧密相关专业,可毕竟不是”计算机科学与技术“、”软件工程“等计算机科本专业出身,经常还自嘲自己是“不务正业”,可回头又想起来自己也是辅修了计算机科学与技术专业的,拿了辅修证,而这个我毕业的第二年再辅助这个课程就改成第二学位证了,是不是也可以算作课班出身?本来高考是想报计算机专业的,阴差阳错上了自动化也不错,控制系统的思想一直在工作中受益匪浅。
所以计算机主要是靠自学,之前走过很多弯路,希望总结一下自己学习过程中的一些心得希望对后来者有所帮助,少走一些弯路。

1.1 关于纸质书与电子书

由于纸质书比较贵,确实比较贵,但买纸质书还是必要的,纸质书除了价格比较贵(相比免费的PDF版),几乎没的其它缺点,个人总结的许多优点,供参考:
1) 携带方便
        很多人可能以为这是电子书的强项,一个U盘可以存放并随时迭代这一辈子看过和将要看的快,但你怎么看呢?手机、Kindle是可以带,可是在飞机起飞、降落的时候电子设备是要关闭的,可纸质书可以随时翻阅。
2)搜索方便
        当然,纸质的有搜索引擎,看似方便,可是对于看过的书,大概页码和位置都差不多记得,再加上自己划出的重点,很快就可以找到自己想要的内容,因为有时想要找的东西想不出是什么词,而只记得在某本书的大概什么位置(你可以留意下,人的形象记忆,其实是要比文字记忆强太多倍了)。
4) 复习方便
        是的,本文中提到的书都是值得买的,值得不止一次地读,温故而知新,做自己的老师。
5)不伤眼睛
        电纸书也很好,毕竟还不是纸书。
6)感觉
        是的,任何电子设备都没的书的感觉,那种说不出的感觉,还有看完书之后将好书收藏起来,搬家时那深甸甸的感觉。

1.2 关于读书

        我有个习惯,面试时喜欢问一个人看什么书,从TA看的书就能判断,TA是不是想要找的那个人。记得几年前一次面试,问一个问题时,得到的回答是“百度一下就知道了”,没有自己的思路,没有自己的判断,百度不是万能的,尤其是你最无助的时候,越困难的时候,百度越帮不上忙,靠的必须是百度“厚积薄发”,所以读书是必要的。
        是精读还是泛读,取决于读一本书的目的,软件开发需要很大的知识量,所有书都精度也是不现实的,心可能做到理解,而对一些重要的内容,或者是项目中需要的内容精度当然是必要的。但必须要指出的是,无论是精读还是泛读,一定把书读完,哪怕翻快点儿也要把一本书翻完,知识书里讲了哪些内容,讲到什么程度,一旦遇到书中内容涵盖的问题,到少要能够想到它,再回来细读。
        英文版还是中文版?如果有条件还是读英文版,中文版不太容易看懂,确实有些书翻译得看着比较难受,还不如英文版易懂,顺便还可以学习英语,本人的英语CET6就是看了几年英文计算机技术书之后,在毕业前半年祼考过的。人家欧美在计算机方面绝对的领先,好好学英语对学习计算机还是非常有用的,很多新的技术或软件框架的文档都是英文版,要想保持技术的领先,英文将是绕不过去的坎儿,读多了也就习惯了,尤其是技术书籍,都是说明文,除了技术术语都是很简单的句子。

2. 概述

        首先,说什么是“程序员”,因为在计算机技术领域相关的技术职位有很多:架构师、运维工程师、开发工程师、测试工程师,而不同岗位、不同团队使用的开发语言也不尽相同,而开发平台也有Windows、Linux、Unix(Soloris、HP-UX、AIX居多)、Mac OS、Android、iOS等。只要写代码的都应该叫程序员,即使是运维工程量也要用Shell、Python、Perl等语言写一些自动化的脚本,哪怕是DBA如果用SQL写个复杂的存储过程,也不其它语言的复杂性,所以我这里的程序员泛指所有的计算机技术工作者。
        什么是“优秀程序员”呢?因为评价一个程序是否优秀不能只从知识、技术方面评价,而这里谈的“优秀”仅限于知识、技术方面,“优秀程序员”是一个抽象了的,相对理想的技术工作者,不依赖于任何一个操作系统平台,不依赖于任何一种或一个类型的开发语言。这里的不依赖,可以看作是全部理解,至少是了解,其深度视工作经历而不同。然而,优秀程序员应该有共同的理想:选择最合适的技术,以最低的成本,保质、保量、按时、高效完成一个软件开发部署项目。所以,本文中在安排知识点时不分编程语言,不分技术平台,只谈技术本身,不同语言与不台只是技术的一个方面,其区别本身也是知识点。
        本文从基础知识、编程语言、软件工程、领域软件等四部分内容总结之前本人读过的认为比较经典的书,以及读书的心得以供参考基础知识主要包括操作系统、网络、安全等;编程语言主要介绍几种常用编程语言的相关书籍;软件工程涉及软件设计、架构、项目管理等;领域软件即大数据、人工智能、大数据、云计算等。
        本文主要介绍课程外的内容,因为各学校各课程设置不同,在校学习的课程也不尽相同,有些书也可能已经被一些高效当作教材了。当然,还有很多更好的书,由于时间、精力有限,没有读过,或者没有读懂的也欢迎网友补充。

3. 基础知识

3.1 概述

        上学时,老师就在讲一个概念,什么叫“软件”、“程序”,给我们讲两个公式:

程序 = 数据结构 + 算法
软件 = 程序 + 文档

        而依我来看,这里的+号要改一下,改成乘号,乘号足以表示数据结构与算法结合的重要性,而不是简单的堆叠;另外,在大数据时代、人工智能时代(这个词儿用得有些滥,但比大家比较容易理解,说实话我很不喜欢,这里还是可以借用一下),软件的内容其实发生了很大的变化,“数据”依然成为软件不可或缺的一部分,甚至在某些软件中成为了主要部分,比如大数据公司、人工智能公司的核心都在于数据(包括模型),所以新的公式应该写为:

程序 = 数据结构 * 算法
软件 = 数据 + 程序 + 文档

        另外,要指出的是,这里的“文档”,不仅仅指的是帮助文档、项目文档,其形式也不限限于HTML、WORD、Excel,而其实代码本身也是文档的一部分,元数据本身也是文档的一部分,每一行代码,每一个变量、字段、函数名都是文档的一部分,亦即“代码即文档”。
关于软件的更多内容,请读【美】史蒂夫·迈克康奈尔《代码大全(第2版)》。
软件构建的百科全书
        这是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题,并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念,还含有丰富而典型的程序示例。这本书中所论述的技术不仅填补了初级与高级编程技术之间的空白,而且也为程序员们提供了一个有关编程技巧的信息来源。(豆瓣)

3.2 核心技术

        IT界有两个核心技术,一直到现在我国还比较落后,那就是硬件中的芯片技术和软件中的操作系统。对于程序员来讲,无疑最核心的技术就是操作系统了。所以,无论用什么语言,首先要学习的必须是操作系统,虽然不同的操作系统各有差别,但主要是两派,即Unix/Linux系和Windows系,除了Windows,其它的操作系统几乎都属于Unix/Linux系的,包括MacOS、iOS和Android。Android无非是在对Linux裁减之后又加了个Java框架作界面而已。了解操作系统必读:
在这里插入图片描述
        这本书有几个版本,只要记住英文的作者Maurice J. Bach,可能翻译的水平不一样,下面这本是最新的。
在这里插入图片描述        新版的我也没读过,都是大厂出的,应该都没问题。
再想深入理解Linux的设计,要读下《深入理解Linux内核》,对Linux内核中的各种实现原理讲解比较细致、清楚。
在这里插入图片描述
有兴趣也可以读读Linux的源码,当然对C语言要熟悉。有本书专门讲Linux源码,国人写的,还是不错,有志者可读一下。
在这里插入图片描述
虽然Linux的版本有了很多变化,但其实最核心的内容变化并不大,这些以不变应万变的知识、技术才是真正的技术,胜过多学几门编程语言,因为编程语言本身就好比是英语、日语,只是一个工具,而不是技术。
再深入理解Unix/Linux就得了解一下它们的API,必读《Unix环境高级编程》:
在这里插入图片描述

对于Windows的理解,可以读一下《Windows核心编程》。C语言基本都是学过的,不太懂也没关系,可以理解下Windows操作系统提供的各种与操作系统交互的接口即Win32 API。如果真要开发,还是要参考MSDN,文档这方面MSDN做的真是全宇宙最好的,没有之一(至少我没见过)。对于用到的章节,MSDN可以当成教材一读。
在这里插入图片描述

3.3 网络

除了操作系统,对程序最重要的核心知识和技术就是网络,网络基础在学校应该都是学过的,对一程序员来讲,最重要的就是TCP/IP协议栈了,RESTful规范的日趋成熟与普及,HTTP已经成为了各类应用的首选传输协议,对TCP/IP协议栈的理解,是设计、开发任何一个复杂系统都必不可少的。《TCP/IP详解》必读,分三卷,都应该好好读一遍。只有深入理解了网络,理解了TCP/IP协议栈,才能在工作中以不变应万变,如庖丁解牛,游刃有余。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(待续…)

发布了311 篇原创文章 · 获赞 225 · 访问量 84万+

猜你喜欢

转载自blog.csdn.net/Nocky/article/details/104887048