也谈“轮子理论”

我已经记不清第一次听说“轮子理论”是什么时候了,反正是很久以前了,在浏览一个国外的技术网站时偶然看见的。当时觉得挺有道理的,觉得它不仅适用于软件开发领域,更是很通用的生活哲学。后来,随着很多自称遵循“轮子理论”的开源框架的出现,身边的人开始越来越多的和我提起“轮子理论”这个字眼儿。一时间,它好像变成了软件开发社区中的时髦词汇,如果谁不知道的话,都不好意思跟别人打招呼。

然而我自认是一个具有人文精神的程序员,而人文精神的特点就是反思和独立思考。看着这么多人对“轮子理论”赞不绝口、顶礼膜拜,我总觉得自己有义务对这个“理论”做进一步的思考,看看它究竟是个什么东东。

所谓“
轮子理论 ”,即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,而且是革命性的。如果几年后真的出现了这样的东东,你会不支持这种“轴”的革命吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SolidWorks轮子库是SolidWorks软件中用于快速创建车轮模型的预制零件库。SolidWorks是一种三维计算机辅助设计(CAD)软件,广泛用于机械设计和工程设计领域。SolidWorks轮子库为用户提供了各种各样的车轮模型,可以根据实际需求选择使用。 在SolidWorks软件中,用户可以通过直接从轮子库中选择合适的预制轮子模型来快速创建属于自己的车轮。这些预制轮子模型通常具有标准尺寸和几何形状,不仅节省了用户从零开始创建车轮模型的时间和精力,也确保了轮子的准确性和质量。 SolidWorks轮子库中的轮子模型可以进行二维和三维编辑,用户可以根据需要对其进行调整和修改,以满足不同项目的要求。例如,用户可以改变轮子的直径、宽度、辐条形状等,使其适应不同类型的车辆和用途。此外,用户还可以添加轮胎、螺母、轴承等附件,使轮子模型更加真实和完整。 通过SolidWorks轮子库,用户可以快速建立车轮模型,并将其应用于整个设计过程中。无论是进行车辆设计、机械装置设计还是产品展示,都可以方便地使用SolidWorks轮子库中的模型。此外,轮子库还提供了自动调整轮子位置和旋转的功能,使用户可以更加方便地对车辆进行布局和动画展示。 总之,SolidWorks轮子库为SolidWorks软件用户提供了丰富多样的车轮模型,使设计人员能够更加高效地创建和调整车轮模型,加快设计过程,提高设计质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值