基础篇(理论与硬件)
这一部分关注的是计算机的基本理论与基本实现。包括硬件结构理论,以及软件与硬件的交互。以理论开篇,在机器语言部分深入,最终在操作系统部分达到高潮。
1、计算机实现计算的原理。这包括门电路是如何实现计算的,时序电路是如何实现存储的,冯诺依曼体系结构是如何将二者结合实现了真正的现实世界的计算机的,以及它是如何反映图灵机这一理论计算模型的。其间会学习布尔逻辑。
2、如何控制计算机硬件。这部分使用的“工具”就是机器语言和汇编语言。我们需要理解机器语言的本质,以及它如何以“汇编语言”这种更容易理解的形式为程序员提供了控制硬件设备的机会。这部分可以学习到很多非常低级但是本质的内容。
3、操作系统是如何工作的。如果你理解了上一部分的计算机硬件相关的问题,那么理解操作系统的工作原理将不会那么困难。另外你将明白操作系统作为硬件和上层软件的中间层次,是如何大大简化了人们对硬件的操作过程的。
进阶篇(软件系统)
1、编程语言。这包括结构化编程语言以及面向对象编程语言。因为有很多选择,其实以一门语言开始即可,如果你在前面正确的理解了硬件与机器语言,那么C语言入门真是太简单了,如果你运气不好,觉得C很困难,那么即使是从Python、Javascript开始学习也没问题。重点在于理解编程中和语法相关的基本概念,并了解一些简单的算法知识。
2、数据结构与算法。说白了就是如何合理的组织数据,通过其结构特点来简化编程或者提高计算的效率。这里的内容是模式化的,所有人都需要学习无序结构、有序线性结构、树结构、图结构等。另外,排序算法、查找算法必须学好,特别是算法策略如递推、递归、蛮力(穷举)、分治、动态规划等也必须有所实践和了解。切记不必深陷其中,这里是个大坑,你不可能真的“精通”他们。
3、编程语言是如何实现的。这里主要涉及编译原理。当你站在高级编程语言实现者的角度再来认识编程语言本身的时候,许多问题豁然开朗。这会深刻的改变你的编程观。可惜的是即使是很好的学生在这里也会遇到很大的阻力。真正的问题不是这方面理论性有多强,而是教材都很烂——包括国外教材(什么龙书虎书鲸书都根本不是为初学者准备的),而且语焉不详。这导致大部分人都感觉莫名其妙高深莫测。如果你不是有志攀登软件设计的最高峰,可以绕行。否则从表达式运算解析开始,逐步引入变量,类型,控制结构,函数,再到对象,一步步构建出解析器,然后结合前面学习的硬件接口知识,将其转换为低级表示,最后你会发现没有那么可怕。
基础领域篇(必备领域知识)
1、互联网络是如何构成的。这部分包括网络的基本知识,主机间通信的原理,转发设备的实现,以及互联网络的构成。这是网络编程所需的基础知识。除了理解低级协议,也要花一些时间了解应用层的协议,特别是 SMTP、POP3、FTP、HTTP 等,重点是了解他们的基本原理,而不是每个细节。因为每个协议都有自己的标准,光 HTTP 协议就够你研究 6 个月以上了。这里注重的是原理。
2、如何管理大量的数据并在其上建立信息系统。数据库是一个很好的例子。包括数据库系统的基本理论,实现原理,以及设计原则。同样,这里不是真的在教你如何构建一个数据库系统,而是在学习他的核心原则,重点是学会如何合理的设计表结构,以及实现效率良好的SQL查询语句。
扩展领域篇(特定领域知识)
1、基于特定平台的软件开发。如何在Windows平台、Linux平台、Mac OS平台或者手机、平板、电视机、微波炉上完成开发?这需要学习特定的软件平台提供了哪些编程接口,如何编译并部署,如何调试和测试等知识。这部分就是软件工程师职业生涯中最耗费时间的部分。
2、有效的软件研发是如何实现的。这包括软件结构的设计知识,软件实施流程的管理知识,以及一些细微而繁杂的内容。人们通常用软件工程一词来概括。但事实上软件工程站的角度要更高一些,这里只是涵盖软件工程的一小部分。
科技领域篇(研究性知识)
如果你对人工智能、科学计算、图像处理感兴趣,这里还有大片的区域等待你探索。