大家好,我是良许。
为什么大学C语言课不教Linux、Makefile、git、gdb这些工具?

这个问题,我当年也想过。
学了一学期C语言,只会在Windows上用VC6.0写Hello World,连编译器是怎么工作的都不知道。等到工作了才发现,企业里根本不用VC6.0,都是Linux环境、命令行编译、版本控制、调试工具...全都要重新学。
那种落差感,真的很大。
但现在回头看,我理解为什么大学不教这些了。
原因很简单:教不了。
你可能觉得我在开玩笑,但这是事实。
咱先来算笔账。一门C语言课,一学期大概16周,每周4课时,总共64课时。这64课时要讲什么?
基本语法、数据类型、运算符、流程控制、函数、数组、指针、结构体、文件操作...光这些内容,64课时都不够用。
你再加上Linux、Makefile、git、gdb、vim、shell...每一个都够讲好几周的。时间根本不够。
有人说,那就多开几门课啊。
问题是,课程设置不是想开就能开的。要经过教学委员会审批、要考虑学分分配、要协调各个专业的需求...这个流程很复杂,不是一两个老师能决定的。
而且,很多学校的课程体系是几年前甚至十几年前定下来的,要改动非常困难。
我上大学的时候,C语言教材还是谭浩强的那本,用的IDE还是VC6.0。你知道VC6.0是哪一年的产品吗?1998年。我2010年上大学的时候,用的是12年前的工具。
为什么?因为教材是这么写的,老师是这么教的,考试是这么考的...整个体系已经固化了,想改很难。
还有一个更现实的原因:很多老师自己也不会。
这不是贬低老师,而是客观事实。很多大学老师,特别是年纪大一点的,他们的知识体系是几十年前建立的。那个年代,没有Linux、没有git、没有这些现代化的工具。
他们教C语言,可能就是照着教材讲,用VC6.0演示一下,然后让学生做几个练习题。至于Linux、Makefile这些,他们自己都没用过,怎么教?
我见过一个老师,上课的时候用PPT讲指针,讲得头头是道。但下课后学生问他:"老师,这个程序在Linux上怎么编译?"他愣了一下,说:"我不太清楚,你自己查一下资料吧。"
这不是个例,是普遍现象。
当然,也有一些年轻老师,他们是从企业出来的,或者自己有项目经验,会教一些实用的工具。但这种老师太少了,而且他们往往不是主讲老师,只能在实验课上带一带。
那学生怎么办?只能自学。
这就是现实。大学教的是基础理论,实用技能要靠自己学。
我当年就是这样。C语言课上学的那点东西,根本不够用。后来找工作的时候,发现企业要求会Linux、会Makefile、会git...我一个都不会。
怎么办?赶紧学呗。
我记得第一次接触Linux,是在大三的时候。当时参加一个比赛,需要在Linux上开发,我连怎么装系统都不会。上网查教程,装了一个Ubuntu,然后开始学命令行。
cd、ls、cp、mv...这些最基本的命令,我都是那时候学的。
然后是vim。第一次打开vim,我连怎么退出都不知道。按了半天Esc,屏幕上就是不动。最后还是室友告诉我,要输入:q才能退出。
那种挫败感,现在想起来还记忆犹新。
但没办法,硬着头皮学。vim的各种命令、Makefile的语法、git的用法...一点一点啃下来。
到了工作的时候,这些工具已经用得很熟练了。
所以,我现在的观点是:大学不教这些,也不是坏事。
为什么?因为这些工具,自学的效果可能比老师教还好。
你想啊,老师教的话,可能就是照着PPT讲一遍,然后让你做几个练习。但自学的话,你会遇到各种问题,然后自己去查资料、去试错、去解决。这个过程,虽然痛苦,但学到的东西更扎实。
而且,这些工具都是实践性很强的,光听老师讲没用,必须自己动手。
我做嵌入式开发这么多年,Makefile写了无数个,但我从来没上过Makefile的课。都是遇到问题,查文档、看别人的代码、自己试...慢慢就会了。
git也是一样。刚开始只会git add、git commit、git push这几个命令,后来遇到分支冲突、需要回滚、需要cherry-pick...这些高级操作,都是工作中学的。
所以,大学不教这些工具,不代表你就学不会。关键是你有没有主动学习的意识。
当然,我也希望大学能改进一下教学内容。至少应该让学生知道,除了VC6.0,还有gcc、clang这些编译器;除了Windows,还有Linux这个操作系统;除了单打独斗,还有git这种版本控制工具...
哪怕不深入讲,至少让学生有个概念,知道这些东西的存在,知道将来工作要用到。
这样的话,学生就能提前准备,不至于到了工作的时候一脸懵逼。
我现在做自媒体,经常有大学生问我:"良许老师,我应该学什么?"
我的回答都是:C语言学完了,赶紧学Linux。装个虚拟机,或者买个树莓派,开始折腾。学命令行、学shell脚本、学Makefile、学git...
这些东西,越早学越好。
因为将来你工作了,这些都是必备技能。与其到时候临时抱佛脚,不如现在就开始积累。
而且,学这些工具,对理解计算机原理也有帮助。
比如说,你用gcc编译一个程序,会经历预处理、编译、汇编、链接这几个步骤。如果你了解这个过程,就能理解为什么有些错误是编译错误,有些是链接错误。
再比如,你用gdb调试程序,可以看到内存地址、寄存器的值、函数调用栈...这些都能帮你理解程序是怎么运行的。
这些知识,比单纯背语法要有用得多。
所以,别抱怨大学不教这些。自己学,效果可能更好。
把大学当成一个起点,而不是终点。
学校教的是基础,实用技能要靠自己积累。
这才是正确的心态。

END
来源:良许Linux