我已经记不清第一次听说“轮子理论”是什么时候了,反正是很久以前了,在浏览一个国外的技术网站时偶然看见的。当时觉得挺有道理的,觉得它不仅适用于软件开发领域,更是很通用的生活哲学。后来,随着很多自称遵循“轮子理论”的开源框架的出现,身边的人开始越来越多的和我提起“轮子理论”这个字眼儿。一时间,它好像变成了软件开发社区中的时髦词汇,如果谁不知道的话,都不好意思跟别人打招呼。
然而我自认是一个具有人文精神的程序员,而人文精神的特点就是反思和独立思考。看着这么多人对“轮子理论”赞不绝口、顶礼膜拜,我总觉得自己有义务对这个“理论”做进一步的思考,看看它究竟是个什么东东。
所谓“轮子理论”,即Don not Reinvent the Wheel,不要重新发明轮子。个中含义,我想就不需要我废话解释了。有了这么一句金玉良言,我们在做事情的时候就有了整体上的方向。如果我们需要开发一个软件,是Product也好,是Application也好,首先去寻找已经存在的能够为我们所用的东东;如果我们要开发一个Framework之类的东西,就要尽量不自己重写,而是以现有的Framework为基础,添加我们认为有意义的特性。本着这样一种精神,我们会以愤世嫉俗的眼光看待身边的很多事物。比如,我们可能会抱怨说既然有了Struts,为什么还要有WebWork,为什么其中一个Framework的开发者当初不选择把它的特性加到另一个已经存在的Framework中。当然,现在Struts和WebWork已经开始合并了,大家也都拍手称快。同样的事情还会发生在很多其它的方面,比如,我们可能会抱怨有那么多个O/R Mapping和数据访问的Framework,为什么不齐心协力做好一个呢?更有甚者,我们甚至会抱怨,已经有了Java、Java EE,为什么死相的微软要弄出个.NET来把水搅浑,如果只有一种开发平台该多好!
当然,这些都是我们天真的设想。如今的世界这么复杂,别说有金钱这个东西诱惑着大家自起炉灶,就算不是为了钱,也会有其它的原因造成这种四分五裂的局势。于是有些站着说话不腰疼的人放话出来说:“啊!这种多样性是多么的美妙啊!”我想,每个被这种“美妙的多样性”折腾得够戗的人都会把它当成屁,捂着鼻子来听。我曾经和我的朋友说过这样的话,“现在的软件开发领域,就像三国演义一样,许多列强都割据了自己的地盘,不停地发号施令,各种势力往往会在战场(市场)上争个你死我活,只是可怜了我们这些做小兵的人啊!”今天我把这句话写在这里,意思就是:如果你是个真正的将才,或甚至是帅才,那么你生对了时代,好好去折腾一番事业吧;如果你不是那么牛,那么这个时代就会让你很辛苦,甚至辛苦也没有好结果。中国人讲,“乱世出枭雄”,更不能否认的是,我国文化的最高峰都是出在战乱时代,但是战乱确实会残害百姓啊...
好像有点儿扯远了,言归正传。我要对“不要重新发明轮子”做进一步的思考,那么就需要先去看看这句话本身的意义,然后才能套用到我们软件开发领域中。那么就让我们从真正的轮子开始看起吧。据我所知,最原始的轮子就是粗细差不多的树干,古代的人把这些树干上的分支砍去,然后并排放在一起,在上面放上木板,然后滚动树干来搬运沉重的东西。可以想象,使用这种方法,每滚动一根树干直径的距离就要把后面的树干再搬到前面,不然木板就没地方滚了。这种办法当然很不好,所以后来人们发现,其实只需要两片圆形的木片,然后中间加上一根轴就可以了。这样不但易于制造,更不用每次都移动树干到前面去了。这样,轮子就出现了。
好了,你看,古代的劳动人民已经发明了轮子了。Don not Reinvent the Wheel!对吗?但是,这是我们当今的生活中使用的轮子吗?当然不是。我们可以想象这样的过程,有人把木片轮子改进成了带空心的轮子,然后有人用金属代替了木头,再然后有人觉得轮子的减震不好,又加上了轮胎这个东东,直到那时,现代的轮子才真正地出现了。
那么我问你,这些各个时期的轮子,算是发明吗?你可能会毫不犹豫的说:“不算!”但是为什么呢?从最原始的木片,到现在我们使用的钢圈+车条+里胎+外胎,这不算是发明吗?我觉得这应该是一种发明,如果说轮子是圆的才是唯一真正的发明的话,那爱迪生可能就不会因为1000多个发明而被后人传颂了。更进一步说,为自行车设计的轮子,为汽车设计的轮子,为坦克设计的履带式轮子,雪地车轮子,赛车轮子,甚至赛车雨天轮子,这些都可以算作发明。那么为什么说Don not Reinvent the Wheel呢?
我觉得,这里的Wheel指得是已经存在的,并且能很好地满足你需求的东西。只有在这种情况下,才应该Dot not Reinvent。我在上“软件系统架构”课程的时候,一个旅美多年的创业者就说过,“开发软件的第一选择就是看你能不能买一个现成的过来”。那么如果没有东西可以满足你的需求呢?当然要Reinvent!
看到这里,各位可能已经很反对我的观点了,“如果大家都Reinvent,那么世界就不变得更加混乱了吗?”各位不用着急,我也是小兵啊,我也不喜欢乱世。让我们重新在考虑回轮子上来,为什么那么多不同的轮子没有造成混乱呢?原因就是,使用轮子的方法没有变!无论是古代还是现代,无论是自行车还是汽车,始终都是通过轴来使用轮子。看过《Taxi 3》的人应该会记得,里面那辆疯狂的士在开到滑雪场追坏人的时候,很轻松的就把公路轮子换成了雪地需要的履带式轮子。这恰恰就是问题的关键啊!
还拿Struts和WebWork举例来说,我天真地想,如果我们可以用相同的方式使用Struts和WebWork,也就是说API,XML Schema等等都是一样的,那么我们还会关心是否有Reinvent的存在吗?当然不会,因为对我们来说没区别啊。把这种天真的想法扩展到其它方面中,所有的O/R Mapping的使用方式都是一样的,所有的IoC的使用方式都是一样的,所有的AOP的使用方式都是一样的,甚至Java EE和.NET的使用方式都是一样的,那么我们还会在乎Reivent吗?随便Reivent好了!反正对于使用者来说都是差不多的!
可是那些站着说话不腰疼的人又来了,“这样就没有多样性了啊!这可不是个好现象!”这又引出了更深一层的话题,如何确定这个统一的使用方式。诚然,没有谁可以保证他设计的API、XML Schema等是最好的,毕竟这不像轮子那么简单。但是就像有许多人总结设计模式一样,也可以根据经验对这些具体的东西做一个积累,然后渐进地做出设计吧。而且这方面的需求也是有的。比如现在很热的SOA,就是通过一种标准化了的叫做Service的东东,描述一个功能(往往是函数),我们不需要适当Service是用什么技术实现、怎么实现的,只要通过标准的Service定义,就可以与它交互了。如果做得更好一点,就像我说的Java EE和.NET的使用方式都一样的程度,那么就不需要什么Service了,直接用就好了,反正都是一样的。如果你在做基于Java的系统时,发现某个功能用.NET更合适的话,不要什么Web Service了,直接用就好了。
这种感觉就好像是,我有一辆汽车,现在用的是锦湖轮胎,后来想换米其林,不是很简单、很正常的事情吗?
可为什么这么“正常”的事情没有在软件界发生呢?因为没有人去做这个“轴”,即“统一的使用方式”。为什么呢?设计的难度只是原因之一,真正的原因是没有人有足够的势力让其它列强听话放弃自己当前的东西,然后一起创造一个统一的东西。在这种情况下,我们也只能退而求其次,通过SOA,重用性很强的Framework(如Spring),等等,来达到我们的目的。
那么是不是可以这样说,“不是Don not Reinvent the Wheel,而是Don not Reinvent the Axis(轴)”呢?当然也不是,Don not Reinvent的思想会阻碍人们对新发明的尝试,我觉得是不可取的。然而,也不是说可以随便的Reinvent这个“轴”,这么重要的东西,如果想Reinvent,那一定要是革命性的,它所带来的进步要有巨大的价值。也就是说,在设计“统一使用方式”这个漫长的过程中,允许有也一定会有改动,这些改动就应该是革命性的。
看过电影《I Robot》吧?还记得里面Will Smith开的那辆Audi吗?它的轮子是球型的,这样车就可以很方便地向任意方向形式,酷吧!但是你想过没有,这种轮子的“轴”是什么呢?简单的一根棍子肯定不行啦,那会是磁悬浮技术?我不知道,但是我知道这个“轴”肯定是Reinvent,而且是革命性的。如果几年后真的出现了这样的东东,你会不支持这种“轴”的革命吗?
分享到:
相关推荐
总结而言,“C#面向对象设计模式纵横谈”是一套全面的学习资源,它将理论与实践相结合,帮助开发者掌握面向对象设计模式,提升软件开发的专业技能。通过观看视频并结合源码实践,我们能够更好地理解和运用这些模式,...
在数据库设计领域,经验和理论同样重要。本文将探讨五个关键部分,帮助你提升数据库设计的效率和质量。 **第 1 部分 - 设计数据库之前** 在开始设计数据库之前,首先要对现有的环境进行深入的考察。这包括分析现有...
由于其低功耗、高性能的特点,也被广泛应用在工业自动化和控制系统中,包括装船机的智能控制系统。 装船机伸缩臂架的处理涉及到复杂的运动控制算法,这些算法通常运行在基于ARM内核的微控制器或嵌入式系统上。ARM...
轮轴的概念也与杠杆密切相关,它是由轮子和轴组成的省力装置。我们常见的门把手、方向盘等都是轮轴的应用实例。轮轴的设计使得我们能够以较小的力转动或移动重物,这在工程和日常生活中都非常实用。轮子越大,其省力...
首先,我们从效率的定义谈起。效率,顾名思义,是指在特定的经济活动中,投入与产出的比例关系。投入可以是资源、资本、人力等因素,而产出则是经济活动结束后的成果,如商品、服务或财富的增长。在收入分配领域,...
#### 由“车”谈起 - **知识点1:古典神话中的神兽** 在我国古典神话中,“飞毛腿”被描述为天庭中担当御用信差的神兽,体现了古代人民对于速度与通讯的想象。 - **知识点2:指南车的发明人** 据古代传说,最...
首先,让我们从平移的概念谈起。平移是一种基本的几何变换,它描述了物体在直线方向上的移动,且该变换保持物体的形状、大小和相对位置不变。在日常生活中,平移现象随处可见,如电梯的升降、火车在铁轨上的行进、...
当我们谈到工具类,我们指的是那些封装了特定功能、提供便捷接口供调用的代码集合。这些代码通常是以类的形式存在,它们的设计初衷是为了在多个项目和场景中复用,从而避免了重复编写相似功能代码的麻烦。本文将深入...