经常会有小伙伴问:”现在生化环材、机械这些专业自学Java等语言后都可以找软件开发相关工作,那么科班出身的优势呢?”
个人觉得没有科班和非科班的差别,只要学习过整个计算机专业课程都可以算科班,课程如:
数字逻辑、计算机组成原理、高级语言编程、数据结构、操作系统、计算机网络、数据库原理、编译原理、计算机网络、离散数学、算法设计分析、面向对象、人工智能、图形学等。
尤其应该多学习计算机体系结构的知识,建立起计算机系统能力,也就是在写代码、设计程序的时候会站在计算机、操作系统的角度考虑,怎么样才更加高效,或者说符合计算机的思维方式。
那么我们常说的计算机系统又是什么东西呢?
我看过很多同学将计算机系统和操作系统划等号,尤其是网上很多同学推荐操作系统书籍,竟然把《深入理解计算机系统》这本书放在首位,尽管CSAPP这本书内有部分OS内容,但是个人觉得它更是偏向“计算机系统”而非“操作系统”。
我理解中的计算机系统应该是包括计算机组成、存储层次、IO、高级语言程序及其实现机制、指令集、操作系统、编译器、链接器、加载等体系结构的知识。
汇总起来就是:
一个程序在计算机中到底是如何运行的。
学习这些东西个人觉得并不是说就能让你怎么牛逼,这肯定不行,只是这些系统的知识能够在学习其它应用知识的时候帮助我们快速迁移学习,比如时空开销、缓存与局部性、分治、并发和并行、远程过程调用、同步异步、吞吐率和时延等概念,在实际项目中也经常会涉及到。
但是呢,国内大部分高校比较缺乏“计算机系统”方面的课程,只有少数高校有开设相关课程,比如南大计算机系统、交大等。
我们学校从CMU引进过ICS(IntroductiontoComputerSystem),我们这叫做系统级编程:SystemProgramming,教材就是使用的CSAPP,不过有一些章节也没有上,也是靠自学。
到底什么叫系统编程呢?
系统编程真的和好的软件工程是不同的吗?这不一定。但是问题在于,软件工程和底层编程通常是孤立地教授的。虽然大部分的软件工程课程是以Java为中心的“书写良好的接口和测试”,但我们也应该教给学生如何设计有重大资源限制的系统。或许我们将底层编程叫做“系统编程”,是因为很多有趣的软件系统是底层的(如数据库、网络、操作系统等等)。由于底层系统有很多的限制,因此需要设计者进行创造性的思考。
把系统编程叫做底层编程可能更好理解,就是直接面对各种底层机器细节。
如果你大学没有相关课程的话,建议可以去看看CSAPP,国外也有几门不错的这方面课程,大家感兴趣的话可以去了解下:
一、麻省理工
麻省理工电子工程与计算机课程系下面的EE(electricalengineering)和CS(