01 

前言
大家好,我是张巧龙。
经常会有小伙伴问:”现在生化环材、机械这些专业自学 Java 等语言后都可以找软件开发相关工作,那么科班出身的优势呢?”
个人觉得没有科班和非科班的差别,只要学习过整个计算机专业课程都可以算科班,课程如:
数字逻辑、计算机组成原理、高级语言编程、数据结构、操作系统、计算机网络、数据库原理、编译原理、计算机网络、离散数学、算法设计分析、面向对象、人工智能、图形学等。
尤其应该多学习计算机体系结构的知识,建立起计算机系统能力,也就是在写代码、设计程序的时候会站在计算机、操作系统的角度考虑,怎么样才更加高效,或者说符合计算机的思维方式。
那么我们常说的计算机系统又是什么东西呢?
02 

什么是计算机系统?
我看过很多同学将 计算机系统操作系统 划等号,尤其是网上很多同学推荐操作系统书籍,竟然把《深入理解计算机系统》这本书放在首位,尽管 CSAPP 这本书内有部分 OS 内容,但是个人觉得它更是偏向“计算机系统”而非“操作系统”。
我理解中的计算机系统应该是包括计算机组成、存储层次、IO、高级语言程序及其实现机制、指令集、操作系统、编译器、链接器、加载等体系结构的知识。
汇总起来就是:
一个程序在计算机中到底是如何运行的。
学习这些东西个人觉得并不是说就能让你怎么牛逼,这肯定不行,只是这些系统的知识能够在学习其它应用知识的时候帮助我们快速迁移学习,比如时空开销、缓存与局部性、分治、并发和并行、远程过程调用、同步异步、吞吐率和时延等概念,在实际项目中也经常会涉及到。
但是呢,国内大部分高校比较缺乏“计算机系统”方面的课程,只有少数高校有开设相关课程,比如南大计算机系统、交大等。
我们学校从 CMU 引进过 ICS(Introduction to Computer System),我们这叫做系统级编程:System Programming,教材就是使用的 CSAPP,不过有一些章节也没有上,也是靠自学。
03 

什么叫系统编程呢?
系统编程真的和好的软件工程是不同的吗?这不一定。但是问题在于,软件工程和底层编程通常是孤立地教授的。虽然大部分的软件工程课程是以 Java 为中心的 “书写良好的接口和测试”,但我们也应该教给学生如何设计有重大资源限制的系统。或许我们将底层编程叫做“系统编程”,是因为很多有趣的软件系统是底层的(如数据库、网络、操作系统等等)。由于底层系统有很多的限制,因此需要设计者进行创造性的思考。
把系统编程叫做底层编程可能更好理解,就是直接面对各种底层机器细节。
如果你大学没有相关课程的话,建议可以去看看 CSAPP,国外也有几门不错的这方面课程,大家感兴趣的话可以去了解下:

一、麻省理工

麻省理工电子工程与计算机课程系下面的 EE (electrical engineering) 和 CS (com- puter science) 都开设的基 础课程:
  • MIT 6.004 计算结构 (com- putation structures)
这是一门贯穿整个计算机系统的课程。这门课包括硬件方面的门电路、功能 部件、单周期和流水线 CPU 之间的核心内容。
其次是软件方面的 C 语言、汇编语言、机器指令之间的基本内容,还涉及到过程调用、系统调用、进程、并行、性能评估等一些重要概念。
整体约等于 = 计组 + C  + 汇编 + 一些操作系统概念
教材是《计算机系统设计原理导论》
可以直接在浏览器搜索相关课程资源学习,B 站也有视频。

二、卡耐基梅隆 & 斯坦福

CMU 计算机学院与斯坦福计算机科学系比较类似,多个专业培养方案都有计算机系统或计算机工程。
这两所学校都有一门为计算机科学=专业学生开设的贯穿整个计算机系统的基础课。
其中 CMU 是 CS 213,斯坦佛是 CS 107,
CS 107 我完整的看完了,不过是很早以前的视频,当时还叫做 Programming Paradigms 编程范式,这门课我在星球也多次推荐过了,真的对你理解整个计算机、底层非常有帮助。
但是现在似乎叫计算机系统,这门课的重点在于计算机的基础设计和构建,尤其是学习软件编译的时候,运行一个程序会发生什么,以及程序是如何在内存中运行的。
课程官网:
http://web.stanford.edu/class/cs107/
两所学校用的教材都是大名鼎鼎的 《深入理解计算机系统》,课程内容和实验内容差不多,都是通过一组精心设计的 C 语言编程实验, 让我们能够更好地了解高级语言程序转换为机器代码的过程,深刻理解底层机器的系统结构。
也算是为后续的体系结构、编译原理、操作系统等课程打下良好的基础。
这个课程,配套的实验是精华,CMU 的总共 7 个实验,涉及数据的表 示、Cache、缓冲区溢出、 过程调用及栈的构成与使用、堆内存分配器、webproxy 等,我记得我们当时还做过一个给 C 写一个垃圾回收器,就是自己把 malloc 和 free 包起来做内存管理,好像是用的可达性分析,反正是最简单的做法,当时还写了个报告:
但是说实话,在国外都是在大一阶段上的课程,但是我们学校安排在了大三哈哈哈,现在回过去看,大一让我去上这个课,似乎也看不懂。。。
除了这三个学校,还有加州伯克利的 Computer Architecture 也挺不错的,总体来说这些课程内容都是比较接近的,主要涵盖以下主题:
C语言→汇编→指令 →微体系结构;编译 →链接→装入→执 行
程序性能优化、 存储器结构与管理、 并发和多线程、网络 编程
应 用级并行→数据级并行→ 线程级并行→指令级并行
大家在学校有时间的话,可以去找相关资料来学习,美国 CS 四大名校的课程体系都很不错, 非常注重计算机系统能力的培养。
并且,在课程内容横跨整个计算机系统,形成一条纵向的主线,把计算机里的每一层都串起来,而国内的课程体系更倾向于分层讲解。
比如自底向上的计组、数字逻辑、汇编语言、高级语言程序设计、操作系统、计算机网络、编译原理等,课程之间的联系比较少,这也导致了学生对 整个计算机系统的认识过程就像 “瞎子摸象”一样,很难形成一个完整的认识。
-END-

往期推荐:点击图片即可跳转阅读
继续阅读
阅读原文