大学生计算机专业学习核心规划


最近很多小伙伴,说大学很迷茫,不知道该学什么?既然是学习,那么在这里,我粗浅地把计算机编程领域的知识分为三个部分:

基础知识

  • 基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。
    • 2-3 门编程语言(1-2 静态编译型:C/C++、Java + 1-2 动态/脚本语言: Python、shell 之类);
    • 算法与数据结构;
      • System(OS、计算机组成、memory、cache 等等);
      • 工程开发能力(git、linux、shell、环境搭建、部署等)。
      • 计算机专业的核心课几乎都是围绕着构建上述这些能力来的,比如:

特定领域知识

  • 特定领域知识就是你从事某个细分方向时需要掌握的知识,比如做游戏引擎的需要掌握图形学;做前端的需要掌握浏览器渲染原理、前端三大件;算法工程师需要更多的数学知识。
    • 计算机学科导论和 C 语言;
      • 汇编、操作系统、C++、数据结构、离散数学、数值分析和计算机组成原理;
      • 计算机编译原理和数据库;
      • 计算机网络与安全和软件工程。
      • 还有高数、线性代数、离散数学、网络原理、网页设计、多媒体技术、汇编语言、面向对象的设计语言、Java 编程、ASP、SQL 等。

系统学习:

  • 先学习 C 语言和 C++。

    • 教材:C programming language-K&R、C traps and pitfalls、Algorithms in C 和 Expert C Programming。
  • 学习数据结构。

    • 教材:清华大学严蔚敏《数据结构》,目前还未找到经典的国外教材。
  • 学习算法。

    • 教材:算法导论和具体数学及其应用。
  • 计算机组成原理。

    • 教材:Computer Organization and Design The Hardware-3rd-David Patterson。
  • 计算机系统。

    • 教材:CSAPP。
  • 操作系统。

    • 教材:鸟叔的私房菜和计算机网络。
  • 核心就是计算机底层 + 通过造轮子方式学习计算机基础课。

  • 操作系统

    • 国外有很多优秀的操作系统公开课,比如 mit6.828、哈佛 OS/161,这类课程基本都是给你一个 mini os 壳,让你去完成部分操作系统的核心模块,比如线程管理、文件系统、分页、调度等。

相比纯看书,这样的学习方式无疑更加的生动和有趣。

  • 中国知名大学、世界知名大学的操作系统课都有大实验,有一个现成的小系统让你去学习、分析。比如 MIT 有 xv6,伯克利有 Nachos,斯坦福有 PrintOS等等。这些代码全是开源的,也都在1两万行上下,完全可以在大学期间啃下来。

  • 国内也有一些顶尖高校也是采取类似的方式,比如清华 ucore、哈工大好像是基于 Linux 0.11 魔改。

  • 另外推荐一本可以让你从零开始写一个 mini os 的书《操作系统真象还原》,这本书讲得真的非常得细致。

  • 数据库

    • 都说很多开发是 crud ,而 crud 的对象就是数据库,所以好好掌握数据库的原理也是非常重要的,如果也能通过造一个简单的 db 的方式来学习,我相信这样的方式一定是最好的:

    • 当然了,实现一个数据库也是相当有难度的,你大概需要这些知识:

      • SQL 解析,你需要实现一个语法分析器, 《编译原理》的基础知识就用上了,不过这里自己去实现不太现实,可以参考 TIDB,用 Lexer & Yacc 去做 SQL 的解析,生成 AST。

      • 数据需要持久化存储,这里需要考虑存储引擎,涉及到《操作系统知识》需要对外提供接口,B+ 树等数据结构知识,这里简单一点甚至可以直接写到文件,毕竟管理磁盘也挺恶心的。

  • 实现索引

    • 需要做表的 Join,事务的 ACID,进阶一点,考虑如何实现 MVCC 等。

    • db 的 client 和 server 之间如何访问又需要用到 socket 编程的知识。

    • 做这些可能有点难,不过在 GitHub 上有教程教你如何一步步实现一个像 sqllite 这样的小型关系型数据库, 比如这一个:https://cstack.github.io/db_tutorial/

    • 另外 MIT 6.830 Database Systems 也是很不错一门课。

    • 这是数据库系统的一门核心课程。由数据库的一大山头 Samuel Madden 教授。前半部分比较基础的数据库的知识,后半段主要在讲 Distributed Databases 的东西,各种 consistency 挺有意思,也是 database 比较火的研究方向。

    • 课程链接:http://db.csail.mit.edu/6.830/

    • 还有 CMU 的两门数据库课程也不错:

    • https://15445.courses.cs.cmu.edu/fall2019/ // 初级

    • https://15721.courses.cs.cmu.edu/spring2019/ // 进阶

  • 计算机网络

    • 这里就是考虑如何去实现个网络协议栈了。

    • 可能不需要完全实现每一层,比如可以尝试用 UDP 去把学到的那些超时重传、ACK、滑动窗口等实现一下,这样对 TCP 理解也会更加深刻。

  • 一些好书&教材

    • 这里就不列太多了,免得吓到大家哈哈哈,随便来两本:

      • 《CSAPP》
      • 《程序员自我修养》
      • 《编码》
      • 《Inside the C++ Object Model》
      • 《Linux 高性能服务端编程》
      • 《计算机网络自顶向下》
      • ….
    • 前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++对象模型》、《STL源码剖析》、《C++设计与演化》、《Linux内核设计与实现》、《Linux内核完全注释》、《effecitve C++》 、《effective modern C++》、《程序员自我修养》、《Linux高性能服务端编程》、《Linux多线程服务端编程》(知乎陈硕大佬写的)……

    • 顺便还看了点 Muduo 源码,自己模仿着基于 Epoll 写一个 Reactor模型的 Web 静态服务器,跟着知乎 Milo 大佬写 Json 库,总之,这段时期是写了一些小“轮子”的。

    • 书看得越多,其实你越能找到自己的方向,大三上我就给自己学习定位:

    • 深入 C++ 语言(多线程)+ 存储(学习 Redis、leveldb)+ 网络编程(学习 muduo,各种网络编程模型)+ 学习分布式(MIT 6.824、ddia、google 三大论文等)

    • 基本上是沿着上面几个方向去展开学习的,有的看书,有的论文,也有的看博客看源码。

    • 总之,知识面在大三不断扩充,自己开始关注学习 C10K、C100K 这样的后台服务器开发高性能、高并发的解决方法。

    • 当然了,还有些到现在还没开始,比如 leveldb 的源码、6.824 的 lab,可能是变懒了……

    • 也可能是学习变得不那么纯碎面向技术了,变成面向工作、面向赚钱了哈哈哈。

另外,对于还在大一、大二的很多学弟学妹们来说,可能觉得刚学会一点编程语言,什么都做不了,更不知道和实际工作的差距在哪。

那么最好的方式就是先按部就班地把学校安排的基础课程学好,再在课外自己多练习编程,了解一些业界的技术、框架。

把时间充分利用好。

要相信,人生没有白走的路,每一步都算数。

编辑此页面

编写:CC


评论
 本篇
大学生计算机专业学习核心规划 大学生计算机专业学习核心规划
最近很多小伙伴,说大学很迷茫,不知道该学什么?既然是学习,那么在这里,我粗浅地把计算机编程领域的知识分为三个部分: 基础知识 基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。 2-3 门编程语言(1-
下一篇 
专升本升学规划 专升本升学规划
思考 什么是学习?应该怎么学习? 参考链接 为什么要专升本 引言 如果你还没想好,这个时候选择专升本或者继续学习技术,复习之前的东西。专科也可直接考研! 在实际工作中一般将某学生所取得的普通全日制高等教育的最终学历作为该生的第一
  目录