我已经记不清第一次听说“轮子理论”是什么时候了,反正是很久以前了,在浏览一个国外的技术网站时偶然看见的。当时觉得挺有道理的,觉得它不仅适用于软件开发领域,更是很通用的生活哲学。后来,随着很多自称遵循“轮子理论”的开源框架的出现,身边的人开始越来越多的和我提起“轮子理论”这个字眼儿。一时间,它好像变成了软件开发社区中的时髦词汇,如果谁不知道的话,都不好意思跟别人打招呼。
然而我自认是一个具有人文精神的程序员,而人文精神的特点就是反思和独立思考。看着这么多人对“轮子理论”赞不绝口、顶礼膜拜,我总觉得自己有义务对这个“理论”做进一步的思考,看看它究竟是个什么东东。
所谓“轮子理论”,即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,而且是革命性的。如果几年后真的出现了这样的东东,你会不支持这种“轴”的革命吗?
分享到:
相关推荐
本主题聚焦于使用SolidWorks设计的一款"小轮子",这款轮子是标准尺寸,配备了轴承,并且采用实心橡胶材料,适用于手推车等应用。 首先,我们来看看"roue_41-312-100b08.SLDPRT"这个文件。SLDPRT是SolidWorks的零件...
总结来说,这个“了不起的轮子”小班科学课件通过互动式的教学方式,寓教于乐,不仅让孩子们在认知轮子的同时,也增强了他们的观察力、想象力和安全意识,是一份非常实用的专业课件,能够有效地帮助孩子们开启对科学...
5. 通过故事的形式,将三角形和正方形的轮子应用于坏蛋的交通工具,既增加了趣味性,也帮助幼儿理解不同形状的特性及其可能产生的后果。 活动延伸部分,鼓励幼儿发挥想象力,创设情境,进一步熟悉各种形状,同时...
在日常生活中,轮子也无处不在,如滚轮行李箱、轮滑鞋、儿童玩具车等,为我们的生活带来便利。 轮子的应用不仅仅局限于传统机械,现代科技也赋予了轮子新的生命。例如,电动滑板车、自动驾驶汽车中的智能轮子,它们...
它不仅改变了我们的交通方式,也推动了科技进步,丰富了我们的生活方式。从简单的木轮到复杂的轮胎系统,再到现代的磁悬浮列车,轮子始终是人类智慧的结晶,其影响力无处不在。 综上所述,这个课件虽然简短,但足以...
Python轮子 非常好用Python轮子 非常好用 Python轮子 非常好用Python轮子 非常好用Python轮子 非常好用Python轮子 非常好用Python轮子 非常好用Python轮子 非常好用
同时,也有可能涉及了轮子在玩具、游乐设施等儿童生活中的角色,让孩子们能在熟悉的情境中更好地理解轮子的作用。 通过这个PPT学习教案,孩子们不仅能学习到科学知识,还能培养他们的观察力、想象力和创新思维。在...
轮子哥安卓开发框架,一个非常优秀的开源框架。 各项界面,对话框,全面的内存优化、布局优化、代码优化、瘦身优化。 项目中常见的代码进行了封装,或是封装到基类中、或是封装到工具类中、或者封装到框架中,不...
现在网络如此发达,资源如此丰富,开源社区也发展的很好。有很多源代码可以下载,使用。那是不是说当我们在写一个程序的时候就不应该自己设计,而是首先到网上去找,只有找不到的情况下才自己去写呢?
【幼儿园中班科学教案:有趣的轮子】 这个教案的核心知识点主要围绕着儿童早期科学教育,旨在帮助幼儿了解轮子的基本特性和作用。首先,通过实际操作和探索,孩子们能够发现轮子是圆形的,这样的设计使得物体可以更...
很抱歉,但根据提供的信息,“小班语言轮子歌.pptx”似乎是一个教育或幼儿教学资源,内容可能包括儿童歌曲、诗歌或者故事,用于帮助小班学生学习语言和认知发展。由于没有提供具体的页面内容,无法详细阐述其中的...
- 孩子们使用硬纸板剪出不同形状的轮子,亲自尝试滚动,这既锻炼了他们的动手能力,也使他们直观感受到不同形状轮子的区别。 5. **活动延伸**: - 鼓励孩子们骑行儿童自行车,通过实践体验,加深对自行车工作...
适配:win10-cuda11.0-Python3.9 torch为1.7.1版本、torchvision为0.8.2 将whl文件下载到桌面,激活环境并cd命令到桌面路径下,使用pip install 文件名.whl 命令来安装。 whl文件安装会自动给你检测并删除已有的、旧...
本示例中的"ios-轮子动画效果.zip"文件,显然提供了使用CAKeyFrameAnimation来创建一个轮子转动效果的实例。CAKeyFrameAnimation是Core Animation框架的一部分,它允许开发者创建复杂的、基于关键帧的动画,这些动画...
最后,测试驱动开发(TDD)也是一种值得实践的方法。先编写测试用例,然后编写满足这些测试的代码,这样可以确保代码质量,并且使重构变得更安全。 总结来说,自己实现轮子是一个极好的学习机会,它涵盖了基础数据...
这篇文档是关于北师大版小学数学二年级上册《需要几个轮子》课程的教学反思。这节课的主要目标是引导学生理解和应用乘法,特别是3的乘法口诀。教学过程中,教师通过创设小动物郊游的情境,激发学生兴趣,让学生自然...
在这个“STL仿造轮子”的项目中,我们旨在通过模仿SGI-STL(斯坦福大学图形小组的STL实现)来深入理解和学习C++以及数据结构的基本原理。 首先,STL的核心组件包括容器、迭代器、算法和函数对象。容器是STL的基础,...
Python 3.9 中下载Dlib包的轮子
在IT行业中,"重复造轮子,表单验证"是一个常见的议题,特别是在软件开发中。当我们谈论表单验证时,通常是指在用户提交数据到服务器之前,在客户端(通常是Web浏览器)进行的数据验证过程。这个过程确保了用户输入...
《有趣的轮子》是针对幼儿园中班的孩子们设计的一系列科学教案,旨在引导他们通过...此外,教师的参与和指导至关重要,他们需要适时引导,确保每个孩子都能积极参与,享受学习的过程,同时也保护和培养他们的创新思维。