80年代末,我第一次接触了Apple II电脑上的BASIC编程语言,从此走上了一条程序人生。十多年前我在博客园上开通了自己的博客,由于下象棋时经常出点“毒”招,所以网名干脆就叫“毒龙的程序人生”,2016年8月底申请公众号,名字就叫“申龙斌的程序人生”了。
回想这些年,由于项目需要或兴趣使然,竟然学了十多种编程语言。
BASIC
第一次接触计算机大概是在1987年,当时我的学校竟然引进了20台昂贵的Apple II计算机,我连如何操作电脑都不会,直接就学BASIC语言。
那时也不懂什么结构化编程,反正就是抄着书上的代码学,虽没写出什么成规模的BASIC程序,但也算编程入门了。记得曾把几个程序小心翼翼地保存在一张1.2M的大软盘中,可惜现在软盘也没了踪影,所以一行BASIC代码现在也没有留下,想怀念怀念过去都没了可能。
FORTRAN
FORTRAN是在读本科时学的,当时科学计算很流行,这是数学系的必修课。一个班几十人连接一台大型机(我已经忘了它的名字),提交程序后得等上十多分钟才能看到程序的编译结果,所以代码要写得非常认真,提前把代码写在本子上,仔细检查各种语法和逻辑错误,否则上机1小时可能连编译都无法通过。
参加工作时竟然还用FORTRAN语言做过项目,当时有一位北大毕业的CHAI师傅,能用FORTRAN写上几百行的代码,我就跟着他修改这一堆代码。当时能写代码的人就是高手,不管什么可维护性,GOTO语句满天飞,每做一个项目就复制、修改一份源程序,最后程序版本混乱,无法维护。
最让我震惊的是当时MIPS工作站上的一套国外开发的地震解释软件,竟然包含了全部的FORTRAN源代码,那套代码有上万行,注释详细,逻辑清晰。
那时的我明白了结构化编程的重要性,即使语言本身的特性不好,也同样能够写出可维护的优美代码。
PASCAL
大学里开了《数据结构》这门课,所有的例子代码都是用PASCAL语言写的,所以我又学了PASCAL语言。
以前学FORTRAN和BASIC时,养成了非结构化编程的坏毛病,因为有行号,语句之间可以随意跳转,也没有模块化的概念,乱用全局变量,程序的可维护性几乎为零。PASCAL这门语言的特点就是严谨,begin和end虽然啰嗦,但结构非常清晰,靠这门语言养成了结构化编程的好习惯。
工作后还曾经用Dephi(在Pascal基础上升级的面向对象的可视化编程语言)写过一个小项目,可惜也没有实际的应用效果。
C
C语言因为性能好,被UNIX、Windows各种机器所支持,所以使用广泛。大学时我们班里没有开这门课,我跑到计数班去听这门课,上机课就混他们的机时。
C语言中指针等概念虽然麻烦,但还是慢慢掌握了。我一开始学语言的动机实际上就是想着写游戏,当时俄罗斯方块正流行,自己也尝试着写一个。有一次,老师在微机课上巡查,发现我正在玩俄罗斯方块,当场对我提出严厉的批评。
我轻轻地按下一个功能键,游戏马上停止,此时显示出一排排的C代码,我正在调试自己写的C程序呢。老师盯着看了看,无语,向其他学生走去。
实际上,自己根本不可能沉迷于自己写的小游戏,而是更关心如何让动画更流畅、代码如何写得更简洁,如何调整难度级别、改进一下记分系统等等。在写游戏的过程中,逼得自己去掌握了编程的语法和算法。
工作后,这门语言的用处还挺大,当时分到物探方法室工作,主要接触UNIX工作站,只有C语言能用也会用,所以就经常帮着师傅们写点小程序,做些上万行数据的统计、格式转换之类的小活,实际上可是帮了他们的大忙。
Visual Basic
Visual Basic可视化式的编程开发开创了一个新的时代,当时用鼠标点点拖拖就可以产生一个Windows程序,这种感觉太美妙了,由于我有以前的BASIC基础,所以学这种语言飞快。
Visual Basic这款产品的兼容性真是没得说,最早的开发环境是在Windows 98上开发的,后来windows升级到2000, xp,windows 7,它仍能运行。
我现在仍在维护的一个用VB写的程序就是瑞士积分编排程序的表格生成器SwissTab,前前后后修改了无数次,至今仍在一些比赛中发挥作用。
CASL
CASL这语言估计很多人没听说过,它并不是一门真正的语言,只是一门考试用的汇编语言。参加工作后,项目并不多,就去报考高级程序员试试,其中有一道大题就是写CASL这种汇编语言。
由于我并非计算机专业毕业,基础知识薄弱,想通过高级程序员还是非常有难度的。第一年我没有通过,来年我把那套高程教材几乎都翻烂了,把所有的练习题都做了一遍,把历年的高程题都试了一遍,从而顺利通过,那时是1996年。就因为这个高级程序员证,还提前2年混到了中级职称。
JAVA
JAVA语言大概是在2000年学的,此时的JAVA语言火得一塌糊涂,“一次编写,到处运行”的理念好像是各个软件项目的救命稻草。本来以为它的优势是桌面端程序,没想到后来服务器程序却变成了它的强项,J2EE/EJB大行其道,写个服务器端程序非要吹出J2EE四个字来。
当前室里几个人组成了一个团队,写出了胜利信息网网站发布系统,2003年上线,一直沿用到了现在。这种跨平台的语言真是节省了大量的工作量,我们的java,JSP程序都在windows端编写、调试,最后的程序部署在unix机器上的weblogic上,非常方便。
此系统被强行交给信息室维护,项目和人员全部解散,以后我再也没有用JAVA做过项目。
C#
这是在项目中应用最多的一门语言,相对其它语言来说,在Windows上开发,学习门槛较低,在国企里能建立起这样一支队伍已属不易。现在带着团队还在完善、推广和维护的系统就是EDSS系统了。
另外用C#写的几个小程序:
- 用C#写的CGM解析程序
- 以前用C#写的一个中国象棋引擎程序
- Eclipse油藏模型解析程序
- SeismicPro地震剖面显示程序
- LDM地震数据体的存储格式分析与应用
- AlphaGo挑战李世石,我的点格棋程序挑战孩子
Haskell
2008年,无意中接触到纯函数式编程语言Haskell。这种语言与以前学的命令式编程(Imperative Programming)完全不是一种思路。Haskell语言是一群数学家发明的,写起来就像一条条公式,欣赏一下这段优美的快速排序代码:
代码语言:javascript复制qsort [] = []
qsort (x:xs) = qsort smaller [x] qsort larger
where
smaller = [ a | a <- xs, a < x ]
larger = [ b | b <- xs, b >= x ]
用一行代码打印100以内的勾股数:
代码语言:javascript复制[(x,y,z) | x<-[1..100], y<-[x..100], z<-[y..100], x*x y*y == z*z]
后来出现的新编程语言很多都借鉴了函数式编程语言中的语法特点,Python中也能写出类似这样的语句。
Objective-C
2011年,苹果APP非常吃香,我也交了99刀的学费体验了一把苹果开发者。历经一年的折磨,踩了无数坑,终于提交了一个小程序XQViewer,当时也不懂什么推广和流量,最终只卖出了几美金,连第二年的开发者证书费用都交不起,更别谈用APP挣钱了。
R
看《大数据时代》和《赤裸裸的统计学》这本书时,又学了一点R语言,这门语言中竟然全部都是向量计算,统计功能强大,我试着用R分析孩子们的考试成绩,短短的代码,立刻可以生成多种直观的分析图表。
我的教训
1)学习新技能时没有目的和计划性,虽然学了10多种编程语言,只有C#算是用得最熟练的,其它的都不精,连最重要的前端JavaScript竟然都没好好学。不管学哪门语言,一定要写一款产品,然后不断打磨它。
2)各种语言实际上主要分为两大体系:过程式(或命令式)、函数式,过程式阵营中掌握JAVA或C#即可,纯函数式的编程语言几乎没有,只要了解Haskell或Lua等的理念即可,实际上现代的编程语言都已经吸收了函数式编程的先进思想。
3)学了一堆语言的一点点好处,就是当遇到一个实际问题时,马上会想到用某种语言解决起来会更加简洁高效。
4)学了十多种语言后,再学其它语言时,只用一、二周就能学完所有语法,比如Python。其实最麻烦的部分是每种语言都带着庞大的类库,这些东西只能通过项目慢慢熟悉。
5)学了这些语言后,现在发现只剩下一个优势了,就是当别人编程遇到障碍时,能够很快发现对方可能的错误,看来我的使命就是辅导别人学编程了。
--- END ---