MyException - 我的异常网
当前位置:我的异常网» C++ » 被误解的C++——蚂蚁,该怎么处理

被误解的C++——蚂蚁,该怎么处理

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

作为高度组织性的生产活动,软件开发可以从分工和协作中获得非常大的益处。这一点毋庸置疑。而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++将其转换成具体类型,比如类或函数等。这不利于开发效率的提高。
对于这个问题,或许有一种方法可以解决,就是搞语言族。就像自动步枪族一样,在一个基础步枪型上,通过更换少量部件,发展出班用机枪、狙击步枪、卡宾枪,和冲锋枪。语言族则可以在一个共同的语法基础和编程模型上,设计不同的语言。包括用于底层开发的,和面向不同应用的高层语言。底层语言功能强大,学习使用较难;高层语言功能简单,学习使用却很方便。两者具有相同的基础,很容易交互。各展所长,优势互补。比如,高层语言不能创建,只能使用模板,模板由底层语言提供。底层语言相当于库开发者,而高层语言则是库使用者。由于无法玩弄那些有用的,但复杂的,甚至危险的语言特性,高层语言会简单容易得多。

文章评论

程序员和编码员之间的区别
程序员和编码员之间的区别
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员的鄙视链
程序员的鄙视链
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
如何成为一名黑客
如何成为一名黑客
一个程序员的时间管理
一个程序员的时间管理
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个调试和排错的小建议
10个调试和排错的小建议
旅行,写作,编程
旅行,写作,编程
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员必看的十大电影
程序员必看的十大电影
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
中美印日四国程序员比较
中美印日四国程序员比较
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
编程语言是女人
编程语言是女人
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
老程序员的下场
老程序员的下场
我的丈夫是个程序员
我的丈夫是个程序员
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员应该关注的一些事儿
程序员应该关注的一些事儿
代码女神横空出世
代码女神横空出世
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
那些争议最大的编程观点
那些争议最大的编程观点
每天工作4小时的程序员
每天工作4小时的程序员
我是如何打败拖延症的
我是如何打败拖延症的
 程序员的样子
程序员的样子
鲜为人知的编程真相
鲜为人知的编程真相
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
漫画:程序员的工作
漫画:程序员的工作
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java程序员必看电影
Java程序员必看电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有