被误解的C++——蚂蚁

longshanks 2007-10-11 09:23:14
蚂蚁
哪种动物最强大?可能每个人的答案都不同。我的答案是蚂蚁。没错,小小的蚂蚁。
一个蚂蚁是渺小的,脆弱的。然而,一群蚂蚁却是非常强大的。它们能够杀死并吞噬遇到的任何生物,包括人类。这并不仅仅是由于它们数量众多。更重要的,是它们的组织。在所有的动物中,蚂蚁的组织是最严密,最高效的。使得蚂蚁在任何一个领域都成为了领先者。蚂蚁是最优秀的猎手、最优秀的采集者、最优秀的牧民、最优秀的种植者,最优秀的建筑师、最优秀的旅行家,以及最优秀的战士。
蜜蜂、胡蜂等动物,也是群居的,和蚂蚁一同被称为社会昆虫。但它们的能力和工作效率却远不及蚂蚁。个中原因并不复杂,关键在于分工协作。蚁群中的分工和协作的复杂程度令人乍舌。仅次于人类的社会。但人类由于个体观念太强,无法达到蚂蚁的严密和效率。
作为一般常识,我们知道蚂蚁大致分为蚁后、雄蚁、工蚁和兵蚁。而蚁群中绝大部分是工蚁和兵蚁。工艺负责生产和劳动,兵蚁负责安全防卫,有时也会凭着强大的体力,干一些重活。在此基础上,工蚁还有更细的分工,有些工蚁可能一辈子没有离开过巢穴,永远在暗无天日的地下工作着。有的负责育婴、有的负责种植、有的负责清洁、有的负责建筑、有的负责运送食物,有的甚至成为专职的“粮仓”(蜜蚁)。

作为高度组织性的生产活动,软件开发可以从分工和协作中获得非常大的益处。这一点毋庸置疑。而C++的在软件开发中的运用,则可以从蚂蚁的分工协作中获得更多启示。
对于蚂蚁而言,很多工作都是高难度的。比如,生产菌类(也就是种蘑菇)。需要蚂蚁们从树上切下树叶,搬运至储藏室,撒播菌种,控制环境,收获菌类等等。这种复杂的工作,对于高智能的人类也不是一件简单的事。需要非常好的组织和协调。(蚂蚁种蘑菇,不是种一两个,而是相当于人类大规模生产汽车那样)。
同样,用C++开发大型软件、或系列软件,也是一件非常复杂的事。相对其他语言,比如java、c#,C++功能更强大,但使用起来很困难。主要由于C++对人员培训的要求甚高,有时会超出企业的承受能力。为此,很多企业放弃C++,直接使用java、c#开发应用。然而,对于高层面的应用开发,即业务翻译,java、C#很适合,但对于涉及到大量公共服务组件的基础性开发,这些语言无论从开发效率,还是从运行性能,都无法达到最优。(请注意,我们不是在谈论做出软件,我们要求以最高效的方式做好软件。在很多基础性的服务组件中,语言的抽象能力远比易用性来的重要)。
对于一个长期发展,并且拥有宽广、但又联系密切的软件企业而言,基础性的服务平台和组件,会产生事半功倍的效果。但这类企业中,很多出于眼前利益,或技术视野的局限,没有发展企业级的平台或库,所有软件都从头做起。这种“积极”的重复劳动行为,对于企业的利润,是空前的灾难。
对于这类企业,C++是很好的选择,或许是最好的。(我不应该说“最好的”,C++毕竟不是一种完美的语言,只是目前还没有真正的替代者。D语言是一个不错的候选者,但尚在发展,目前还看不出明显的优势。况且C++本身也在不断地进化中)。C++在基础性开发上,拥有无以伦比的优势。当然啦,首先要能够发挥这些优势。这就比较麻烦了。因为市面上好的C++程序员并不多。一个普通企业要找那么几十上百的C++熟手或高手,还真不容易。
这时候,我们就得学学蚂蚁了。
如果仔细地分析企业中个软件的特性,会发现整个软件体系可以通过一个倒三角的图形来描述。最底下的是服务组件,最上面的是应用软件。服务组件提供基本的服务功能,而上层的应用软件,则是组装这些服务组件。
这是个好消息。因为服务组件通常需要处理一类问题,对抽象的要求很高。但却是以一当百的,一个组件会给很多软件用。所以,服务组件的开发工作量会相对小一些,但对开发人员的分析、设计,以及编码能力有很高的要求。这种人在程序员中,虽然谈不上凤毛麟角,也算是难得之才。好在基础组件通用性强,可以由少数高手领导一些C++熟手统一开发。而企业也无需从利润中挖出一大块肥肉,来养活一大群专家。
在倒三角的另一头,主要执行的是业务翻译成程序的工作。这方面,对编程能力的要求相对较低,而对业务知识和经验的要求很高。(这些人有时也被称为“实施人员”或“顾问”)。所以,这群人同基础开发人员正好是互补关系。这样就形成了分工和协作。
进一步,底层和高层的开发人员可以继续细分:擅长算法的高数据处理;擅长抽象的,搞构架设计;学过财务的,搞帐务系统;了解物流的,负责仓储系统;一专多能的,当消防队员;…。
这么一个复杂的软件开发组织结构,管理起来着实是个挑战。让我们再到蚂蚁那里汲取些灵感。
很明显,蚂蚁是非常简单的动物。同人类相比,根本算不上有智能。它们共同完成一项复杂的工作,并非依靠他们各自的聪明才智。蚂蚁完全靠本能行事。(也可以说上帝为他们编的程序)。每一只蚂蚁的“程序”非常简单。但这些简单的行为组合起来,却能完成高智能生物才能完成的工作。(想象一下,如果高级生物,甚至人,也像蚂蚁那样严密组织,会是什么样的景象啊)。
这样,从理论上而言,软件开发中的个体,也只需按照既定的程序执行,便可以很好地组织起来。这种程序就是所谓的“过程”。(了解CMM的人,对这个词恐怕不会陌生吧。而做过CMM的人对这个词,恐怕深有感触吧)。
但这只是理论上的,程序员毕竟不是蚂蚁。程序员有七情六欲,也就很难达到蚂蚁那样的严密组织。但是,严格细致的管理过程还是非常有用的,尽管有时无法彻底贯彻。有总比没有的强。
现在回过来看看如何使用C++。C++的高级运用的确令人耳目一新,有时短短的十几、二十行代码,可以替代其他语言中的几百上千行;一个组件或算法一经开发,便可以用于所有的类型。但是,能把C++玩到这种程度的人,少说也需要4、5年的严格训练,而且还必须是正宗的C++训练。更何况还有抽象分析和设计能力的磨练。此非一日之功。
就因为这样的人少,所以应当把他们放在关键的领域中,开发高价值的组件。而这些人开发出来的组件,则可以为其他人所用。
但是,这里还有一些麻烦。C++不是一种容易学的语言。即便是最基本的使用,比如使用现成的容器和算法做一个排序,也比其他语言来的长些(当然也就长那么一点点)。毕竟他们需要熟悉更多的基本概念和技能。而且还要防止他们过早涉足C++那些危险的机制。
既然先前已经在高层编程的程序员描述成精通业务、粗通编程的人,那么让他们再去学习C++,未免有些残忍。因此,在这一层面,C++是最不适合的语言。在这里,需要的是一种非常简单、直白,无需复杂机制的“胶水语言”。尽管java和c#已经广泛应用于这个层面的软件开发,但是从对高层开发人员的要求来看,还是过于复杂。Java和C#是介于“胶水语言”和基础语言之间的语言,可以单独开发一整个应用软件。
但是,我们前面说了,我们要学习蚂蚁,搞分工协作。而底层的服务组件由C++实现更合适,再把Java和C#用在高层开发,似乎显得浪费。不仅仅是语言的浪费,也是开发人员精力的浪费。
我们需要的是更简单的语言。这使得我们把目光投向了一些脚本语言,诸如Ruby、Python、PHP、各类浏览器script,甚至xslt,都可以作为考虑的对象。这些语言非常简单、易学,(比Java更易学)。一般人,即便不懂编程,稍加培训也能掌握。这就非常适合那些“编程半文盲”的业务专家。这些语言通常都很直白,使用者可以很自然地将业务中的过程和要素翻译成代码,无需复杂的逻辑分析。其中,Python已经在google得到很成功的应用。
从效益的角度讲,一种语言通吃所有层面的开发,已经不适合了。C++有能力通吃,但很不划算。不同层面有不同层面的应用特点,而不同语言适合不同的开发。只有把它们定位在各自适合领域,并使他们相互协作,优势互补,方能发挥最大的效益。
除了脚本语言,新兴的DSL(Domain Specific Language)也是一种可能的发展方向。DSL面向特定领域设计,语法和使用上非常接近该领域的自然概念和操作,对于业务开发人员非常适合。而且DSL可以在一种“宿主”语言上构造,在C++ Template Metaprogramming一书的最后两章里,便描述了如何利用C++的机制,构造一种DSL。(当然啦,C++不是为DSL设计的,能做DSL完全是个“意外”。所以,做出来的DSL限制很大,而且语法别扭、丑陋)。
如果可以在一种宿主语言上构造DSL,那么一个企业便可以面向自身的业务领域开发相应的DSL。相比脚本语言,DSL更紧凑,也更直接。目前而言,DSL还只是处于萌芽状态,未来如何发展还不得而知,但不失为一种很好的选择。在这里,对此有过一些简单的讨论。更多的,就得google了。
但是,从另一个角度来看,单纯使用C++一种语言,也存在一定的优势。在使用两种语言的情况下,我们无法要求高端语言能够充分地利用C++所提供的机制。比如C++可以利用模板开发泛型算法和泛型组件。但是,其他的语言却无法直接使用。必须要求C++将其转换成具体类型,比如类或函数等。这不利于开发效率的提高。
对于这个问题,或许有一种方法可以解决,就是搞语言族。就像自动步枪族一样,在一个基础步枪型上,通过更换少量部件,发展出班用机枪、狙击步枪、卡宾枪,和冲锋枪。语言族则可以在一个共同的语法基础和编程模型上,设计不同的语言。包括用于底层开发的,和面向不同应用的高层语言。底层语言功能强大,学习使用较难;高层语言功能简单,学习使用却很方便。两者具有相同的基础,很容易交互。各展所长,优势互补。比如,高层语言不能创建,只能使用模板,模板由底层语言提供。底层语言相当于库开发者,而高层语言则是库使用者。由于无法玩弄那些有用的,但复杂的,甚至危险的语言特性,高层语言会简单容易得多。

自然界的生物经过了几十亿年的发展(几十亿年的设计),有很多东西值得我们学习和借鉴。所以,就有了仿生学这门学科。过去,人们更注重对生物的实体上的仿生。但现在,我们将更多的注意力投向那些非物质的东西。蚂蚁的严密和高效的社会组织,为我们提供了很好的样板。现在所剩下的,就是如何理解并运用这些信息了。
...全文
197 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liwei84516 2007-10-11
  • 打赏
  • 举报
回复
收藏了.认真看
iambic 2007-10-11
  • 打赏
  • 举报
回复
占位。
0412Rainbow 2007-10-11
  • 打赏
  • 举报
回复
好文~
ckt 2007-10-11
  • 打赏
  • 举报
回复
又见longshanks

学习
ouyh12345 2007-10-11
  • 打赏
  • 举报
回复
学习

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧