被误解的C++——蚂蚁

原创 2007年10月11日 09:15:00

蚂蚁

哪种动物最强大?可能每个人的答案都不同。我的答案是蚂蚁。没错,小小的蚂蚁。

一个蚂蚁是渺小的,脆弱的。然而,一群蚂蚁却是非常强大的。它们能够杀死并吞噬遇到的任何生物,包括人类。这并不仅仅是由于它们数量众多。更重要的,是它们的组织。在所有的动物中,蚂蚁的组织是最严密,最高效的。使得蚂蚁在任何一个领域都成为了领先者。蚂蚁是最优秀的猎手、最优秀的采集者、最优秀的牧民、最优秀的种植者,最优秀的建筑师、最优秀的旅行家,以及最优秀的战士。

蜜蜂、胡蜂等动物,也是群居的,和蚂蚁一同被称为社会昆虫。但它们的能力和工作效率却远不及蚂蚁。个中原因并不复杂,关键在于分工协作。蚁群中的分工和协作的复杂程度令人乍舌。仅次于人类的社会。但人类由于个体观念太强,无法达到蚂蚁的严密和效率。

作为一般常识,我们知道蚂蚁大致分为蚁后、雄蚁、工蚁和兵蚁。而蚁群中绝大部分是工蚁和兵蚁。工艺负责生产和劳动,兵蚁负责安全防卫,有时也会凭着强大的体力,干一些重活。在此基础上,工蚁还有更细的分工,有些工蚁可能一辈子没有离开过巢穴,永远在暗无天日的地下工作着。有的负责育婴、有的负责种植、有的负责清洁、有的负责建筑、有的负责运送食物,有的甚至成为专职的“粮仓”(蜜蚁)。

 

作为高度组织性的生产活动,软件开发可以从分工和协作中获得非常大的益处。这一点毋庸置疑。而C++的在软件开发中的运用,则可以从蚂蚁的分工协作中获得更多启示。

对于蚂蚁而言,很多工作都是高难度的。比如,生产菌类(也就是种蘑菇)。需要蚂蚁们从树上切下树叶,搬运至储藏室,撒播菌种,控制环境,收获菌类等等。这种复杂的工作,对于高智能的人类也不是一件简单的事。需要非常好的组织和协调。(蚂蚁种蘑菇,不是种一两个,而是相当于人类大规模生产汽车那样)。

同样,用C++开发大型软件、或系列软件,也是一件非常复杂的事。相对其他语言,比如javac#C++功能更强大,但使用起来很困难。主要由于C++对人员培训的要求甚高,有时会超出企业的承受能力。为此,很多企业放弃C++,直接使用javac#开发应用。然而,对于高层面的应用开发,即业务翻译,javaC#很适合,但对于涉及到大量公共服务组件的基础性开发,这些语言无论从开发效率,还是从运行性能,都无法达到最优。(请注意,我们不是在谈论做出软件,我们要求以最高效的方式做好软件。在很多基础性的服务组件中,语言的抽象能力远比易用性来的重要)。

对于一个长期发展,并且拥有宽广、但又联系密切的软件企业而言,基础性的服务平台和组件,会产生事半功倍的效果。但这类企业中,很多出于眼前利益,或技术视野的局限,没有发展企业级的平台或库,所有软件都从头做起。这种“积极”的重复劳动行为,对于企业的利润,是空前的灾难。

对于这类企业,C++是很好的选择,或许是最好的。(我不应该说“最好的”,C++毕竟不是一种完美的语言,只是目前还没有真正的替代者。D语言是一个不错的候选者,但尚在发展,目前还看不出明显的优势。况且C++本身也在不断地进化中)。C++在基础性开发上,拥有无以伦比的优势。当然啦,首先要能够发挥这些优势。这就比较麻烦了。因为市面上好的C++程序员并不多。一个普通企业要找那么几十上百的C++熟手或高手,还真不容易。

这时候,我们就得学学蚂蚁了。

如果仔细地分析企业中个软件的特性,会发现整个软件体系可以通过一个倒三角的图形来描述。最底下的是服务组件,最上面的是应用软件。服务组件提供基本的服务功能,而上层的应用软件,则是组装这些服务组件。

这是个好消息。因为服务组件通常需要处理一类问题,对抽象的要求很高。但却是以一当百的,一个组件会给很多软件用。所以,服务组件的开发工作量会相对小一些,但对开发人员的分析、设计,以及编码能力有很高的要求。这种人在程序员中,虽然谈不上凤毛麟角,也算是难得之才。好在基础组件通用性强,可以由少数高手领导一些C++熟手统一开发。而企业也无需从利润中挖出一大块肥肉,来养活一大群专家。

在倒三角的另一头,主要执行的是业务翻译成程序的工作。这方面,对编程能力的要求相对较低,而对业务知识和经验的要求很高。(这些人有时也被称为“实施人员”或“顾问”)。所以,这群人同基础开发人员正好是互补关系。这样就形成了分工和协作。

进一步,底层和高层的开发人员可以继续细分:擅长算法的高数据处理;擅长抽象的,搞构架设计;学过财务的,搞帐务系统;了解物流的,负责仓储系统;一专多能的,当消防队员;

这么一个复杂的软件开发组织结构,管理起来着实是个挑战。让我们再到蚂蚁那里汲取些灵感。

很明显,蚂蚁是非常简单的动物。同人类相比,根本算不上有智能。它们共同完成一项复杂的工作,并非依靠他们各自的聪明才智。蚂蚁完全靠本能行事。(也可以说上帝为他们编的程序)。每一只蚂蚁的“程序”非常简单。但这些简单的行为组合起来,却能完成高智能生物才能完成的工作。(想象一下,如果高级生物,甚至人,也像蚂蚁那样严密组织,会是什么样的景象啊)。

这样,从理论上而言,软件开发中的个体,也只需按照既定的程序执行,便可以很好地组织起来。这种程序就是所谓的“过程”。(了解CMM的人,对这个词恐怕不会陌生吧。而做过CMM的人对这个词,恐怕深有感触吧)。

但这只是理论上的,程序员毕竟不是蚂蚁。程序员有七情六欲,也就很难达到蚂蚁那样的严密组织。但是,严格细致的管理过程还是非常有用的,尽管有时无法彻底贯彻。有总比没有的强。

现在回过来看看如何使用C++C++的高级运用的确令人耳目一新,有时短短的十几、二十行代码,可以替代其他语言中的几百上千行;一个组件或算法一经开发,便可以用于所有的类型。但是,能把C++玩到这种程度的人,少说也需要45年的严格训练,而且还必须是正宗的C++训练。更何况还有抽象分析和设计能力的磨练。此非一日之功。

就因为这样的人少,所以应当把他们放在关键的领域中,开发高价值的组件。而这些人开发出来的组件,则可以为其他人所用。

但是,这里还有一些麻烦。C++不是一种容易学的语言。即便是最基本的使用,比如使用现成的容器和算法做一个排序,也比其他语言来的长些(当然也就长那么一点点)。毕竟他们需要熟悉更多的基本概念和技能。而且还要防止他们过早涉足C++那些危险的机制。

既然先前已经在高层编程的程序员描述成精通业务、粗通编程的人,那么让他们再去学习C++,未免有些残忍。因此,在这一层面,C++是最不适合的语言。在这里,需要的是一种非常简单、直白,无需复杂机制的“胶水语言”。尽管javac#已经广泛应用于这个层面的软件开发,但是从对高层开发人员的要求来看,还是过于复杂。JavaC#是介于“胶水语言”和基础语言之间的语言,可以单独开发一整个应用软件。

但是,我们前面说了,我们要学习蚂蚁,搞分工协作。而底层的服务组件由C++实现更合适,再把JavaC#用在高层开发,似乎显得浪费。不仅仅是语言的浪费,也是开发人员精力的浪费。

我们需要的是更简单的语言。这使得我们把目光投向了一些脚本语言,诸如RubyPythonPHP、各类浏览器script,甚至xslt,都可以作为考虑的对象。这些语言非常简单、易学,(比Java更易学)。一般人,即便不懂编程,稍加培训也能掌握。这就非常适合那些“编程半文盲”的业务专家。这些语言通常都很直白,使用者可以很自然地将业务中的过程和要素翻译成代码,无需复杂的逻辑分析。其中,Python已经在google得到很成功的应用。

从效益的角度讲,一种语言通吃所有层面的开发,已经不适合了。C++有能力通吃,但很不划算。不同层面有不同层面的应用特点,而不同语言适合不同的开发。只有把它们定位在各自适合领域,并使他们相互协作,优势互补,方能发挥最大的效益。

除了脚本语言,新兴的DSLDomain Specific Language)也是一种可能的发展方向。DSL面向特定领域设计,语法和使用上非常接近该领域的自然概念和操作,对于业务开发人员非常适合。而且DSL可以在一种“宿主”语言上构造,在C++ Template Metaprogramming一书的最后两章里,便描述了如何利用C++的机制,构造一种DSL。(当然啦,C++不是为DSL设计的,能做DSL完全是个“意外”。所以,做出来的DSL限制很大,而且语法别扭、丑陋)。

如果可以在一种宿主语言上构造DSL,那么一个企业便可以面向自身的业务领域开发相应的DSL。相比脚本语言,DSL更紧凑,也更直接。目前而言,DSL还只是处于萌芽状态,未来如何发展还不得而知,但不失为一种很好的选择。在这里,对此有过一些简单的讨论。更多的,就得google了。

但是,从另一个角度来看,单纯使用C++一种语言,也存在一定的优势。在使用两种语言的情况下,我们无法要求高端语言能够充分地利用C++所提供的机制。比如C++可以利用模板开发泛型算法和泛型组件。但是,其他的语言却无法直接使用。必须要求C++将其转换成具体类型,比如类或函数等。这不利于开发效率的提高。

对于这个问题,或许有一种方法可以解决,就是搞语言族。就像自动步枪族一样,在一个基础步枪型上,通过更换少量部件,发展出班用机枪、狙击步枪、卡宾枪,和冲锋枪。语言族则可以在一个共同的语法基础和编程模型上,设计不同的语言。包括用于底层开发的,和面向不同应用的高层语言。底层语言功能强大,学习使用较难;高层语言功能简单,学习使用却很方便。两者具有相同的基础,很容易交互。各展所长,优势互补。比如,高层语言不能创建,只能使用模板,模板由底层语言提供。底层语言相当于库开发者,而高层语言则是库使用者。由于无法玩弄那些有用的,但复杂的,甚至危险的语言特性,高层语言会简单容易得多。

 

自然界的生物经过了几十亿年的发展(几十亿年的设计),有很多东西值得我们学习和借鉴。所以,就有了仿生学这门学科。过去,人们更注重对生物的实体上的仿生。但现在,我们将更多的注意力投向那些非物质的东西。蚂蚁的严密和高效的社会组织,为我们提供了很好的样板。现在所剩下的,就是如何理解并运用这些信息了。

2016面试——腾讯、蚂蚁金服、蘑菇街

腾讯TST技术面: 先罗列一下问题吧: 编程语言编译的过程 同样的逻辑,golang的二进制代码比C语言的二进制代码长很多.试分析原因 项目 ,三个项目都有聊.因为现场面,可以用纸写...
  • u013159040
  • u013159040
  • 2016年03月30日 22:49
  • 9030

JavaScript:世界上最被误解的语言

JavaScript:世界上最被误解的编程语言
  • Bumphy
  • Bumphy
  • 2017年06月17日 22:24
  • 262

被误解的MVC和被神化的MVVM

被误解的 MVC   MVC 的历史   MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示...
  • ceshi986745
  • ceshi986745
  • 2016年07月01日 12:38
  • 3853

【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】

(´;ω;`) 有以下几点要注意: 1,蚂蚁不是质点。 2,蚂蚁的直径是1,不是半径是1。 3,给蚂蚁按age排序的时候,不要忘了target也得跟着变。 4,过早优化就是死,直接维护信息素的值就...
  • BraketBN
  • BraketBN
  • 2016年03月06日 14:07
  • 949

mymps蚂蚁分类系统 5.8 E UTF8 完全解密版 新功能详细介绍

mymps 蚂蚁分类信息是一款基于PHP+MySQL的建站系统,为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps5.8下载 蚂蚁分类系统5.8下载 蚂蚁分类系统下载 my...
  • mympsqq3479015851
  • mympsqq3479015851
  • 2017年02月28日 16:35
  • 1391

蓝桥杯 历届试题 蚂蚁感冒 详解

问题描述   长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。   每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。   当两只蚂蚁碰面时,它们会同时掉头往相反的方...
  • qq_36238595
  • qq_36238595
  • 2017年01月14日 20:03
  • 500

被人误解的设计思路2

前几天写了一稿,当然当中有部分是网上摘录的。有朋友提到了马桶的设计,我觉得有必要学习一下,于是也在网上查了一些资料,摘录给各位。 关于马桶,我们其实有时候真的深受其害。我其实用的时候,真的也会遇...
  • lili893628843
  • lili893628843
  • 2016年09月12日 14:23
  • 205

(转)这张照片告诉了你蚂蚁金服成功的秘密...

尼采说过,“杀不死我的会让我更加强大”,伟大的困难带来伟大的机遇,同时也会锻造伟大的组织。“骆驼大会”和“裸照风波”是支付宝的两个关键转折点,组织经过两次深刻的反思爆发出强大而持续的执行扭力,是蚂蚁金...
  • wowotuo
  • wowotuo
  • 2017年04月17日 22:35
  • 566

蚂蚁爬行问题

问题主题:Ants(POJ  No.1852) 问题描述: n只蚂蚁以每秒1cm的速度在长为Lcm的竹竿上爬行。当蚂蚁看到竿子的端点时就会落下来。由于竿子太细,两只蚂蚁相遇时,它们不能交错...
  • luoweifu
  • luoweifu
  • 2013年09月26日 23:31
  • 5502

蚂蚁分类信息系统5.8 数据标签调用方法(二)

该方法适用于5.8及以上版本的单城市和多城市版本。教程来源于其它网络截图,仅供参考...
  • qq_35921430
  • qq_35921430
  • 2017年06月11日 20:38
  • 458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:被误解的C++——蚂蚁
举报原因:
原因补充:

(最多只允许输入30个字)