我一直是一个很大程度上独立的学习者,从维基百科和各种书籍中收集到的东西。但是,我担心我可能会因无意中遗漏主题和概念而偏向于我的自我教育。我的目标是从顶尖大学自学相当于计算机科学的本科学位(无所谓)。
为此,我已经购买并开始阅读一些学术教科书:
除了我从一所平庸的州立大学上课时留下的一些教科书:
我的问题是:
欢迎使用软件工程书籍,但请在学术研究的背景下阅读。我知道Code Complete和Pragmatic Programmer,但我正在寻找一种更理论化的方法。谢谢!
答案 0 :(得分:13)
我看到最大的两个遗漏:
对于操作系统,我更喜欢Tanenbaum而不是Silberschatz,但两者都很好:
关于订单,这取决于您的兴趣。没有太多先决条件,编译器的自动机是最明显的。首先阅读自动书,然后阅读龙书。
我不知道你拥有的所有书籍,但我所知道的书籍已经足够好,这可能意味着其他书籍也是不错的。
您还缺少一些logic和discrete math本书。
让我们不要忘记一些database theory本书!
答案 1 :(得分:12)
我找到的最好的方法是选择你最喜欢的大学,去他们的网站,并查看学位课程。许多大型课程都为每门课程发布了所需的阅读材料。麻省理工学院的Open Course Ware就是一个很好的例子。
顺便说一句,这也适用于非CS学位课程。
答案 2 :(得分:9)
答案 3 :(得分:6)
答案 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 Omnibus或Theoretical Introduction to Programming。
如果我在聘用两名程序员之间做出决定而且没有多少经验,但是一个人拥有CS学位而另一个没有,我会聘请具有CS学位的人。但是当你比较两位具有十几年经验的程序员时,学位并不重要。
答案 8 :(得分:3)
对不起,无论书籍有多好,你都不能通过阅读书籍或书籍来取代四年的大学。如果可以,为什么有人会上大学?
答案 9 :(得分:2)
我认为您可以使用大多数其他书籍作为参考,并完全吸收Programming Pearls。这样做会让你比我见过的90%的程序员更好。
答案 10 :(得分:2)
系统分析与设计(软件 从业务工程 透视。课程非常如此。)
伦理。
网络(教网络 算法,位模式处理 与网络数据)。
有一些的东西要理解它们需要帮助;不一定是教授(他们这样做是为了谋生),但也许是一个参加过课程或研究过这个领域的朋友。
阅读这些主题的书并不意味着你了解它们。对数学进行数学运算,对代码进行编码等等,这些都有助于您理解,并告诉您最终了解主题。
答案 11 :(得分:1)
具体数学
答案 12 :(得分:1)
你也应该有一本关于通用数据库的书,而不深入研究Oracle,MySQL,SQL Server等的具体细节。
答案 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)
即使我在同一个平面上:下班后在空闲时间学习计算机科学; 这些是我现在在书架上的一些书籍
答案 19 :(得分:0)
答案 20 :(得分:0)
File Structures: An object oriented approach with C++
很多关于块设备和文件结构的好信息,您在列出的任何书籍中都找不到这些信息。它在亚马逊上得到了一些评论,因为人们不喜欢他的代码示例,但本书的重点是教授概念,而不是剪切和粘贴代码示例。
还要确保获得一本关于编译器的书
答案 21 :(得分:0)
关于专业软件开发的书籍,涵盖软件项目的工作方式,不同的方法和设计模式。 在就业方面,网络设计知识也非常有用。
我不明白你为什么要自己尝试这样做。即使是一个“平庸最好”的大学也能够比你自己教的技能更好地教你技能。这一切都是为了满足那些具有实际从事计算机行业经验的人。
这与大学无关,因为你所付出的努力决定了你的表现。
我的回答可能对你没有帮助,因为我不知道你来自哪里。在我居住的苏格兰,我必须免费去大学,这可能不是你的情况。