说说我的语言学习经历,仅供参考。
1989年,我学习BASIC,是Apple II BASIC。我用BASIC做过一些有趣的智力题
如约瑟夫问题,讲在古罗马的时候,一次战争中,约瑟夫被俘,
后来用BASIC做过简单的排序,找最大值,逻辑判断等等。
使用BASIC的历史很长,一直到1993年。1993年,我开始学习PASCAL,是Borland的Turbo Pascal,主要还是兴趣小组,也参加过一些编程竞赛。我使用PASCAL学习了基本的数据结构,如栈、队列。以及一些有趣的问题,如高精度四则运算,迷宫问题,学习了广度优先和深度优先以及A算法。
我觉得我的水平一直停留在这一阶段很长时间。1994年我逐步接触一些C语言的知识,但是迫于没有环境(现在看来是编译器)。所以没有深入使用。那时我形成了一个现在看来新生代程序员普遍缺乏的能力:就是用铅笔在白纸上写程序的能力。我非常喜欢冥想,然后在纸上写出好几页程序,输入计算机很快编译通过并运行成功。但是那时我仍然钟爱PASCAL。
1995年我上大学,大一上半学期必须学习谭浩强的那本C语言教程。虽然是电类系,可是计算机系的大一新生学习PASCAL,我非常羡慕。现在看来对于选择C语言,系里的初衷是希望我们后继能直接使用C语言操作硬件,从而方便开展控制系统的教学和实践。
C语言虽然对我来说非常轻松,可是我的兴趣仍然在PASCAL上,这时候Borland公司推出了Delphi,是Pascal的RAD环境,我觉得很有趣,于是用Delphi来做大学物理实验的数据处理,搞拟合、画结果。
但是1995年C++和面向对象的兴起很让我着迷,虽然我没有Borland C++ 3.0。但是我发挥了我的优势,在纸上写程序和冥想。这个过程一直到我后来终于搞到了Borland C++ 4.0。那是一个在Windows 3.x上的图形化IDE和编译器,带有OWL类库,现在看来其震撼力是空前的。
这时我以前的数据结构和算法的基本功发挥了作用,有年暑假,系里的老师给了我一个有趣的任务,写一个类似分形的算法,现在看来,就是把一系列树的生成规则递归解释执行并在屏幕上描绘出一颗树的生长过程。我这时开始接触Win32 GUI编程,很着迷。记得那时有个高年级同学说,判断是否掌握一门语言的标准是能否独立写出俄罗斯方块。我当时分表用Turbo C++在DOS下和用Visual C++在Win32下写了俄罗斯方块游戏。
这期间Visual Basic在Delphi的激烈竞争下也迅速推出并不断升级,对此我很不以为然。因为我根深蒂固的认为BASIC是我的启蒙语言,他是给中学生用的。但是后来进入系里的教研组后,很多情况下不得不使用。这是后话了。
然后就是微软和Borland大战,Borland C++和Visual C++死磕,我也不断游走在OWL和MFC之间。最后的结果是,教研组里的大部分项目都是用了MFC。我们系有大量的工业控制项目,所以,我经常混用C和C++。这期间我也写了大量的单片机程序,和底层控制程序。
1997年互联网热得发紫,Java也出来了。我用了用早期的Java,写了写Applet。觉得提不起什么兴趣。
但是接着1998年CGI这门技术让我着实着迷,我可以写出类似BBS的网络论坛。当然我使用的语言是Perl。我折腾了一阵Linux的Slackware和Redhat。用perl写了大量的网站程序。后来perl有了IIS的支持,我又回到Windows上写perl程序。当然这期间也顺便学习了JavaScript,但和现在的JavaScript相差甚远。
我喜欢把黑盒子打开,于是我好奇web究竟是怎么回事。于是我开始研究WEB下面的C代码。折腾Socket,然后在系里实验室的Sun工作站上用socket写程序。
1996年,作为一门必须课,我学习了8086汇编语言。
光阴荏苒,在我折腾这些现在看来都是buzz的东西的时候,不知不觉要毕业了。大四的暑假我和同学去了镇江一家软件公司实习,我用ASP写网站。大五一回来就要收心了。这是我要考虑我毕业做什么课题。我决心做一个电话自动拨号器,于是我学习了PL/I汇编语言,控制单片机。并且最终做出了这个有趣的东西。这年暑假我还学习了NEC单片机的汇编语言。
之后就是研究生了,我跟着导师做了很多项目,绝大部分都是底层用C或者汇编控制硬件,然后用Visual C++/MFC或者Visual Basic做上位机的GUI。在此期间,我对数字图像处理产生了浓厚的兴趣,而C++又是干这个的利器,性能又好,又能利用面向对象解决复杂的问题。所以我用三年时间做出了一个视频检测的课题,用C++处理视频,找出里面的机动车和行人,并进行跟踪。今年校庆我回学校,教研组的毕业生说还在参考我当年的论文。
毕业后,我对机器人产生了浓厚的兴趣。于是我开始做机器人,这期间一方面写Linux的硬件驱动,一方面写机器人的控制算法,也是混用C和C++。而且我还花费了相当时间折腾Windows下的驱动,也就是WDM。另外一个就是折腾Linux下的GUI,所以写了些GNOME的程序。
如果说Matlab也算个DSL的话,我那时还是个Matlab的Mathematics的狂热爱好者。
这期间一个有趣的学习是PIC C语言,是一个专门针对PIC单片机的C语言。我们知道8位机C语言中一个字节是8个bit,但是PIC芯片只用了7个,剩下一个用作地址控制。这个语言非常有趣。总要折腾这剩下的一个bit。
2003年我接触了STL,我认为我以前了解的那个C++和98标准后的C++简直就是两个东西。然后我从新梳理了一遍C++,我回过头读Effective C++和Modern C++ design。
2004年我找工作的时候,有面试官问我Design pattern,我根本没有听说过,结果面试失败了。顺别说下,那家公司叫Nortel。
2004年底,我的第一份工作是使用java语言,是我多年前就很不感兴趣的语言。但是我得感谢java,因为没有哪个语言这么强调design pattern。我那时认为design pattern很了不起。这个想法要到多年后才认识到有问题。当然,作为检验,我又写了一个俄罗斯方块。
2005年底我回到北京,进入了手机领域,用一个被裁减的C++做Symbian开发。对比Modern C++ design我觉得自己回到了90年代。这期间有人推荐了Smalltalk。我觉得我以前在面向对象中的一些经历,象一颗颗散落的珠子,现在它们被Smalltalk串起来了。
2006年,前后,我对模板元编程非常感兴趣,写了无数模板程序,包括素数筛法,甚至我用模板元编程实现了深度优先搜索。在第二次看Modern C++ design的时候我注意到Andrew Alexandrescue提到了LISPISH这个词,于是我下决心学习LISP
2006年,我开始学习Lisp方言Scheme,先后读了HTDP和SICP。我还是反思C++。
期间我学习了Python,但是没有什么特别的感觉。
2008年,沿着LISP给我打开的FP这条路,我学习Haskell,我感觉我几乎在重新学习计算机科学。2007到2008年,我花了一年半时间读完了Programming programmatic一书,这本书涉及了30多种语言,从编译的角度讲解了语言本身的原理。从那以后,我就知道我会学习什么语言,而拒绝学习什么语言了。
2009年,我开始用Haskell,以FP的角度实现《算法导论》中的所有算法。这期间,我才重新认识到Python的价值。
2009年,我想了解Scheme之外的LISP,于是我学习了Comomon Lisp语言。
2010年,我反思我对语言的看法,得出了结论:最终极的语言是伪代码和数学公式。Python和Haskell是迄今为止,最接近我这个衡量标准的语言。
2010年,我开始学习Prolog语言,因为根据我形成的固定观点,Prolog是不同于FP和Imperative两种思维方式。值得学习。
2010年,为了读论文,我学习了ML语言,然后我一口气啃下了Okasaki的著作,Purely functional data structures.
2011年,我想了解,Objective C如何把C和Smalltalk结合到一起,于是我迅速学习了Objective C。
我相信,今后我学习语言的目的会非常明确,我不会因为市场上某个语言流行而学习,也不会因为周围人都学习某个语言,或者某个语言容易找工作而学习。如果某个语言会影响我的思维方式,我会学习。
拉拉杂杂写了不少。欢迎其他同志共享你们的经历。
==
另外:近几年我反思了Design Pattern。当然有些人极端的认为Design pattern是一派胡言。我认为Design Pattern在很多场合被滥用了。
求神书Programming programmatic
很多学习经历和想法我都有过,不过比你的功力差太远了。可惜在TE时没多找你请教,把时间都和小强打球了:)