浅谈计算机&编程发展路线——自顶向下脱发方法

2019-12-29
21分钟阅读时长
Featured Image

很多年轻人打算搞IT,问要看什么书,以下是比较专业的回答:

第一阶段:《数据结构》《C语言》《C++》《C#》《PHP》《Java》《设计模式》《框架》 第二阶段:《莫生气》《佛教》《道》《思想与政治》《论持久战》 第三阶段:《脊椎匡扶指南》《腰间盘突出康复指南》《心脏病的预防与防止》《高血压降压宝典》《强迫症的自我恢复》 第四阶段:《迷恋》《谢谢你折磨我》《自私与贪婪》《走向奴役之路》《精神变态日记》 第五阶段:《活着》 第六阶段:《棺材的质量与选材》《墓地的风水与选择》《死后的思想》 第七阶段:《中国传统丧葬礼仪概述》 第八阶段:《论投胎的方法与技巧》 第十阶段:《论出生后如何不成为程序员》

你可能很疑惑,为什么没有第九阶段。别问,问就是喝孟婆汤忘记了。

规划的原则——因材施教

我想从一个经典的知乎问题开始讲起:计算机专业有哪些必读的书籍/计算机专业应该如何提升自己。

关于这个问题,可谓是仁者见仁,智者见智。

常言道,一千个人眼中有一千个哈姆莱特;常言又道,一千个人心中有一千部红楼梦;据此类比推出:常言还道,一千个人脑海里有一千种书单。

想要笼统而概括地论述计算机专业&编程专业的发展路线,其实不是一件容易的事情。我的观点是:因材施教。每个刚刚接触计算机或者接触编程的青年,都应该对自己未来的发展有明确的认识,应该广泛了解各方面的知识,然后在这个基础上,选择自己适宜的发展方向,并规划自己的发展路线。

首先我们来看下一般大学的科班——计算机科学与技术的课程表:数字电路原理、模拟电子技术、数字逻辑、数值分析、计算机组成原理、微型计算机技术、计算机网络、高级语言(C++、Java)、汇编语言、数据结构、操作系统原理、数据库原理、编译原理、计算机图形学、离散数学、概率统计、线性代数以及算法设计与分析、面向对象程序设计。

  1. 高数,概率,线代,复变,离散数学等基础学科,打下了 逻辑思考的基础,以及工作中需要使用到复杂的数学运算时的数学基础。使人更加易于理解和分析如何吧现实问题转化为程序逻辑并实现。

  2. 模电主要让人明白信号传递的原理同时又作为数字电路的基础,而数电主要让人明白计算机内部数据到底是如何存储,如何运算,如何传输的。

  3. 计算机组成原理,微机原理等,主要是来解释计算机是如何组成的,早期是什么样子的,发展历程是什么,为什么会有这样的发展,现在的计算机的复杂结构下的简单核心是什么?

  4. 操作系统则真正讲述了,一个应用程序是如何层层传递,调用了最终硬件的;操作系统,驱动,应用程序,分别都是什么关系;cpu的运算方式是什么样子的;为什么要有多线程;为什么会有死锁;在多线程的模型下,硬件到底在做什么。

  5. 计算机网络,让人明白在计算机的基础之上,到底是如何传输数据的。OSI七层模型和TCP/IP协议五层模型分别有哪些层;每一层在做什么;为什么RFC的各种协议里会有那么多奇奇怪怪的头和尾;各种不同的协议是怎么产生和怎么发展的;分别有什么特色;以及我们为什么在某一种场景下使用某一种网络协议;假如我们需要一个自己的协议,该如何构建。

  6. 数据结构,让人明白数据是如何存储的,目前常见的存储的模型有那些?这些模型在内存里以什么样的方式存储?这些存储方式都有什么优劣?在那些场景中最为适用?

  7. 编译原理,让人明白高级语言到底是怎么被解释编译成机器语言的。

  8. 汇编语言,让人明白在接近硬件的层面上,程序到底是怎么运作的。去理解去思考,我们的操作和编写的程序,对硬件到底做了什么。不同的操作系统,不同的编译器,不同的写法,不同的逻辑,在硬件层面上,会有什么样的不同?

  9. 算法和高级语言,一般来讲,到这个层面往上,非科班和科班的差距开始变小。因为大部分人在实用性的学习过程中。必须来学习和接触到高级语言和算法。

综上所述,计算机的基础,不是你会什么C、C++、C#、Java、python、PHP、Object-c这样的语言;也不是你学了多少linux,Win32,IOS,Android,MFC,.net,Apache,Struts,Spring这样的框架;更不是你会Oracle,MySQL,SQL server这样数据库的使用;而是你是否明白,从最基础的电路和电讯号传递开始,到今天的计算机体系的大厦,是如何一步步构建出来的,每一步的取舍都是为了什么

大部分的人,要么是半路出家,上了几个编程培训班而自以为技术成熟,要么是非科班出生,对科班这一整套课程体系不屑一顾。诚然,直接从高级语言和算法开始学起,可以做到知其然,并且熟练的编程,设计生产出非常优秀的应用。但是如果知其所以然,那么就可以做得更好,在出现新东西的时候,能够更快的去理解这些新东西的缘由,发展和价值。

我劝各位想要接触计算机行业的初学者——当然我本人也不过是初学者而已——不要学了一点皮毛就沾沾自喜。今天我们之所以不用去了解那么多基础,就可以从事这个行业,正是因为无数前人帮助我们构建了一个相当完善的知识体系,在这个基础上,我们可以轻松的去学习,去操作。但我们的梦想就仅此而已了吗?我们该如何往前进一步的去推进呢?在工作学习的过程中,进步远非是要学习怎么做那样简单,更要多问问为什么。只有这样才能走的更高,更远。

参考书单——循序渐进

我想基于我刚才提到内容的基础,结合我之前参考的很多知乎、微博和Bilibili上从事程序设计、软件架构、前端后端开发的工程师的经验和建议,以及科研工作者对计算机学习的规划与指导,谈谈我的一点浅薄之见——计算机初学者应该怎样发展自己的计算机学习。

如果真真正正是零基础开始学习计算机,我的建议是需要注重兴趣,但是不能永远以兴趣为由放弃基础知识的学习。如果不能适应计算机底层的枯燥知识,最好是直接转行,不要继续待在计算机行业里。

计算机学习的最开始,当然是需要对计算机整体有个清晰的把握,然后一面深究计算机底层层面,一面发展高级语言层面。按照这个思路,我提供如下的书单,以供参考。

底层原理

  1. 数字电路与模拟电路。

    数字逻辑电路(南理工)

    数字电路绝对是完全被低估的一门计算机基础课,我在大学期间就没有严肃地对待这门课,这导致我只了解基本的逻辑门电路,对更高级的知识知之甚少。由于有关数字电路的书籍很难找得到出众的,故这里只推荐中国大学MOOC上的公开课。

    模拟电路大体同上,在中国大学MOOC上搜索即可。

  2. 计算机组成原理

    1. 《大话处理器》

    2. CODE: The Hidden Language of Computer Hardware and Software

      《编码:隐匿在计算机软硬件背后的语言》

    3. 《穿越计算机的迷雾》

    4. Computer Systems: A Programmer’s Perspective

      《深入理解计算机系统》

    5. Structure and Interpretation of Computer Programs

      《计算机程序的构造和解释》

    首先推荐的两本都是比较通俗易懂的书,这两本书都偏科普一些,阅读起来相当轻松,非常具有趣味性,是入门的上佳选择,如同看小说一般过一遍即可;另一本穿越计算机的迷雾目前已经绝版了,不过它的内容也是不错的,网络上可以搜索一下相关资源。

    第三第四本是需要重点介绍的正规教材:

    《深入理解计算机系统》 它从程序员的视角详细阐述了计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。

    《计算机程序的构造和解释》讲的是从数据抽象、过程抽象、迭代、高阶函数等编程和控制系统复杂性的思想,到数据结构和算法,到编译器/解释器、编程语言设计。

    计算机组成原理很好地向我们阐述了计算机如何工作,如何计算和输出我们想要的数据的。由于本门课还是大部分大学的考研科目,所以各个大学都会有一些公开课视频,可以自行查找。

  3. 汇编语言

    《汇编语言(第2版)》(王爽著)

    汇编语言是一门相对比较难并且比较抽象的课程,但是却可以方便地进行实操,就像学习编程一样,可以实际运行书中的一些代码。

  4. 计算机操作系统

    1. Linux操作系统入门

      1. 《典藏大系-Linux从入门到精通》
      2. 《鸟哥的Linux私房菜》
    2. 操作系统原理详解

      Modern Operating System《现代操作系统》

    3. Linux环境编程及内核分析(必须先修C/C++语言后再读)

      1. 《UNIX环境高级编程》
      2. 《Linux程序设计》
      3. 《Linux内核设计与实现》

    计算机操作系统和计算机组成原理一样是考研课程。首先推荐的两本是科班所教授的Linux操作系统基础知识(当然Linux不属于考研范畴之内)为后面的Linux环境编程打下基础。

    《现代操作系统》是相当经典非常需要读的一本书,《UNIX环境高级编程》相比之不遑多让,这本书之经典,三言两语无法说清。之所以推荐第二本,还有一个原因就是该书是基于UNIX的,UNIX/Linux在服务器中的重要性和广泛应用我相信不必强调。 第四本较之第三本略逊一筹,参考价值也很大。

    至于第五本,则是在当你对操作系统有一定理解以后阅读,它将为你打开学习Linux内核的大门,当然在此之前你得有一定的C语言开发能力,以及对Linux的了解。

  5. 计算机编译原理

    1. 《编译原理 (原理、技术、工具)》(龙书)
    2. 《现代编译原理》(虎书)
    3. Advanced COMPILER DESIGN IMPLEMENTATION (鲸书)

    很多编程学习者都并不是很清楚编译时到底发生了什么事情,什么是编译期什么是运行期相信有些人还是一知半解,编译原理就是告诉我们高级语言是如何一步一步地被转化为低级语言,最终在计算机上运行的。

    编译原理的学习分为三大阶段,龙书阶段考虑原理、技术和工具;虎书阶段考虑技术实现和实践;鲸书阶段考虑知识的前瞻和增广扩充。

  6. 离散数学

    《离散数学及其应用》

    离散数学个人认为对于计算机学生而言是非常重要的一门课,可惜的是我在本科期间对计算机的认知不够,导致在学习这门课的时候只是把它当成一门数学来学习,并且也没有花费太多的时间以及精力,相信对于大部分计算机专业的学生来说也是这样的。

    不过我认为如果有时间和精力,一定要重新学习这门课,因为日后的编程与离散数学的逻辑是紧密相连,不可分割的。

  7. 计算机网络

    1. 《图解HTTP》(兴趣阅读)
    2. 《网络是怎样连接的》(兴趣阅读)
    3. ※《计算机网络——自顶向下方法》
    4. ※《TCP/IP详解》
    5. ※《UNIX网络编程》

    计算机网络的原理认知对日后的发展有非常大的帮助,非常典型的例子就是分布式系统。对于计算机网络的学习,我认为可以分为两个阶段,第一阶段是快速地把两本兴趣阅读的读物给过一遍,建立起对网络的认知,然后迅速地进入第二阶段,精心研读第三、四两本史诗级巨著;最后一本讲解了Unix内核是如何实现网络通信的,其中涉及到很多网络,操作系统的知识,并且你要熟悉c语言。它也是被奉为网络编程神书的存在。

  8. 高级语言的学习

    这一节实在是太重要了,重要到必须另起一阶段,详细地阐述。

高级语言

高级语言大体上使用率高的基本上有:C++、Java、Python、Go、JavaScript等等,分述如下:

C++

如何学好C++?唯一的办法就是读书,读大量的书,才可以学好。

要把C++作为日常语言,而不是一种程序语言,这样才更容易掌握。

检验大家C语言学的好不好的两个最重要的指标,一是指针,二是内存管理。

基本上中国大学的计算机专业都会把C++当作第一门语言课,C++相对其它语言来说,入门上手会相对比较难,可能会打消掉一部分同学的积极性。但是C++又是一门可以进行类比的语言,C++学习到一定程度后,学习其他语言也会变得非常容易。(关于这个观点存在一些争议,如果确实对C++并不看好,可以从java开始,不必要非得学习C++)

学任何东西其实都有一个学习曲线,只要沉下心去学,多花点时间,总会跨过那个曲线,后面学习过程就会变得很平滑。学C++也类似,不要知难而退,而是要迎难而上,翻过大山也许就能看到彩虹。

  1. 入门书籍:

    The C++ Programming Language (Bjarne Stroustrup)

    C++之父的经典之作,无论如何也应该读个四五遍!这是一切C++的书本的源泉。推荐英文版,如果英文不好再看中文版,此书由浅入深,知识全面,代码具有代表性。如果把书上的代码都上机打一遍,C++绝对入门了。

  2. 进阶阶段1:

    1. Essential C++
    2. C++ Primer Plus
    3. C++ Primer

    后两本书都可以精读,其中第二本虽然比第三本多一个Plus,但其实第二本书更加基础一些,涵盖的内容也没有第三本广泛。C++ Primer的体量非常巨大,故此一定要品味第二、三本。可以先从*Essential C++*开始,它将四个C++的范型都讲了,而且讲得非常清楚。当然,也有一部分人一直认为C++Primer带着太过强烈的C的痕迹,对于学习C++未必是好事。读者需要先读这本巨著,然后再作判断。

  3. 进阶阶段2:

    1. Thinking in C++ (Bruce Eckel著、候捷译)

      这本书每过半年建议重读一遍。可以说每一章都是写得发人深省的,这本书可以让人感受到技术运用的高超境界,语言非常平实,只要认真地读,即使基础不行,也一定可以懂。

    2. Effective C++

    3. More Effective C++

      要更上一层的话,就要慢一步,先要把握C++设计习惯的良好。这是Scott Meyers的*Effective C++More Effective C++*带给我们的无尽收益。这两本书是真正的经典,作者对C++的纯熟,使得语言的风格非常具有魅力,虽然C++本身并不十分有趣,但书读起来却甘之如饴,就像他站在对面在讲课。

    如果你已经深刻地理解了Effective C++More EffectiveC++,那你可以发现,你在众人中已经是鸡群之鹤。可以指导项目运作了,可以编写一切你想做的程序了,可以指出别人看起来不错的代码的大小问题了。如果你能一眼看出有人的代码是对应于"条款27"或"条款M6",那你可真是令人刮目了。

  4. 高级阶段:

    1. Exceptional C++

    2. More Exceptional C++

      如果要写程序,*EC++MEC++*的境界已经足以使你自如应付,可是如果你还不满足,想关注一些理论层面的问题,或是想看看实现的代码,你就不应该错过上面这两本好极了的书。(由Herb Sutter所著)

      这两本书的难度是非常大的。每一条的阅读笔记都应该有十多页。特别是泛型程序设计的部分,这两本书旁征博引,极尽深入探讨之能事,每每看懂一条,都该大感酣畅淋漓,每每学到一点,都值得浮一大白。

    3. 《STL源码剖析》(侯捷著)

      它是以实际的例子一点点地讲解一个STL是怎么样实现的。

    4. Inside the C++ Object Model

      从这本书中可以了解无数的编译器解释源代码的细节,以及记忆体分配的细节。

    5. C++沉思录

      经典之作,语言是苍白无力的,必须读一遍,呃不,读无数遍,深刻体会。

  5. 补充:

    如果还觉得不够的话,就订购一本C++标准,但是仅作为参考工具书使用。

    中国大陆作者的书,尽量不要看。一切VC++或讲特定的编译器的书,一概不要看。

    这里要特别提一句伟大的谭先生、谭教授THQ编写的巨著,书名就不叙述了;业内人士将其称之为谭++;我计划专门整理一篇博客,细数一下伟大的谭先生为我国C++教学事业所作的杰出贡献。另外,我要正告各位读者,如果不是为了计算机二级考试,千万不要购买谭++,入邪教而恍然不知,悔时晚矣!

    如果需要补C语言的课,买一本非常小的K&R的The C Programming Language足矣,其它的书一概不要看。不要先学C,再学C++,而要直接学C++。你不是先学古文,再学白话的,对不对?相信我,直接来更容易。

  6. 其他的书:

    1. Accelerated C++ 从各方面评价来看,完全值得推荐。
    2. 《C++ Templates全览》 (STL参考)
    3. 《C++设计新思维:泛型编程与设计模式之应用》 (STL参考)
    4. 《C++标准程序库:自修教程与参考手册》 (STL参考)
    5. 《C++网络编程》(卷1,卷2) (网络参考)
    6. 《C和指针》 深入了解指针,看完以后对指针不再害怕。
    7. 《C陷阱和缺陷》 看完后可以避免C语言开发的一些坑。
    8. 《C专家编程》

Java

如果是真真正正完全0基础入门编程的话,其实Java作为入门语言是非常合适的。

虽然Go,Kotlin等目前比较火的动态语言对Java这种静态语言造成了一定的威胁,但是短期内其冲击远远不会到影响Java的程度。Java依旧是当今当之无愧的第一就业语言,绝大部分互联网企业都选择Java作为它们的开发语言。

信息化系统的建设(各种各样的业务系统,及互联网服务等),其主流的驱动技术就是Java,而其他语言,例如PHP是呈下降状态,而Go语言目前的份额也并不大;另外一点就是Java目前的业务需求是比其他语言要大得多的。

从难度上讲,Java相比c++是真的容易很多。

有人推荐Python,至少在中国目前这个纯就业的环境下,学Python去找个工作简直要发狂,不要相信培训公司吹的那样,搞Python不走人工智能是很难的 ,而AI,机器学习,算法这些现在的趋势都是研究生起步,学历这方面相当重要,这些东西不是经过努力学点程序就行的,更何况,有些技术不是想学就能学会的——就像有些人这辈子注定无法获得诺贝尔奖一样,现实是很残酷的……

当然,不可否认的是,Python语言编写的脚本在某些方面确实给日常生活带来了便利,就这一点来说,它的易用性其实是非常优秀的,我认为Python是一门非常有价值的编程语言。虽然就现实来说,在就业方面可能并不是那么理想。换言之,只有优秀的Python编程者才有机会。

  1. 入门书籍:

    1. Head First Java
    2. 《疯狂Java讲义》
    3. 《Java核心技术 卷I&II》

    我没有把《Java核心技术》排在第一位的原因是:这本书的治学精神是非常值得学习的,但是入门Java并不需要在Java SE里那些不常用的技术上浪费时间,而初学者又不知道如何鉴别哪些需要学习,哪些不需要学习,基于这个原因,我个人建议先看前两本书。

  2. 进阶书籍:

    1. 《Java编程思想》
    2. Effective Java
    3. 《Java并发编程实战》
    4. 《深入理解Java虚拟机》

    《编程思想》书是Java界极其经典的圣经书籍,地位相当于Java界的辞海。里面相当多的内容是非常非常值得学习的。如果错过了这本书,那么Java的学习只能用遗憾来形容。

    Effective Java 作为技术人员的参考用书。介绍了在 Java 编程中 7到8 条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮和高效的代码。

    《并发编程》则具备企业级开发里常用的知识,多线程/多进程的精髓就在于此。当然,这本书的难度也更大一些。

    《Java虚拟机》虽然基于OPEN JDK1.7,但是其中的Java编程思想永不过时!不论是对于现在的Oracle JDK12,还是以前的版本,对原理的理解是没有影响的。

  3. 拓展书籍:

    1. 《函数式编程思维》
    2. 《TCP/IP 详解》

    《函数式》这本书对于提高代码的信噪比是非常有帮助的,当然,可能在日后的重构方面会存在一些困难。《TCP/IP》书则是为了帮助进行Java网络编程,该书在之前的计算机网络处已经叙述过了,这里不再赘述。

    信噪比,也就是信号噪声比,在此处意思是说用少量的代码得到更高的运行效率。

  4. 补充书籍(并发系列)

    1. 《Java并发编程艺术》

    同样是讲Java并发编程的。Java并发编程实战相对来说全是干货,看起来可能比较晦涩。这本书可能看起来更通熟易懂些,但是没有Java并发编程实战全面,大家可以搭配着读。

  5. 补充书籍(Android系列)

    1. 《第一行代码 Android》

    Android开发入门书籍。 Android开发是基于Java的。

    1. 《Android 开发艺术探索》

    这本书强烈推荐。是从Android初级向中高级进阶的必看书籍,里面讲的知识点都很好。重要的是Android面试会问到很多这本书里面的知识点,找Android开发必看。

    1. 《Android 系统源码代码情景分析》

    从源码分析Android系统的书,经典程度不亚于上本。

  6. 补充书籍(Java Web和Spring模块)

    1. 《深入Java Web技术内幕》

    从Android向后台转型过程中看的一本书。比较全面的介绍了Java Web知识,可以当作Java Web的入门辅助书籍。

    1. 《Spring in action 中文版》

    学习Spring时候看的书,主要介绍了官方文档的知识。讲的很全面,准确度也高。

    1. 《Spring MVC学习指南》

    2. 《Maven实战》

    Java Web离不开Maven,这本是Maven入门书籍,讲的很全面。

    1. 《Spring实战》 & 《Spring Boot实战》

    2. ※《Spring技术内幕》 建议精读。

Python

  1. 入门书籍:

    1. Python cookbook

    该书被多平台,多位大神联合推荐,毫无疑问,这是一本很不错的书籍。但有人会考虑,这本书适合入门吗?回答是肯定的。当然,这本书比着有些"入门书籍"要稍微深一些,这正是推荐这本书而不推荐其他书籍的原因:《Python Cookbook》和其他入门书籍、教程一样,都是在围绕数据结构、基本概念在展开,但是它对比于其他教程"蜻蜓点水"式的阐述,这本书做了更多延伸,讲解了更多高阶用法,我觉得高阶用法你不一定要记住,但是知道有这么一回事,对后期进阶、实战会有很多帮助。

    除此之外,还有以下Python入门书籍可供选择:

    1. 《Python编程:从入门到实践》
    2. 《Python编程快速上手》
    3. 《像计算机科学家一样思考Python》
    4. 《Python基础教程 第2版》
    5. 《笨办法学Python 3》
    6. 《流畅的Python》

    《流畅的Python》致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面,适合精读。

  2. 进阶练习和书籍:

    1. Python练习册,每天一个小程序 这是GitHub上超1W Star的项目。

    2. Python项目练习 包括十个项目的练习和代码

    3. 500 line or less 一本Python神书,而且还有源码。

    4. Python - 100天从新手到大师 骆昊 (jackfrued) 规划的一条从“从新手到大师”的百天之路。

    5. Python for Data Analysis

  3. 高级阶段:

    选择一个学习的方向:

    1. 机器学习
    2. 图像处理
    3. 自然语言
    4. 数据分析
    5. web
    6. ……

    选择一个学习的方向,然后才清楚自己该朝着哪个方向努力、该拿哪些项目练手,对编程能力进一步巩固,这样要比“无头苍蝇”式的漫无目的学习效率要高很多。

    然后,可以找一些比较优秀的项目进行实战,扩展自己知识面的同时对编程能力进行巩固。

    以下是三个可供参考的学习链接:

    1. tensorflow_cookbook

    2. Awesome-pytorch-list

    3. WebAPP

Go和SQL

Go书籍推荐:《Go语言实战》&《Go In Action》

SQL书籍推荐:

  1. 《MySQL必知必会》

  2. ※《数据库系统概念》第六版

  3. 《深入浅出MySQL》

注:《MySQL必知必会》虽然在语法上看起来是《SQL必知必会》的子集,但是实际上其内容更加全面,更加精细。

数据结构与算法

学习算法,不要一上来就开始啃《算法导论》,这本书有太多关于算法的数学证明(除非你喜欢这种风格,那么你就看这本)。既然这本书并不适合新手学习,而如果你之前的算法基础又比较薄弱,那么只会一直陷在“拿起来又放下”的循环里。

  1. 入门书籍:

    1. 《算法图解》:“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂
    2. 《大话数据结构》:把理论讲得有趣不枯燥;每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。
  2. 标准教材:

    《数据结构与算法分析》 非常系统、全面、严谨,适合掌握了至少一门编程语言的同学。

    这本书有三个语言的版本:C语言描述,C++语言描述和Java语言描述

  3. 进阶书籍:

    1. ※《算法 第4版》
    2. ※《算法导论》

    这两本书都是经典,建议细细品味。

  4. 拓展书籍:

    1. 《算法之美》 算法科普,从生活中的各种问题说起:租房、谈恋爱、老虎机、拍电影、面试、买彩票、各种排序、找停车位、寻找新药、临床试验、奥巴马拉赞助、预估电影票房等等,非常生活化,可以作为补充阅读。
    2. 《算法帝国》 同样是科普类书籍,并无涉及算法的原理与实现细节,也可以作为补充阅读。
  5. 殿堂级书籍:

    The Art of Computer Programming 《计算机程序设计艺术》 包含共四大卷,其深度、广度、系统性、全面性是其他所有数据结构和算法书籍都无法相比的。该书建议慢慢阅读,可以当做一种挑战!

  6. 其他书籍:

    1. 《算法设计与分析基础》
    2. 《算法引论:一种创造性方法》
    3. 《编程原本》
    4. 《算法竞赛入门经典》
    5. 《算法艺术与信息学竞赛》

设计模式与架构

轻量级书籍推荐:

  1. 《大话设计模式》

  2. 《设计模式》 (刘伟著)

    可以读此书配套的《设计模式实训教程》。还有《C#设计模式》和《 设计模式的艺术——软件开发人员内功修炼之道 》,后者贴近于工程实践方面的应用。另外风格相近的还有 《设计模式之禅》与《研磨设计模式》 可以作为进阶。

  3. 《Head First 设计模式》

重量级书籍推荐(以下神书排名不分先后):

  1. Refactoring 《重构——改善既有代码的设计》

  2. Code Complete 2 《代码大全2》

  3. The Pragmatic Programmer 《程序员修炼之道》

  4. Clean Code 《代码整洁之道——程序员的职业素养》

  5. Programming Pearls (2nd Edition) 《编程珠玑》

  6. Design Patterns 《设计模式:可复用面向对象软件的基础》

  7. The Mythical Man-Month 《人月神话》

  8. Working Effectively with Legacy Code 《修改代码的艺术》

结语

本文从立意到结尾历时2天,撰写时间逾10个小时,参考和借鉴了80多位从事计算机及编程行业的工作者和爱好者在知乎的回答和在B站的视频推荐。

原先,我本意是想简略的列一份计算机需要读的书单,但我整理的目的是想让自己按照规划的这条路线走下去,因此在整理的过程中,我花了相当多的精力考察每一本书,包括它的目录,它涉及的内容以及它的编写目的及作用。最终,在给每一本书赋予一个特定的地位的时候,我都附注了自己或者他人的理解和感悟。不同的人对同一本书的看法肯定是不同的,所以并不是说所阅读的书局限于上述书单里。书单的意义 ,是给我自己规划的一条计算机从入门到略有体会的道路。

希望我整理的内容能够帮助各位有志于提高自己水平的青年学者;无论你之前是否接触过编程。国外的名著之所以比国内的教科书更加具有价值和历史意义,就是因为它们是给人看的,看书的过程也就是对话、沟通、交流、理解的过程。名著是兼容的,无论水平高低,读者都能在其中获取到知识;我希望我自己也能始终坚持谦虚好学的态度,不搞鄙视链,向各类人士兼容。

真正的大师,永远都怀着一颗学徒的心。

Avatar

Serene Feather Pavilion

瞽者无以与乎文章之观,聋者无以与乎钟鼓之声。岂唯形骸有聋盲哉?