本科学习建议

1. 概述

计算机科学是一门系统性研究计算系统的学科。计算机科学包含许多子领域,所涵盖的内容非常广,掌握任何一个计算机领域的内容都需要扎实的理论基础和丰富的实战经验。因此,如何高效的学习计算机知识和技能是每一位本科生面临的困难与挑战。
为了帮助计算机专业的本科生更好的学习计算机知识,小水滴根据多年从事高等教育的经验以及计算机领域的从业经验,总结出以下针对计算机专业本科阶段的学习建议。这个学习建议包括针对两种学习目标的本科四年学习计划,和计算机核心专业课程的介绍以及推荐的学习材料。我们期望这些建议能够帮助广大计算机专业的本科生成功找到理想的工作或者成功申请理想的研究生院继续攻读硕士博士学位。
这个学习建议和计划仅为小水滴的经验汇总。读者可能会有不同的学习方法和学习计划,或者读者可能会对计算机的学习和教育有着不同的理解,小水滴欢迎读者与我们联系探讨。在总结和写作过程中,因小水滴水平有限,文中难免出现疏忽、遗漏或者错误之处,尚期读者不吝指正。我们的邮件地址为:support@littlewaterdrop.com

2. 学习目标

四年的本科学习时间是短暂的,每一年都有着重要的学习内容和学习目标。计算机学科涉及的领域、知识和技术非常广,在四年内学习所有领域的知识内容是一项“不可能完成”的任务。因此,大家需要有选择性地、分阶段地学习计算机知识。
在制定学习计划之前,首先需要确定学习目标。因为学习目标决定着学什么、怎么学、如何学等问题。本章节将针对以“就业”和“继续深造”为学习目标,为本科学习阶段提出建议。

2.1. 以“就业”为本科学习目标 (夯实基本功+提升实战经验)

如果将“就业”作为本科阶段学习目标的话,那么,学员应将重点放在基本功的练习和实战经验的积累上。基本功是指掌握和运用计算机基础知识的能力。计算机的基础知识包括数据结构、算法、程序设计和相关数学知识。实战经验是指运用已掌握的计算机知识和技术完成项目的经验和能力。在开始一个工程/项目之前,首先需要熟练掌握至少一门编程语言和熟悉至少一个系统或者框架的知识。这个系统或者框架可能是操作系统、数据库、或者目前流行的编程框架等系统之一。积累这些实战经验有助于学员增加就业的竞争力。
因此,以“就业”为目标的学员应着重掌握以下内容:
  • a. 基础知识(例如: 数据结构、算法、和数学知识)。
  • b. 熟练掌握一门流行的编程语言(例如: Java/C++/Python/Go/JavaScript)。
  • c. 熟练掌握一个系统(例如: Linux,MySQL/PostgreSQL或者一个流行的框架系统)。
  • d. 熟悉一个领域内的知识。

2.2. 以“继续深造”为本科学习目标(基本功+逻辑思维训练+英语+写作)

如果将”继续深造”作为本科阶段学习目标的话,那么,在本科阶段应将重点放在基本功、逻辑思维训练、写作和英语上。与上一节类似,基本功是指掌握和运用计算机基础知识的能力,也是从事软件开发或者科研工作的基础。逻辑思维训练对于每一位本科生都非常重要,然而,对于以攻读硕士/博士学位为目标的本科生而言尤为重要。因为在硕士/博士阶段,还需要完成论文和答辩;独立思考、分析问题和写作是必不可少的技能。如果将国外(美国、加拿大、英国、澳大利亚等)研究生院作为申请目标,或者以完成国际高水平论文为目标的话,英语能力也是一项必备技能。
因此,以“继续深造”为目标的学员应着重掌握以下内容。
  • a. 基础知识(例如:数据结构、算法、和数学知识)。
  • b. 熟练掌握一门编程语言(例如:Java/C++/Python)。
  • c. 熟练掌握一个系统(例如:Linux, MySQL/PostgreSQL或者一个流行的框架系统)。
  • d. 熟悉一个领域的知识。
  • e. 科技文写作。
  • f. 英语(读、写、说、听的能力)。

3. 学习内容

在确定了学习目标之后,我们再来详细的讨论本科四年的学习内容,以达成上述的目标。本章节将详细介绍各个阶段推荐的重要课程以及相关的学习材料。在参考和购买推荐书籍时请查阅书籍的最新版本。

3.1. 第一学年(大一)

第一学年是打基础的阶段。无论是以“就业”为目标或者以“继续深造”为目标,学习计算机入门课程、数学课程和英语都是非常重要的。这一阶段重要的基础课简要的总结如下。
  • 计算机基础(Introduction to Computer Science):计算机基础是一门入门课,主要介绍计算机的工作原理和应用范围。虽然目前计算机的普及率非常高,几乎每位学生都会有一台计算机,但是成为计算机专业人才和熟练操作计算机是完全不同的两件事情。小水滴建议每一位本科生认真学习计算机基础这门课,从一开始就建立起对计算机科学的正确认知和理解。
  • 第一门编程语言(First Programming Language):目前流行的编程语言有很多种,它们有着各自的特点,那么,对于大一新生如何选择第一门编程语言呢?小水滴给出几个选项,学员可以根据自身情况,以及所在高校的开课情况,酌情选择。
  • Python编程语言(Python Programming Language):Python是近十年兴起的一门编程语言。相对其他流行的编程语言而言,Python易学、容易上手。Python具有非常庞大的函数库,可以满足不同行业的需求(例如:数学、物理、经济、生物等)。学生能够在较短的时间内完成项目、做出成果。因此,学习Python易于激发学员对编程语言的学习兴趣。
    推荐学习资料:
    Wesley J. Chun, Core Python Applications Programming, 3rd edition. , ISBN-13: 978-0132678209.
    中文版: Python核心编程, 第三版, 人民邮电出版社. ISBN-10: 9787115414779
    Python编程语言官方网站: https://www.python.org/
  • C编程语言(C Programming Language):C语言作为一门传统语言,曾被许多高校采用为第一门编程语言。其原因是(1) C语言的应用较为广泛,绝大多数的操作系统、数据库、编译器等系统均为C语言实现;(2) 学习完C语言之后,可进阶学习C++编程语言,因为C++语言是完全兼容C语言的。然而,以C语言为第一门编程语言也有缺点:(1) 作为第一门语言,学好C语言比较难,容易给学员带来挫败感;(2) 虽然C语言实现了众多系统,但是,目前C语言的就业并不是最宽的,大多数情况下,学员需要再学一门编程语言。
    推荐学习资料:
    Brian W. Kernighan and Dennis M. Ritchie, C Programming Language, 2nd edition. , ISBN-13: 978-0131103627.
    中文版: C程序设计语言, 机械工业出版社. ISBN-10: 9787111617945
    Peter Van Der Linden, Expert C Programming: Deep C Secrets, 1st edition. , ISBN-13: 978-0131774292.
    中文版: C专家编程, 人民邮电出版社. ISBN-10: 9787115171801
    Kenneth Reek, Pointers on C, 1st edition. , ISBN-13: 978-0673999863.
    中文版: C和指针, 人民邮电出版社. ISBN-10: 9787115172013
    Andrew Koening, C Traps and Pitfalls, 1st edition. , ISBN-13: 978-0201179286.
    中文版: C陷阱与缺陷, 人民邮电出版社. ISBN-10: 9787115171795
  • Go编程语言(Go Programming Language):Go语言作为一门较新的语言,它的编程理念代表着未来编程的一个发展方向。Go语言由谷歌(Google)推出,近些年的使用率增长非常快,常被用于开发大型系统。以Go语言作为第一门语言的优点是能够直接学习最新的编程技术与思路,快速的完成项目,提升对编程语言的学习兴趣。缺点是Go语言目前还没有Java/C++语言应用广泛。
    推荐学习资料:
    Alan A. A. Donovan, Go Programming Language, 1st edition. , ISBN-13: 978-0134190440.
    Go编程语言官方网站: https://golang.org/
  • Java语言(Java Programming Language):Java语言是一门通用的、面向对象的编程语言。从语言的复杂度上看,Java语言并不适合作为第一门语言学习。然而,Java语言也包含了一些易于初学者上手的特性,而且Java语言的生态系统非常庞大,需要经过长年累月的积累才能熟练掌握。因此,从一开始学习Java的一些初级特性,并且在大学四年中坚持学习的话,Java也是一个不错的选择。
    推荐学习资料:
    Cay S. Horstmann, Core Java Volume I – Fundamentals, 11th edition. , ISBN-13: 978-0135166307.
    中文版: Java核心技术(卷一)基础知识, 机械工业出版社. ISBN-10: 9787111636663
    Cay S. Horstmann, Core Java Volume II—Advanced Features, 11th edition. , ISBN-13: 978-0135166314.
    中文版: Java核心技术(卷二)高级特性, 机械工业出版社. ISBN-10: 9787111643432
    Joshua Bloch, Effective Java, 3rd edition. , ISBN-13: 978-0134685991.
    中文版: Effective Java中文版, 机械工业出版社. ISBN-10: 9787111612728
  • 高等数学:高等数学课程是一门开启“高等数学”学习的入门基础课。其中,最为重要的一项知识是微积分。它是由极限概念延展而成的。极限的思想和微积分常常应用于计算机优化(Computer Optimization)领域。虽然,目前计算机只能工作于“离散空间”,而极限和微积分建立在连续空间之中,但是在计算机理论的研究中,极限和微积分是最为基础的知识。
    与计算机相关的数学学习资料:
    Eric Lehman, Thomson Leighton, and Albert Meyer, Mathematics for Computer Science.
    D. Knuth, Concrete Mathematics: A Foundation for Computer Science, 2nd edition. ISBN-10: 0201558025, ISBN-13: 978-0201558029.
    Jean Gallier and Jocelyn Quaintance, Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning.
  • 英语:在计算机领域,英语的学习尤为重要。目前绝大多数计算机专业的文献资料都是使用英文撰写的,因此,阅读英文资料的能力决定着学员学习计算机知识的深度和广度。当前世界顶尖的计算机专业人才使用的是英语,向他们学习以及交流心得,互进互助需要全面熟练的掌握英语。英语是申请硕士研究生/博士研究生必考的科目之一。国外研究生院的申请材料需要使用英语撰写。投稿并发表国际会议/期刊论文,也需要使用英文撰写。

3.2. 第二学年(大二)

第二学年会进入计算机专业的基础课学习,它们为第三学年的学习专业课程打下坚实的基础。在第一学年学习了第一门编程语言和高等数学课程之后,可以开始学习一些基本的编程思想和技术,以完成一些小的项目,并且进一步学习其他的、与计算机专业相关的“高等数学”的内容。计算机专业基础课是非常重要的,它们是第三学年学习专业课的基石。其中,数据结构与算法是程序设计的核心所在:数据结构讲解的是如何在程序中表达数据以及数据之间的关系;而算法则是处理和操作数据的逻辑。因此,我们可以认为,一个程序=数据结构+算法。
  • 数据结构(Data Structures):数据结构课程重点讲解在程序中如何组织和表达数据。数据结构课程是所有专业课的基础;数据结构课程中讲解的内容会被用于专业课中解决更加复杂的问题。因此,学好数据结构课程是学好专业课程的前提条件。数据结构的课程内容也会被广泛的用于课程设计之中和参加工作之后的项目开发之中。
    前置课程:第一门编程语言、高等数学。
    推荐学习资料:
    Y. Daniel Liang, Introduction to Java Programming and Data Structures, 12th edition. ISBN-10: 0136520235, ISBN-13: 978-0136520238.
  • 算法(Algorithms):算法也是一门十分重要的专业基础课。与数据结构课程类似,算法课程讲解的是解决问题的逻辑和处理过程。在算法课程中会讲解一些常用问题以及有效的处理方法。这些方法已被广泛的应用于专业课程和项目开发之中。另外,数据结构与算法的内容是企业面试和研究生考试中必考的内容,值得重点学习。
    前置课程:第一门编程语言、数据结构、高等数学。
    推荐学习资料:
    Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 3rd edition. , ISBN-13: 978-0262033848.
    中文版: 算法导论, 机械工业出版社. ISBN-10: 9787111407010
    Robert Sedgewick and Kevin Wayne, Algorithms, 4th edition. , ISBN-13: 978-0321573513.
    中文版: 算法, 人民邮电出版社. ISBN-10: 9787115293800
    Steven S Skiena, The Algorithm Design Manual, 2nd edition. , ISBN-13: 978-1848000698.
    中文版: 算法设计手册, 清华大学出版社. ISBN-10: 9787302207276
    D. E. Knuth, The Art of Computer Programming. ISBN-10: 0321751043, ISBN-13: 978-0321751041.
  • 组成原理(Computer Organization):组成原理是一门讲解计算机各部件运行原理的课程。课程内容包括CPU/内存/磁盘的工作原理、机器语言的设计、以及数据和指令的表达方式等内容。CPU是一台计算机最重要的部件;组成原理课程会重点讲解CPU内部的运行原理以及CPU与其他部件的协作原理。组成原理属于偏硬件、偏底层的一门课;通过学习组成原理课程能够帮助从下至上彻底理解CPU和计算机的运行原理和工作方式。因此,组成原理是非常重要的一门课程。
    前置课程:无。
    推荐学习资料:
    David A. Patterson and John L. Hennessy, Computer Organization and Design MIPS Edition: The Hardware/Software Interface, 5th edition. , ISBN-13: 978-0124077263.
    David R. O'Hallaron Randal E. Bryant, Computer Systems: A Programmer's Perspective, 3rd edition. ISBN-10: 9332573905, ISBN-13: 978-9332573901.
  • 数值分析(Numeric Analysis):因为现代计算机只能在离散空间中处理离散数据,而不能在连续空间处理连续变化的数据。例如:计算机无法求得极限、积分等问题的精确解。因此,数值分析课程着重介绍一些常用的方法,以求得这些问题的近似解。因此,学习数值分析课程对以后从事科研非常有帮助。
    前置课程:第一门编程语言、高等数学。
    推荐学习资料:
    Richard L. Burden, J. Douglas Faires and Annette M. Burden, Numerical Analysis, 10th edition. , ISBN-13: 978-1305253667.
  • 第一个课程设计(Course Project):在学习了数据结构和算法课程之后,很可能会被要求完成至少一个课程设计。这个课程设计是非常重要的,因为,很可能这是第一次完成正式的项目。在此过程中,学生需要独立选择和实现数据结构和算法,最终完成一个项目或者模块。学生可能会遇到各种各样的问题,解决这些问题也是锻炼程序开发能力的一种方式。因此,我们建议重视此次的课程设计,遇到困难时,多于同学和老师交流。若有疑难,小水滴也会提供帮助。
  • 线性代数 (Linear Algebra) :在众多数学科目中,线性代数是对计算机科学技术贡献最大的几门数学科目之一。在线性代数中,空间的表达能力和矩阵的运用广泛的应用于计算机图形学(Computer Graphics)、数据挖掘(Data Mining)、机器学习(Machine Learning)、计算机视觉(Computer Vision)、科学计算(Scientific Computing)、人工智能(Artificial Intelligence)、图形图像处理(Image Processing)等领域。因此,线性代数是一门非常重要的基础课,对于学习和理解上述领域的知识起到了关键性的作用。
    推荐学习资料:
    Gilbert Strang, Introduction to Linear Algebra, 5th edition. , ISBN-13: 978-0980232776.
  • 离散数学(Discrete Mathematics):离散数学是研究离散数据结构及其关系的学科,在计算机众多领域(编译原理(principles of compiler design)、人工智能(Artificial Intelligence)、计算理论(Theory of Computation)等)都有着重要的应用。如果计划在计算机科学领域内做深入研究的话,离散数学是一门非常重要的数学课程。
    前置课程:高等数学。
    推荐学习资料:
    K. H. Rosen, Discrete Mathematics and Its Applications, 8th edition. , ISBN-13: 978-1260091991.
  • 概率论(Introduction to Probability):概率论是一门研究概率和随机现象的课程。概率论在以下计算机领域有着广泛的应用,例如:人工智能(Artificial Intelligence)、计算理论(Theory of Computation)、数据挖掘(Data Mining)、机器学习(Machine Learning)、算法优化(Algorithm Optimization)等。所以,概率论也是一门非常重要的数学课程。
    前置课程:高等数学、线性代数。
    推荐学习资料:
    Hossein Pishro-Nik, Introduction to Probability, Statistics, and Random Processes, 1st edition. , ISBN-13: 978-0990637202.
  • 英语学习与四级英语:英语学习是一个长期持续的过程。在第二学年、可以考虑参加全国英语四级考试。这不仅是一个检验英语水平的机会,有些高校还要求学生必须通过全国英语四级考试才能获得学位证书。因此,在前两个学年里,应保持英语学习,并通过全国英语四级考试。对于计划出国深造的学生,在本学年可以开始尝试阅读英文原版教材,以保持英语的阅读量和熟悉计算机领域内的专业英语词汇。
    推荐学习资料:

3.3. 第三学年(大三)

第三学年会进入计算机专业课学习。第三学年非常重要是因为学生开始接触到计算机学科内各个子领域的知识。在这个学年里,大家会逐渐认识计算机科学、选择将来从事的子领域。如果还计划毕业后在国内/国外继续攻读硕士/博士学位的话,那么,第三学年将会是最忙的一年。因为,在这一年里,不仅需要学习众多专业课,还需要开始着手准备考研或者出国留学的诸多事情。
计算机的专业课非常多,而且随着计算机技术的发展,还会不断地涌现出新的专业科目,我们将核心专业课的内容简要的总结如下。
  • 数据库管理系统(Database Management Systems) :使用和管理数据是计算机领域一个重要的应用。数据库系统被广泛的应用于大多数企业级应用系统中。当前数据库管理系统分为关系型数据库管理系统(Relational Database Management Systems)和非关系型数据库管理系统(No-SQL Database Management Systems);本阶段的数据库管理系统课程会重点讲解关系型数据库的原理和使用方法。在熟练掌握关系型数据库之后,学员还可以在此基础之上进一步学习非关系型数据库管理系统。值得注意的是,学好数据库这门课程会对将来就业有较大帮助。
    前置课程:数据结构、算法。
    推荐学习资料:
    Raghu Ramakrishnan and Johannes Gehrke, Database Management Systems, 3rd edition. , ISBN-13: 978-0072465631.
    David M. Kroenke, David Auer, Scott L. Vandenberg, and Robert C. Yoder, Database Concepts, 8th edition. , ISBN-13: 978-0134601533.
    流行的关系型数据库管理系统:MySQL, PostgreSQL.
    流行的非关系型数据库管理系统: (免费)
  • 操作系统(Operating Systems) :操作系统课程介绍的是操作系统的工作原理。操作系统是用于将硬件和软件“连接”在一起工作的软件系统。向下,操作系统管理各个硬件;向上,操作系统使用各个硬件资源,为上层软件提供服务。无论是在今后的就业还是从事科研工作,操作系统方面的知识都是不可缺少的。学习操作系统课程需要有扎实的C语言基础。
    前置课程:第一门编程语言、数据结构、算法。
    推荐学习资料:
    Abraham Silberschatz, Greg Gagne, and Peter B. Galvin, Operating System Concepts, 10th edition. , ISBN-13: 978-1119456339.
    中文版: 操作系统概念, 机械工业出版社. , ISBN-13: 978-7111604365.
    Andrew S. Tanenbaum and Herbert Bos, Modern Operating Systems, 4th edition. , ISBN-13: 978-0133591620.
    中文版: 现代操作系统, 机械工业出版社. , ISBN-13: 9787111573692.
    W. Stallings, Operating Systems: Internals and Design Principles. ISBN-10: 0134670957, ISBN-13: 978-0134670959.
    流行的操作系统(可选择其中一种操作系统学习):
  • Linux
    Daniel P. Bovet and Marco Cesati, Understanding the Linux Kernel, 3rd edition. , ISBN-13: 978-0596005658.
    中文版: 深入理解Linux内核, 中国电力出版社. , ISBN-13: 9787508353944.
    Robert Love, Linux Kernel Development, 3rd edition. , ISBN-13: 978-0672329463.
    中文版: Linux内核设计与实现, 机械工业出版社. , ISBN-13: 9787111338291.
  • Windows
    Pavel Yosifovich, Mark E. Russinovich, David A. Solomon, and Alex lonescu, Windows Internals, 7th edition. , ISBN-13: 978-0735684188.
    Mark E. Russinovich, Andrea Allievi, Alex Lonescu, and David A. Solomon, Windows Internals, Part 2, 7th edition. , ISBN-13: 978-0135462409.
  • MacOS/iOS
    Jonathan Levin, MacOS and iOS Internals, Volume I: User Mode. , ISBN-13: 978-0991055562.
    Jonathan Levin, MacOS and iOS Internals, Volume II: Kernel Mode. , ISBN-13: 978-0991055579.
    Jonathan Levin, MacOS and iOS Internals, Volume III: Security & Insecurity. , ISBN-13: 978-0991055531.
  • Linux/Unix系统编程:
    Richard Stevens and Stephen Rage, Advanced Programming in the UNIX Environment, 3rd edition. , ISBN-13: 978-0321637734.
    中文版: UNIX环境高级编程, 人民邮电出版社. , ISBN-13: 9787115516756.
    Robert Love, Linux System Programming: Talking Directly To The Kernel And C Library, 2nd edition. , ISBN-13: 978-1449339531.
    中文版: Linux系统编程, 人民邮电出版社. , ISBN-13: 9787115346353.
  • 体系结构(Computer Architecture) :体系结构课程也是介绍计算机各组成部分工作原理的课程。这一点与计算机组成原理课程十分相近。但是,它们的不同之处在于计算机组成原理的课程内容更为底层,着重于通用计算机部件的实现细节;而体系结构则更偏向于通过使用不同的技术、不同的组件、不同的组件间的协作方式,为上层提供最优化的服务。换句话说,学习组成原理有助于理解通用计算机的工作原理,而学习体系结构能帮助理解和设计,在不同的应用场景下最优的计算机的结构。对于有志于在计算机架构方向发展的学生而言,体系结构是一门非常重要的课程。
    前置课程:第一门编程语言、数据结构、算法。
    推荐学习资料:
    John L. Hennessy and David A. Patterson, Computer Architecture: A Quantitative Approach, 6th edition. , ISBN-13: 978-0128119051.
    中文版: 计算机体系结构, 人民邮电出版社. , ISBN-13: 9787115297655.
  • 编译原理(Principles of Compilers) :广义的说,编译原理课程讲解的是计算机编程语言的本质。这其中包括计算机语言的分类、计算机语言的翻译与解释、以及计算机语言的运行过程。狭义的说,编译原理着重介绍的是如何设计一门编程语言,如何设计与实现相对应的编译器/解释器,以及如何运行由这门语言编写的应用程序。如果对程序设计和编程的本质感兴趣的话,编译原理是一门非常重要的课程。
    前置课程:第一门编程语言、数据结构、算法。
    推荐学习资料:
    Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman, Compilers: Principles, Techniques, and Tools, 2nd edition. , ISBN-13: 978-0321486813.
    中文版: 编译原理, 机械工业出版社. , ISBN-13: 9787111251217.
    Harold Abelson, Gerald Jay Sussman, and Julie Sussman, Structure and Interpretation of Computer Programs, 2nd edition. , ISBN-13: 978-0262510875.
    中文版: 计算机程序的构造与解释, 机械工业出版社. , ISBN-13: 9787111135104.
  • 第二门编程语言(Second Programming Language):在大三学年学习了一些计算机专业课之后,学员可以考虑学习第二门编程语言,以开拓程序设计的知识领域,积累更多的编程经验。如果已选择C/Go语言作为第一门编程语言的话,此时可尝试学习使用C++或者Java作为第二门编程语言。因为C++和Java是目前最为流行的、面向对象的程序设计语言。如果已选择Python语言作为第一门编程语言的话,学员可以继续使用Python,或者学习C++/Java语言,因为从编程方式和应用场景而言,Python和C++、Java是完全不同的。如果已选择了Java语言作为第一门编程语言,可以进而学习Scala语言。如何选择第二门编程语言并没有一个统一的答案,需根据自身情况选择。
    推荐学习资料:
  • C++
    Stanley B. Lippman, Josee Lajoie, and Barbara E. Moo, C++ Primer, 5th edition. , ISBN-13: 978-0321714114.
    中文版: C++ Primer中文版, 电子工业出版社. , ISBN-13: 9787121155352.
    Scott Meyers, Effective C++: 55 Specific Ways to Improve Your Programs and Designs, 3rd edition. , ISBN-13: 978-0321334879.
    中文版: Effective C++:改善程序与设计的55个具体做法, 电子工业出版社. , ISBN-13: 9787121123320.
    Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs, 1st edition. , ISBN-13: 978-0201633719.
    中文版: More Effective C++:35个改善编程与设计的有效方法, 电子工业出版社. , ISBN-13: 9787121125706.
    David Vandevoorde, Nicolai M. Josuttis, and Douglas Gregor, C++ Templates: The Complete Guide, 2nd edition. , ISBN-13: 978-0321714121.
    中文版: C++ Templates中文版, 人民邮电出版社. , ISBN-13: 9787115171818.
  • Scala
    Martin Odersky, Lex Spoon, and Bill Venners, Programming in Scala, 4th edition. , ISBN-13: 978-0981531618.
    Scala编程语言官方网站: https://www.scala-lang.org/
  • 计算机网络(Computer Networks) :计算机网络课程讲解的是两台或者多台计算机之间通信的原理和工作方式。目前,计算机网络遍布全世界每一个角落;每天都有大量的数据分享于计算机网络之上。计算机网络课程讲解的是这些数据如何在网络上发布、传输和分享。互联网、以太网、WIFI、蓝牙等技术都是计算机网络的一项应用技术。对这些技术的工作原理和实现细节感兴趣的学员可重点学习计算机网络课程。
    前置课程:第一门编程语言、数据结构、算法、概率论。
    推荐学习资料:
    James Kurose and Keith Ross, Computer Networking: A Top-Down Approach, 7th edition. , ISBN-13: 978-0133594140.
    中文版: 计算机网络:自顶向下方法, 机械工业出版社. , ISBN-13: 9787111599715.
    Richard Stevens, TCP/IP Illustrated Vol. 1: The Protocols, 2nd edition. , ISBN-13: 978-0321336316.
    中文版: TCP/IP详解,卷一:协议, 机械工业出版社. , ISBN-13: 9787111453833.
    Gary Wright and Richard Stevens, TCP/IP Illustrated Vol. 2: The Implementation, 2nd edition. , ISBN-13: 978-0321336316.
    中文版: TCP/IP详解,卷二:实现, 机械工业出版社. , ISBN-13: 9787111617938.
    W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Unix Network Programming, Volume 1: The Sockets Networking API, 3rd edition. , ISBN-13: 978-0131411555.
    中文版: UNIX网络编程,卷1:套接字联网API, 第三版, 人民邮电出版社. , ISBN-13: 9787115517791.
    W. Richard Stevens, UNIX Network Programming, Volume 2: Interprocess Communications, 2nd edition. , ISBN-13: 978-0130810816.
    中文版: UNIX网络编程,卷2:进程间通信, 第二版, 人民邮电出版社. , ISBN-13: 9787115517807.
  • 计算机安全(Computer Security):计算机安全课程主要讲解的是如何保护数据和如何保护计算资源的原理。其中,人们熟知的计算机病毒与防范方法、计算机黑客、计算机网络攻击与防范、数据加密解密等都属于计算机安全的范畴。因此,对于这些内容感兴趣的学员应重点学习这门课程。
    前置课程:第一门编程语言、数据结构、算法、高等数学、概率论、操作系统、计算机网络。
  • 图形学(Computer Graphics):计算机图形学介绍的是在计算机系统中如何生成和显示图形图像的原理和细节。例如,在显示器上展示图形、播放视频和动画等都属于计算机图形学的范畴。因此,对于图形图像的处理、计算机游戏开发感兴趣的学生可重点学习这门课程。
    前置课程:第一门编程语言、数据结构、算法、线性代数。
  • 软件工程(Software Engineering): 软件工程课程介绍软件开发的过程。其中,软件开发的过程内容包括软件开发的周期模型(Software Life Cycle Models),软件需求分析、软件开发与测试技术、软件开发的成本估算、软件质量评估、和软件维护等问题。在软件工程课程上讲解的内容是企业项目开发中直接使用的内容。因此,学习这门课程对将来就业帮助非常大,值得学习。
    前置课程:第一门编程语言。
  • 软件品质保证(Software Quality Assurance): 软件品质保证课程介绍一系列软件开发的流程、方法和工具;它们用于确保开发的软件能够达到预计质量标准。其中,软件品质保证内容涵盖需求定义、软体设计、代码编写、版本控制、代码审查与测试、软件集成和发布管理等内容。因此,学习这门课程对将来就业帮助非常大。
    前置课程:第一门编程语言。
  • 敏捷开发(Agile Software Development): 敏捷开发是一种软件开发的方法。这种方法能够迅速响应多变的需求,提高团队的生产效率。敏捷开发是一种对于软件开发的价值观和原则,她能够将团队自发的组织在一起,通过积极协作,寻找和实现解决方案。敏捷开发提倡适度的计划、增量开发、持续改进、快速响应等开发理念。敏捷开发是目前较为流行的一种软件开发方法。
    前置课程:第一门编程语言。
  • 专业课的课程设计:专业课的课程设计是一个非常好的、运用已学的知识和技能开发应用程序的机会。在这个过程中,学员能够学到许多实用的技术、积累实战经验。并且这次课程设计是与计算机子领域直接相关的。拥有这些经验对于今后的成长以及就业会有很大的帮助。
  • 英语:对于以“继续深造”或者留学为目标的学生仍然需要继续加强英语学习。在通过全国英语四级考试之后,可以将下一个目标定为全国英语六级考试。通过参加全国英语六级考试能对自己有一个客观的测试与评价,并且为未来考研或者考GRE/TOEFL做准备。 如果学员以申请美国研究生院为目标的话,在本科第三学年就应该开始着手准备并参加GRE/TOEFL考试。目前,GRE的成绩五年内有效、TOEFL成绩两年内有效。因此,对英语较有信心的同学可以先参加GRE考试,取得理想成绩之后,再参加TOEFL考试,这是因为准备TOFLE考试的周期较短,并且TOEFL的成绩有效期较短。如果对于英语基础较弱的学生,我们建议先参加TOEFL考试,取得较好成绩之后,再参加GRE考试,这是因为相比较而言,TOEFL较为容易一些,如果能取得好成绩,会极大鼓励后续的GRE考试。
  • 考研:对于以报考国内研究生院的学员而言,在第三学年结束之后,在第四学年开始之前,就需要开始着手准备全国研究生初始考试了。在第三学年第二学期,学员需开始了解考研的内容、过程、报考学校和专业等问题。

3.4. 第四学年(大四)

在第四学年中,学生将学习一些进阶的专业课以及完成毕业论文。在这个过程中,学生应着重选择一些将来从事或者继续深造的方向的课程,以持续积累在该方向内的知识和技能。在最后一个学期,毕业论文的写作也是一个很好的训练思维、锻炼写作和表达能力的机会。尤其对于即将攻读硕士/博士学位的学生而言,需要重点训练写作技巧,提升表达和做学术报告的能力。
  • 分布式与并行计算(Distributed and Parallel Computing):分布式与并行计算课程讲解的是多台计算机之间如何协作完成一项任务的原理与技术。目前,分布式与并行计算技术广泛地应用于各种大型应用程序和系统。例如:分布式/并行数据库、分布式/并行数据处理、数据挖掘、人工智能等领域。因此,分布式与并行计算是一门值得投入时间学习的课程。
    前置课程:第一门编程语言、数据结构、算法、计算机体系结构。
    推荐学习资料:
    Peter Pacheco, An Introduction to Parallel Programming. ISBN-10: 0123742609, ISBN-13: 978-0123742605.
    Maarten van Steen and Andrew S. Tanenbaum, Distributed Systems, 3rd edition. ISBN-10: 1543057381, ISBN-13: 978-1543057386.
  • 云计算(Cloud Computing):云计算课程讲解的是云计算方面的内容。使用云计算技术能将网络上的计算资源集中有效的管理,并为用户提供优质的服务。这些服务包括部署和运行云服务器、云存储服务、云数据库、和云应用软件(数据处理、人工智能应用)等服务。云计算技术建立于众多计算机技术之上,例如:操作系统、体系结构、分布式与并行计算、计算机网络、计算机安全等。在世界范围内,众多云厂商(亚马逊(Amazon)、谷歌(Google)、微软(Microsoft)、阿里巴巴(Alibaba)等)均开发推出了高质量的云服务。云计算的应用正在快速增长。因此,云计算是非常值得学习的一门高阶专业课。
    前置课程:第一门编程语言、数据结构、算法、计算机体系结构、操作系统。
    推荐学习资料:
    Dan C. Marinescu, Cloud Computing: Theory and Practice, 2nd edition. ISBN-10: 0128128100, ISBN-13: 978-0128128107.
  • 人工智能(Introduction to Artificial Intelligence):人工智能课程讲解的是人们研究与扩展机器智能的理论、方法、技术和应用。著名的人工智能应用包括谷歌阿尔法围棋应用程序(AlphaGo)、语音识别(Speech Recognition)、人脸识别(Face Recognition)、自动驾驶系统(Autonomous Vehicle System)、聊天机器人(Chatbot)等。在众多计算机领域中,目前人工智能是最为热门、最富有发展前景的子领域。人工智能这门课是开启人工智能方向的入门课程,值得学习。
    前置课程:第一门编程语言、数据结构、算法、概率论与统计。
    推荐学习资料:
    Stuart Russell and Peter Norvig, Artificial Intelligence: A Modern Approach, 4th edition. , ISBN-13: 978-0134610993.
    中文版: 人工智能:一种现代的方法, 清华大学出版社. , ISBN-13: 9787302331094.
  • 数据挖掘(Data Mining):数据挖掘课程讲解的是如何使用计算机技术从原始数据(Raw Data)中探索和发现有用信息(Information)的技术和方法。随着当前数据快速增长,数据挖掘技术被广泛应用于数据处理和数据分析之中。数据挖掘技术与统计学(Statistics)、人工智能(Artificial Intelligence)、和机器学习(Machine Learning)有着非常紧密的联系。它们相互启发、相互借鉴、相互帮助。它们常常被同时使用在一个系统中。对于未来计算机的发展,数据挖掘将变得越来越重要。
    前置课程:第一门编程语言、数据结构、算法、概率论与统计。
    推荐学习资料:
    Trevor Hastie, Robert Tibshirani and Jerome Friedman, The Elements of Statistical Learning: Data Mining, Inference, and Prediction, 2nd edition. , ISBN-13: 978-0387848570.
    David J. Hand, Heikki Mannila, and Padhraic Smyth, Principles of Data Mining (Adaptive Computation and Machine Learning), 1st edition. , ISBN-13: 978-0262082907.
  • 机器学习(Machine Learning):机器学习课程讲解的是如何经过学习之后,让计算机具备处理实际问题的能力。传统的计算机技术是由人们编写特定逻辑的代码来解决特定的实际问题。而不同的是,机器学习领域研究的是如何通过学习训练之后,计算机能够具备解决某一特定实际问题的理论和技术。机器学习技术广泛的应用于人工智能领域。例如上述的应用,包括谷歌阿尔法围棋应用程序(AlphaGo)、语音识别(Speech Recognition)、人脸识别(Face Recognition)、自动驾驶系统(Autonomous Vehicle System)、聊天机器人(Chatbot),都需要使用机器学习技术,让计算机能够处理这些问题。因此,机器学习技术的发展与成熟将会极大的影响未来计算机技术的发展以及人类的生活。
    前置课程:第一门编程语言、数据结构、算法、高等数学、概率论与统计。
    推荐学习资料:
    Christopher M. Bishop, Pattern Recognition and Machine Learning (Information Science and Statistics), 1st edition. , ISBN-13: 978-0387310732.
    Christopher M. Bishop, Neural Networks for Pattern Recognition (Advanced Texts in Econometrics), 1st edition. , ISBN-13: 978-0198538646.
    周志华, 机器学习, 清华大学出版社. , ISBN-13: 9787302423287.
  • 项目管理(Software Project Management):项目管理课程介绍的是如何有效的跟踪和管理大型软件项目的开发和维护。项目管理方面的知识和经验能够帮助学员增加就业的竞争力。同时也能帮助学员更加快速的融入开发团队、投入项目开发和管理之中。
    推荐学习资料:
    A Guide to the Project Management Body of Knowledge (PMBOK Guide), 6th edition. , ISBN-13: 978-1628251845.
  • 密码学(Cryptography):密码学是计算机科学专业信息安全方向的主要专业课。本课程涵盖密码学的基本原理,主要内容包括加密,加密哈希,证书和签名,经典密码,对称密钥和公钥密码,块操作模式和常见密码分析技术,包括详尽搜索、中间人攻击和生日攻击的密码分析技术。
    前置课程:概率论与数理统计、计算机安全。
    推荐学习资料:
    Christof Paar and Jan Pelzl, 深入浅出密码学-常用加密技术原理与应用. ISBN-10: 730229609X, ISBN-13: 978-7302296096.
    Christof Paar, Jan Pelzl, and Bart Preneel, Understanding Cryptography: A Textbook for Students and Practitioners. ISBN-10: 3642041000, ISBN-13: 978-3642041006.
  • 网络安全(Network Security):网络安全课程重点介绍网络协议的漏洞,针对跨网络传输的数据的机密性、完整性和可获得性的攻击,以及通过项目练习诊断和弥合安全漏洞的方法。该课程还涵盖了高级持久威胁(APT),自带设备(BOYD)和恶意软件服务的网络安全课题。
    前置课程:计算机操作系统、计算机网络。
    推荐学习资料:
    Patrick Engebretson, The Basics of Hacking and Penetration Testing: Ethical Hacking and Penetration Testing Made Easy, 2nd edition. , ISBN-13: 978-0124116443.
  • 恶意软件分析(Malware Analysis):本课程介绍恶意软件分析的原理和实践。主题包括静态和动态代码分析,数据解码,分析工具,调试,shellcode分析,隐身恶意软件的逆向工程以及分析结果的书面演示。
    前置课程:计算机操作系统。
    推荐学习资料:
    Michael Sikorski and Andrew Honig, Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software, 1st edition. ISBN-10: 1593272901, ISBN-13: 978-1593272906.
    中文版: Michael Sikorski and Andrew Honig, 恶意代码分析实战, 电子工业出版社. , ISBN-13: 9787121224683.
  • 入侵检测(Intrusion Detection):计算机信息系统安全监视,入侵检测 (两种基本类型:异常检测和滥用检测)和危机管理,包括警报管理、签名配置、传感器配置和故障排除组件。介绍如何识别、解决和记录网络危机并激活响应团队。讨论各种类型的威胁,如何将其检测到以及减少威胁发生可能性的管理控制。
    前置课程:计算机操作系统、计算机网络。
    推荐学习资料:
    Stephen Northcutt, Network Intrusion Detection, 3rd edition. ISBN-10: 0735712654, ISBN-13: 978-0735712652.
  • 区块链(Block Chain):区块链技术是一种新型的数据存储技术。与传统的数据库或者数据中心不同的是,区块链将数据分散存储在多处,具有防篡改、易追溯等优点。区块链技术有着广泛的应用,除了著名的比特币以外,区块链还可应用于信息管理(Information Management)、物联网(Internet of Thing)、身份识别应用(Identity Application)等领域。因此,区块链技术将会逐渐改变人们的生活方式。
    前置课程:概率论与统计、计算机安全、并行计算与分布式系统。
    推荐学习资料:
    Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, and Steven Goldfeder, Bitcoin and Cryptocurrency Technologies: A Comprehensive Introduction. , ISBN-13: 978-0691171692.
  • 科技文写作(Technical Writing):科技文写作课程介绍的是科技文章/科研论文的写作内容、写作方法、以及写作技巧等。无论是将来从事科研工作或者进入企业,写出结构清新、逻辑明确、层次分明的文章都会使得学生受用终身。值得强调的是,科技文写作课程是从事科研工作的“必修课”。因此,科技文写作课程是值得投入时间学习的一门课。
    推荐学习资料:
    Justin Zobel, Writing for Computer Science. ISBN-10: 1447166388, ISBN-13: 978-1447166382.
  • 考研:全国统一的硕士研究生考试一般在第四学年的上学期结束后举行。因此,考研的学生会在第四学年上学期将大部分精力放在考研的准备工作上。如果在硕士研究生初试(笔试)中获得了好成绩,那么,各高校的研究生复试会在第四学年的下学期举行。相应的,考生还需要准备硕士研究生的复试。复试的内容由报考的高校自行决定。
  • 留学申请:对于北美高校而言,留学申请材料一般需要在第四学年上学期(秋季)提交(截止日期通常在秋季11-12月份)。有些高校的截止日期(Deadline)可能稍晚,大概会在第四学年下学期(春季)的1-2月份。在通常情况下,在提交材料时,还需填写GRE/TOEFL成绩,并要求ETS将GRE/TOEFL成绩单邮寄到所报考的学校。与此同时,学员还需考虑预约签证(Visa)。在去国外高校报道之前,学员还需要向所在国的大使馆提交签证申请。在签证批准后,学员才能持签证入境。一些热门留学国家(例如:美国),预约和准备签证的过程并不轻松,因此,需要提前准备。
    推荐学习资料:

3.5. 专业选修课

因为各高校的课程安排不同,小水滴认为还有一些重要的计算机专业课可能以选修课的形式出现在各个高校。这些课程同样能帮助学生学习某一子领域内的重要知识,锻炼学员的能力。
  • 计算理论(Theory of Computation):计算理论是系统性的从概念和理论的角度介绍计算本质的一门课。学习这门课能帮助学员站在计算机的角度来思考问题、分析问题和解决问题。计算机不是“万能”的;有些问题,使用计算机很容易解决;有些问题,使用计算机解决比较困难;有些问题,计算机无法解决。那么,计算理论课程会从理论的角度梳理和分析这些问题。因为计算理论研究的是计算的本质所在;因此,学习计算理论能帮助学员提升对计算机的认知水平,这些知识将终身受用。
    推荐学习资料:
    Michael Sipser, Introduction to the Theory of Computation, 3rd edition. , ISBN-13: 978-8131525296.
    Peter Linz, An Introduction to Formal Languages and Automata, 6th edition. , ISBN-13: 978-1284077247.
  • 嵌入式系统(Embedded Systems):嵌入式系统课程介绍的是小型、微型计算系统的工作原理。因为嵌入式系统的计算资源非常少,因此,与常见的台式机和服务器相比,嵌入式系统有着完全不同的体系结构和工作原理。嵌入式系统的优势在于身材小巧、耗电少、价格低廉,因此,嵌入式系统技术广泛的应用于物联网(Internet-of-Thing)领域。
    前置课程:C/C++语言、计算机组成原理、操作系统、Linux系统。
  • 物联网(Internet-of-Thing):物联网课程讲解的是物联网系统的原理和工作方式。物联网是未来计算机技术发展的一个重要方向和趋势。随着嵌入式技术和5G网络的发展与成熟,人们设计开发出各种各样的终端设备,应用于我们的日常生活之中。将这些终端设备相互连接起来,组成一个“巨型”的网络系统,我们称这个系统为物联网。在未来,物联网技术将会极大的改变人们的生活方式。因此,学习物联网课程将会帮助学员开拓视野、学习最前沿的计算机技术理念。
    前置课程:一门编程语言(C/C++/Java/Python)。
  • 移动应用开发(Mobile App Development):移动应用开发课程介绍的是开发移动设备上的应用程序的内容和流程(例如:开发手机应用程序或者平板电脑应用程序)。目前,最为流行的两个移动开发平台为安卓(Android)平台和iOS平台。另外,还有一些框架或者平台能够帮助学员开发跨平台的应用程序(使用一套代码开发出安卓和iOS平台的应用程序)。这是一门偏工程、偏实际应用的课程。在这门课程中,学员能积累移动平台的开发知识和经验,增强编程能力,帮助学员增加就业的竞争力,因为,企业可能也正在使用相同或者类似的技术。
    推荐学习资料:
    安卓平台官方网站https://www.android.com/
    Flutter(跨平台)官方网站https://flutter.dev/
  • 网站设计与开发 (Web Development):网站设计与开发课程介绍的是制作网站的原理和技术。在这门课程结束之后,学员应能够熟练掌握HTML/CSS/Javascript语言特性,并使用它们开发出网站系统。为了降低网站开发的难度,目前较为流行的网站开发技术是响应式网页开发(Responsive Web Design),它能够帮助网站自适应屏幕大小,从而在不同大小的设备上呈现内容,提供最优的人机交互接口。另一个目前较为流行的趋势是使用框架开发出单页面应用程序(Single Page Application),帮助开发人员更加快速高效的开发网站。
    推荐学习资料:
    Bootstrap官方网站https://getbootstrap.com/
    React官方网站https://reactjs.org/
    Vue官方网站https://vuejs.org/
    Angular官方网站https://angularjs.org/
  • 人机交互(Human-Computer Interaction): 人机交互课程学习的是人类和计算机交换信息的方式。这里所指的“计算机”不仅仅限于笔记本或者服务器,它包括一切计算系统,例如:手机,可穿戴设备(Wearable Device)等。学习人机交互课程能帮助理解和设计更加有效的操作界面和操作方式。人机交互的知识被广泛的应用于可穿戴设备开发(Wearable Device Development)、游戏设计(Game Design)、移动应用开发(Mobile App Development)等领域。
    推荐学习资料:
    Alan Dix, Janet E. Finlay, Gregory D. Abowd, and Russell Beale, Human-Computer Interaction, 3rd edition. , ISBN-13: 978-0130461094.
  • 计算机辅助技术原理与实践(Principles and Practice of Assistive Technology): 计算机辅助技术课程介绍的是如何使用计算机技术帮助改善残障人士的生活品质。目前,计算机辅助技术主要用于辅助移动(Assistive Mobility)、辅助阅读(Assistive Reading)、助听(Assistive Hearing)、助声(Assistive Speech)等领域。在完成本课程后,学生能够系统性掌握计算机辅助技术和知识,并开发计算机辅助产品的原型(Prototype)。
  • 交互式数据可视化(Interactive Data Visualization): 交互式数据可视化课程介绍的是如何使用计算机技术实现交互式的数据可视化。数据可视化技术(Data Visualization)常被用于展示和分析数据,因为它能帮助人们更加有效的梳理思路、洞察要点和高效展示信息。在完成本课程之后,学生能够独立设计、分析和评估一项可视化设计(Design, Analyze and Assess a Visualization Design),并且使用计算机技术设计和开发可视化项目。
  • 生物信息学(Bioinformatics):生物信息学是一门交叉学科,也是将计算机技术应用于生命科学的一个交叉领域。随着生物技术的发展以及生命科学数据的积累,在生命科学领域急需计算机专业的人才帮助存储、处理、和研究这些大规模的数据,因此,生物信息学孕育而生。生物信息学广泛的使用了数据库、并行计算、和分布式存储技术。学习这门课能帮助学生扩展第二学科的知识,锤炼运用计算机知识解决实际问题的能力。
    推荐学习资料:
    Michael Agostino, Practical Bioinformatics, 1st edition. , ISBN-13: 978-0815344568.
  • 游戏设计(Game Design):游戏设计课程讲解的是游戏的运行原理以及设计和开发游戏过程中的核心概念和技术。不同类型的游戏,其运行原理和开发过程是不同的。但是,它们都是建立在计算机图形学(Computer Graphics)的理论基础之上的。通过这门课程的学习,学生应能具备开发简单游戏的技能。
  • 机器人技术(Robotics):机器人技术课程介绍的是“机器人”的工作原理、工作方式以及应用场景。“机器人”是由多个计算机领域共同发展起来的一项自动化应用技术;常见的机器人产品有汽车、扫地机器人、无人机等。机器人技术课程将简要介绍计算机模拟技术(Simulation)、机器运动学(Kinematics)、机器控制(Control)、算法优化(Optimization)和概率推断(Probabilistic Inference)技术。这门课程能帮助学生进入机器人技术领域,为投入机器人项目打下扎实基础。
    推荐学习资料:
    H. Asada and J.-J. E. Slotine, Robot Analysis and Control, 1st edition. , ISBN-13: 978-0471830290.
  • 计算机视觉(Computer Vision): 计算机视觉课程介绍的是图像生成的基本原理、摄像成像几何,图像中的特征提取、特征匹配、移动跟踪、图片分类、图片内容的理解等内容。这些技术和内容是计算机感知和理解外部世界的一个重要的途径。计算机视觉是人工智能领域的一个重要发展分支。
    前置课程:一门编程语言(C/C++/Java/Python)、数据结构、算法、线性代数。
    推荐学习资料:
    Reinhard Klette, Concise Computer Vision: An Introduction into Theory and Algorithms. , ISBN-13: 978-1447163190.
    Richard Szeliski, Computer Vision: Algorithms and Applications. , ISBN-13: 978-1848829343.
  • 自然语言处理(Natural Language Processing): 自然语言处理课程介绍的是计算机如何理解和运用人类的语言。这部分的内容包括如何识别和界定单词、消除歧义、理解语句、和生成语句等关键内容。自然语言处理是人工智能方向的一个重要分支、也是未来人机交互(Human Computer Interaction)的一个重要发展方向。
    前置课程:Python、数据结构、算法、线性代数、概率论。
    推荐学习资料:
    Dan Jurafsky and James H. Martin, Speech and Language Processing.
    中文版: 自然语言处理综论, 电子工业出版社. , ISBN-13: 9787121250583.
    Jacob Eisenstein, Introduction to Natural Language Processing. , ISBN-13: 978-0262042840.

4. 学习计划

在确定了大的学习方向(“就业”或者“继续深造”)和了解专业课程内容之后,我们可以制定更为详细的学习计划。为了更全面、更系统的学习和理解计算机核心技术,小水滴从以下三个方面组织和规划本科阶段的学习计划。
  • 计算机专业知识:本文4.1小节展示了本科阶段应学习的计算机专业领域的知识。其中,大一、大二、大三的课程为“轴心”课程,是每一位本科生都应该认真扎实学习的。在大四学年中,学生可以根据兴趣和职业发展规划,选择一个或者两个计算机的子领域重点学习。图1展示了六个热门的发展方向(人工智能、物联网、大数据/云计算、系统开发、计算机安全、和软件工程) 以供大家参考。
  • 计算机编程能力:计算机编程能力是指根据项目要求设计计算机程序以及完成项目的能力。本文4.2-4.8小节分别展示了多个职业发展的方向的课程学习计划,包括Java/C++/Python/Go软件工程师发展方向、前后端软件开发发展方向、移动应用开发方向、和Linux系统开发发展方向,供参考。
  • 继续深造:以“继续深造”为目标的本科生在安排本科阶段的学习计划时还需要考虑报考或申请研究生院的时间安排。我们在最后两小节提供了报考国内硕士研究生和申请国外(北美)硕士研究生的时间安排和建议。学生在制定计划时需要将计算机专业课程的学习与硕士报考的计划进行合并以制定个人专有的学习计划。
本章提供的学习计划是按照学习目的划分的,如果读者在本科阶段计划同时完成两个或者多个学习目的的话,需要将本章相应的学习计划合并规划。例如:计划攻读人工智能方向的硕士/博士的学生需要将学习人工智能领域专业知识的计划与报考硕士/博士的计划合并。

4.1. 本科阶段专业课程学习

图 1. 计算机专业课程学习计划图

4.2. 本科毕业后成为前端软件工程师(Frontend Software Engineer)

前端软件工程师的主要职责是编写网页代码,增加用户交互功能,丰富网页内容,改善用户体验。在网页系统(Web-based System)中,前端软件运行于浏览器(Browser)中,将系统内容展示给用户,并接收/处理用户的输入或者反馈。
前端软件开发是基于HTML/CSS/JavaScript技术的。熟练掌握和理解她们的运行原理和工作方式非常重要。随着手机和平板电脑的普及,网页内容会展示在不同尺寸大小的设备上。为了提供良好的用户体验,自适应式网页设计(Responsive Design)变得越来越重要。Bootstrap是一个非常流行的组件库(Component Library)。使用Bootstrap提供的页面布局(Page Layout)和组件(Component),能帮助开发人员设计开发出风格统一、自适应的网页。
React/Vue/Angular是目前最流行的前端软件开发框架。她们用于开发单页面应用程序(Single Page Application,或者SPA)。与传统网站设计不同的是,使用她们开发出的网站全部在一个页面中。熟练掌握这些框架后,她们能极大的简化前端软件的开发/维护难度,提高了生产效率。
由于JavaScript语言本身的缺陷,导致前端软件开发常常遇到各种各样的问题。为了降低项目中使用JavaScript的难度,微软推出了TypeScript编程语言。TypeScript有着更加严格的语法规则和类型系统(Typing System),能帮助开发人员检查和预防代码中的问题。TypeScript源代码经编译后,生成等效的JavaScript代码,运行于任何JavaScript环境。
NodeJS是一个应用程序。因为她嵌入了JavaScript解释器和运行环境,因此,她使得JavaScript“走出”了浏览器的束缚。换句话说,有了NodeJS,JavaScript不仅可以运行于前台(浏览器之中),还可以运行于后台(服务器端)。所以,目前有一种趋势是使用JavaScript打通前端和后端的开发。
使用HTML+CSS+JavaScript不仅能开发前端软件,还能使用electron开发跨平台的桌面应用程序(Desktop Application)。著名的Visual Studio Code就是基于electron开发的。
另一种发展方向是开发Progressive Web Application。这种应用程序使用的是HTML+CSS+JavaScript技术,开发出来的是Web应用。但是,因为在浏览器中加入了Progressive Web Application的特性,她能在手机/平板的桌面上生成一个图标。每次用户点击图标,实际上是使用浏览器打开这个Web应用。但是,对于用户而言,使用体验和使用移动应用程序十分相似(移动应用程序又称为Native Application,即使用操作系统开发出来的应用程序)。值得注意的是,Progressive Web Application尚未形成成熟的体系,需谨慎考虑将Progressive Web Application作为职业发展方向。
推荐学习资料:
Bootstrap官方网站https://getbootstrap.com/
React官方网站https://reactjs.org/
Vue官方网站https://vuejs.org/
Angular官方网站https://angularjs.org/
NodeJS官方网站https://nodejs.org/en/
TypeScript官方网站https://www.typescriptlang.org/
Electron官方网站https://www.electronjs.org/
图 2. 前端软件工程师学习计划图

4.3. 本科毕业后成为后端软件开发工程师(Backend Software Engineer)

后端软件工程师专门从事设计与开发后端软件。后端软件运行于服务器上,不参与用户交互。根据应用场景,后端软件会使用多种类型的软件、框架、或者服务。例如,常见的后端服务和框架有:关系型数据库(MySQL/PostgreSQL)、NoSQL数据库(Redis)、消息队列(ActiveMQ/RabbitMQ)、搜索引擎(Elasticsearch)等。
后端软件开发的趋势是开发大规模的Web服务(Large-Scale Web Service)。Restful是一种流行的Web服务协议(Protocol)。所以,使用Restful协议提供服务的系统被称为Restful Web Service。
后台开发的一个难点是支持大规模的在线用户(一般是百万级用户以上)。一种流行的做法是使用HTTP负载平衡器(HTTP Load Balancer)作为“门户”,接收用户请求,并将请求分发到后端的Web服务器上处理。常见的HTTP负载平衡器为Nginx或者各大云厂商提供的负载平衡器服务。
在大规模的系统中,通常情况下会运行多个Web服务器处理请求。有时,Web服务器的个数会根据请求数目的多少而动态调整。这个过程称之为自动伸缩(Auto Scaling)。 为了搭建能够自动伸缩的系统,一种常见的做法是将Web Server放在一个Docker容器中。Docker容器能为Web Server提供一个安全、相对独立的运行环境。然后,使用Kubernetes自动增加或者减少同时运行Docker容器的个数(每个容器中运行一个Web Server),以达到系统自动伸缩的目的。
根据编程语言的不同,后端服务开发大致可分为Go技术栈、Java技术栈、Python技术栈和JavaScript技术栈。Java是一个非常成熟的编程语言,有着大量的代码库支持Java应用的开发。目前,Java任然是最为流行的、大型项目开发的语言。Go语言上升的势头很猛。因为,相对Java而言,Go应用对内存要求不高,特别适合运行于容器中,配合Docker/Kubernetes一起使用。JavaScript/TypeScript更多的被用于全栈开发(Full Stack Development)。因为JavaScript/TypeScript可同时用于前台和后台的开发。对于公司而言,无须储备两种编程语言技术;对于开发人员而言,无须学习两种完全的技术栈。而且,JavaScript/TypeScript开发速度快。程序性能上的劣势可有运行更多的服务器来弥补。Python也是常用的一种技术栈,因为Python有着更为庞大的第三方代码库支持,而且Python对于内存和其他运行资源的要求都不高,也是一个不错的选择。
推荐学习资料:
Nginx官方网站https://www.nginx.com/
ActiveMQ官方网站https://activemq.apache.org/
RabbitMQ官方网站https://www.rabbitmq.com/
Docker官方网站https://www.docker.com/
Kubernetes官方网站https://kubernetes.io/
图 3. 后端软件开发工程师学习计划图

4.4. 本科毕业后成为C++软件工程师

因语言特性,C++有着独特的市场地位。虽然Java、Go发展迅速、Rust也正在崛起,但是,学习C++的开发人员仍然很多,使用C++开发项目的企业也很多。C++语言更多用于开发系统软件、网络软件、图形图像、游戏等应用。而且,各大著名的操作系统、数据库、编译器、开发工具等都是由C或者C++语言开发的。
C++是一门比较难学的语言,特性比较复杂,学习路径比较长。首先,在学习C++的基本特性之后,可以尝试去完成一些课程设计。然后,进一步可以学习C++的标准库STL和Boost库(Boost库中的一些好的特性可能会在未来加入到C++标准库中)。如果多C++标准库的实现有兴趣的学生可以学习C++元编程(Meta Programming),这也是C++最具独特“魅力”的地方,也是C++最难学的地方。学习设计模式和C++多线程编程也是有帮助的,她们能帮助开发人员合理的设计系统,组织代码。在此时,可以完成一些大型的课程设计。
如果对C++语言感兴趣的学生可以尝试阅读C++ Proposals。C++语言标准是由C++委员会(C++ Committee)制定和修改的。世界各地的C++开发者都可以向C++委员会提交语言修改建议。这些建议被称为C++ Proposals。阅读这些建议不仅能阅读世界顶尖C++开发者对于C++语言的理解(主要是理解C++的不足之处),还能阅读C++委员会对于建议的评语,理解C++未来发展的方向。
另一个发展方向是学习第二门语言。其中,Rust是一个不错的选择。Rust“继承”了C++快速高效的语言设计思想,但是,尝试解决指针使用的问题,降低程序出错的概率。学习Rust也是一个不错的选择。
推荐学习资料:
图 4. C++软件工程师学习计划图

4.5. 本科毕业后成为Java软件工程师

Java是目前最流行的编程语言。因为Java的跨平台特性和垃圾回收机制,Java语言深受广大的开发者欢迎。因为Java的特性非常多,而且Java的框架、第三方代码库也非常多,我们建议读者先从Java最为核心的内容开始,扎实的夯实基础。然后,再学习一两个流行的Java框架。
Java语言的基础知识包括Java的各个特性和标准库的使用。在此基础之上,然后可以学习Java虚拟机的工作原理、Java的泛型编程、多线程编程、设计模式等。最后,可以通过学习一个Java框架来完成一项课程设计。Spring是目前最流行、使用最广泛的Java框架,值得学习。
对移动应用开发感性的的读者可以考虑学习安卓应用开发(Android App Development),因为,安卓应用主要是使用Java语言开发的。
对于Java语言感兴趣的读者可以尝试阅读Java Enhancement Proposals(JEPs)。OpenJDK是一个开源的、Java语言的开发和运行环境。世界范围的Java开发者都可以向OpenJDK的一个委员会提交建议,改进Java语言。这些建议被称为Java Proposals。阅读这些建议不仅能阅读世界顶尖Java开发者对于Java语言的理解(主要是理解Java的不足之处),还能阅读OpenJDK委员会对于建议的评语,理解Java未来发展的方向。 另一个发展方向是学习第二门语言。其中,Scala是一个不错的选择。Scala同时支持面向对象特性和函数式编程。Scala能使代码变得更加简洁,有效。另一个特点是Scala运行于Java虚拟机之上,能与Java程序无缝衔接。因此,在学习了Scala之后,开发人员不必要完全从Java转换到Scala上来。开发人员可以同时使用Java和Scala开发项目,各取所长。
推荐学习资料:
Spring框架官方网站https://spring.io/
安卓官方网站https://www.android.com/
图 5. Java软件工程师学习计划图

4.6. 本科毕业后成为Python软件工程师

Python语言的特点是易学、易用;Python有着庞大的第三方代码库。因此,学习Python语言的开发人员特别多。Python同时支持面向对象程序设计和函数式编程,扎实的学习Python编程语言需要较长的时间。在熟悉了Python语言的特性后,可以学习Python数据库编程、Python多线程编程、设计模式和Python虚拟机工作原理的内容。然后,可以选择一两个Python代码库深入学习和练习。如果计划从事Python后端开发的话,可以选择Django。如果计划从事科学计算的话,可以选择Pandas、Numpy或者SciPy代码库。如果计划从事人工智能或者机器学习方向的话,可以选择PyTorch代码库。最后,使用这些库完成一项课程设计,巩固所学的知识和技能。
对于Python语言感兴趣的读者可以尝试阅读Python Proposals。Python虚拟机和运行环境是一个开源的项目。世界范围的Python开发者都可以向Python基金组织的一个委员会提交建议,改进Python语言。这些建议被称为Python Enhancement Proposals(PEP)。阅读这些建议不仅能阅读世界顶尖Python开发者对于Python语言的理解(主要是理解Python的不足之处),还能阅读Python委员会对于建议的评语,理解Python未来发展的方向。
推荐学习资料:
Pandas官方网站https://pandas.pydata.org/
NumPy官方网站https://numpy.org/
SciPy官方网站https://www.scipy.org/
PyTorch官方网站https://pytorch.org/
图 6. Python软件工程师学习计划图

4.7. 本科毕业后成为移动软件开发工程师(Mobile App Developer)

移动软件开发工程师称为一个独立的职位是因为移动软件开发的技术栈和其他职位所要求的技术栈不同。目前,最流行的移动系统为安卓(Android)和iOS系统。
安卓系统运行于Linux内核之上;绝大多数部件和服务由Java语言开发。因此,Java语言是官方推荐使用的开发语言。成为一名安卓应用开发工程师的第一步就是学习Java编程语言。在熟悉了Java语言之后,可以同时开始学习安卓系统的工作原理和安卓应用的开发流程。最后,在课程设计中完成一个真实应用的开发,巩固所学的知识和技能。
iOS系统是由苹果公司(Apple Inc.)开发的私有操作系统。苹果公司推荐使用Swift编程语言来开发iOS的应用程序。所以,在成为一名iOS应用开发工程师的第一步就是学习Swift编程语言。与此同时,还可以同时学习iOS系统的工作原理和iOS应用的开发流程。最后,在课程设计中完成一个真实的应用,巩固所学的知识和技能。
从上面的描述可以看出,开发安卓和iOS应用所需的技术是完全不一样的。然而,作为企业或者开发人员,一个移动应用需要同时支持两个版本。为了帮助企业降低移动应用开发的难度,一些跨平台的开发框架孕育而生。Flutter就是其中之一。使用Flutter,能将一套源代码同时实现安卓、iOS等多个平台的应用程序。
另一种发展方向是使用Progressive Web Application。这种应用程序使用的是HTML+CSS+JavaScript技术,开发出来的是Web应用。但是,因为在浏览器中加入了Progressive Web Application的特性,她能在手机/平板的桌面上生成一个图标。每次用户点击图标,实际上是使用浏览器打开这个Web应用。但是,对于用户而言,使用体验和使用移动应用程序十分相似(移动应用程序又称为Native Application,即使用操作系统开发出来的应用程序)。值得注意的是,Progressive Web Application尚未形成成熟的体系,需谨慎考虑将Progressive Web Application作为职业发展方向。
推荐学习资料:
安卓官方网站https://www.android.com/
Flutter官方网站https://flutter.dev/
图 7. 移动软件开发工程师学习计划图

4.8. 本科毕业后成为Linux系统工程师(Linux System Engineer)

Linux系统工程师专门从事设计、开发和维护在Linux系统中运行的软件。Linux系统工程师能成为一个独立的职位是因为Linux是一个非常复杂的系统,需要长期的学习和积累才能熟练掌握Linux系统的工作原理。
成为一名优秀的Linux系统工程师的成长路径是较为漫长的。首先,需要学习Linux操作、管理、和维护功能,熟悉Linux整个社区和环境。与此同时,还需选择一个Linux的发布版本(Linux Distribution),作为以后学习的环境。例如:Ubuntu和Debian都是不错的选择。
然后,可以学习Linux的系统编程和网络编程。一般的、Linux上的系统编程使用的是C/C++语言,这是便于程序通过调用标准库函数(Standard Library)或者系统调用(System Call)接口直接与Linux系统交互。在熟悉系统编程之后,还需要学习一些Linux内核的工作原理,以提高对系统编程的理解。最后,通过完成一项课程设计来巩固和提高Linux系统编程的水平和能力。
图 8. Linux系统工程师学习计划图

4.9. 本科毕业后继续攻读国内硕士

全国硕士研究生考试分为笔试和复试两个阶段。笔试阶段为参加全国硕士研究生统一考试。笔试分为四个科目:数学、英语、政治和专业课。其中,数学、英语和政治为全国统一命题。即,全国所有报考计算机专业硕士研究生的考生考试内容相同。但是,专业课是由各个高校自主命题的。报考不同学校的专业课考试内容可能不同。
在通过笔试考试后,考生还需参加所报考学校的复试。复试考核的内容和考核形式由各高校决定。复试内容可能包括英语口语、上机编程以及与导师面试等环节。
全国研究生考试笔试一般会在大四第一学期结束时;而复试开始大约在大四第二学期的前半段。
针对上述研究生考试的内容,本科生需要扎实学习和掌握高等数学、线性代数和概率论的知识,为参加研究生笔试打好基础。英语学习是一项长期的任务。在大二参加全国四级英语考试、在大三参加全国英语六级考试是非常好的评估英语水平的机会。在专业课方面,因为各高校自主制定考试内容,本科生需要有针对性地学习各个计算机专业课程。其中,数据结构和算法是核心基础课,操作系统、组成原理、系统结构等是“轴心”专业课。 对于继续攻读硕士研究生的学生而言,科技文写作也是必不可少的一项技能。熟练掌握科技文的相关知识点和写作技巧有助于帮助更快的开启科研工作。
图 9. 继续攻读国内硕士的学习计划图

4.10. 本科毕业继续攻读国外硕士学习计划

攻读国外(北美)硕士项目的学生应将更多的时间投入到英语学习中,因为在报考材料中需要包含TOEFL和GRE的考试成绩。TOEFL考试是验证考生运用英语的基本能力。GRE考试更多的是考核逻辑思维的能力。这两门考试的难度在逐年递增。
目前,TOEFL考试成绩有效期为两年,GRE考试成绩的有效期为五年。综合来看,TOEFL考试的难度略低于GRE考试的难度。对英语较为自信的学生,可在大三学年尝试准备和参加GRE考试。如果能取得理想成绩,则在大四学年留下较多的时间准备TOEFL考试和申请材料。如果认为英语是弱项的学生,可从TOEFL入手。在第三学年完成TOEFL考试之后,再将重点放在GRE考试之上。这两门考试的时间需要安排好,因为只有当两门成绩与申请材料全部寄到国外研究生院后,申请书才会被审核。这两门成绩与申请材料务必在申请截至之前送达,否则有可能会被当作因缺少材料而作废。
另外,申请书由申请人自行邮寄到国外研究生院。有些学校开通了网上直接投递材料。TOEFL和GRE考试成绩由ETS机构邮寄到研究生院。
科技文写作也是必不可少的一项技能。熟练掌握科技文的相关知识点和写作技巧有助于帮助更快的开启科研工作。
图 10. 继续攻读国外硕士的学习计划图

5. 总结

本文汇聚了小水滴多年科研、从业、和留学经验。在北美高校,对于每一位本科生,院系都设有一名指导老师(Advisor),帮助学生制定学习计划,提供学习建议。然而,国内高校并没有这一职务。因此,小水滴总结了自己的学习经验。一路走来,我们曾经拥有过成功时的喜悦,也曾经经历过失败的沮丧。我们希望通过阅读此篇文章,能够帮助每一位学生快速成长,少走弯路。
本文若有不妥或不足之处,欢迎与我们联系,批评指正。
小水滴
2020年7月24日

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.