如何使用这本书
本书的所有课程仅仅是作为参考,所有课程是我和各个计算机行业的教授和学长们一起讨论后所筛选出的AI时代CSer们应该具备的专业知识,以便在科研和工作中能提高效率和工作质量。一门学科可以有多种学习方式,我们仅仅筛选出反馈效果较好和内容质量较高的一些资源供大家参考。实际上读者只需要了解一个课程的教学内容和方向,也可以自行寻找资源进行学习。
初入校园
如果你是大一新生或是刚入学不久,那么恭喜你,你的时间非常的充足。你可以大胆学习任何你感兴趣的知识,因为学习就是你的本业。你不必纠结于学习这些是否有用,也不必纠结于是否能找到工作这些功利性的想法。初入校园,我们要做的第一件事就是放心打破高中时期形成的按部就班式的学习方法。作为一个小镇做题家,我深知国内大部分高中会把大家一天当中的每一分钟都安排得满满当当,你只需要被动地跟着课表按部就班地完成一个个既定的任务。只要足够认真,结果都不会太差。但是进入大学,自由度一下高了许多。首先所有的课外时间基本都由你自由支配,没有人为你整理知识点,总结提纲,考试也不像高中那般模式化。如果你还抱着高中那种“乖学生”的心态,老老实实按部就班,结果未必如你所愿。因为专业培养方案未必就是合理,老师的教学未必就会负责,认真出席课堂未必就能听懂,甚至考试内容未必就和讲的有关系。说句玩笑话,你或许会觉得全世界都与你为敌,而你只能指望自己。
那么,现状就是这个现状,你先改变,就必须要有足够的能力去质疑它。在低年级,打好基础很重要。这里的基础是全方面的基础,你不仅需要学习基础的理论知识,像数据结构、算法、面对对象思想、软件工程,你还需要掌握一些实用的工具,同时也要习得一种良好的学习习惯;同时计算机专业讲究实践,无论是刷题,实验课都是能提高自己对于理论知识理解的途径。然而以上说的这些,恰恰是国内许多高校本科教育所缺乏的。我和一些教授和学长讨论,为大家总结了几点建议,供给大家参考。
其一,就是要重视基础的学习。前段时间有很多学弟学妹问题,AI这么厉害,到底还需不需要掌握底层知识。教授和学长们给我的回答如出一辙的都是“要”。为什么呢?C语言、数据结构和算法、软件工程这些基础的知识,恰恰是我们在AI时代使用AI辅助工作研究所最需要掌握的东西。如果没有这些基础,我们就无法认识到一些问题。AI 提高的是“生成能力”,但并没有替代“理解能力”和“系统能力”。如果没有良好的基础,未来在工作和科研时,就很难认识到项目的不足和方向。同时,基础知识也决定了你能否正确理解整个项目所使用的技术和项目的方向,能否正确对AI进行发号施令和理解AI的回答。
其二,学习如何写“优雅”的代码。对于程序员而言,代码不仅仅是给自己看的,更重要的是在不断迭代过程中供给自己和他人阅读。我深知国内很多高校会把编程入门讲成极其无聊的语法课,其效果还不如让学生去看一些优质的文档。事实上,从大一开始就让学生了解到什么样的代码是“优雅”的是大有裨益的。一般来说,编程入门课会首先介绍C语言这样的面对过程编程,其中的模块化和封装的思维是极为重要的。如果你只想着代码能在 OpenJudge 上通过,写的时候图省事,用大段的复制粘贴和臃肿的 main 函数,长此以往,你的代码质量将一直如此。一旦接触稍微大一点的项目,无尽的 debug 和沟通维护成本将把你吞没。因此,写代码时不断问自己,是否有大量重复的代码?当前函数是否过于复杂(Linux 提倡每个函数只需要做好一件事)?这段代码能抽象成一个函数吗?一开始你可能觉得很不习惯,甚至觉得这么简单的题需要如此大费周章吗?但记住好的习惯是无价的,C 语言初中生都能学会,凭什么公司要招你去当程序员呢?
大一下一般会讲面对对象编程(例如C++或Java),这里非常推荐大家看MIT 6.031: Software Construction这门课的Notes,这门课以Java语言为例详细讲解了如何写出“优雅”的代码,内容包含Java基础知识、如何测试、如何设计规范不止。
其三就是平衡好课内和自学。我们质疑现状,但也得遵守规则,毕竟绩点在保研中还是相当重要的。因此在大一,我还是建议大家尽量按照自己的课表学习,但辅以一些优质的课外资源。例如微积分线代可以参考 MIT 18.01/18.02 和 MIT 18.06 的课程 Notes。假期可以通过 Python官方文档 来学习 Python。同时做到上面第一、第二点说的,注重好的编程习惯和实践能力的培养。就个人经验,大一的数学课学分占比相当大,而且数学考试的内容方差是很大的,不同学校不同老师风格迥异,自学也许能让你领悟数学的本质,但未必能给你一个好成绩。因此考前最好有针对性地刷往年题,充分应试。
到了大二,你已经有足够的基础支撑你选择更加广阔的方向了,尽管这时你需要学习更加困难的专业课,但是只要你愿意,我相信你一定可以挤出足够的时间学习你感兴趣的知识。进入大二你已经有了基础往上的编程能力,这时候你可以真正开始做一些有挑战性的项目了。AI辅助编程是你使用AI最应该掌握的一门课,这门课程教会你在一个项目中使用AI的具体细节,如何让AI有效的服务你的项目。同时,随着专业难度的提高,AI也发挥着越来越重要的作用,如何与AI对话已经成为一门学问。提示工程作为一门新兴学科,其目的就是指导用户如何与AI进行更加高效的对话,如何让AI全面了解你的意图,并做出最符合你预期的回复仅仅取决于你给AI的提示词。另外我还整理了一份可供参考的AI-CS学习规划,这是根据我多年学习总结提炼出来的全套指南,每门课的特点以及为什么要上这门课我都做了简单的介绍。对于你课表上的每个课程,这份规划里应该都会有相应的国内外资源,而且在质量上我相信基本是全方位的碾压。由于计算机方向的专业知识基本是一样的,而且高质量的学习资源会让你从原理上理解知识点,对于国内大多照本宣科式的教学来说基本是降维打击。一般来说只要考前将老师“辛苦”念了一学期的 PPT 拿来突击复习两天,取得一个不错的卷面分数并不困难。总之,灵活变通是第一要义,你的目标是用最方便、效率最高的方式掌握知识,所有与你这一目标违背的所谓规定都可以想方设法地去“糊弄”。凭着这份糊弄劲儿,我大二之后基本没有去过线下课堂(我平时待在一个技术社团里),对绩点也完全没有影响。
化繁为简
如果你已经本科毕业开始读研或者走上了工作岗位,亦或是从事着其他领域的工作想要利用业余时间转码,那么你也许并没有充足的业余时间来系统地学完 一份仅供参考的CS学习规划 里的内容,但又想弥补本科时期欠下的基础。考虑到这部分读者通常有一定的编程经验,入门课程没有必要再重复学习。而且从实用角度来说,由于工作的大体方向已经确定,确实没有太大必要对于每个计算机分支都有特别深入的研究,更应该侧重一些通用性的原则和技能。因此我结合自身经历,选取了个人感觉最重要也是质量最高的几门核心专业课,希望能更好地加深读者对计算机的理解。学完这些课程,无论你具体从事的是什么工作,我相信你将不可能沦为一个普通的调包侠,而是对计算机的底层运行逻辑有更深入的了解。
| 课程方向 | 课程名 |
|---|---|
心有所属
如果你对于计算机领域的核心专业课都掌握得相当扎实,而且已经确定了自己的工作或研究方向,那么书中还有很多未在 一份仅供参考的CS学习规划 提到的课程供你探索。
如果你想贡献这方面的内容,欢迎和作者邮件联系 su2489544776@outlook.com