我应该读什么书来获得计算机科学的本科教育?
我一直是一个很大程度上独立的学习者,从维基百科和各种书籍中收集我所能得到的。 然而,我担心我可能会因无意中忽略了主题和概念而偏向于我的自我教育。 我的目标是让自己相当于一所顶尖大学的计算机科学本科学位(无所谓)。
为此,我购买并开始阅读一些学术教科书:
- 计算机程序的结构和解释
- algorithm介绍
- 人工智能:现代方法
以及我在一所平庸的州立大学上课时所留下的一些教科书:
- 计算机仿真方法介绍
- 微积分:概念和连接
- 计算机组织与架构
- 操作系统概念
- 数据库系统第一门课程
- forms语言和自动机
我的问题是:
- 这个集合不包含哪些主题?
- 是否有任何书籍比这里列出的书籍更严格或更彻底(或者更容易阅读)?
- 有什么书是浪费我的时间吗?
- 我应该读什么书?
- 麻省理工学院或斯坦福大学(或UCB或CMU …)学习什么,我可能会错过?
欢迎软件工程图书,但在学术研究的范围内,请只。 我知道Code Complete和Pragmatic Programmer,但是我正在寻找更理论化的方法。 谢谢!
我看到最大的两个遗漏:
- 龙书
- 计算机networking
对于操作系统,我更喜欢Tanenbaum而不是Silberschatz,但两者都很好:
- 操作系统
关于顺序,这取决于你的兴趣。 没有太多先决条件,编译器的自动机是最明显的。 首先阅读自动机书,然后读龙。
我不知道你拥有的所有书籍,但是我知道的书籍已经足够好了,所以可能意味着其他人也是体面的。
你错过了一些逻辑和离散的math书籍。
我们不要忘记一些数据库理论书!
我发现的最好的办法是select你最喜欢的大学,去他们的网站,并查看学位课程。 许多大学都有他们为每门课程公布的必读资料。 MIT的Open Course Ware就是一个很好的例子。
顺便说一下,这也适用于非CS学位课程。
Don Knuth的计算机编程艺术
麻省理工学院几年前推出了“开放式课程”计划。 他们把书籍/家庭作业/讲座在网上,所以你可以跟随麻省理工学院的课程:
顶尖大学的许多课程都没有使用教科书,因为没有一本书可以满足要求。 (我在普林斯顿接受教育并在哈佛大学任教8年)当有人推荐一本书的时候,问一下这本书是否真的好,或者是否是现场最好的 。
例如在编译器中 ,我不是“龙书”的忠实粉丝。 我从来不喜欢这种方法,现在的版本已经过时了。 我想你会用迈克尔·斯科特的“ 编程语言语用学”( Michael Scott's Programming Language Pragmatics)这样的书更好一些,虽然有点散漫是一本可读的书。 (我从来没有教过它,所以我不能说什么学生的想法。)我不知道一本关于自动编译的编译器构build一本很好的书,虽然你可能看看库珀和Torczon的工程编译器因为它是由业内最好的编译器工程师中的两位最新编写的。
对不起,无论书本多好,你都不能用一本书或一些书来代替四年的大学。 如果可以的话,为什么还有人上大学?
首先,我不会为此担心。 但是如果你想要一本书学习一些抽象的CS思想,我会推荐图灵综合或者编程的理论介绍 。
如果我决定雇用两个程序员,但都没有太多的经验,但是一个有CS学位,另一个没有,我会聘请一个CS学位的人。 但是,当你比较两个程序员十几年的经验,这个程度并不重要。
我可能无法推荐最好的书籍,但有几个重要的科目是你错过的:
- 统计
- 线性代数
- 图论与离散math
- 电脑图像
- 科学计算
- 计算机networking
- 软件工程
- 数据结构
一些可能被认为更“可选”的主题可能是:
- encryption
- 图像/图案处理和识别
- 生物信息学
- 互联网计算
- 古典物理学
计算系统的元素
本书将您从硬件devise的基础知识一直到以面向对象的语言编写程序。 使用模拟器,您可以构build一台完整的计算机。 然后编写一个汇编程序,一个操作系统,一个编译器(编译为在VM上运行的面向对象语言),然后编写一个使用该语言编写的游戏。
这是一个很大的工作,但作者已经认真地完成了这个任务。 你必须努力工作才能完成这个工作,但是它给了你一个计算机编程的完整视angular。
您可以查看一些示例章节,以及在这里玩模拟器。
强烈推荐! (即使是CSgradle生)
我认为你可以使用大多数其他书籍作为参考,并且完全吸收编程珍珠 。 这样做会使你比我见过的程序员中的90%更好。
- 离散mathI和II(我的私立学校)
- 物理学我(密苏里州大多数州立学校)
- 统计一
- encryption(可选,但我喜欢它)
- C ++中的OpenGL(可选但很整洁)
-
系统分析与devise(从商业angular度看软件工程,课程如此)。
-
伦理。
-
networking(教授networkingalgorithm,处理networking数据的位模式)。
有些事情要理解他们需要帮助; 不一定是教授(他们以此为生),但也许是一个已经参加过课程或学习过这个领域的朋友。
阅读有关这些主题的书并不意味着你知道他们。 对math进行math计算,对代码进行编码等等,可以帮助你理解,并最终显示你对这个问题的了解。
我不知道在美国是怎样的,但在我的国家,我们学习离散math和图论在正式语言和自动机之前的介绍。
另外,我没有看到任何有关计算机networking的书籍。你为什么不试试Andrew Tanenbaum的计算机networking ?
在此之前,请阅读“ 计算机科学:现代简介” 。 这将给你一个很好的基础和概述的主题有追求。
algorithm介绍非常好。 有关函数式编程的介绍,我build议通过ML来帮助编程人员 。
将计算机科学家与程序员区分开来的领域:离散math的基础,对VLSI和系统结构的基本理解,对密码学和安全性基础知识的理解,对可计算性理论的理解以及对信息理论的理解。
具体的math
这是一个很好的名单。 我肯定会join的两个主题是离散math和networking。 其他您可能感兴趣的主题是编译器,计算机graphics学,分布式操作系统。 人工智能也有很酷的子领域,比如计算机视觉和机器学习。 而为了处理这一切,你绝对需要线性代数和概率。
不言而喻,通过阅读书籍你不可能真正做计算机科学。 要真正理解每个主题,你必须在其中做项目。 我也会build议看麻省理工学院的开放课件,教授在课程大纲,讲义和作业上。
你也应该有一本关于通用数据库的书,而不必深入Oracle,MySQL,SQL Server等的细节。
我build议: 数据库系统:完整的书
计算机编程的概念,技术和模型似乎有我看到的各种高级语言编程风格和技术的最广泛的概述。
专业软件开发书籍涵盖了软件项目如何运作,不同的方法和devise模式。 网页devise知识在就业方面也非常有用。
我不明白你为什么试图自己做这件事。 即使是一个“最好的平庸”的大学,也能教会你的技能远远超过你自己的教导。 这完全是为了满足在计算机行业有经验的人。
这不是关于你所做的努力决定了你做得如何。
我的回答可能对你没有帮助,因为我不知道你来自哪里。 在我住的苏格兰,我得免费去大学,这可能不是你的情况。
文件结构:使用C ++的面向对象的方法
很多有关块设备和文件结构的好信息,在您列出的任何书籍中都找不到。 它在亚马逊上得到了一些批评性的评论,因为人们不喜欢他的代码示例,但本书的重点在于教授这些概念,而不是给出剪切和粘贴代码示例。
另外请确保获得一本关于编译器的书
我将“计算理论导论”添加到列表中
“四人帮” devise模式书 我在大学上学的devise模式课程可能是我曾经学过的最有益的课程。
即使我在同一架飞机上:下class后在空闲时间学习计算机科学; 这些是我现在在书架上的一些书
- 应用UML和模式 – Larman
- algorithm介绍 – Cormen
- 离散math及其应用 – 罗森
- 软件工程
- UNIX环境下的高级编程
当我完成他们之后,会进一步更新这个列表… 🙂