菜鸟笔记
提升您的技术认知

程序员修炼必读清单(一)

阅读 : 55

1. 引言

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

1.1 关于纸质书与电子书

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

1.2 关于读书

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

2. 概述

        首先,说说什么是“程序员”。在计算机技术领域相关的技术职位根据分工不同有很多种:架构师、运维工程师、开发工程师、测试工程师,而不同岗位、不同团队使用的开发语言也不尽相同,而开发平台也有Windows、Linux、Unix(Solaris、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框架作界面而已。
对于操作系统的全面了解,还是要读一下教材式的《操作系统-精髓与设计原理》

而真正的实现,可以读一下《Orange’S:一个操作系统的实现》,“从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身,同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。”

然后就是《UNIX操作系统设计》,这本书对操作系统的原理及实现方法讲解得非常简洁、清晰,语言功底极好,必读。

        这本书有几个版本,只要记住英文的作者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协议栈,才能在工作中以不变应万变,如庖丁解牛,游刃有余。



(待续…)