大家好,欢迎来到月球空间站。
这是我的播客,没有固定主题,想到什么就说什么。但是应该会主要围绕我的研究领域:天文,航天,计算机等等。
第一期,我讲一下酝酿已久的一个题目:C语言。这个播客不是C语言教程,而是介绍跟C语言相关的一些八卦。
C语言是我上大学学的第一门语言,也是人类发明计算机以来,不能说最重要,也是非常非常重要的一门语言。它足够接近底层,如果学习过汇编,看着C代码基本可以在头脑中把相应的机器指令写出来。它又足够高级,接近于人类流水线式的思维方式,再加上关键词少,语法简单,一个认识简单英文的小学生经过少量培训就能看懂。这种底层和高级之间的精妙平衡使它可以胜任从操作系统到大型商业软件等待一系列工作。其实我们耳熟能详的软件,比如Windows,Linux,都是用C写出来的。
先说一说我是如何接触C的。我出生于中部省份,教育落后,启蒙的比较晚,上大学才开始学习编程,第一门课学习C。那时候电脑还很贵,不是每个人都有。学校提供机房供学生上机,调程序,完成作业。我对当时上机印象最深刻是换拖鞋。那时上机很有仪式感,进入机房之前要先换拖鞋。拖鞋不是一次性的,每次打开鞋柜就像是开盲盒,也许上一个人是一个抠脚大汉,打开之后一股沁人心脾的气息扑面而来,神清气爽。经过这一关之后,硬着头皮穿上拖鞋,才能走进机房。我们使用的是大型机,运行着UNIX,每个同学分配一个终端,打开之后滴滴滴做响,很刺耳,过一会,就出现了登录界面。输入自己账号密码之后就可以开始调程序了。那台机器貌似不是很稳定,如果有牛人,写个程序指针乱指,或者开辟了无数进程,很容易把整个主机搞死,然后大家都等着助教重启主机。用的编辑器也是最简单的vi。有句话说得好,世界上有两类程序员:用vi的和不用vi的。最近刚刚看了《霍乱时期的爱情》,知道了这句话就出自这本书。vi一个小小的编辑器,学习曲线却极陡。初次接触时不知道怎么启动,启动了不知道怎么编辑,编辑了不知道怎么退出。开发vi的是一个叫Bill Joy的。这家伙是个牛人,是类UNIX操作系统BSD的开发者,此外他还实现了TCP/IP协议,C shell,网络文件系统NFS,vi只是他举手之劳。后来Joy作为联合创始人参与成立了太阳微系统,他的BSD也发展成了运行于SUN上面的Solaris。太阳后来开发了JAVA,是如今使用最广泛的编程语言。所以优秀的人无论干什么都优秀,以一当十都有些低估他们的实力,以一当百甚至当一千更恰当。
刚才说到Unix,C语言和Unix渊源很深。贝尔实验室一个叫Ken Thompson的人在Unix的前身Multics上写了个游戏玩。后来Multics项目搁置,他没有机器玩游戏了。于是在实验室一台闲置的PDP-7上和丹尼斯里奇一起用汇编重新写了这个游戏。这些移植游戏的经历以及之前系统的开发经验使肯开始研究操作系统,1969年,肯和原来Multics团队的一些成员开发出了第一版的系统,运行在PDP-7上,但是性能不佳。接着他们在1970年开发出了第二版,并正式命名为UNIX。最初的版本用B语言和汇编开发。B语言听名字就知道是C语言的前身,是一种解释型语言,语法与C类似,但是没有类型。肯和丹对它进行了改造,1971年发明了C语言,并且用C语言重写了UNIX,这就是第三版。当时为了效率,系统程序都是汇编写的,用C语言重写提高了可移植性,而且代码更容易维护,是当时很大的创新。
说完UNIX,另一个不得不提的是贝尔实验室。这家实验室主打电子通讯技术等应用研究,我们现代生活中的很多东西,包括晶体管,激光,光伏电池,CCD,等等,都诞生于这家实验室。而且贝尔实验室无心插柳柳成荫,跟天文学关系异常紧密。最著名的当属微波背景辐射的故事了。微波背景是理论预研的大爆炸的遗迹,每个方向的辐射强度都基本相同,其对应的温度在3K左右,或者说零下270度。接下来的事情就是要找到这个信号。1964年,贝尔实验室两位工程师彭齐亚斯和威尔逊合作建造了一台号角状天线研究卫星通讯。这台天线灵敏度很高,但是测试噪声的时候总是有一个3K左右的噪声存在。他们想了各种办法把它消除掉,包括清理了天线上的鸟粪,掏掉一个鸟窝。但是这个噪声一直存在,每个方向都相同,一年四季都相同。后来他们终于和几英里之外普林斯顿大学的迪克教授联系,迪克教授几乎是立刻就意识到了这就是宇宙学家苦苦寻找的大爆炸遗迹。后来他们背靠背在天体物理杂志发表了两篇文字,报告了这个发现。之后的1978年,彭和威尔逊获得了诺奖。在大多数版本中,为了增加故事的戏剧性,都强调是两个跟天文不沾边的工程师做出了这个重大发现。现实情况是彭齐亚斯和威尔逊早期是贝尔实验室的无线电研究部门唯二的专门从事射电天文的研究人员。后来随着1962年美国国会通过卫星通讯法案,专门成立了COMSAT公司专门经营卫星通讯业务。贝尔实验室缩减卫星和空间相关的研究规模。二位被告知只能保留一个专门从事射电天文的职位。于是他们两个决定每个人各接受一半的资助,另一半从事其他项目。而他们建造的角状天线,也是半天文半卫星通讯目的。
说回贝尔实验室。这个实验室跟射电天文的渊源比微波背景辐射的发现要早得多,其实射电天文本身就是在贝尔实验室诞生的!故事要从1928年说起。那年一个叫卡尔央斯基的工程师加入了贝尔实验室,他的工作是调查干扰无线电传输的噪声来源。他用的设备是一台被称为央斯基旋转木马的天线。他后来果然发现了一个噪声,指向银河系中心!这一发现标志着射电天文学的诞生。1973年国际天文联合会为了纪念他,决定将射电辐射流量密度单位命名为Jansky,简写作Jy。
说了半天C语言早期历史和贝尔实验室,回到中国。说回C语言,中国人学C,离不开一个人,谭浩强,念一段wiki上他的简历:
谭浩强教授,1952年毕业于上海市上海中学,1958年清华大学自动控制系毕业。学生时代曾担任清华大学学生会主席、北京市学联副主席、全国学联执行委员,北京市人大代表。毕业后留在清华工作,担任清华大学团委副书记,同时承担教学工作。从70年代末开始,投入计算机教育。现担任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书(NIT)考试委员会主任委员,教育部全国计算机等级考试委员会副主任,是中国大陆部分计算机教材的作者。
对于大部分中国大学生来说,C语言之父不是上文提到的里奇和汤普森,而是谭浩强。我们那个年代几乎每个人学习c语言都是谈教授的那本书启的蒙。其实C语言并不是谭教授最拿手的,谈教授的第一桶金是BASIC。有一本叫做《知识英雄:影响中关村的50个人》的书,其中一篇讲谈教授,现在摘录一段:
许多后来看起来意义深远事件的缘起,回想当初都显得那样地偶然和普通。1978年,清 华大学扩大招生,计算机系多招了两个班,这两个班的计算机语言课没人讲。有人建议当时 任清 华大学计算中心党支部书记的谭浩强兼课:“反正党支部现在也没什么事,你去讲吧。” 此时,距离开课只有三个礼拜的时间,没有教材,谭浩强找到一本英文教材,谭浩强连这本 英文的BASIC书还没有完整地看完一遍,就走上了讲台。
上面这本书出版于1998年,那时候谈教授的BASIC教程已经买了1200万册,C语言教程卖了210万册。现在已经过去了23年,期间又经历了大学扩招,据我所知很多大学仍然在用谈教授的教程。准备这篇播客的时候我特意去网上查了一下,现在C语言教程已经出到了第四版,封面上赫然印着总销量1250万册。更有意思的是现在正值七夕,京东很贴心的提醒“爱意甄选,礼享七夕”,也就是说这本书很适合作为七夕节送给爱人的礼物。所以广大直男知道该送自己女朋友什么了吧?
谭教授的书广为诟病,里面充斥着各种奇怪且不标准的语法,比如大学四年,我一直认为main函数返回值是void型,直到研究生阶段才改回来。其余各种类似于i++,++i的奇技淫巧数不胜数,谭教授的书影响了一代人,让青年学子看到c这门语言就觉得高不可攀,大门还没进就打退堂鼓。现在看来,真的不知道这是好事还是坏事,因为不会编程就成为不了程序员,至少不用整天996掉头发了。我始终觉得对谭教授的苛责是非常不公平的。评价一个人,不但要考察个人能力,更要考虑历史进程,八十年代,刚刚改革开放,计算机产业刚刚在国内发展起来,谭教授的书烂,但是其他书更烂,于是瘸子里面挑将军,选中了教授。有句话怎么说来着?世无英雄,使竖子成名。郭德纲也说过一句类似的:全靠同行衬托。谭教授在中国计算机教育史上,是有着不可磨灭的贡献的。他的书可以看一看作为入门。但是无论学习任何知识,都不能奢望靠一本书搞定一切。很多人都是在大学阶段开始学习C语言的。现在回过头看,很重要的一点,大学学习的不是知识,而是获取知识的方法。一个合格的大学生应该有独立思考的能力,针对各种材料做出甄别。况且谭的书并没有错到离谱的程度,都是些小毛小病,把每章后面的练习题挨个做一遍,初步掌握这门语言没什么问题。之后边看其他书,边做项目,回过头来看,会发现他的说法确实有很多问题,这就是一个提高的过程。
那么现在再学习C,我有什么建议呢?首先当然是推荐由布莱恩柯尼汉和丹尼斯里奇编写的《C程序设计语言》,丹尼斯是C语言的作者,其权威性不容质疑,如果其他教材跟这本教材讲法不一样,那一定是其他教材错了,如果书里面的程序在编译器上通不过,那一定是编译器错了。布莱恩也是贝尔实验室的著名科学家,事实上UNIX这个名字就是他提出来的。他为UNIX贡献了大量的基础工具,包括awk。这本书是如此的有名,应该说在中国之外它都是C语言学习的标准入门教程。这本书中有一个著名的程序:打印输出“Hello, World!” 这也成为一种计算机文化,是现在每一门编程语言要介绍的第一个程序。
学习C语言一定要做练习,把每一章后面的习题都调通,掌握的就差不多了。如果我接触C语言的时候能够使用这本书,做这本书的习题,相信编程水平应该比现在要高。但是假设没有意义,希望后来者不要走我的弯路了。看完练习完这本书之后,还有著名的C语言三部曲,包括《C和指针》,《C专家编程》以及《C陷阱与缺陷》。看完之后语言能力绝对会有提高,不过学习语言主要是为了使用,我特别反对为了学语言而学语言,所以这三本书有时间的时候随便翻翻就可以。
学习完以上内容之后只能讲掌握了C语言的语法,而真正的编程是建立在算法和数据结构之上的。所以一个比较好的途径是接着学习数据结构。我当时使用的是严蔚敏的数据结构教材,现在看起来褒贬不一,有人说不适合新手,过于晦涩。但是我觉得还可以。这本书学习完,把练习做完,再回过头看C语言教程本身,就会有一览众山小的感觉。
最后说一下现在比较火热的少儿编程。有人把编程列为跟英语一个级别的技能,未来人人都要掌握。我还在上学时可能也是这样看的,觉得编程很神圣,是一项了不得的能力。现在程序写得多了,见到的东西多了,想法跟以前不一样了。如果把一个项目比作建造大楼,那么程序员在其中的位置类更类似于其中的木匠和泥瓦,是一种体力劳动。我不是贬低这些职业,其实现代社会这些职业的收入不比白领低,但是估计现在的家长应该不会从小让孩子学习这些技能。为什么呢?因为如果有必要的话,这些技能并不难掌握。编程也一样,生活所迫的话,只要不是太笨,短时间内也能掌握到一定程度,这就是北大青鸟之类的培训机构得以存在的原因。那么我们更希望孩子成为什么样子的人呢?当然是建筑设计师,是设计这座大厦的人,对应到程序开发中就是系统架构师和项目总监之类的人才。但是这个职位需要的就不仅仅是熟练掌握某种编程语言以及各种算法,更重要的是能够理清各种需求,然后根据现有资源进行设计,同时要兼顾审美和成本。这些技能可远远不是小时候上几门编程课就能学到的。至于如何培养这些能力,就不是这期播客能够涵盖的了。
好了,这一期就讲到这里,谢谢大家!
还没有评论,快来发表第一个评论!