计算机专业应该知道的

学习极客时间左耳听风专栏,一篇马修的文章,详细讲解了计算机专业学生需要知道的所有,总结记录。另外,他的博客排版也很好,像 paper 一样阅读让人专注,只在顶部和底部放链接。

原文链接 http://matt.might.net/articles/what-cs-majors-should-know/

抛出问题

全文主要回答 4 方面的问题

  1. 要获得一份好工作,学生需要知道什么?

  2. 为了一辈子有工作干,学生需要知道什么?

  3. 进入研究生院,学生需要知道什么?

  4. 做个对社会有益的人,学生需要知道什么?

解答问题

作品集比简历更重要。作品集可以是博客、项目页面或是参与的开源项目。
技术交流,需要掌握好的展示工具如 keynote。
一个工程师的心。需要像工程师那样说话,学习实变函数、线性代数、概率论、物理学。
Unix 哲学,除非了解 unix 的强大,否则你不会学习 unix。你需要很适应命令行、文件配置、和无 IDE 的软件开发环境。
系统管理,你必须完全并安全的管理你自己的系统和网络,这样软件开发才更有效率。
编程语言。编程语言会随着太阳朝升西落,但编程生涯不会。学习编程语言最好的方法是同时学习多门语言。参考语言有:Racket,C,JavaScript,squeak,java,standard ML,Prolog,Scala,Haskell,C++,Assembly。
离散数学,你需要了解树、图、形式化语言、自动机。
数据结构和算法,你需要了解哈希表、链表、数、B+树、有向图和无向图。
理论,理论在处理有固定边界问题时特别有用。你需要了解有限状态机、正则语言、下推自动机、上下文无关语言、形式语言、图灵机、lambda 计算、不确定性。需要能够区分 P、NP、NP-Hard、NP-Complete。
架构,你需要了解计算机的架构。晶体管、门、加法器、多路复用器、浮点运算、逻辑运算单元、控制单元、缓存、内存。
操作系统,了解操作系统的内核系统调用、分页文件、调度、上下文切换、文件系统、内部资源管理。
网络,需要了解网络协议栈和路由协议,需要了解协议的优缺点,知道怎么选择协议。
安全,需要了解社会工程学、缓冲区溢出、整形溢出、代码注入、race conditions,privilege confusion。
密码学。需要了解对称密码系统、公钥密码系统、安全哈希函数、挑战-应答认证、数字签名、阈值系统。
软件测试,了解基本测试流程。
用户体验设计
可视化
并行计算
软件工程,需要了解版本控制系统和代码调式工具。
形式方法
图形和仿真
机器人学
人工智能
机器学习
数据库

总结

目前工作大量用到的是 system administration,需要学精通。然后学习基础性的如数学、结构和算法、计算机体系结构、程序设计语言。软件就是算法和数据结构的结合。然后再学习上层的操作系统、软件工程等。