论要不要重复造轮子

在程序界有一句话很流行,不要重复造轮子。然而,这句话被滥用了。已经渐渐沦为程序员懒惰的借口。甚至因此而盲目指责那些勤奋的人。
    大多数情况下初学者很难分清楚自己是不是在重复造轮子。当我头一次听到这句忠告的时候,我变得异常敏感,在做什么之前都要判断一下是否在造轮子。我跟大多数普通人一样,容易受到他人只言片语的不良影响。事实上很多时候,避免造轮子并不是我的首要目标。我的目标是完成一项任务,任务完成的速度要尽量快,质量要尽量好。而不是去判断自己在不在造轮子。
    使用他人的现成轮子是实现快速任务的一项捷径。然而,并不总是这样子的。重复造轮子的正面是另外一句行话:吃自己的狗食。在涉及到关键技术点的地方,依赖他人的轮子容易造成高风险。高风险的原因在于:第一、它不是你写的。凭借注释和教程获得支持很有限,当需要功能拓展或者定制时,用起这个初期看起来很好的轮子反而变得碍手碍脚了。第二、当依赖轮子程度比较高的时候,那么它容易限制自己的思维。有些功能用轮子很难拓展,我们会推脱说轮子产生限制。反而不去思考这些功能的提出是否合理。第三、轮子可能是个一次性产品,轮子的开发者不愿再花时间维护。轮子不能与时俱进,那么就会被淘汰。因此你的产品也会遭到淘汰。“吃自己的狗食”的优势便是上述情况的反义。善于吃狗食的人,并不满足应用轮子做事,他们也会乐于阅读不同轮子的源码。去粗取精,博采众长。最终写出属于自己的锋利轮子,达到期望的目标。
    除了在关键技术点尽量不要使用他人的轮子。还有重要一点,那就是不要被“重复造轮子”这句话吓怕了。windows有现成的记事本和扫雷,但是每年还是有成千上万的大学生乐此不疲的编写记事本和扫雷程序。更有喜欢折腾的人尝试自己实现红白机上的经典游戏。实践是最好的老师,学生们并不是在重复造轮子,而是以提高为自己的目的。许多开源项目的初始目的并不只是为了做出一件产品,而是为了学习。高手们都明白实践出真知的道理,只是他们实践的技术含量更高而已。所以,千万不要被轮子吓怕,更不要以“轮子”为借口拒绝学习成长。
    上面我说了滥用重复造轮子的几个情况以及他们的危害。现在我想将自己的一点小小心得介绍出来——到底什么时候不要重复造轮子?
    若我有天想去九寨沟旅游,我想要选择租车自驾游,我肯定不需要关心汽车是怎么工作的。汽车对我来说只是个工具,因为我的目标是旅游。情景发生转变时,一切就变得不一样了。假如我是个汽车设计师,我想测试汽车在九寨沟的山路上能否平稳驾驶。那么我不该关心九寨沟的旅游景点有哪些,而应该关心汽车的内部构成怎样,有没有问题,能否改进。
当使用轮子是为了达成一个日常任务,或是以一个工具形态出现的时候。那么请不要重复造轮子,除非为了学习目的。我常常督促自己多多学习一些shell命令,这样可以避免自己写出一堆轮子脚本。同样的,当我有个新奇想法的时候。我常常会上网搜索有没有朋友已经实现,若有的话直接使用现成的轮子即可。如果没有,那么我只有亲力而为,自己去实现。
    有时候我会突然兴冲冲的充满野心。用数据库用的很不爽,不是说“吃自己的狗食”吗?那么把它写出来吧!当然最后一筹莫展,因为这对我来说太难了。也许我花上三五年时间都没法彻底搞懂。同样的还有写个操作系统、写个语言。这些东西也许最佳应亲力而为,但如果它对于自己来说过于复杂,那么就用它吧。因为这别无选择。优秀的程序员不会乐于被这些困难的东西牵着鼻子走,他们会尝试消化并改善它们。
    除了遇见这些困难的东西,有时候还会碰到一些并不困难但是很占时间的东西。没有必要盲目开工写这些占时间的东西。在仔细分析已有的几种轮子后可以直接选择其中最优秀的,在它不能合适工作的时候就大刀阔斧的修改它。这其中的关键之处在于你明白轮子工作的原理,如果愿意,只要花上几个月的时间,你能重新写出一个来。
    市面上有很多同类产品。明明有肯德基,为什么还出来麦当劳、李先生之类的。有时我会为开发产品的“山寨”而耿耿于怀,这无疑是重复造轮子的行为。别人已经有了,为什么我还要做?几乎同样的逻辑,为什么要重复实现一遍?这的确是重复造轮子,但是这是必要的。原因有:1.虽然产品形态和使用技术类似,但是后台的资源是不同的。用户需要不同的轮子,这样可以使市场有活力。肯德基和麦当劳虽然都是快餐店,经营方式和食品类型也差不多。但总有些微差异,而正是这份差异带来了活力。2.平台化、纵向发展。TX老是被网民骂抄袭,但是似乎越骂用户量反而越高了。因为TX造轮子有深厚的商业目的,它希望做出一个整合一切的平台。统一的平台给资源聚合带来了巨大的好处,用户也会变得更加喜欢用这个简单好用的整合平台。这种造轮子行为从这个角度上说是非常有利的。

时间: 2024-10-04 15:59:39

论要不要重复造轮子的相关文章

GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式. 对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局.能够让开发者轻松开发

避免重复造轮子的UI自动化测试框架开发

一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览器的基本上底层都是selenium,驱动无线app和浏览器基本是appium.monkey之类的,底层都是基于官方支持的自动化测试框架开发而来,然后上层又做了各种封装 首先在开始计划开发自动化时,第一步是了解目前已有的自动化开发技术,上面说了,最底层的就那几种,根据实际要去测试的业务需求选择合适的自

第27篇 重复造轮子---模拟IIS服务器

在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西是一个更好的理解和使用.   当你打开一个网页时,你会看到一个html页面的呈现,当然这是一个完整的Http的请求和响应的过程,无非是对HTML+CSS+JS一个综合的产物,在这个过程中浏览器请求数据的过程中会发出一个有一个格式的字符串(基于http协议生成的http请求报文),服务器在接收这样的一

重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用法及配置文件,这对于有些小工具.小程序.小网站来说,有点“杀鸡焉俺用牛刀”的感觉,而且如果对这些日志框架不了解,可能输出来的日志性能或效果未毕是与自己所想的,鉴于这几个原因,我自己重复造轮子,编写了一个轻量级的异步写日志的实用工具类(LogAsyncWriter),这个类还是比较简单的,实现思路也很

重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印

重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端系统打印经常使用的场景. 1.一种是类似票务方面的系统需要打印固定格式的票据.比如景点门票.车票.电影票. 这种基本是根据模板调整位置套打. 2.还有一种是交易小票,比如商超POS小票,打印长度会随着内容的大小自动伸缩. 这种就不仅仅是固定格式的套打了,还得计算数据行以适应不同的打印长度. 打印方式

万树IT:Spring Batch批处理框架技巧,让你不再重复造轮子

整理了Spring批处理框架的内容,掌握这些知识,可以帮你省去一些造轮子的过程,提高开发效率.本文由博主姚兆峰分享,小编整理后推送,希望对你的工作有帮助. Part.1 问题分析 在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员等等.而在批量处理任务的过程中,又需要注意很多细节,如任务异常.性能瓶颈等等.那么,使用一款优秀的框架总比我们自己重复地造轮子要好得多一些. AD 我所在的物联网云平台部门就有这么一个需求,需要实现批量下发命令给百万设备.为了防止枯

重复造轮子感悟 – XLinq性能提升心得

曾经的两座大山 1.EF 刚接触linq那段时间,感觉这家伙好神奇,语法好优美,好厉害.后来经历了EF一些不如意的地方,就想去弥补,既然想弥补,就必须去了解原理.最开始甚至很长一段时间都搞不懂IQueryProvider(小声说,其实现在也没完全搞懂),好不容易把IQueryProvider搞懂了,然后才发现好戏才刚刚开始,这个时候尝试写了第一个ORM.那个时候不明白表达式树的原理,自然一开始的思路就是走一点算一点,走到后面就没法走了,因为思路太乱了.这个时候就感觉EF太牛了,那么复杂的linq

重复造轮子的概念

网上的概念: 1.圆形的轮子已经是最合适的形状,再造一次无疑是做无用的重复工作. 也指明知道自己做的不可能比前人已做的更好,还要坚持做: 2.轮子就是一种现成的通用函数,或已有的开源代码.库.框架等,能够重复使用,以减少不必要的重复工作. 不要发明轮子,但是重复制造轮子也有它的意义: 1.自己亲自实践一次,能力得到锻炼,明白具体原理算法: 2.有时甚至可能从中发现新的问题,加以改进,比前人做得更好. 原文地址:https://www.cnblogs.com/tuji-sjp/p/8325329.

重复造轮子系列--桶排序

理解了基数排序,也就理解了桶排序. 桶排序就是基数排序的一种优化,从MSD开始,即取最高位来排一次序,如果最高位没有重复(意味着没有冲突需要处理),是算法的最佳状态,O(n). 如果有冲突,就将冲突的元素存放到对应的桶里(代码就是一个链表或者数组或者stl容器),然后对每个桶进行一次插入排序,平均情况的话冲突很小的,桶里的元素的数量就不多,速度很快, 如果冲突集中在几个桶甚至一个桶里,那么就出现了算法的最差情形,也就是O(n^2)的复杂度. 下面是例子代码实现: 1 template<typen