# 前言
作为一个计算机专业的大学生,深感学校课堂试教育的局限性,从而在大学中的许多课程基本都靠自学。因此对自学计算机专业的课程做以总结。
其实在实际开发中,并不能完全用到那些枯燥抽象的计算机专业课。所以为什么还要去学它们呢?原因只有一个,让你在计算机行业能有更长远的发展,以防止程序员只能吃青春饭的现象。这些专业理论课就如同武侠小说中的内功,而编程语言框架等则都属于外功招式。试想,一个徒有花拳绣腿的人怎么可能与一个拥有深厚内功的人抗衡呢。
经过对比,可以发现各个大学计算机专业的核心课程高度一致,这是国际计算机学会 ACM(Association for Computing Machinery) 和 IEEE-CS 联合工作组发布的 CS2013(计算机科学课程指南 2013) 报告,提出的计算机科学知识体的概念。该报告给出的关于计算机科学的十八个知识领域如下:
缩写 | 英文 | 中文 |
---|---|---|
AL | Algorithms and Complexity | 《算法与复杂度》 |
AR | Architecture and Organization | 《计算机结构体系与组织》 |
CN | Computational Science | 《计算科学》 |
DS | Discrete Structures | 《离散数学》 |
GV | Graphics and Visualization | 《图形与可视化》 |
HCI | Human-Computer Interaction | 《人机交互》 |
IAS | Information Assurance and Security | 《信息保障与安全》 |
IM | Information Management | 《信息管理》 |
IS | Intelligent Systems | 《智能系统》 |
NC | Networking and Communications | 《网络与通讯》 |
OS | Operating Systems | 《操作系统》 |
PBD | Platform-based Development | 《基于平台的开发》 |
PD | Parallel and Distributed Computing | 《并行与分布式计算》 |
PL | Programming Languages | 《程序设计语言》 |
SDF | Software Development Fundamentals | 《软件开发基本原理》 |
SE | Software Engineering | 《软件工程》 |
SF | Systems Fundamentals | 《系统基本原理》 |
SP | Social Issues and Professional Practice | 《社会问题与专业实践》 |
而 ACM 又将对这些知识的掌握程度分为以下三级:
Familiarity: What do you know about this? 理解一个概念是什么或意味着什么。
Usage: What do you know how to do? 能够以具体的方式使用或应用概念。例如,在程序中适当地使用特定的概念,使用特定的证明技术,或执行特定的分析。
Assessment: Why would you do that? 能够从多角度考虑一个概念和/或为解决某个特定问题选择特定的方法。这种程度的掌握涉及到从能够解决问题的所有方案中中选择最适合的方法的能力。
那么在业余时间自学计算机专业课程是否可能?完全可以!计算机专业是人类历史上第一个可以在互联网上学到到几乎所有专业知识的专业,在互联网,可以听到从本科到研究生层次,从国内重点大学到国外知名高校的几乎所有的课程,除了一些硬件课程需要必备的设备之外,其他课程只需要一台能上网的电脑就完全足够了。
# 学习路线
首先需要对计算机科学和计算机产业进行总体的认识,可以通过阅读计算机导论有关的书籍进行了解。
在对计算机概论有一个比较全面的了解后,我们最先需要的就是掌握一门编程语言,同时学好数学。在大学的计算机专业中,这两部分往往安排在大一至大二。
关于初学者第一门编程语言,比较常见的有这几种:
- C:国内大多高校所普遍使用的入门语言。
- **JAVA/C#**:两者都是很典型的面向对象的编程语言,后期的课程如数据结构与算法也有不少学校使用其作为范例编程语言。 JAVA 有很多非常活跃的开源社区与数不尽的开发者为其提供代码以供学习。而 C# 的背后则是 IT 巨头微软,并且 C# 的语法糖被很多新生语言所借鉴,如 Google 现今的官方开发语言 kotlin。
- Python:典型的动态语言,国内一部门高校所选用的新兴入门语言,应用极为广泛。尤其是现今的大数据与人工智能时代,更加离不开 Python。
这些编程语言的均可以通过书籍与视频结合的学习方法。关于学习的书籍和视频网上已经有很多了,这里就不做赘述。
计算机专业必须掌握的四门数学课程,包括高等数学、离散数学、线性代数、概率论与数理统计。为什么要学数学?因为具备基本的数学能力是对所有计算机专业人员的基本要求。在实际开发项目中,对程序员的数学功底要求其实并不高,很多框架的底层都有强大的算法作为支撑,但初级程序员并不需要完全理解这些算法。对于初级程序员来说,仅仅需要有高中的数学基础加上一些数据结构的知识就行了。但对于中高级程序员来说,则必须基本良好的数学功底,尤其是需要使用一些特定技术进行开发,建模或者设计相关算法,例如现今比较流行的人工智能,它的实现就需要强大的 AI 算法——这意味的技术水平的提高,学习领域的深入,所需要的数学功底也是逐渐提高的。
本人以前觉得只要掌握大学中所学的数学就足够了,然而在深入学习中却发现大学中所学的数学基础课程还远远不够用于开发,例如我在学习 unity 的过程中,经常碰到三维向量,欧拉角与四元数等等,为了理解这些东西,我重新回过头来学习了一遍计算机图形学中的 3D 数学。
国内的大部分数学教材,往往只讲相关的法则定理证明等等理论知识,而不会涉及到其发展历史和具体应用,不强调解决特定问题的思路,文字枯燥,并不适合自学。还有些教材往往写的过于简练,比如经常出现“由此可见”,“由此可得”等词语,本人在自学的过程中对这些词眼极为头疼,于是便放弃了使用国内的教材。
这里可以参考知乎上@周筠 的回答:计算机系的高数,离散,线代都是用在哪些方面的? - 周筠的回答 - 知乎,讲的很不错。
在掌握了编程语言与数学基础后,就可以进入专业基础课和一些使用技术的学习。各个学校的计算机专业基础课都大同小异,总数有十多门。但最重要的就是以下四门科目,也是计算机专业学生的考研科目——数据结构与算法、计算机组成原理、操作系统、计算机网络。同样采用视频与教材结合的方式。
- 数据结构与算法:参考书籍:机械工业出版社的 《算法基础 打开算法之门》和《算法导论》
公开课:
麻省理工学院公开课:算法导论- 计算机组成原理:这门课可以用两个字概括——抽象。对于在校大学生,我们不需要(也不可能)完整的理解它,因此可以把它和操作系统这门课结合起来学习。
参考书籍:人民邮电出版社的《计算机组成:结构化方法》
公开课:
计算机组成原理- 操作系统:
参考书籍:中国电力出版社的《深入理解计算机系统》
公开课:
浙江大学操作系统 38 讲- 计算机网络:这门课应该从上层往下层学习,而且需要通过实验以加深理解。
参考书籍:《计算机网络教程:自顶向下方法》
公开课:
哈工大的 计算机网络作为大学生,以上科目可以先完整的看一遍教学视频,配合参考书籍和学校的教程进一步学习,重点还是在学习的过程中多去实践。在学习理论科目的同时,我们可以学习一些相关的实用技术,如各种流行的开发框架和工具等来加深理解。
- 在完成了以上学习后,就进入了一个新的自学阶段,这一阶段的学习就可以针对你感兴趣的特定领域进行了解和学习。比如人工智能,物联网,大数据,web 开发,游戏开发等等。这一阶段的学习目的非常明确,就是培养特定领域的专业编程技能,从而能够选择进入相关领域继续研究(考研考博)或者进入参加。
最重要的一点是:你需要打好扎实的基础。其实在很多大公司眼里,新人只是一张能够吸墨的白纸,你的基础扎实程度就代表你能够吸收多少墨汁。所以在大学期间,不要过分追求项目经验。但这并不代表着你不需要对所学的知识加以实践,只是相比“怎么做”,你更加需要明白“为什么”。
# 后记
上面的课程有些我已经学完了,而有些还在学习过程中。
我喜欢去总结我所经历的事物,即使人生发生的种种只是过眼云烟,但我还是希望一些有意义的事能永远留下。
以上。
参考: