“大学只教C语言,需不需要自学一些其他的技术?”
“大学里为什么不教 PHP,Swift 或者 Python 这些真正实用的语言?”
... ...
在知乎上经常可以看到这样的问题。这也不能单纯怪学生们浮躁,现在工业界的技术日新月异,在以 Github 为中心的开源社区以及针对各种语言平台的包管理软件的带动下,大大小小眼花缭乱的框架和新兴语言百花齐放,好不热闹。反观科班的计算机教育,依然是几十年不动的 C 语言,和十年前相比唯一变化就是开发工具从 Turbo C 升级到了 VC 6.0。
我们都知道对于计算机科学这个学科,实践一直以来都是一个非常重要的环节。所以大学之所以十年如一日的以 C 语言为中心教学, 最根本的原因是,计算机科学的核心课程的实践环节都可以靠,并且主要是靠C语言完成。
这个部分,是大多数学校所欠缺的。什么意思呢? 大多数学校都选择性忽视了核心课程的实践环节,最终导致了学生们对 C 语言的偏见。
那到底是怎么个实践法儿? 我举几个例子:
数据结构,都不说难的,各种链表,各种链表增删查改,队列,双端队列,栈,用栈模拟递归,基本的树形结构,基本树形结构的递归和非递归遍历,各种排序,检索算法,是不是都得用C语言实现一遍?各种字符串操作,性能比较,模式匹配,KMP,BM这些算法是不是也得尝试 一下自己写出来?这些看起来是进阶部分的练习,其实恰恰才是最基本,最核心的要求。
等你学了一些更加 Fashion 的语言后你会发现,用 C 来实现数据结构是最简单,最清晰,也是最容易的。
操作系统,大多数人会觉得这特么课根本不可能有啥可执行的实践吧? 其实是有的,有这么一个项目:NachOS:http://homes.cs.washington.edu/~tom/nachos/, 以linux的进程为载体,实现了一个最基本OS的逻辑, 千行级别的代码,是千,不是千万,很容易看懂。 看懂了然后呢? 就可以自己做一个bash,解析用户的输入,可以自己做一个文件系统,自己做一套基于自己的文件系统上的搜索算法,自己做进程模型,实践各种进程切换的算法。当然,都是靠C语言(NachOS 源码是 C++ 的,不过并没有多少 C++ 的特性,基本就是 C with class,基本会C语言都能看懂)。
计算机网络,这就更别说了,linux 上到处都有为 C 语言开发的网络操作库,不论是做个简易 TCP 客户端,或者请求个简单的网页, 尝试把 HTTP 报头打印出来看看,或者用 libpcap 做个 sniffer ,抓抓包。或者自己构造个 RST 包,看看能不能切断一个正在进行的 TCP 链接。 只有亲自写代码去完成这些场景,才能够真正理解课本里面的概念。才能算学好了这门课,这些自然也是靠 C 语言。
计算机图形学,这简直就是 C 语言的天下!看一下 OpenCV,OpenGL。两者都有对 C 语言非常有好的接口,不论是撸个三维的地形,迷宫,还是针对摄像头,搞个实时人脸检测,都不难,并且都只需要纯 C 语言基础 + 对应的库的接口, 不需要任何 GUI 相关的编程知识。如果不做这些练习,那课本里那些“光线跟踪”、“背景剔除”、“形态学运算” 对你来说就永远都只是个模糊的名词而已。duang!C 语言又立一攻。
编译原理,能写个语言的解释器是编译原理的基本要求,这很重要,而且这并不难,但从来不受重视(反正考试不考……)。一般编译原理的课程大作业都是些一个表达式求值的计算器,然后止步于此。但其实再往前走一步,其实在此基础上加个变量表,再引入递归下降的思想,就已经是一个解释器的雏形。在此基础上添加对 if 或者 for 这些控制流的语句也是水到渠成的事。曾几何时,用 C 语言写个简单的 BASIC 解释器几乎是人见人爱的活动,资料一找一大堆。
说了这么多,还是那句话。作为科班学生,学好 C 语言,学好其他 CS 核心课程,是最重要的,并且也是最花时间的,当然也是日后会给你最丰厚回报的。别没事儿就整动态语言,移动开发那些花花肠子。
------------
想看更多内容? 可以关注我的知乎