一个程序员的远古追忆——葵花宝典

  张无忌之所以最后能成为张无忌,其中一个重要的原因是他捡到了潇湘子掉的《九阳真经》,不然恐怕连命都不保了,就自然不用说后面沾小昭的光学到《乾坤大挪移》,再然后的什么明教教主、郡主驸马之类的就更不用想了。同样段誉要不是误打误撞看到了《六脉神剑》,大概也就不需要想象以后的逍遥日子了。所以说,要想当个武林高手,总得有本武林秘籍。甭管是掉洞里捡的,还是街头给老流氓忽悠买的,总之得弄上那么一本。

  其实学电脑学编程,道理是一样的,你得弄本宝典。先不说弄来了学得会学不会,至少嘛,需要撑个场面的时候,拿出来吓唬吓唬人得保证有效先。想当年我就是抱着这种想法,忍痛割舍了十几根冰棍钱,弄了本《QBasic 程序设计》。不过现在回想起来,看样子没上当,多少是从这些宝典里面学到了一些本事,确实没白亏了那点冰棍钱。

  要说我怎么就这么好运气呢。九十年代那会,对我们这样的小P孩来说,捡个武林宝典还确实不是什么难事。为什么这么说呢? 说起来这个主客观原因还都有。

  首先说主观原因,那时候其实不管是个什么书,有本书看,尤其是有本编程的专业书看,这本身就是件不容易的事情。所以说,先不管好书赖书,反正找着本书可以肯定的是当初我们这种小孩一定是好好看认真看的。所以就算写的再糟糕,能写出书来的人毕竟多少是有些水准的。因此但凡是书,只要认真的读了,就一定能够多少学到些本事。

  我们当时具体是什么情况呢? 那时候首先没有网络,想学个啥都得去找本书。然后当时市面上都哪些书流行呢? 首先是教学教辅类,那个永远是个铺天盖地的阵势。之后是什么奇闻异趣、小说杂志之类的东西。再之后才有些偏门偏角的计算机书籍。而且这些计算机书里面,五笔字型绝对是占了半壁江山,然后是什么WPS文档处理啦、DOS入门啦之类的。真正要轮到编程了,那就是少之又少了。现在要是在哪个老社区里面吼一嗓子,说你们老程序员当年第一本书是啥,恐怕半数以上都得占到谭浩强的队伍里头去。当时就是这么个情况,编程的书很稀缺。所以弄到了,心思也不会飘忽,一本书能读上几年。想想看,几年的时间读一本书,铁杵都能磨成针了,怎么会学不好? 所以这个是个主观原因:获取信息的途径少,书少,所以拿到一本书能够非常认真的读。

  当然,现在书市上的局面其实也差不多,乱七八糟不相干的书总是最多的。不过至少计算机专业书这个领域,书少局面在接近2000年的时候就瞬间改善了。这是给我的印象。有那么一阵我似乎好久没去逛书店了,大概是初三中考那段时间。等放了假,终于可以泡书店的时候了。一进门,好嘛,提前跨世纪了。整个计算机书架瞬间扩大了几倍体积。什么PhotoShop、Flash、汇编、VB等等等等,都如雨后春笋般一呼啦全钻出来了。当时就是刘姥姥进大观园了,眼花缭乱了——要有这样的感受的人,恐怕还都得赶上时候,2000年以后入行的人大概都不会有过这种体验了。当场我就傻了,说这么多书看哪本好呢?不过照顾下自己手头就三俩钢蹦儿的实际情况,再结合一贯的把蒜种水缸里冒充水仙倒装蒜的德性,我是在瞬间的震惊之后立刻冷静下来:想想其它东西从头学还要重新入门遭人白眼,我还是老老实实接着学我那本QBasic多少还能冒充个高人的好。所以现在回头想想,偶尔装会儿蒜其实也是有益身心健康的,至少没把自己弄成个样样都会半截的半瓶醋。总结下来,还是当年那个观点,刚入行的时候,专注是个好事情。

  再说捡到宝典的客观原因。其实就简单多了。

  那时候本身会计算机的就不多,能写书做专家的就自然更少了。而且,写书的这些老先生们,主要都是清华北大的,本身水准就顶呱呱的。再就是一个非常重要的原因,当年那些大学老师、校长啦都是实在人,不讲究什么论文数、项目数之类的花里胡哨的,在学校里就好好当老师,这是人家的基本宗旨。所以不论是上课嘴巴讲的,还是写书上让咱沾沾光的,里面教书育人四个字是贯穿始终的。为什么说一本书有人写的好,有人写的差呢。其实说白了就差别在这四个字上的。

  我大学毕业以后,有段时间是在弄Matlab相关的事情。当时我就有个深刻体会,最好的Matlab书是哪本? 哪都不用去找, 就是Matlab自己的帮助文档。怎么讲呢?其一是这个文档内容很全, 而且讲到一个具体的技术领域的时候, 它会比较全面的对技术领域的背景进行交代。比如说我当年学神经网络,我就没看别的书,直接Matlab的NN工具箱的文档就是很不错的教材。真的叫深入浅出,公式、算法、思路、图示面面俱到。更重要的是,它还帮你列参考文献。其二原因呢,就非常有对比性了。这个文档当年是英文版的,没中文的东西,中文的Matlab什么情况呢?就一个字,抄。抄啥,就是抄这个帮助文档,英文换成中文来抄,还超出一个一个精品教材来。你说有必要嘛,除了去骗骗啥都不懂的专家评委,要这种书有啥用?而且抄把,你也遵循个信达雅也好啊,人家好,除了函数参考,前言后语那些Matlab文档最出彩的地方全都给省了去了。为啥,人家教授找的那些学生劳动力做做机械劳动勉强还可以,但要是让人家理解思想、转述想法,这不是要了人家命了。

  所以,看到了吧,一本书,用心写和用脚写多少会有些差异的。当年谭浩强老先们写书,那是真真正正的用心在写。读书的人哪里容易犯混、哪里会踩到坑,提前几章的时候人家就帮你把路铺垫好了。一本书教的不仅仅是具体的语法、技巧,更重要的,人家把编码的价值观、算法的引导、数据结构的简单应用、计算机的基本原理,能渗透的都给你渗透了。等到真正学到后面这些东西的时候,给我的感觉只有一个:“哦,数值计算听起来牛逼哄哄的东西,搞半天就是这个呀”。为啥,咱学QBASIC的时候就做过这些题了,不陌生啊。所以说呢,我多少年来学计算机只有一个感觉,没遇到过难学的,这个首先就要感谢给我启蒙的这些教材的作者,人家一本书已经帮我们提前铺了几年的路了。

  再说几个例子。一个是编码格式的事情。我几乎天天都会遇到这样的家伙,尤其是一些目前正在读研的学生(这些人似乎从来没学过写程序,读研了居然要做个什么什么的应用程序来混学位)。怎么样呢?啪啪啪铺一屏幕代码给我,然后说大神啊帮帮忙,我程序运行不了。天哪,那代码我都不忍直视,我说你学编程的时候,书上或者老师没教你什么叫缩进吗? 等你帮他把代码格式调整好以后,问题自然就看见了,大括号少打了。这种混我犯过没?说老实话,我还真的从来没犯过。为什么,因为我记得我当年学的启蒙书里第一个例子,老先生就花了好几百子的篇幅来告诉我为什么需要用缩进。而且我当年也是虚心学习,并且形成了一个敌视一切缩进错误甚至断行不对的代码、认为非我族类的价值观。

  还有一个是当年讲结构化编程的时候,老先生也是花了挺多的篇幅,介绍流程图、NS框图、MS框图。然后我也是非常认真的学着画这几个图。这个上面获得的教益也是非常大的。虽然现在除了流程图偶尔用一下,NS框和MS框基本上都不用了。不过我从里面学懂的是什么呢?只有一个事实,任何一个图有一个严格的代码范式与其对应,任何一个规范的代码范式可以用一个图来表达。这个很重要哦。包括我后来学物理、学机械、学UML、学分析、学管理,在我眼里,每遇到一种图,我总是尝试找出它后面的公式表示、算法表示和编码表示,在我眼里图是活的,是可以运算的。甚至于现在接近中年了,开始学着总结了,我都开始从哲学层面去理解这么多种表示的内在原因。当然这是题外话,不多扯,想一起来摆摆龙门阵的可以到这里去看。反正当年关于图文一致这个价值观,就像是莱昂纳多的一个种子想法,就是在那时候种下的。

  还有就是关于著名的GOTO的事情, 老先生当年讲我们要避免使用GOTO, 又讲到我们也要注意到如果固定了范式能够保护好环境的话, 可以借助GOTO进行优化。我一开始不懂后一句是什么意思,不过我是老老实实听话不用GOTO的。直到我学深度优先的时候,才明白后一句的意思。深度优先两种实现方式,一个是递归法、一个是回溯法。递归法很直白,但是因为当年都是33MHz,只有几十KB的内存的机器,递归深一层资源就耗掉不少,所以很多问题机器跑不起来。但是回溯法呢,好是好,但是那时候小,很喜欢犯懒,回溯那个东西思维逻辑要绕一点。咱不喜欢去背那个逻辑,结果回溯法总是没法一遍写成功。所以呢,编程技能上有缺陷,怎么办?想来想去(其实想的那些时间就够背下回溯法了,不过咱真是懒人,胡思乱想可以,让我去背书没门),终于想出个办法,先用递归把代码写好,然后手工加个栈来存储环境,在递归的for循环内部植入一个GOTO跳进跳出循环,手工压栈保护环境或者手工恢复环境,用非递归的程序去模拟递归的过程。嘿,还真让我给弄出来了,写起来直白程度不亚于递归,而资源消耗程度不亚于回溯法。结果给我命名成拟递归,然后堂而皇之的拿去用,一点不怵。这一会,我弄懂了老先生将GOTO的完整想法,范式这个东西是人做的,既然是范式自然是要遵守。但是毕竟要想到一点,这个东西是人做的,必要的时候也可以去建立自己的范式。要说创造性,绝不能说中国人,或者象牙塔里面的书呆子没有创造力,没有创造力只有一个原因,因为他没学懂而已。

  然后还有当年做的课后习题里面的那些梯形法求积分、牛顿法求根、二分法查找,甚至于串口通讯。你真的不能够想象,如今所谓的各种宝典里面,还会如此兼容并包的去在一本入门性的书籍面讲到这些东西,为一个学生之后几年甚至十几年的学业做铺垫。

  再想想看,这样的书而且还是讲个一个刚刚入门啥都不懂的小孩的,然后竟然能够让他读懂。你说说,不叫它葵花宝典,叫什么好呢?

你可能感兴趣的:(一个程序员的远古追忆——葵花宝典)