本科学习建议
1. 概述
计算机科学是一门系统性研究计算系统的学科。计算机科学包含许多子领域,所涵盖的内容非常广,掌握任何一个计算机领域的内容都需要扎实的理论基础和丰富的实战经验。因此,如何高效的学习计算机知识和技能是每一位本科生面临的困难与挑战。
为了帮助计算机专业的本科生更好的学习计算机知识,小水滴根据多年从事高等教育的经验以及计算机领域的从业经验,总结出以下针对计算机专业本科阶段的学习建议。这个学习建议包括针对两种学习目标的本科四年学习计划,和计算机核心专业课程的介绍以及推荐的学习材料。我们期望这些建议能够帮助广大计算机专业的本科生成功找到理想的工作或者成功申请理想的研究生院继续攻读硕士博士学位。
这个学习建议和计划仅为小水滴的经验汇总。读者可能会有不同的学习方法和学习计划,或者读者可能会对计算机的学习和教育有着不同的理解,小水滴欢迎读者与我们联系探讨。在总结和写作过程中,因小水滴水平有限,文中难免出现疏忽、遗漏或者错误之处,尚期读者不吝指正。我们的邮件地址为:support@littlewaterdrop.com。
2. 学习目标 
四年的本科学习时间是短暂的,每一年都有着重要的学习内容和学习目标。计算机学科涉及的领域、知识和技术非常广,在四年内学习所有领域的知识内容是一项“不可能完成”的任务。因此,大家需要有选择性地、分阶段地学习计算机知识。
在制定学习计划之前,首先需要确定学习目标。因为学习目标决定着学什么、怎么学、如何学等问题。本章节将针对以“就业”和“继续深造”为学习目标,为本科学习阶段提出建议。
2.1. 以“就业”为本科学习目标 (夯实基本功+提升实战经验) 
如果将“就业”作为本科阶段学习目标的话,那么,学员应将重点放在基本功的练习和实战经验的积累上。基本功是指掌握和运用计算机基础知识的能力。计算机的基础知识包括数据结构、算法、程序设计和相关数学知识。实战经验是指运用已掌握的计算机知识和技术完成项目的经验和能力。在开始一个工程/项目之前,首先需要熟练掌握至少一门编程语言和熟悉至少一个系统或者框架的知识。这个系统或者框架可能是操作系统、数据库、或者目前流行的编程框架等系统之一。积累这些实战经验有助于学员增加就业的竞争力。
因此,以“就业”为目标的学员应着重掌握以下内容:
2.2. 以“继续深造”为本科学习目标(基本功+逻辑思维训练+英语+写作) 
如果将”继续深造”作为本科阶段学习目标的话,那么,在本科阶段应将重点放在基本功、逻辑思维训练、写作和英语上。与上一节类似,基本功是指掌握和运用计算机基础知识的能力,也是从事软件开发或者科研工作的基础。逻辑思维训练对于每一位本科生都非常重要,然而,对于以攻读硕士/博士学位为目标的本科生而言尤为重要。因为在硕士/博士阶段,还需要完成论文和答辩;独立思考、分析问题和写作是必不可少的技能。如果将国外(美国、加拿大、英国、澳大利亚等)研究生院作为申请目标,或者以完成国际高水平论文为目标的话,英语能力也是一项必备技能。
因此,以“继续深造”为目标的学员应着重掌握以下内容。
3. 学习内容 
在确定了学习目标之后,我们再来详细的讨论本科四年的学习内容,以达成上述的目标。本章节将详细介绍各个阶段推荐的重要课程以及相关的学习材料。在参考和购买推荐书籍时请查阅书籍的最新版本。
3.1. 第一学年(大一) 
第一学年是打基础的阶段。无论是以“就业”为目标或者以“继续深造”为目标,学习计算机入门课程、数学课程和英语都是非常重要的。这一阶段重要的基础课简要的总结如下。
3.2. 第二学年(大二) 
第二学年会进入计算机专业的基础课学习,它们为第三学年的学习专业课程打下坚实的基础。在第一学年学习了第一门编程语言和高等数学课程之后,可以开始学习一些基本的编程思想和技术,以完成一些小的项目,并且进一步学习其他的、与计算机专业相关的“高等数学”的内容。计算机专业基础课是非常重要的,它们是第三学年学习专业课的基石。其中,数据结构与算法是程序设计的核心所在:数据结构讲解的是如何在程序中表达数据以及数据之间的关系;而算法则是处理和操作数据的逻辑。因此,我们可以认为,一个程序=数据结构+算法。
3.3. 第三学年(大三) 
第三学年会进入计算机专业课学习。第三学年非常重要是因为学生开始接触到计算机学科内各个子领域的知识。在这个学年里,大家会逐渐认识计算机科学、选择将来从事的子领域。如果还计划毕业后在国内/国外继续攻读硕士/博士学位的话,那么,第三学年将会是最忙的一年。因为,在这一年里,不仅需要学习众多专业课,还需要开始着手准备考研或者出国留学的诸多事情。
计算机的专业课非常多,而且随着计算机技术的发展,还会不断地涌现出新的专业科目,我们将核心专业课的内容简要的总结如下。
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.
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.
计算机网络(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.
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.
区块链(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.
3.5. 专业选修课 
因为各高校的课程安排不同,小水滴认为还有一些重要的计算机专业课可能以选修课的形式出现在各个高校。这些课程同样能帮助学生学习某一子领域内的重要知识,锻炼学员的能力。
嵌入式系统(Embedded Systems):嵌入式系统课程介绍的是小型、微型计算系统的工作原理。因为嵌入式系统的计算资源非常少,因此,与常见的台式机和服务器相比,嵌入式系统有着完全不同的体系结构和工作原理。嵌入式系统的优势在于身材小巧、耗电少、价格低廉,因此,嵌入式系统技术广泛的应用于物联网(Internet-of-Thing)领域。
前置课程:C/C++语言、计算机组成原理、操作系统、Linux系统。
物联网(Internet-of-Thing):物联网课程讲解的是物联网系统的原理和工作方式。物联网是未来计算机技术发展的一个重要方向和趋势。随着嵌入式技术和5G网络的发展与成熟,人们设计开发出各种各样的终端设备,应用于我们的日常生活之中。将这些终端设备相互连接起来,组成一个“巨型”的网络系统,我们称这个系统为物联网。在未来,物联网技术将会极大的改变人们的生活方式。因此,学习物联网课程将会帮助学员开拓视野、学习最前沿的计算机技术理念。
前置课程:一门编程语言(C/C++/Java/Python)。
自然语言处理(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. 本科阶段专业课程学习
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作为职业发展方向。
推荐学习资料:
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对于内存和其他运行资源的要求都不高,也是一个不错的选择。
推荐学习资料:
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.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开发项目,各取所长。
推荐学习资料:
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未来发展的方向。
推荐学习资料:
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作为职业发展方向。
推荐学习资料:
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系统编程的水平和能力。
4.9. 本科毕业后继续攻读国内硕士
全国硕士研究生考试分为笔试和复试两个阶段。笔试阶段为参加全国硕士研究生统一考试。笔试分为四个科目:数学、英语、政治和专业课。其中,数学、英语和政治为全国统一命题。即,全国所有报考计算机专业硕士研究生的考生考试内容相同。但是,专业课是由各个高校自主命题的。报考不同学校的专业课考试内容可能不同。
在通过笔试考试后,考生还需参加所报考学校的复试。复试考核的内容和考核形式由各高校决定。复试内容可能包括英语口语、上机编程以及与导师面试等环节。
全国研究生考试笔试一般会在大四第一学期结束时;而复试开始大约在大四第二学期的前半段。
针对上述研究生考试的内容,本科生需要扎实学习和掌握高等数学、线性代数和概率论的知识,为参加研究生笔试打好基础。英语学习是一项长期的任务。在大二参加全国四级英语考试、在大三参加全国英语六级考试是非常好的评估英语水平的机会。在专业课方面,因为各高校自主制定考试内容,本科生需要有针对性地学习各个计算机专业课程。其中,数据结构和算法是核心基础课,操作系统、组成原理、系统结构等是“轴心”专业课。
对于继续攻读硕士研究生的学生而言,科技文写作也是必不可少的一项技能。熟练掌握科技文的相关知识点和写作技巧有助于帮助更快的开启科研工作。
4.10. 本科毕业继续攻读国外硕士学习计划
攻读国外(北美)硕士项目的学生应将更多的时间投入到英语学习中,因为在报考材料中需要包含TOEFL和GRE的考试成绩。TOEFL考试是验证考生运用英语的基本能力。GRE考试更多的是考核逻辑思维的能力。这两门考试的难度在逐年递增。
目前,TOEFL考试成绩有效期为两年,GRE考试成绩的有效期为五年。综合来看,TOEFL考试的难度略低于GRE考试的难度。对英语较为自信的学生,可在大三学年尝试准备和参加GRE考试。如果能取得理想成绩,则在大四学年留下较多的时间准备TOEFL考试和申请材料。如果认为英语是弱项的学生,可从TOEFL入手。在第三学年完成TOEFL考试之后,再将重点放在GRE考试之上。这两门考试的时间需要安排好,因为只有当两门成绩与申请材料全部寄到国外研究生院后,申请书才会被审核。这两门成绩与申请材料务必在申请截至之前送达,否则有可能会被当作因缺少材料而作废。
另外,申请书由申请人自行邮寄到国外研究生院。有些学校开通了网上直接投递材料。TOEFL和GRE考试成绩由ETS机构邮寄到研究生院。
科技文写作也是必不可少的一项技能。熟练掌握科技文的相关知识点和写作技巧有助于帮助更快的开启科研工作。
5. 总结 
本文汇聚了小水滴多年科研、从业、和留学经验。在北美高校,对于每一位本科生,院系都设有一名指导老师(Advisor),帮助学生制定学习计划,提供学习建议。然而,国内高校并没有这一职务。因此,小水滴总结了自己的学习经验。一路走来,我们曾经拥有过成功时的喜悦,也曾经经历过失败的沮丧。我们希望通过阅读此篇文章,能够帮助每一位学生快速成长,少走弯路。
本文若有不妥或不足之处,欢迎与我们联系,批评指正。
小水滴
2020年7月24日