十年后重学核心课程

十年

2009年8月29日,也就是十年前的今天,我成了一名大学新生。十年后,我成了大学教师,过几天就要给学生们上课。本想专门写篇文章纪念这重要的十年,但所思所想不足以成文。所以就在本文的开头感慨这丰富多彩的十年,这沧桑巨变的十年!

我本科和硕士都是自动化(控制科学与工程)专业,由于工作期间基本只关注特定的方向,几门专业课长期没有接触,比较生疏。我要重新把这些知识捡起来,这样在讲台上会有更好的发挥。所以,我准备「十年后重学核心课程」,在本文中分享一些学习材料和经验。其实自动化、电子、通信、测控、电气等专业在本科阶段学的课程很相似,本文对这些专业的学生都有参考意义。

我本着认真负责的态度书写本文,拒绝道听途说的信息,所有提到的材料和经验本人都亲身经历过。我把所有重要的课程分为三类:数理基础、专业核心和计算机基础。

数理基础

微积分

微积分没学好,学习后续的专业课程会寸步难行。大多数工科专业的学生没必要花太多时间钻研晦涩难懂的实数理论和\(\varepsilon-\delta\)语言,理解核心概念,能熟练计算就够了。

如果对严密的数学有执念,可以尝试数学专业的「数学分析」课。我十年前学的就是这门课,用的华东师大版的教材,我觉得这套教材还不错。菲赫金哥尔茨的《微积分学教程》被誉为是经典分析学的巅峰之作,全套一共有三本,我读完了第一本,非常喜欢。实数理论那一章用Dedekind分划来定义无理数,非常巧妙和深刻。这套书篇幅大且难度高,全部读完要耗费大量时间。所以我计划只阅读这本书最核心的部分,计算的内容扫一扫就够了。

线性代数

线性代数也非常重要,专业课程中很多理论都用线性代数的语言描述。强烈推荐MIT的线性代数公开课,我读研究生的时候才看的这个公开课,要是早点接触这个课程,当年就不会学得那么不明不白了。教材可以用授课老师Gilbert Strang著的Linear Algebra and Its Application,甚至我认为,看老先生的视频课程不需要教材都可以。需要注意的是,这门课注重理解和计算,基本上不做证明,想学习更严密的代数可以找本数学专业的教材,比如丘维声的《高等代数》

专业核心

电路分析

2019年秋季学期我有一门与电路相关的课程,我参考了不少《电路分析导论》的内容,里面有大量的实用知识。电阻器的颜色编码、常用仪表的原理与使用方法这类的知识就不说了。像真实电容器的实际模型(有电阻和电感成分)以及它的频率阻抗曲线这类知识太有用了,但国内的教材基本没有提及。本科刚进实验室做电子设计比赛时,发现电路板上用到好多电容,只知道电容有滤波、去耦等作用,对一些细节问题模棱两可,比如:

  • 滤波电容、去耦电容、旁路电容分别是什么意思?
  • 为什么稳压芯片输入输出端并联的电容大小不一样?
  • 为什么有很多小电容并联,而不是用一个大电容去替代?
  • 为什么电感同样作为储能元件,应用没有电容那么广泛?

如果不知道电容的实际模型,很难从理论上解释上面的问题。这本书真正是理论与实际相结合,做教材和参考书都非常好。但是这本书没有提及电流、电压的参考方向,这是个不小的缺陷,所以建议主要用国内的主流教材学习,这本书可作为辅助。

模拟电路

2019年秋季学期的备课过程中,我读了Microelectronic Circuits这本教材,内容相当丰富,例题和习题也很有代表性。这本教材在台湾省的几所高校里地位非常高,台湾交通大学有一门电子学课程,用的就是这本教材。主讲老师陈振芳讲得很详细,甚至有点啰嗦,就怕你听不懂,视频在B站上就可以找到。大陆没有这本书最新版的译本,台湾有,但是价格比较贵,购买起来也不方便,我一时脑热买了,详见另一篇文章:谈谈「Smith的电子学」

上面提到的教材和课程篇幅太大,如果以后不是从事模拟集成电路设计相关的工作,不太建议我们专业的学生全部学完。就用清华大学那本教材,搭配上海交通大学郑益慧老师的教学视频,个人觉得比清华的老师讲得好一些。

数字电路

数字电路相比模拟电路学起来容易一些,用国内的主流教材即可。学完后推荐读下《编码:隐匿在计算机软硬件背后的语言》,有数字电路的基础读这本书会很容易,读完后就能理解硬件和软件之间是如何建立联系的,计算机芯片的基本原理就明白了,对后面学微机原理很有帮助。

自动控制原理

这门课是自动化专业的核心课,学生普遍反映难度比较大。2020年春季学期,我带了门叫做「自动控制系统与仿真」的课,顺带把自动控制原理的内容复习了一遍。后面几个学期长期带这门课,反复巩固了几次,还比较熟悉。

内容最全的教材莫过于胡寿松编的《自动控制原理》,它是重要的考研参考书。该书的优点和缺点都在于,讲得实在是太细了,细致得让人望而生畏。所以我大部分时间是读的另外一本《现代控制工程》,详略得当,把工科学生需要掌握的知识点用适当的篇幅讲清楚了。参考的在线课程是西北工业大学卢京潮老师的教学视频,从视频弹幕的内容来看,很多考研的同学在卢老师视频的帮助下取得了不错的成绩。卢老师还出过一本教材,我粗略地浏览过,详略得当,里面有些很好的总结,作为参考书也挺好。

信号与系统

2020秋季学期,我给两个专业讲授「自动控制原理」,在备课过程中读了奥本海姆这本经典的《信号与系统》。这两门课太相似了,自动控制原理中需要很多系统特性和信号特性的知识,特别在学习频域法时很有帮助。卷积、傅里叶变换这些内容读大学时都没完全弄明白,读了这本书后都懂了。这本书既有严密的数学推导,也有形象的解释,图文并茂,把东西讲得不能再清楚了,不愧是经典中的经典!

微机原理与单片机

用主流教材即可。这门课的细节很多,刚开始学时会觉得云里雾里,而且很难记住,要耐着性子反复读教材。

计算机基础

C语言

C语言是本专业最重要的编程语言。由于接近计算机底层硬件,学好了C语言就相当于把计算机基础打牢了,后面再学其它的编程语言也很快。初学者可以读C Primer Plus,如果想更进一步,K&R的《C程序设计语言》是必读的。两位作者都是贝尔实验室的核心成员,其中一位还是C语言的发明人,他们的技术功底非常深厚,这本书被誉为是技术写作的典范。但因为其难度大,并不适合初学者,可以作为学习C语言的第二本书。在线课程可以看浙江大学翁恺老师的C语言程序设计,翁老师连怎么安装软件都亲自示范,对初学者非常友好。

我强烈建议学完C语言之后,马上去学习单片机编程。买一款最便宜的51单片机开发板,参考郭天祥的视频学习,甚至都不需要电路、单片机等基础知识,因为视频里把需要的知识讲得很清楚。提早接触单片机C语言编程有什么好处呢?首先,学完C语言后马上应用,熟练之后就不容易遗忘,免得一两年后又要重学一遍C语言;其次,能够理解软件和硬件的关系,知道市面上那些简单的电子产品是怎么做出来的,可以激发学习兴趣。

数据结构与算法

很多人在遇到比较复杂的功能时,无法用代码实现,这就是编程能力的不足,而学习基础算法是编程能力提高的必由之路。非计算机专业的本科生如果时间精力有限,算法不需要学太深,了解链表、队列、栈、二叉树、排序算法等基础内容就足以应付日常开发和求职面试。我推荐《数据结构与算法分析(C语言描述)》这本书,大部分内容都覆盖到了,篇幅合适,而且书中所有的C代码都可以实际运行,而不是用的伪代码。

写代码类似于一门手艺活,想要提高需要大量的练习。我自己有亲身体会,读研究生时写了不少代码,专门自学了算法,刷了不少OJ上的题目(详见刷LeetCode有感)。那段时间深切地感受到了编程能力的突飞猛进,以前觉得很难的代码也能轻松实现,日常工作中的功能需求基本没问题。

这门课对我们专业并不是必需的,但有志于投身软件开发工作的同学在本科阶段就应该学习这门课。

总结

总之,我觉得想学好一门课程,需要把握如下几个关键点:

  1. 了解课程在整个专业课程体系中的作用和地位,认识到它的重要性,有学好它的决心和毅力
  2. 学好一门课不容易,一个学期真正学好两三门核心课就不错了,时间精力有限,要合理分配
  3. 由于种种原因,国内采用的主流教材普遍质量堪忧,要多参考国内外优秀教材,还可以看高质量线上课程
  4. 有的课程需要多实践,硬件类的课程多去实验室动手操作,没有条件的话可以用仿真软件,软件类的课程多写代码

希望本文能够对相关专业的年轻学子有所帮助。