被误解的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++将其转换成具体类型,比如类或函数等。这不利于开发效率的提高。

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

 

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

C++语言基础

C++是一门高效而实用的程序设计语言,本课详细介绍C++语言中的封装、数据隐藏、继承、多态的实现,主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。课程继续关注学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。
  • 2015年03月01日 10:55

百度笔试编程题:爬行的蚂蚁(c++)

题目: 有一个长m细木杆,有n只蚂蚁分别在木杆的任意位置。 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头, 但不会后退。当任意两只蚂蚁碰...
  • lxubin
  • lxubin
  • 2016-09-13 21:35:46
  • 1275

DSL与函数式编程

一直看到这个英文缩写,但是不知道它具体是啥东西,google几次都讲的非程序层面的意思,找到一篇还不错的介绍文章,转载过来... 出自:http://mzhou.me/?p=95219 ...
  • chhuean
  • chhuean
  • 2016-09-28 12:54:14
  • 398

领域专用语言(DSL)

原文:DomainSpecificLanguage    设计        2004年2月13日            Bliki 索引所谓领域专用语言(domain specific la...
  • mfowler
  • mfowler
  • 2006-08-16 12:50:00
  • 55659

JOOQ初学-DSL核心

org.jooq.impl.DSL是生成所有jOOQ对象的主要类。它作为一个静态的工厂去生成数据库表表达式,列表达式,条件表达式和其他查询部分。jOOQ 2.0以后,为了使客户端代码更加的趋近于S...
  • LANGZI7758521
  • LANGZI7758521
  • 2016-08-26 10:00:36
  • 956

Android支付宝支付

接入流程及说明官方地址:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.erBW90&treeId=59&articleI...
  • qq_27280457
  • qq_27280457
  • 2016-08-31 14:58:44
  • 665

c/c++成长之捷径

c++成长之路不再迷茫!           不知不觉中进入计算机行业已有多个年头了,回首往事依然历历在目。今天我把我这段时间收集的书籍资料以及实例源码帖出来(部分资料太大了放不上去,理解下),...
  • Baoge_leopard
  • Baoge_leopard
  • 2014-10-15 21:03:29
  • 3009

C/C++ 误区一:void main()

        很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup...
  • Borenbao
  • Borenbao
  • 2006-06-29 10:37:00
  • 2197

DL超级大火锅

0x00 文章来由DL问题不断整理0x01 卷积层学习卷积核?该问题来自于知乎: https://www.zhihu.com/question/39022858,里面说到0x02 loss很低,但是a...
  • Scythe666
  • Scythe666
  • 2017-08-06 10:32:00
  • 2019

一站到底

[题目库] 题目数=20897 1=【物理】属于国家一类保护动物的是:A.天鹅B.娃娃鱼C.孔雀D.丹顶鹤|A 2=【体育】举重时运动员为什么搓白粉?A.使手变的粗糙B.吸取手上的汗C.刺激肌肉...
  • zfz1015
  • zfz1015
  • 2016-10-25 14:50:38
  • 167187
收藏助手
不良信息举报
您举报文章:被误解的C++——蚂蚁
举报原因:
原因补充:

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