旧文重发:剑走偏锋:非主流的程序员

这篇文章发表于《程序员》2007.06期。

引子

在冷兵器时代,大概刀剑算是主流的武器,在军营中,则以长枪、弓箭为主。然而我前两天看了一篇文章,说短棍成为现代实战格斗中的主要武器。回望从前,短棍绝对不会成为主流武器,因为相对于长兵器,他实在难于有什么优势。

同样,我们再回望软件界的从前(我是指国内软件这短短的十几年的历史),我们也会发现,很多东西或从主流变为非主流,又或者从非主流晋升为主流。而我们的开发人员,学完短棍再学长枪,然而多是套路不对,不得不感叹:技术变化太快。最终,我看到很多人退出这个圈子,或者隐于幕后,昔日的辉煌不再。

从整体上来说,国内软件界十年来的变化,大抵是四个方面的:

  • 操作系统的优势逐渐丧失殆尽;
  • 从应用工具的研制,转向工程项目的开发;
  • 从通用产品转向领域产品或定制产品;
  • 从传统桌面应用开发,转向互联网项目的开发。

所以所谓主流,就是跟随着这种整体趋势的开发活动;所谓非主流,要么是落后于趋势,要么就是在整个趋势之外。

用组件是流行,组件化是反流行

在VB出现之前,开发界便已经有了一种组件化的趋势。我96年在北京惠软工作的时候,这个公司有一个欣力量软件工作室,就在雇佣一批开发人员做组件化的编程工具:VisualBuilder,这有for C和for foxpro的两个版本。我随着这个开发组做过约半年的工作,他们的思路,大约是用C或foxpro语言实现一套开发库,可以方便地用在相应的语言环境中;并且提供一个简单的面板,用来实现拖放等界面组织形式。这个产品卖出了许多份拷贝,因为当时做软件还是很有市场的,软件公司也舍得花钱,只是这个VisualBuilder拿回去究竟用了多久我却不知道。——因为后来整个开发团队都没有了,惠软软件公司也没有了。

但是组件化的事并没有结束。组件化的概念给了我很多想法,后来也接触到Delphi 1.0,印象更是深刻。半年后我到了郑州的一家名为经纬的软件公司,我并不满足于做做文档和广告的工作,于是决定做的第一个开发,便是一套名为VIM(Visual Interface Manager)的系统,是一种在Turbo Pascal上实现的可视化界面系统,这成了我进入开发部的一块敲门砖。但后来VIM并没有进一步的发展,因为DOS时代看来已经死了,无论是在C、foxpro上的VisualBuilder,还是Pascal上的VIM,都随DOS时代远去了。

然而又过了一年多,我便听说一家公司在跟我们公司谈一个软件,名为“积木”,是将一个个的组件拖放来去,用来构建大型系统的,但后来公司终于没有买进这个产品。又过了大约两年,我去北京的一个名为思维加速的公司看望老朋友,他们正在做一个名为Just Builder的系统,也是方便做系统中的界面和业务组件可视化编程的。

到现在,我所知道的“积木”这个软件已经不存在了;而Just Builder,据说是思维加速的一个核心产品,但也是在领域软件内推动,而不是通用开发类软件的。

前不久,我在CSDN英雄大会上,又见到对组件开发倾力投入的孙辉先生,他讲到的“七巧板(Tangram)”仍然是一个组件化开发的系统。不过孙辉先生说到把组件抽象成了数学模型,因此对构建系统的理论基础要求也就更高,于是懂得他的想法的人也就更少。在我看来,孙辉先生所讲种种,无非还是强调:把编程过程模型化、组件化,对于行业发展来说是极为重要的方向。

这是当然。因为从90年代中期到现在,大概15年的时间,这个概念从来没有被颠覆过。放在国外,从《人月神话》中的信息来看,组件化的思想大概从20多年前就从理论分析向系统实现过渡了。于是我想,这里一定是出了什么问题:国内做了这么多年的组件化系统的研究,为什么都不能像Delphi VCL、.NET FCL一样的流行起来呢?

我其实想说的是,为什么大家都知道VCL、FCL之类的是主流的开发技术,但在国内去做类似的组件化研究,就变成了非主流呢?

而孙辉先生在组件、模型与抽象方面的研究,是曲高和寡,还是逆流盲行?

反编译从热门到冷门的反思

反编译系统曾经热门一时,这大概也是在DOS时代。因为当时的操作系统都很封闭,大家写软件也很封闭。因此,如果要了解操作系统或者别人的软件是怎么写的,就需要反编译。

我在惠软工作时,公司也有专门的产品组来跟进反编译。不过,当时做的是foxpro的反编译。在这个方向上,我认识一个程序员,而且同事过大约三年。他姓穆,大家叫他老穆。他最初是跟进一个名为unfoxpro项目,后来他自己反编译了一个国外的产品来做参考,便将unfoxpro改成了unfoxall。在那个时代,这个unfoxall是无往不利,一概通吃的。

这个老穆性格很孤僻,虽不易怒,但愤怒时无人能当。他学易的,会占卜,所以是很少见的一种人。他对数据很敏感,能很快地从数据关系中找到格式和模型,而且又对编译系统、操作系统底层非常熟悉,所以是难得的做反编译的人才。

后来,反编译终于没市场了。因为到了java/c#时代,反编译其实变成了跟混淆器作对,纯粹是算法问题,或者在跟解释系统干仗。而且,最重要的是开源盛行,没有什么人急于去反编译一套系统然后读那种似是而非的代码。于是,老穆失业了。

再后来,老穆在一个电力系统的项目中做了将近一年,再也无法忍受数据库系统的枯燥和无味,辞职回了老家,后来在北京、河南、河北等地辗转,我们便从此失去了联系。

现在我再回望反编译软件的来路,其实这些年来老穆都在逆向工程这条非主流的路线上行进着,而且技术上相对封闭、特有,也不太接受新东西。到了开源的时代,背景发生了变化,那些技术变得失去价值时,老穆就再也无法跟进了。

在同样的道路上,这些年来,我看到的还有调试器软件、加解密软件和磁盘工具类软件,这些软件的开发者们,当初都独领一时,而现在大多都找不到了。

这些变化,根结在哪里呢?我们在行进在迷途,不断地得到,又不断地失去。大多数人看到了得到的东西,很少有人在关注那些所失去的。

互联网对工具软件的冲击

互联网兴起之前,可以说是国内工具软件的黄金时代。那个时候也有盗版,但是很多人还是坚信软件公司会给他们提供更多的服务和后续开发,所以工具软件总是还有一席之地的。我在惠软工作时,惠软就有一种“惠软工具箱”,将各种常用工具集成在一起,在95~97年期间,市场非常好。那个时代,大大小小的软件公司,成就了象联邦、赛乐氏这样的软件销售网络。

然而后来,整个市场开始下滑。这其间的原因之一,便是共享软件成为跟随着互联网到来的另一轮浪潮(下一轮则是免费软件,再下一轮则是免费在线服务)。从共享软件时代开始,整个工具软件市场就死掉了。大多数开发人员都看不到工具软件的未来,于是原来做工具的转型做了工程,或者回家卖红薯去了。

当然也有不卖红薯的,这中间又分成两批。一部分做正版软件的开发者们转而做了共享软件,通过国外销售代理从国外用户的口袋里收取授权费(国内市场,就我所知,付费用户只占到几个百分点)。这其中也有一些获益的,我知道就有当年的netants、jetcar/flashget、elib/CyberArticle,这些都属于市场和利益双丰收的共享工具类产品。

我们已经看到了问题,技术的主流与否已经成为次要因素,更主要的因素是营收模式。简而言之,卖拷贝赚不了钱,而卖授权有可能盈利。

但工具软件的技术真的就不值钱了么?不是这样,其中的一个极典型的异数便是3721。其实3721是让很多人大掉眼镜的,因为3721的最核心技术无过于一张对照表,放在桌面系统上,就像附件中的通讯簿一样,是一个不起眼的功能。但当一个工具开发技术与互联网结合起来,当把“查找自己的好友”变成“让网民来查找我的公司”时,一切就发生了变化。3721在技术上其实没有多少的先进之处,其实我所知道的朋友大多只是对3721的市场能力赞誉有加。而整个3721的历史几乎是冷门技术的大集成史,早期他将3721做成浏览器插件时,并没有多少人关注IE plugins;后来尾大不掉的“反反安装技术”差不多是无人问津的;还有将驱动技术变成桌面驻留,几乎是匪夷所思。我的印象中,3721还集成了类似书签、网络加速等这样的工具。在3721开始集成它们的时候,其实它们还默默无名。

互联网为一些冷门技术提供了市场。即使我的IE安装历史几乎变成了与3721持续战争的历史,我也要正言以告:3721其实给大多数的冷门技术提供了遐想的(比较灰暗的)空间。

然而,真的是那些冷门的技术在挣钱,在产生市场价值吗?很多做这些冷门技术的开发人员,要么是卖完了红薯再卖白薯,要么就是走向外挂、浏览器侵入、病毒或类病毒这样的怪圈子。3721并没有成就无数的非主流程序员,也没有在国内产生某种面向非主流的开发思想,事实上3721只是成就了自己。技术在这个过程中,不过是实现了一个(非常顽固的)通讯簿而已。

反病毒的三分天下

我对反病毒软件市场和开发都很熟。我有两年左右的时间在做病毒方面的研究、分析,以及反病毒软件的开发,也有近一年的时间在软件市场中推销反病毒产品。所以根底上来说,我算是比较了解反病毒的。而我也欣喜地看到:反病毒软件是少数几种能与国外抗衡的工具类软件产品之一(其它的有词典、OCR等)。

是什么原因成就了这种局面呢?

大凡知道些历史的IT人员都知道国内的反病毒软件产品出现在1989年,是能够查杀6种病毒的KILL 6.0。第二个有名的反病毒软件就是KV100,出现在1994年。所以从国内计算机应用的早期,我们就已经掌握了反病毒技术。KV100率先提出了“广谱病毒码”的概念,使得对新病毒的反应速度变得非常迅速,也提出了第一个真正意义的查病毒引擎。后来,郑州经纬爆炸性地推出了AV95杀病毒软件,将当时尚停留在200种的反病毒数量,一次性地提高到了7000种。事实上,这些病毒中的绝大多数从来没有在国内出现过。

这其中的秘密,在于经纬公司通过反编译技术得到了一种新的反病毒引擎。事实上,经纬并没有直接使用这种引擎,而是借鉴这种引擎的技术和特性码的技术,实现了一种更新的版本。然而,由于反编译了引擎,事实上也就获得了该引擎所能应对的7000多种病毒的特征资料。后来,经纬公司又开发了病毒识别的虚拟环境(类似于现在的虚拟机),使得复杂的变形病毒和病毒的变种也可以被智能识别出来。

另一个秘密,则来自于金山毒霸。

早在2000年时,没有任何反病毒背景的金山毒霸腾空出世,引起许多人的猜想。后来有网民通过反汇编将金山毒霸使用国外某著名反病毒引擎的证据直接摆上桌面。后来金山公司不得不承认这一事实,并开始反其道而行,变成了“高举双引擎杀毒大旗”。然而三年后,金山公司中止与国外病毒引擎厂商的合作,推出了全新、自主引擎的新版金山毒霸。据说,三年时间,金山公司预期在反病毒引擎及相关技术领域的投入为3亿。

如今,瑞星、江民、金山三分杀毒软件市场,国外软件的渗透缓慢、持久而艰难,其中自主的反病毒引擎是关键之所在。而在另外的一些领域,我们也看到了相应的投入,例如游戏引擎、网络传输引擎和音视频引擎。我们回顾这些技术,发现在较长的时间内,这些技术都是高秘或高端的,研究者少而持续投入极大。围绕这些技术的,大都是一些在相关领域中多年经营的、或不为人知的探索者。

以我所熟知的反病毒领域来说。当年在郑州存在着一个小的技术团体,被IT界称为“郑州帮”。其中周辉、刘杰从93年开始便一直在进行反病毒引擎方面的研究,何公道等三人进入金山公司,主导了引擎技术的研发。其他两人中,一位在业界并不是很活跃,无从得知其近况;另一位则辗转多家公司,现在是某网络公司的总裁。这个小团体中,七人中便有五人在从事反病毒引擎上的、长达十余年的研究。

剑走偏锋

很多人喜欢剑走偏锋、求其险势,这其中也包括我。事实上上面这些故事,我大多亲历;相关的技术,我也大多研究过。所以曾经那些并不怎么主流的技术,我其实都多少有所涉猎。

回顾所来,我发现其实如前面所讲的,主流与非主流其实并不矛盾,只是形式上在变化着。问题在于,开发人员所追求的目标是什么:如果目标在于解决生计问题,那么非主流自然不是首选;如果有长远的规划,那么主流的也可能并不是持久之选。

抛开这种理性的、为生存计的选择来谈。选择非主流的问题又在哪里呢?上面的故事中:

  1. 从组件的故事中,我们注意到国内行业主体上是使用技术而不关注技术产生,因此对新技术的持续投入成了“非主流”。从传统行业的经验来看,这是一种短视的行为,因此技术持续投入其实是一种“暗潜的主流”,它本身便存有“从非主流变为主流”的趋势。
  2. 从反编译的故事中,我们看到某些技术的确将会随着应用环境而渐变为非主流。开发人员要么认清局面、适应变化,要么就被淘汰。这种淘汰不是技术本身所决定的,所淘汰的也并非技术(谁能说再过十年编译、反编译技术是否会卷土重来呢)。这其间,开发者的适应能力起到了决定作用。
  3. 从3721的故事中,我们看到技术在大环境变化下仍然存在活力。问题从“技术优劣”变成了市场能力的高下之别。就如同ICQ与OICQ,(在早期,)其实是市场行为而非技术优劣使得后者将前者挤出市场。一些简单的技术与创意、与平台的结合就会产生奇特的价值,例如百度输入法。
  4. 从引擎技术中我们看到,基础研究是长期、持续而孤寂的。身处其间的大多数人被认为是深研某种冷门技术的偏执狂。然而这种看起来“非主流”的程序员,却对整个行业的推动极大。他们平衡了IT行业中某个、某些领域的国内外技术差距,事实上也是行业技术的引导者。

所以不必在乎一个技术流行与否,纯以技术而论,只要你没有生计的压力,做出怎样的选择都是可以的。只要十年如一日的持续研究,平衡了心态,放开了眼光,仍然会有无限长远的未来,也有无可限度的机会。大多数人的问题,是盲目于主流、非主流的变化与跟随,浅尝而止终无所成;另一部分人则沉迷于单一技术而忽视其它,把技术与市场割裂开,把技术与产品割裂开,最终是技术再好也没能对行业构成影响,空耗了一身技艺。

对于前者,我建议持之以衡,求其深研;对于后者,我建议多投入实践,并多历练一些角色,或者寻求合作,以互增补。如此一来,剑走偏锋也有了其它力量的助益,(所谓的)非主流也可从主流中得到新思想。