|
敬惜人工智能平台开发经验谈自08年11月6日动手开发到09年4月初敬惜人工智能平台基本完工,两三万行代码写下来,笔者也从对C#、.Net、贝叶斯网、蚁群算法、分布式处理等等只有些粗浅的书本知识到尝尽其间的酸甜苦辣。 自08年11月6日动手开发到09年4月初敬惜人工智能平台基本完工,两三万行代码写下来,笔者也从对C#、.Net、贝叶斯网、蚁群算法、分布式处理等等只有些粗浅的书本知识到尝尽其间的酸甜苦辣。原说所经历得还是太少,本不足以积累什么经验教训贻笑大方,不过IT的精神就是开放、重用、创新。所以但有所得,小子不敢藏私,还是要尽量总结总结,以和诸君共享。 一.要骄傲得相信自己 IT作为一个重要的产业部门不过三十余年的历史,这么年轻的一个产业能迸发出如此的活力靠得就是创造力。而创造就是要否定现存的,不敢想不敢尝试就只能在别人划定的圈子里打转,没有突破没有创新在IT业内就活不好。但创新太难,又没有什么经验可循、理论指导,所以采取小步试探缓慢前趋的方式来降低风险本是必然。不过在竞争激烈的IT业“速度就是生命”,不可不冒险、不可不激进,面对未知的未来所能倚仗者似乎只有自信或是再加上些理性,而最终还是要骨子里有一种骄傲,不服气。 刚刚开始用蚁群算法编写构造贝叶斯网算法的时候,因为对其理解不够彻底,怎么都出不来,太痛苦啦,每次运行结果出来都是对自己的一次否定!贝叶斯网的构造又需要大量的时间,在期待与恐惧的煎熬中等了几个小时,失败、沮丧、否定,再来!这可才是整个开发的第一步啊,后面还不知道会怎样啊?每天都在不停地重复着这种否定自己的煎熬,能坚持到最后靠的就是这个不服气:我就不信我做不出来!就赌这一口气了。 所以说能不能做成是一回事,敢不敢做是另一回事。放在IT创新这件事情上,两者之间就没有什么关系。因为IT尤其是软件领域本来就是一个主要是智力成本的行业,知识、技能、创意这些东西在信息泛滥的今天根本就没有什么门槛。学习是必要的,但思考尤其是实践中的思考更重要,而勇于创新恰恰就是一个进行大量思考的好机会。 二.对问题的理解决定竞争力 一个程序有八九成的工作是在进行表达,就是把现实世界翻译成计算机能处理的数据以及处理完了再翻译回去、为各种处理进行数据准备、在处理之间进行数据转换、对处理过程进行跟踪记录。 剩下的才是在进行真正的处理,而这些处理中绝大多数又都是很通常的,都是可以从一些通用算法甚至就是通用处理(简单到连算法都算不上)变化出来的。只有极少一部分工作是针对核心问题的,也只有这一部分工作他人是无法根据表面需求推导出来的或是可以替代的,所以也就是这极少一部分的工作决定了整个程序的最终价值。而这部分工作的好坏完全依赖于开发者对核心问题的理解。笔者以前说过: 眼光影响了认识;认识决定了判断; 判断驱动了行为;行为导致了结果。 表达工作是最平常的工作,大部分都可以归纳到对各种数据结构的操作。把这些工作尽量抽象、整理、归纳出来,用基本类库来实现,虽然程序的效率低了些,但逻辑结构会清晰很多(以笔者的实践来看,因为构造贝叶斯网是刚开始做的第一个模块,所以大都是专用的代码,后来慢慢都改成了通用代码,可最后的构造速度反而提高了一倍,这是因为一开始虽然是专用代码但认识不深,所以很多处理很笨拙;而通用代码则随着认识的深入在一遍遍的改进中代码越来越精炼)。对于算法,能用基本算法的就用基本算法,没必要去进行所谓的优化,这部分的技巧没多大价值,想到了就做没想到就算。 一切显式的技巧性的东西都很难或是很难长久的构成竞争力。一个产品是有生命的,这个生命就在于对某些客户需求的独特满足上。这种独特性是创新的结果而不是目的,创新是个根据对问题的理解不断进行权衡、取舍的过程,针对一两个大的目的而得到某个结果是自然的,但刻意的去追求一大堆细致的目的就很难低成本的全部达成,因为目的间存在着很强的约束性冲突,如果能把所有的约束性冲突全部在事先解决掉就不是创新了,这也不需要创新。 三.逻辑思维能力是基础、想象力是关键 计算机不是人脑,它就是一台傻乎乎的机器,也就只会傻笨痴呆的干点加、乘、与或之类的苦力活,可就因为它傻所以你就拗不过它,你就只能按它的方式来。因此我们脑子里必须先要有一台虚拟计算机能把我们的想法都先跑一遍,这个所谓的虚拟计算机就是我们在构思解题方案时的思维方式是不是遵循了形式逻辑,中国人对这个是很缺的,毕竟我们没这个传统。逻辑思维能力的养成需要长时间的训练,对我们中国人可能还要是艰苦的训练,着力点便是在概念上。想测试一下逻辑思维能力的话,就随便找本《离散数学》把每章后面的习题都做一遍,做完还有信心的就再找本《计算理论》试一把。 IT本质上是对人脑的模拟,但对人脑又不能进行大规模的破坏性实验,因此基本上就是空想然后想法验证这么滚动发展出来的。除了极少数关键性的思想之外绝大部分的空想也要靠数学来想,否则就没有可信性与前进方向,要是完全依靠试错的经验积累这成本根本无法接受。没有数学思维就不可能发展出科学,中国的历史已经说得很清楚了。所以,学好数学。 没有想象力创新就不会有空间,没有逻辑思维能力创新就没有手段。 四.原则至高无上,边界么还是要突破的 创新是个无中生有的事情,所以本质上就是一个尝试、探索的过程,就算有参考书也没多大作用,一方面很多细节就是一种感悟,写书的人也没办法准确地描述出来;另一方面IT创新大都是站在技术与应用的前沿,书本上已有的叫做科学,是对现实问题抽象后的归纳与分析,而我们要做的叫做技术,是对具象的现实进行适应与控制,尽信书则为“南辕北辙”。 可惜,虚拟的就是虚拟的,它只能推导些主要的操作环节,细节部分是不可能想清楚的。所以就要及早地定下开发原则以及边界,原则用来规定推导时的大方向,虚拟推导时的原点就是这几个简单的原则;而具体编程时一般是要限制在边界以内,否则一个问题牵扯着另一个问题很快就不知道跑到哪去啦。 对于分布式系统,要实现的第一个功能当然就是邻机保活,由于笔者一开始定下的原则之一是要具备强大的平台管理能力,就很自然的在邻机Hello的过程中添加了一个LSM(本地管理器)的选举算法。选举当然最好是用FSM(有限状态自动机)来做,所以笔者兴致勃勃得做了一个功能强大的FSM出来,然后利用这个FSM来做邻机Hello。哇,很好用啊,逻辑清楚、程序简单,还有完整的记录,这么复杂的状态变迁实现起来都比画状态变迁图还快!得意忘形之余很快就发现不对了:只有3个状态而已,竟然有10个事件、15个状态变迁、12个动作函数!天那!这可是笔者设想的所有功能里最简单的一个啊!后面那些构思精巧、功能强大的模块还不得给我堵墙来画状态变迁图!这能完全想清楚所有的状态变迁而没有遗漏?!经过一番高速运转后,笔者彻底宕机了。 重启后“绕树三匝”,笔者断然决定将整个平台的设计原则改为无状态的分布式决策。所以数据库不能用了,所以竟然需要自己开发一个分布式存储系统出来!现在想想,2月初的那个决定实在够疯狂,可这个疯狂却让笔者把任务调度、安全、通信、存储、消息、用户管理全部自己编了出来,虽然还很粗糙,但毕竟有了继续开发分布式计算平台的基础。 五.目标要时刻牢记在心,手段合用就成 笔者是个理想主义者,所以各种软件工程方法看了一堆,在本次开发之前的知识准备过程中,还特意逐次重温了一遍。不过看到这,相信大家都明白笔者用的开发方法就是所谓“无招胜有招”的“蛮力硬干法”。原因很简单:没经验。现在想想这恐怕更符合中国IT的实际需要,因为所有的软件开发方法论其隐含的前提都是对问题领域要具备相当程度的认识、理解与经验,但这些恰恰不是我们的强项! 我们常说1944年发明了第一台计算机,可大家却经常忽略其中的一个定语:是第一台电子计算机。IBM在20世纪20年代就开始卖继电器式计算机,更早的在18世纪吧(这半年来笔者写程序写得和计算机一样傻笨痴呆啦,连记忆都给执行了LRU算法,所以本文的引用有不准确的地方望谅:实在没时间做文献工作啦),微积分的自动计算尺就发明了。而且在文艺复兴时期,一些自动计算的理论就展开了,布尔代数19世纪、图灵机20世纪30年代、连现在热得发烫的人工智能也是在20世纪50年代就展开了:1955年就有了能赢州冠军的跳棋程序!蚁群算法诞生于20世纪80年代。不必再罗列下去了,这么多已经足够说明我们缺少西方IT巨头们所赖以打遍天下无敌手的依凭:传统! 中国的IT工程师缺少逻辑思维的系统训练、缺少计算数学的熏陶、缺少自动计算的经验传承、更缺少因需求的牵引而对问题领域的实践经验,所以那些依托于这些为底蕴所总结出来的开发方法论不可能适合于我们自己的IT实践!我们还处在一个生吞活剥的快速学习过程中,那些诞生于20、30年前甚至更早的IT思想对我们来说还是闻所未闻,可我们竟然还要和这些IT巨头们投身于同一个市场进行完全的竞争,太不公平啦! 可天下哪有什么完全公平的事情?!来不及完全领悟各种技术思想、来不及完全认识清楚现实的状况、来不及积累足够的经验教训、甚至来不及凑够起码的开发费用,可对手都杀到家里来了,还能管得了那么多吗?!所以对我们来说,“乱拳打死老师傅”就是最好最实用的拳法!大家常说太浮躁,但反过来想浮躁的背后就是激情、就是奋斗、就是力争上游,有什么不好?!关键是如何引导。中国IT最大的优势就是聪明人多,大家乱七八糟的出手,不需要十年就可以把西方积累百余年的知识、经验全部尝试一遍,只要打通共享与合理报酬之间的关隘,与西方IT巨头们在知识与经验方面的壁垒就可被轻易击穿。这或许是将蚁群算法应用到“产业发展”方面的一个思路。 世界总是处在发展变化之中,所以西方IT业在面向对象的基础上提出了接口或说是抽象类的手段来应对变化。很棒的想法,可惜不适用于中国,因为中国的发展速度超越了对认识进行抽象的速度,接口/抽象类能发挥威力乃在于事物的发展如果是比较稳定的,则抽象出来的接口在一段时间内就不需要变化,从而实现了变化的封闭。但中国现在是整个国家都是发生巨变,变化不是局部的、一时的,而是全局的、持续的,因此软件积累的越多包袱就越沉重。 遗憾的是软件最大的溢价就在于重用的积累,那么我们怎么在一个巨变的市场中创造出高的附加值呢?笔者以为我们不能违背IT精神去搞“大而全”,必须遵循IT精神来搞“小而专”:把产业链拉长,在混乱的尝试中诞生一大批只专精于某一特长的小而专的软件公司,用产业链条拉长所形成的专业性与各个环节的多样性(因为理解不同嘛)来形成弹性以适应快速的变化;而应用软件商则转型为咨询服务商,把业务重心转向客户需求的把握、协调与平衡,开发则根据客户需求进行剪裁、组合与衔接,不要沉迷于所谓的“解决方案”,那是削足适履。 不由得想起了看“耗散结构论”时的一些启发:混乱中孕育着秩序,涨落间推动了进化。 六.不要在意什么技术,基础的才重要 技术的变化是以年来计算的,理论的变化是以一代人、两代人的代来计算的,而思想的变化则是以世纪来计算的,至于精神则更为恒久。所以说技术嘛看看就好啦,工具啊用用就熟啦,要想在竞争激烈、发展迅猛的IT业中活下来光靠学技术会被活活累死的!拼命学那些西方IT巨头源源不断推出的各种所谓“新”技术,然后10年后学不动了,自己所积累的经验都渐渐过时了、知识结构老化了,眼看着廉价的新人追上来了,恐惧、茫然、绝望,所以急功近利就成了业界的平常事。中国的聪明人太多了,谁比谁差多少,快成品能有多大用啊? 笔者一开始做贝叶斯网引擎的时候,还是想着要用数据库的,看到正在热捧随着.Net 3.5一起推出的LINQ,因为还要集中精力做引擎,想用吧还有些担心要分出太多的精力,可看到LINQ被吹捧的如此好,那还是看看吧。哦?原来是这么回事啊,08年年初时笔者刚开始用VB.Net时就对ADO很烦:笔者在输入SQL命令时经常输错,这调试起来很麻烦的。郁闷之下就自己编了一个类专门负责封装数据库操作,而LINQ不过就是嵌入到智能编译器中多了个强类型检查罢了。唉,坏了,这LINQ还没法用啊,敬惜人工智能平台是要开放给不同用户使用的,同样的数据需要映射给不同的用户,可强类型就限制了这种灵活的动态映射啊?!笔者有些不甘心,就大致推导了一下MS实现LINQ的可能方案,然后上网找到相应的Schema,总共两个小时就搞定了类到数据表的动态映射。所以笔者实在不相信这样的热门技术能构成多大的竞争力。 没经验有什么可怕的呢?一咬牙、一跺脚,吃点苦头干上一遍,不就有经验了嘛。关键是有知识准备、有学习能力、有逻辑思维能力、有想象力和激情,以及由此而诞生的强大自信吗?!我们做的是产品又不是一锤子的买卖,而产品是可以根据客户需求持续进行改进、进行积累的。 倒不是说经验没有用,在整个开发敬惜人工智能平台的过程中,笔者在两个领域遇到了极大的困难,一是用蚁群算法来构造贝叶斯网,一是编写带流控的组播UDP通信系统,前者因其复杂,后者因其太快,都没办法跟踪,细节部分对不上,这就完全超出了笔者脑袋里的那台计算机的CPU处理能力!笔者没经验没工具,就只能笨人笨办法——当作黑箱来处理:根据错误结果反复进行推导、小幅修改来进行试错。所以两者短短各自几百行的核心算法都耗费了一个星期以上的时间,而文件数超过30、代码量万行上下的分布式存储系统也不过花了两三个星期的时间,这就是没经验的代价。有经验当然好啦,不过没有也不是很可怕。人的潜力是我们自己所无法想象的! 程序员是靠知识吃饭的,热衷于那些学学就会、用用就熟、很快就过时了的东西只能让我们也成为一个很快就会被淘汰的工匠。而对精神、对思想、对原理、对规则的理解与认识程度将最终决定职业生涯的持续性与发展潜力。不要把希望都寄托在什么机会上,竞争是持续的,一时的取巧胜不了一世。 向前看机会无限!不谋万世者不足以谋一时。 结语 敬惜人工智能平台也谈不上太多的创新,基本上都是在重复人家已经有的,不过就是把很多东西自己做出来然后又做了一个整合而已。IT业内的创新大多如此,毕竟西方人想制造一个自动机器的历史从文艺复兴时期就开始了,能想的都想过了,能试的也都试过了。而我们的历史太短、基础太弱,所以不要老想着做一个别人从没做过的,这基本上是不可能的,似曾相识而又别开生面最好。 万世之谋定好了?!那就忘了吧,踏踏实实得去做那些你喜欢做的、高兴做的、想做的、应该做的、必须做的事情!行文至此忽然想起来了小时候父母和师长们天天耳提面命的那句话:世上无难事,只要肯攀登! 责编:田启佳 微信扫一扫实时了解行业动态 微信扫一扫分享本文给好友 著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。 |
热门博文 |
|