我应该读什么书来接受计算机科学的本科教育?
我一直是一个很大程度上独立的学习者,从Wikipedia和各种书籍中收集我所能提供的知识。但是,我担心自己可能因疏忽性地忽略了主题和概念而使自己的自我教育产生偏差。我的目标是教自己一个顶尖大学的计算机科学学士学位的学位(与哪一个大学无关)。
为此,我已经购买并开始阅读一些学术教科书:
- 计算机程序的结构和解释
- 算法导论
- 人工智能:一种现代方法
以及我从一所中等水平最好的州立大学上过的课程中遗留下来的一些教科书:
- 计算机仿真方法概论
- 微积分:概念和联系
- 计算机组织与架构
- 操作系统概念
- 数据库系统第一门课程
- 形式语言和自动机
我的问题是:
- 此收藏集未涵盖哪些主题?
- 有没有比这里列出的书更严格或者更透彻(甚至更容易阅读)的书?
- 有没有浪费我时间的书?
- 我应该按什么顺序看书?
- 麻省理工学院或者斯坦福大学(或者UCB或者CMU ...)本科生从中学到了什么,我可能会错过?
欢迎使用软件工程书籍,但请仅在学术研究范围内。我知道Code Complete和Pragmatic Programmer,但我正在寻找更理论的方法。谢谢!
解决方案
Don Knuth撰写的计算机编程艺术
我看到的最大的两个遗漏是:
- 龙书
- 计算机网络
对于操作系统,我更喜欢Tanenbaum而不是Silberschatz,但两者都很好:
- 操作系统
关于订单,这取决于兴趣。前提条件并不多,对于编译器的自动机是最明显的前提条件。首先阅读自动机书,然后阅读龙。
我不知道我们拥有的所有书籍,但据我所知,这些书籍已经足够好了,可能意味着其他书籍也很不错。
我们还缺少一些逻辑和离散数学书籍。
而且,我们不要忘记一些数据库理论书籍!
我发现最好的方法是选择自己喜欢的大学,进入他们的网站,然后查看学位课程。许多大学生都会为每门课程发布所需的阅读材料。麻省理工学院的开放课件软件就是一个很好的例子。
顺便说一下,这也适用于非CS学位课程。
我不知道在美国情况如何,但是在我国,我们研究离散数学,并在正式语言和自动机之前研究图论。
另外,我看不到任何有关计算机网络的书籍...我们为什么不尝试使用Andrew Tanenbaum的计算机网络?
在开始之前,请阅读《计算机科学:现代概论》。这将为我们提供一个良好的基础,并概述要攻读的主题。
算法简介非常好。关于函数式编程的介绍,我建议使用ML作为工作程序员。
使计算机科学家与程序员区分开的领域:离散数学基础,VLSI和系统体系结构的基本理解,密码学和安全性的基本知识,可计算性理论的理解,信息理论的理解。
这是一个很好的清单。我肯定会添加的两个主题是离散数学和网络。我们可能感兴趣的其他主题是编译器,计算机图形学,分布式操作系统。 AI还有很酷的子领域,例如计算机视觉和机器学习。为了处理所有这些,我们肯定需要线性代数和概率。
不用说,我们不能仅通过读书来真正地从事计算机科学。要真正理解每个主题,我们必须在其中进行项目。我还建议我们看一下麻省理工学院的开放课件,教授在其中发布课程提纲,讲义和作业。
- 离散数学I和II(我的私立学校)
- 物理I(密苏里州大多数州立学校)
- 统计一
- 密码术(可选,但我喜欢)
- C ++中的OpenGL(可选,但简洁)
- 系统分析和设计(从业务角度看软件工程。课程是如此。)
- 伦理。
- 联网(教授网络算法,处理网络数据的位模式)。要理解它们,有些事情需要帮助。不一定是教授(他们以此为生),但也许是一位上过课或者学习过该领域的朋友。
阅读这些主题的书并不意味着我们了解它们。在数学上进行数学运算,在代码上进行编码等等是可以理解的,并最终显示我们知道该主题。
关于专业软件开发的书籍非常出色,涵盖了软件项目的工作方式,不同的方法论和设计模式。
网页设计知识在就业方面也非常有用。
我不明白我们为什么要自己尝试这样做。即使是一所"顶尖水平"的大学,也能够教给我们比自己教给自己的技能更好的技能。这是要与有实际在计算行业工作经验的人会面。
决定学习成绩与大学无关,而取决于我们所付出的努力。
我的回答可能对我们没有帮助,因为我不知道我们来自哪里。在我居住的苏格兰,我必须免费上大学,但对我们而言可能并非如此。
我认为我们可以将其他大部分书籍用作参考,并全面吸收《 Programming Pearls》。这样做将使我们比我曾经遇到的90%的程序员更好。
具体数学
我们还应该有一本关于通用数据库的书,而不必深入探讨Oracle,MySQL,SQL Server等的细节。
我建议:数据库系统:全书
文件结构:使用C ++的面向对象方法
很多有关块设备和文件结构的好信息,我们在所列的任何书籍中都找不到。由于人们不喜欢他的代码示例,因此在亚马逊上受到了一些批评,但是本书的重点是讲授概念,而不是剪切和粘贴代码示例。
另外,请确保获得有关编译器的书
顶尖大学的许多课程都不使用教科书,因为可用的书都不够好。 (我在普林斯顿大学接受教育,在哈佛大学任教8年。)当有人推荐一本书时,请问这本书真的很不错,还是该书是该领域最畅销的书。
例如,在编译器中,我不是'Dragon Book'的忠实拥护者;我从不喜欢这种方法,并且当前版本已经过时了。我认为我们最好选择像Michael Scott的《 Programming Language Pragmatics》这样的书,尽管有些分散,但它是一本好书。 (我从没教过它,所以我不能说出学生对它的看法。)尽管我们可能会看到Cooper和Torczon的Engineering a Compiler,但我不了解一本关于自动编译器构造的好书。因为它是最新的,并且由该行业中最好的两名编译器工程师编写。
抱歉,无论书籍多么好,我们都无法通过读一本书或者多本书籍来代替四年大学。如果可以的话,为什么有人会上大学?
首先,我不用担心。但是,如果我们想读一本书来学习一些抽象的CS想法,我建议我们使用Turing Omnibus或者Theoretical Introduction to Programming。
如果我决定雇用两个程序员,但两个都没有太多经验,但是一个拥有CS学位而另一个没有,那么我会选择一个拥有CS学位的程序员。但是,当我们将具有十多年经验的两位程序员进行比较时,程度几乎无关紧要。
麻省理工学院几年前推出了他们的" OpenCourseWare"程序。他们将书籍/家庭作业/讲座放在网上,因此我们可以遵循MIT课程:
http://web.mit.edu/catalogue/degre.engin.ch6.shtml
我会将"计算理论导论"添加到列表中
我可能无法推荐最好的书,但是我们缺少几个重要的主题:
- 统计数据
- 线性代数
- 图论与离散数学
- 电脑图像
- 科学计算
- 计算机网络
- 软件工程
- 数据结构
可能被认为更"可选"的一些主题可能是:
- 密码学
- 图像/图案处理与识别
- 生物信息学
- 互联网计算
- 古典物理学
计算系统的要素
本书将带我们从硬件设计的基础知识一直到以面向对象的语言编写程序。使用模拟器,我们可以构建完整的计算机。然后,我们编写一个汇编器,一个操作系统,一个编译器(用于在VM上运行的面向对象语言),然后编写使用该语言编写的游戏。
这是很多工作,但是作者精心地使任务变得尽可能简单。我们将需要努力才能完成这一过程,但是它为我们提供了计算机编程的完整视角。
我们可以查看一些示例章节,也可以在此处使用模拟器。
强烈推荐! (即使是CS毕业生)
关于各种高级语言编程风格和技术,我所见过的计算机编程概念,技术和模型似乎具有最广泛的概述。
"四人帮"设计模式书。我上大学的"设计模式"课程可能是我参加过的最有益的课程。
甚至我都在同一架飞机上:下班后的空闲时间学习计算机科学;
这些是我现在在书架上的一些书
- 应用UML和模式-Larman
- 算法简介-Cormen
- 离散数学及其应用-Rosen
- 软件工程
- UNIX环境中的高级编程
一旦我完成它们,将进一步对该列表进行补充... :-)