年轻人,你渴望力量吗?
二胖作为一个从传统行业转行到IT行业的底层青年,在自学计算机技术的过程中经历了很多困惑与挫折,尽管现在也没能很好的掌握CS的专业知识,但是勉强能为大家推荐两本计算机科学的经典书籍。
上图冯·诺依曼大神和大神背后的黑皮书在网上名气很大。计算机专业的教材汗牛充栋,根据豆瓣读书组的数据单单由机械工业出版社出版的计算机科学丛书(黑皮书)就有册,除去同名图书的不同版本也有三百多册;国内各大高校自己编写的教材更是数不胜数。
二胖经过艰辛的收集与整理,集齐了二百多本机工社的黑皮书,面对这么多教材,我有些迷茫。我想一辈子也看不完这么多专业图书,正所谓“吾生也有涯,而知也无涯”。
现在互联网上到处都是学习资源,然而精华与糟粕并存。就算像黑皮书基本都是精华,可还是不够精简。经过不断的探索总结与询问公司程序员小伙伴,我总结出了一份只含七本图书的清单。
七本经典书籍分别是:《深入理解计算机系统》、《数据密集型应用系统设计》、《计算机程序的构造和解释》、《算法设计手册》、《计算机科学中的数学》、《操作系统导论》、《计算机网络:自顶向下方法》。
七本教材分别花一两百个小时进行学习是很有必要的,不论是对专业能力还是职业生涯的提升都是巨大的。
还是太多?
如果小伙伴们觉得七本图书要花一千多个小时学习是比较艰难的一件事,那我推荐你先专注于学习两本图书:《深入理解计算机系统》和《数据密集型应用系统设计》。投入到这两本书的时间可以获得极高的回报率,特别适合从事网络应用开发的自学工程师。这两本书也可以作为上面表格中其他科目的纲领。
程序员分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。嘿嘿,二胖是智能硬件产品经理(IHPM)。这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。
第一种工程师总是寻求深入学习计算机科学的方法,或是通过传统的方法学习,或是在职业生涯中永无止息地学习;第二种工程师通常浮于表面,只学习某些特定的工具和技术,而不研究其底层的基本原理,仅仅在技术潮流的风向改变时学习新的技能。
如今,涌入计算机行业的人数激增,然而计算机专业的毕业生数量基本上未曾改变。第二种工程师的供过于求正在开始减少他们的工作机会,使他们无法涉足行业内更加有意义的工作。对小伙伴们来说,不论正在努力成为第一种工程师,还是只想让自己的职业生涯更加安全,学习计算机科学是唯一可靠的途径。
《深入理解计算机系统》简介:
本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。——《深入理解计算机系统(原书第3版)》
深入理解计算机系统应该是最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及汇编原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系结构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读深入理解计算机系统是最有效率的方式。
《深入理解计算机系统》对于那些想了解计算机系统以求编写更快、更高效、更可靠的软件的人来说是很好的起点。总之《深入理解计算机系统》值得反复深入阅读,理解体会。
《数据密集型应用系统设计》简介:
全书分为三大部分:
第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。
第二部分,我们将从单机的数据存储转向跨机器的分布式系统,这是扩展性的重要一步,但随之而来的是各种挑战。所以将依次讨论数据远程复制(第5章)、数据分区(第6章)以及事务(第7章)。接下来的第8章包括分布式系统的更多细节,以及分布式环境如何达成一致性与共识(第9章)。
第三部分,主要针对产生派生数据的系统,所谓派生数据主要指在异构系统中,如果无法用一个数据源来解决所有问题,那么一种自然的方式就是集成多个不同的数据库、缓存模块以及索引模块等。首先第10章以批处理开始来处理派生数据,紧接着第11章采用流式处理。第12章总结之前介绍的多种技术,并分析讨论未来构建可靠、可扩展和可维护应用系统可能的新方向或方法。
随着计算机在数量上的增加,计算机同样开始分散。尽管商业公司过去愿意购买越来越大的大型机,现在的典型情况是,甚至很小的应用程序都同时在多台机器上运行。思考这样做的利弊权衡,即是分布式系统的研究所在,也是越来越重要的一项技能。
推荐的《数据密集型应用系统设计》与传统的教科书相比,它是一本为实践者设计的具有很高的可读性的书,并且保持了深度和严谨性。
现今,尤其是在互联网领域,大多数应用都属于数据密集型应用。本书从底层数据结构到顶层架构设计,将数据系统设计中的精髓娓娓道来。其中的宝贵经验无论是对架构师,DBA、还是后端工程师、甚至产品经理都会有帮助。
这也是一本深入浅出的书,讲述概念的来龙去脉而不是卖弄定义,介绍事物发展演化历程而不是事实堆砌,将复杂的概念讲述的浅显易懂,但又直击本质不失深度。每章最后的引用质量非常好,是深入学习各个主题的绝佳索引。
本书为数据系统的设计、实现、与评价提供了很好的概念框架。读完并理解本书内容后,读者可以轻松看破大多数的技术忽悠,与技术砖家撕起来虎虎生风。
最后,二胖肯定会放资源出来的,小伙伴们按下面的链接自行下载吧,如果失效了请联系我。
《深入理解计算机系统》:链接: