我应该阅读哪些书才能获得计算机科学的本科教育?

时间:2008-09-27 15:02:14

标签: computer-science

我一直是一个很大程度上独立的学习者,从维基百科和各种书籍中收集到的东西。但是,我担心我可能会因无意中遗漏主题和概念而偏向于我的自我教育。我的目标是从顶尖大学自学相当于计算机科学的本科学位(无所谓)。

为此,我已经购买并开始阅读一些学术教科书:

除了我从一所平庸的州立大学上课时留下的一些教科书:

我的问题是:

  • 此系列未涵盖哪些主题?
  • 是否有比这里列出的书更严格或更彻底(甚至更容易阅读)的书籍?
  • 有没有浪费我时间的书?
  • 我应该以什么顺序阅读这些书?
  • 麻省理工学院或斯坦福大学(或UCB或CMU ......)本科生了解到我可能会错过什么?

欢迎使用软件工程书籍,但请在学术研究的背景下阅读。我知道Code Complete和Pragmatic Programmer,但我正在寻找一种更理论化的方法。谢谢!

22 个答案:

答案 0 :(得分:13)

我看到最大的两个遗漏:

对于操作系统,我更喜欢Tanenbaum而不是Silberschatz,但两者都很好:

关于订单,这取决于您的兴趣。没有太多先决条件,编译器的自动机是最明显的。首先阅读自动书,然后阅读龙书。

我不知道你拥有的所有书籍,但我所知道的书籍已经足够好,这可能意味着其他书籍也是不错的。

您还缺少一些logicdiscrete math本书。

让我们不要忘记一些database theory本书!

答案 1 :(得分:12)

我找到的最好的方法是选择你最喜欢的大学,去他们的网站,并查看学位课程。许多大型课程都为每门课程发布了所需的阅读材料。麻省理工学院的Open Course Ware就是一个很好的例子。

顺便说一句,这也适用于非CS学位课程。

答案 2 :(得分:9)

答案 3 :(得分:6)

麻省理工学院几年前推出了他们的“OpenCourseWare”课程。他们在线提供书籍/家庭作业/讲座,因此您可以跟随麻省理工学院的课程:

http://web.mit.edu/catalogue/degre.engin.ch6.shtml

答案 4 :(得分:4)

顶尖大学的许多课程都不使用教科书,因为没有一本可用的书很好。 (我在普林斯顿大学接受过教育,在哈佛大学任教8年。)当有人推荐一本书时,问一下这本书是否真的很好,或者它是否只是该领域最好的书< / strong>即可。

例如,在编译器中,我不是“龙书”的忠实粉丝;我从不喜欢这种方法,目前的版本已经过时了。我觉得你最好能拿一本像迈克尔斯科特的Programming Language Pragmatics这本书,虽然有点散射是一本可爱的书。 (我从来没有教过它,所以我不能说学生对它的看法。)我不知道一本关于autodidact编译器构造的好书,尽管你可能会看看Cooper和Torczon的{{3因为它是最新的,并由业内两位最好的编译工程师编写。

答案 5 :(得分:3)

The Elements of Computing Systems

本书将介绍从硬件设计到基于面向对象语言编写程序的基础知识。使用模拟器,您可以构建一台完整的计算机。然后编写汇编程序,操作系统,编译器(编译为在VM上运行的面向对象语言),然后编写使用该语言编写的游戏。

这是一项很多工作,但作者已经认真地完成了这项任务。你必须努力工作才能完成这一工作,但它为你提供了一个完整的计算机编程视角。

您可以查看一些示例章节,也可以使用模拟器here

强烈推荐!(即使是CS毕业生)

答案 6 :(得分:3)

我可能无法推荐最好的书籍,但是你缺少几个重要的科目:

  • 统计
  • 线性代数
  • 图论和离散数学
  • 计算机图形学
  • 科学计算
  • 计算机网络
  • 软件工程
  • 数据结构

某些可能被视为“可选”的主题可能是:

  • 密码学
  • 图像/图案处理 和认可
  • 生物信息学
  • 互联网计算
  • 经典物理学

答案 7 :(得分:3)

首先,我不担心。但如果您想要一本书来学习一些抽象的CS想法,我建议The Turing OmnibusTheoretical Introduction to Programming

如果我在聘用两名程序员之间做出决定而且没有多少经验,但是一个人拥有CS学位而另一个没有,我会聘请具有CS学位的人。但是当你比较两位具有十几年经验的程序员时,学位并不重要。

答案 8 :(得分:3)

对不起,无论书籍有多好,你都不能通过阅读书籍或书籍来取代四年的大学。如果可以,为什么有人会上大学?

答案 9 :(得分:2)

我认为您可以使用大多数其他书籍作为参考,并完全吸收Programming Pearls。这样做会让你比我见过的90%的程序员更好。

答案 10 :(得分:2)

  • 离散数学I&amp; II(我的私人 学校)
  • 物理I(密苏里州最州 学校)
  • 统计数据
  • 密码学(可选,但我喜欢 它)
  • C ++中的OpenGL(可选但很整洁)
  • 系统分析与设计(软件 从业务工程 透视。课程非常如此。)

  • 伦理。

  • 网络(教网络     算法,位模式处理     与网络数据)。

    一些的东西要理解它们需要帮助;不一定是教授(他们这样做是为了谋生),但也许是一个参加过课程或研究过这个领域的朋友。

阅读这些主题的书并不意味着你了解它们。对数学进行数学运算,对代码进行编码等等,这些都有助于您理解,并告诉您最终了解主题。

答案 11 :(得分:1)

具体数学

答案 12 :(得分:1)

你也应该有一本关于通用数据库的书,而不深入研究Oracle,MySQL,SQL Server等的具体细节。

我建议:Database Systems: The Complete Book

答案 13 :(得分:1)

这是一个非常好的清单。我肯定会添加的两个主题是离散数学和网络。您可能感兴趣的其他主题是编译器,计算机图形,分布式操作系统。人工智能还有很酷的子领域,如计算机视觉和机器学习。为了处理所有这些,你肯定需要线性代数和概率。<​​/ p>

毫无疑问,你只能通过阅读书籍来完成计算机科学。要真正理解每个主题,您必须在其中执行项目。我还建议看一下麻省理工学院的开放式课件,其中教授会发布教学大纲,讲义和作业。

答案 14 :(得分:1)

在此之前,请阅读Computer Science: a Modern Introduction。这将为您提供良好的基础和对要追求的主题的概述。

Introduction to Algorithms非常好。有关函数式编程的介绍,我建议使用ML for the working programmer

将计算机科学家与程序员区分开来的领域:离散数学的基础,对VLSI和系统架构的基本理解,对密码学和安全性基础知识的理解,对可计算性理论的理解,对信息理论的理解。

答案 15 :(得分:1)

Concepts, Techniques and Models of Computer Programming似乎拥有我所见过的各种高级语言编程风格和技术的最广泛的概述。

答案 16 :(得分:1)

我不知道它在美国是怎么回事,但在我的国家,我们在形式语言和自动机之前研究离散数学和图论理论。

另外,我没有看到任何涉及计算机网络的书......你为什么不试试Andrew Tanenbaum的Computer Networks

答案 17 :(得分:0)

“四人帮”Design Patterns book。我上大学的设计模式课程可能是我参加过的最有益的课程。

答案 18 :(得分:0)

即使我在同一个平面上:下班后在空闲时间学习计算机科学; 这些是我现在在书架上的一些书籍

  1. Applying UML and patterns - Larman
  2. Introduction to algorithms - Cormen
  3. Discrete mathematics and its applications - Rosen
  4. Software Engineering
  5. Advanced Programming in the UNIX Environment
  6. 一旦我完成它们,我将继续更新这个列表......: - )

答案 19 :(得分:0)

答案 20 :(得分:0)

File Structures: An object oriented approach with C++

很多关于块设备和文件结构的好信息,您在列出的任何书籍中都找不到这些信息。它在亚马逊上得到了一些评论,因为人们不喜欢他的代码示例,但本书的重点是教授概念,而不是剪切和粘贴代码示例。

还要确保获得一本关于编译器的书

答案 21 :(得分:0)

关于专业软件开发的书籍,涵盖软件项目的工作方式,不同的方法和设计模式。 在就业方面,网络设计知识也非常有用。

我不明白你为什么要自己尝试这样做。即使是一个“平庸最好”的大学也能够比你自己教的技能更好地教你技能。这一切都是为了满足那些具有实际从事计算机行业经验的人。

这与大学无关,因为你所付出的努力决定了你的表现。

我的回答可能对你没有帮助,因为我不知道你来自哪里。在我居住的苏格兰,我必须免费去大学,这可能不是你的情况。