造轮子:理解本质,避免无用功,找到好做法
本文最后更新于 2026年2月5日 下午
造轮子:理解本质,避免无用功,找到好做法
编程领域常说的“造轮子”,指重复开发已有成熟解决方案的功能。比如有人写了一套日期处理函数,却不知社区已有Moment.js这类库。这种行为并非全然无用,但多数时候,无意义的重复造轮子会消耗时间,拖慢项目进度。
《韩非子·五蠹》有言:“以子之矛,攻子之盾”,若我们无视已有工具的价值,执意从零构建,就如同拿着自己造的简陋矛,去对抗成熟工具的“盾”,效率高下立判。我倾向于认为,理解“造轮子”的本质,区分必要与无意义的重复,是每个开发者的必修课。
本文会厘清“造轮子”的定义,分析为何会陷入无意义造轮子的困境,给出避免的方法,也探讨什么时候“造轮子”是有价值的,以及做好这件事的正确路径。
一、什么是“造轮子”:从定义到本质
“造轮子”并非字面意义的制造轮子,而是编程中重复开发已有通用解决方案的行为。
比如为项目写一个JSON解析函数,而JavaScript原生已有JSON.parse/stringify,这就是典型的造轮子。
技术社区里,“轮子”通常指那些通用、成熟、可复用的工具库、框架或组件。它们经过大量用户验证,修复了多数边界问题,就像工业标准的轮子,适配绝大多数车辆。
判断是否在无意义造轮子,核心是看是否有成熟且适配的现有方案。
庄子说“吾生也有涯,而知也无涯”,开发者的时间有限,把精力花在重复造轮子上,就无法投入到项目核心价值的构建中。
需要注意的是,“造轮子”并非绝对负面。新手为了学习原理手写排序算法,或是现有轮子无法满足特殊业务需求时的定制开发,这类“造轮子”是有价值的。
总结:“造轮子”的核心是重复开发通用方案,其价值取决于是否服务于学习或解决特殊需求。
二、为什么会陷入无意义造轮子?
无意义造轮子的根源,往往不是技术能力不足,而是认知或心态问题。
第一种原因是信息差:开发者不知道已有成熟方案。比如刚入行的程序员,不了解npm生态,就会自己写表单验证逻辑。
这就像古人“不知有汉,无论魏晋”,并非不愿用,而是不知道有更好的选择。
第二种原因是过度自信:认为自己写的比现有库更好。有些开发者觉得开源库“臃肿”,想写更精简的版本,却忽略了开源库经过的长期测试和兼容性处理。
我倾向于认为,除非有明确的性能或功能短板,否则这种自信往往缺乏依据。
第三种原因是对现有方案的不信任:担心第三方库有安全漏洞,或后续不维护。但主流开源库有社区背书,比个人临时写的代码更可靠。
总结:无意义造轮子多源于信息差、过度自信或不信任,而非技术本身的需求。
三、如何避免无意义的“造轮子”?
避免无意义造轮子,核心是“先找后造,先评估后动手”。
第一步,养成调研的习惯。在开发某个功能前,先通过GitHub、npm、PyPI等平台搜索现有方案。
比如要做数据可视化,先看看ECharts、Chart.js是否满足需求,而非直接从零开始。调研是避免无意义造轮子的第一道防线。
第二步,评估现有方案的适配性。看是否满足业务需求、是否有活跃维护、是否有完善的文档和社区支持。
比如在企业级项目中,选择有长期维护的库,比自己写的临时代码更可靠。
第三步,优先复用和二次开发。现有库若只有少量功能不满足,可基于其扩展,而非重写。
例如,在电商项目中,我们可以使用Element UI的表单组件,仅修改样式和少量逻辑,而非重新开发整套表单。
需要注意的是,调研时要区分“通用方案”和“定制方案”,通用功能优先复用,定制功能再考虑开发。
总结:避免无意义造轮子的关键是先调研、评估,优先复用现有成熟方案。
四、什么时候“造轮子”是有价值的?
并非所有“造轮子”都该避免,特定场景下,造轮子反而能创造价值。
第一种场景:学习技术原理。比如新手为了理解HTTP请求的本质,自己写一个简单的axios替代版,而非直接用现成库。
这就像学开车时先拆发动机,虽然耗时,但能理解底层逻辑,《论语》说“学而时习之”,这种造轮子就是最好的“习之”方式。
第二种场景:现有方案无法满足核心需求。比如在金融风控项目中,现有规则引擎无法适配高频实时计算,这时定制开发专属引擎就是必要的。
例如,在风控决策项目中,我们可以使用Go语言编写轻量级规则引擎,满足毫秒级响应的需求。
第三种场景:追求极致的性能或体积。比如移动端H5项目,现有UI库体积过大,影响加载速度,这时精简核心功能造一个轻量版,能提升用户体验。
我倾向于认为,有价值的造轮子,一定是“有明确目标”的,而非盲目动手。
总结:学习原理、满足特殊需求、追求极致性能时,造轮子是有价值的。
五、“造轮子”的正确做法:从设计到落地
若确定需要造轮子,就要遵循科学的方法,避免造“劣质轮子”。
首先,明确需求边界。先列出功能清单,只开发必要功能,避免过度设计。
流程图示:需求梳理→功能拆解→核心逻辑开发→测试→迭代,其中需求梳理是关键。
其次,做好模块化设计。让代码可复用、易维护,而非写成“一次性代码”。
比如写一个日期处理库,把格式化、解析、时区转换拆分成独立函数。
这段代码的作用是:实现一个轻量的日期格式化函数(核心功能),避免引入庞大的日期库。
1 | |
再次,充分测试。覆盖边界场景,比如空值、异常日期,确保轮子可靠。
这段代码的作用是:为日期格式化函数编写测试用例,保证功能稳定。
1 | |
例如,在小程序项目中,我们可以使用上述轻量日期函数,替代体积较大的Moment.js,减少包体积。有价值的轮子,必然是经过测试和复用验证的。
最后,文档和复用。为轮子编写简单文档,方便自己和团队后续使用,避免重复造第二个“同款轮子”。
总结:造轮子需明确边界、模块化设计、充分测试,且做好文档复用。
结语
“造轮子”是开发者成长中绕不开的话题,它既可能是低效的代名词,也可能是学习和创新的路径。
《荀子·劝学》说“君子生非异也,善假于物也”,优秀的开发者并非不造轮子,而是懂得何时借用现有轮子,何时打造专属轮子。
我倾向于认为,判断造轮子是否有价值的核心,在于是否服务于项目核心目标或个人成长。避免无意义的重复,把精力放在真正需要创新的地方,才是理性的选择。
需要注意的是,“复用现有轮子”不代表完全照搬,根据业务场景做轻量化适配,也是开发者的核心能力之一。
延伸阅读:
- 《不要重复造轮子,但要理解轮子怎么造》(GitHub官方开源指南)参见:[GitHub Open Source Guide]
- 《重构:改善既有代码的设计》中关于代码复用的章节 参见:[Martin Fowler 重构指南]
最后提出一个思考问题:你在最近的项目中,是否做过无意义的“造轮子”?如果重新来,你会如何选择?是复用现有方案,还是有策略地造轮子?这个问题,或许能帮你更清晰地看待开发中的取舍。
总结
- “造轮子”的核心是重复开发通用方案,其价值取决于是否服务于学习、解决特殊需求或追求极致性能。
- 避免无意义造轮子的关键是先调研现有方案、评估适配性,优先复用或二次开发。
- 有价值的造轮子需遵循“明确边界→模块化设计→充分测试→文档复用”的路径,而非盲目动手。