http://blog.sina.com.cn/s/blog_52eb74050102wem7.html
我已有十好几年没正拉八经地编程了,现在主要做的是大数据(Big Data)和商业情报(BI)。所谓大数据和商业情报,简单说,就是将海量数据(千兆、百万兆)采集来,经过整理、分析和计算,发现有用的资讯,提供给企管,客服乃至未来决策规划作参考。这项工作带研究性,使用的都是业内通用的成套设备,但空闲时,若工作需要,我还会重操旧业,编些小程序和小应用软件,作辅助工具之用。多年前我编的一些小东西,至今仍被单位使用着,可能得等到主人退休时,才一同离去吧。
我学编程,时间较早,那时候个人电脑刚刚流行,互联网概念虽已有了,但远未成熟,一切都在起步阶段,所以软件工程师们有许多用武之地。只要你足够聪明和有想象力,就可把现实世界的许多东西,如事物,事件,操作和工作流程等,模拟到计算机的虚拟空间去加以调控、管理。因此编程,一言以蔽之,就是把自己看到的,甚或想到的世界,在电脑上呈现出来,运行起来。
编程工具是计算机语言。最基础的叫集成代码,即0101的机器语言。直接用机器语言编程,不够方便,也不易学习。我们知道,在大千世界里,除了物,事件和过程都是由各种各样的逻辑关系组成的,其中最基本的有因果关系,层递关系,时序关系和条件关系等,譬如哪个条件下将产生怎样的结果(If..then..),什么情况下应采取怎样的行动(While..do..),多大范围内可实现预期目标(For 1 to 10..excute..)等,用机器语言去表达,不仅困难,而且写出的程序也不大好懂,某人写的程序,换一个人,即使内行,通读一遍都费劲儿,更甭提修改了。
于是乎,计算机精英们想,能不能用一种比较通俗易懂,如英语一般的语言,象作家写小说一样来编程呢?程序写好后,再用编译器把它们转换成机器语言,交电脑执行不就完了么?这个创意是革命性的,其结果就是催生了许许多多句法和语法各不相同的“高级”语言,如Pascal,Fortran,Cobol,Lisp和C等。那些语言之所以“高级” ,就在于易学好懂。只要你逻辑能力强,掌握它们并不困难。我,一名前文科生,能转行干编程,即为明证。
上述计算机语言,我分别学过用过。它们互有长短,应用于处理不同类型的数据,象Cobol擅长商业文件的处理,而Lisp则多被用来编制人工智能的软件等,细节在此不表了,因为与本文主题关系不大。现在我们都可看到,互联网已俨然成了人类的第二世界,互联网+也变成强大生产力,虚拟经济正以超乎寻常的速度与规模,改变并影响着人类的生活方式和品质,这一切都是由网络工程师们一笔一笔构建起来,在键盘上一下一下敲打出来的。人类使用计算机,不仅开创了新世界,同时也提高了自身的认识能力、视野和思维方式。在这个改变历史的进程中,我自认为有一份辛劳,虽然贡献微薄,不足为道,却颇引以为豪的。
还是回到编程语言上来,看它们如何一步步成长起来的。在C语言问世之前的各种语言,行内管它们叫“步骤性”语言(Procedural Language)。所谓“步骤性”语言的特点是,重事件的线性过程,却不重视可能发生的变化;重步骤的前后连系,而忽略步骤的替代性和可置换性。
举例来说,编一个“张三坐车上班”的程序:张三从家中出发步行到车站,搭1路车去某中转站,再换2路车到公司门口。程序看似简单,仅涉及一个人,两部车,外加一个出发点和一个终点,按前后顺序一步步写下来就行了。但如果某天1路车误点或因故取消了怎么办?张三为了不迟到,改坐3路到离公司稍远的站下车,然后步行若干时间到目的地。这样一来,原来编好的程序就没用了,或者需要修改和加上可能遇到的变化。倘若变化有百个千个,又怎么办?你都一个个往上加吗?显然不可能,也不是好办法。况且编好的程序,多一次修改,就多一个出错机会,为杜绝出错,只好增加测试。改写和测试,必然耗时费力,达不到“多快好省”的目的——用电脑不就为了“多快好省”,否则要它干嘛使呢?!
C语言的产生,在一定程度上解决了这个“计划赶不上变化”的问题,因为它可以把相似事件或步骤写成可置换并可共享的“模块”(Module)。比如坐公车可看作一个模块,不管你坐哪路车,只需写出一个程序来,即可服务于各条线路的车。如遇情况变化,只需给模块一个指令,张三便跳上最快到站的车,选择即时快速的出行路线。程序员不必为每辆车和每条线路写百行千行代码,因为坐公车的性质和方式都是共通的,只是线路编号不同罢了,因此代码可以兼容。用“模块”方法写出的程序,既灵活应付突发情况,也节省改写或增删代码所花费的时间与人力,一举两得。再放大来看,坐公车仅是个小模块,而“张三坐车上班”的整个程序亦可看作大模块,这个大模块既可给张三用,也能给李四和王五麻子用,犯不着为每个人各写一套程序。这就是“模块化”语言(Modular Language)带来的好处,其优越性不言而喻,别的语言跟着效仿,加上“模块化”的功能,从而大大简化了电脑程序。
但“模块化”的编程方式并未从根本上解决问题。我们很容易看到,无论“步骤性”语言,还是“模块化”语言,都只是把世界看成直线平面的,程序只有一个维度:时间,按这个单向维度编出的程序,不足以描绘真实世界的全貌。受上世纪八、九十年代数据库从数据储存场发展到关系型数据库,进而多维数据库的启发,计算机语言也开始转变思想,进一步改革语言,让它变得灵活、立体,容易建构和适用性强,于是“类”(Class)的概念就出现了。
“类”的观念是把同类事物整合到一起,将数据、功能和行为方法捆绑起来,限制其使用权限,增加变通性。比如我们可把车看成一个类,在这个类里不仅有公交车,还包括轻轨、地铁和出租车等,它们服务于同一目的:交通。再把公交车,轻轨、地铁和出租车也分别看作一个个类,它们是车的子类。子类“继承”母类共性,同时又保留自己的独立性。如遇必要,独立性可“覆盖”母类的虚拟行为,按自己特点行事。每个类还建有接收与处理不同数据类型的“窗口”(interfaces),那样,整个世界就变成不同类,大类与小类,母类与子类,以及子类之间交互运动和作用的多维组合体了,编程重点也因此从单纯写作转移到构思设计上来,强调代码的简短、灵活和多态性。在这种思想指导下诞生的语言便是著名的C++和Java。
我曾用C++和Java写过大量程序,果然好用。西人把这种语言命名为Object Oriented language,国内翻译为“面向对象的计算机语言”,我觉得不准确,应该叫“以客体为导向的”,或者叫“客体化的”计算机语言,因为任何语言都是“面向对象”的,没有对象,何以在电脑世界里重现它们呢?问题核心在于把对象看成什么,看成静止机械被动的点、线、面呢,还是一个个独立、能动和变化的客体,从而在根本上转变编程的世界观和方法论。类-客体成为构成对象世界的基本元素,编程也从单维时间变量拓展到时空双维上来。还有,因为类和类之间相对独立,修改某个类的内容,只要接口不变,不会影响跟其它类的互动关系,乃至整个程序的运作,所以较好地解决了程序修改的难题。即使修改,也仅是局部和个别的,不会牵动全局,除非整个软件需要重新设计。
至此,发展到C++和Java,可以说计算机语言基本成熟了。后来出现的C#和.NET框架等,我没学过,据说是在“客体化语言”基础上,进一步完善和提高而已,核心思想没有变。C#和.NET后来成为建构互联网的便捷而有力的武器,因为我转行干别的去了,没在编程领域里继续发展,所以对它们了解不多,说不出什么来。
但我相信,随着现代计算技术和材料的突飞猛进,特别是到了量子计算机时代,编程语言可能还会有一场革命,那时不仅互联网有更大发展,而且人工智能的研究也将大踏步前进,并以各种方式影响人类生活的方方面面,目前无人驾驶汽车的发明就是马上可以看到的科技成果。近日阿尔法狗与韩国围棋高手的对弈,也引起了广泛关注,机器终于可以与人的智力一较高下了。阿尔法狗具有计算能力强,速度快,精度高,且不受情绪影响的优点,所以连胜三局。第四局,李世石的一着奇招,超出机器所掌握的数据储存和样本经验,阿尔法狗应对失据,输掉了。但最后一局它没让韩国选手继续呈能,可见机器人的数据库量足够庞大(据说可装下三千万个光盘),而人的奇招毕竟有限,难逃天网。有朝一日,阿尔法狗进一步掌握了人所有的直觉力和即时应变能力,人还能指望战胜机器吗?我看那日子不会太久。阿尔法狗是机器人,但不是普通的机器人,而是有灵魂的机器人。这个灵魂就是它的程序软件,编程员给机器装上灵魂,战胜人类,创造力有多伟大啊!
阿尔法狗使用两个“神经网络”(Neural Network):策略和价值,在对弈的每一步,把未来各种变化建成一棵无限伸展的“蒙特卡罗树”,从中搜索出胜算更高,而非着眼于眼前利益的步法。由于人类棋手难以在有限时间内算出百步以外的结果,所以根据大量参数变量,快速运算,稳健选择,是机器人克敌制胜的不二法宝。这种神经网络方法,我在上世纪九十年代中期为一家人工智能公司工作时,也曾用过,我们采用的是美国一位物理学家进行热核聚变的计算方法。
计算机和人工智能的潘多拉魔盒一经打开,就别想再捂起来了,世界迟早会发生翻天覆地的变化,抱怨世风日下人心不古,是杞人忧天,担心机器会摧毁人类,更是幼稚可笑的。生活在这个飞速发展的科技世界里,变是绝对的,而不变是相对的,人类需对自己有信心,无论怎么变,最后总会朝好的方向发展。正如Alphabet公司董事长埃里克•施密特先生在这次人机大战的启动仪式上所说:“无论最终结果是什么,赢家都是人类。”我们无需顾虑,应该勇敢地站在时代最前沿,迎接变化,与时俱进地引导和推动发展,为人类造福。
这是我一个即将退休的老科技工作者的浅薄之言。吾虽老迈,但对新生事物和新的挑战还是抱开放态度的。