搜索一下“造轮子”或者“程序员为什么喜欢造轮子”,会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年。不过还是有再谈的必要。

“造轮子”的含义:

明知道你做的不可能比前辈做得更好,却仍然坚持要做。

就软件开发而言,“造轮子”是指,“业界已经有公认的软件或者库了,却还坚持要自己做”。

在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状况?

这篇文章就来讨论“造轮子”这件事,包括下列主题:

  • 程序员为什么会重复造轮子

  • 为什么有人不让“造轮子”

  • 什么时候可以造轮子

为什么会重复造轮子?

  • 每个造轮子的程序员都有自己“不得不造”的理由。比如:

  • 以为自己的需求独一无二,现有的库就是在某个点上满足不了

  • 老轮子没有规格说明书,或者接口太复杂,不知道怎么用,搞明白太难

  • 需要在老轮子上添加新功能,然而老轮子代码难读无人可问,不知道何时能弄明白,看不到结果,容易放弃

  • 眼界有限,不知道已有这样的轮子

  • 版权原因无法使用第三方库,比如Google Android实现JVM(Google曾因为一行代码而和Oracle打官司),比如阿里YunOS自己实现JVM

  • 就想锻炼自己,因为造轮子对自己的设计、编码能力有很大好处,对理解业务也有很大好处

  • 自己造轮子,有“控制感”,看得见摸的着,可以一步一步来,一个一个小目标迭代出大目标,不断成功的小激励,会带给自己前行的动力

  • 创新成分多(对自己而言),有成就感

  • 不相信老轮子,譬如老轮子可能有后门、漏洞(想想OpenSSL的心脏出血漏洞)、后期万一要修改没把握等,反正是觉得自己造轮子心里更踏实

  • 不想让自己产品的关键技术掌握在别人手里,也不想让自己的核心用户数据流经别人的系统

  • 别人的轮子不开放,我就是要赶紧造(山寨)一个出来以便获得话语权或商业利益

为什么有人不让“造轮子”

有坚持要造轮子的,也有高呼“不要重复造轮子”的。那为什么有人不让造轮子呢?

  • 项目(产品)时间紧张,用第三方库搭积木快,能节约时间

  • 领导上(或队友)认为想造轮子的程序员水平就那样,不可能造出比现有库(软件)更好的轮子,显然会漏洞百出推高维护成本

  • 造轮子是个看上去很美做起来很操蛋的事儿。复杂一点的轮子,造出来很费劲,道阻且长,很可能骑虎难下或半途而废,导致精力和时间的浪费

  • 待造的轮子不是产品的关键(比如一个字符串类、一个XML解析类),不属于核心竞争力,不值得花费人力,要把精力放在最重要的事情上

结合为什么要造轮子以及为什么不让造轮子,就可以理解本文一开始提到的那种反差极大的状况。

什么样的轮子可以重新造?

看现在的软件发展趋势,越来越多的基础服务能够“开箱即用”、“拿来用就好”,越来越多的新软件可以通过组合已有类库、服务以搭积木的方式完成。这是趋势,将来不懂开发语言的人都可以通过利用现有软件组件快速构建出能解决实际问题的软件产品。

在这种趋势下,软件(服务)就慢慢演化为两极:

  • 满足终端用户的应用类产品

  • 解决软件产品通用问题的基础服务(组件)

比如你在自己的App中需要即时通信功能,完全可以使用融云、环信、网易云信等服务快速集成。

比如你想在自己的App中添加支付功能,完全可以使用Ping++或Pay++来解决诸多支付渠道的集成问题。

比如你想添加分享功能,ShareSDK、友盟SDK可以节省你很多时间。

比如你想做跨平台的游戏,使用Cocos2d-x远比自己在Android、iOS上从底层从OpenGL ES干起要高效得多。

比如你想让你的网站支持更多用户更多并发,能够快速部署、迁移、规模复制,那完全可以借助阿里云、AWS、Azure等而没必要自己搞。

比如你想推送消息给用户,就可以用腾讯信鸽、极光、个推、百度云推送、友盟等。

……

类似的场景很多很多。这种趋势使得一部分厂商集中精力开发基础服务(组件),一部分企业集中精力解决用户需求。对基础服务(组件)厂商来讲,他通过解决更复杂的基础问题为其他厂商带来便利而盈利。对终端软件产品企业来讲,他通过解决用户问题给用户创造价值而盈利,从理论上讲,只要其产品从用户端或第三方获取的价值大于支出给基础服务厂商的价值,生意就可以做下去。

有了这样的认识,什么样时候可以造轮子什么时候最好不重复造轮子就不再是问题了。

对于提供基础服务的软件厂商,很多轮子必须造。因为他要提供服务给其他软件厂商,你拿友商的组件换个包装提供给其他软件厂商,没有竞争力。所以你看到在某个软件服务市场上,会有多家企业各自在造轮子,为的就是自己掌握核心科技有自己的竞争力。比如提供云服务的,有阿里,七牛,百度……比如提供即时通信服务的,有融云、环信、阿里云信……比如提供语音服务的,有科大讯飞、百度、OKVoice、Google、微软……

对于开发满足终端用户的应用类产品的公司,很多轮子就没必要造。比如你提供一个健身类的App,可能需要引入即时通信功能,用第三就好了。

从公司的角度讲是这个样子,那对程序员来讲呢?

对程序员来讲,在一开始的学习成长阶段,造轮子则具有特殊的学习意义,学习别人怎么造,了解内部机理,自己造造看,这是非常好的锻炼。每次学习新技术都可以用这种方式来练习。

当我们掌握了一门技术,可以用于实际产品开发中时,关于造轮子,就有了另外的划分:

一些基础的工具类库,比如String,比如Xml,比如Json,比如Http,比如推送,比如流媒体协议,重新造的必要性不大。而与业务相关的,可以尝试重构、再造,对理解业务有好处,也能更好适应新需求。

转载于:https://www.cnblogs.com/Amoyios/p/5764426.html

程序员为什么热衷造轮子?相关推荐

  1. 程序员为什么热衷造轮子

    搜索一下"造轮子"或者"程序员为什么喜欢造轮子",会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. "造轮 ...

  2. 造轮子是什么意思_程序员为什么热衷于造轮子,升职加薪吗?

    作者:小傅哥 博客: https://bugstack.cn- 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 哪个架构师没造过轮子? 你想过这样一件事吗? 是先具备能力在安排职位,还是先安排 ...

  3. 程序员如何通过造轮子走向人生巅峰?

    前言:你所做的事情,也许暂时看不到成果.但不要灰心,你不是没有成长,而是在扎根. 程序员圈经常流行的一句话:"不要重复造轮子".在计算机领域,我们将封装好的组件.库,叫做轮子.因为 ...

  4. 程序员为什么热衷于造轮子,而不是硬照,升职加薪吗?

    一.前言 哪个架构师没造过轮子? 你想过这样一件事吗?是先具备能力在安排职位,还是先安排职位在学习?

  5. 程序员为什么热衷于造轮子,升职加薪吗?

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  6. 程序员所说的「轮子」是什么东西?

    显然,车轮子是圆形的,这是大家公认的,最合适的形状. 而你非要发明另一种形状的轮子,这种行为就叫「重复发明轮子(Reinventing the wheel)」,即「造轮子」-- 明知道你做的不可能比前 ...

  7. 不服丨月薪10k程序员vs月薪40K的程序员

    程序员的薪资一直是大家关注的焦点,对于一个起薪基本上在10k的行业来说,程序员也是分等级的. 不同等级的程序员处理问题的方式与他们的薪资直接挂钩,接下来小编就带着大家一起看一下月薪10k.20k.30 ...

  8. 月薪10k和40k的程序员差距有多大?

    程序员的薪资一直是大家关注的焦点,相较于其他行业,程序员的高薪也是有目共睹的,而不同等级的程序员处理问题的方式与他们的薪资直接挂钩. 接下来就一起看一下月薪10k.20k.30k.40k的程序员面对问 ...

  9. 在中国程序员还是青春饭吗?35岁危机?头发见光,工资不涨?亲身经历!(内容太过真实)

    作者:启舰 原文链接:https://zhuanlan.zhihu.com/p/87648096 为了不给大家误导,咨询了猎头.圈内好友,以及年过35岁的几位老程序员--舍了老脸去揭人家伤疤--希望能 ...

最新文章

  1. 逻辑模型设计步骤-粒度层次划分
  2. sql server 批量删除临时表
  3. 2018第九届蓝桥省赛题目
  4. [python 进阶] 9. 符合Python风格的对象
  5. '固定' table宽度,走起!
  6. Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理
  7. 数据结构链表知识入门
  8. 网站页面增加一个简单的密码登录访问php网站源码
  9. Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)
  10. C++11标准之NULL与nullptr比较
  11. linux本地检测如何tomcat是否启动成功tomcat端口检测
  12. web安全day23:vim软件的最基本最常用操作
  13. niceScroll 滚动条的用法
  14. 绘制自己的人际关系图_如何系统的绘制自己的人际关系网络图?
  15. 【华为OD机试真题 JS】两数之和绝对值最小
  16. while(true) Thread.Sleep(XX)我通常是用这种写法,有没有更好的写法或者改进
  17. 为Android 模拟器加速
  18. Java使用对象使用属性过滤集合对象重复数据
  19. smalltalk 上手
  20. Python学习(六)Python自带IDLE使用方法

热门文章

  1. linux建ftp用户限制访问,Linux下建ftp用户并限制用户访问路径
  2. python突破反爬虫_【Python3爬虫】突破反爬之应对前端反调试手段
  3. oracle安装后再建库,oracle-数据库的安装与建库
  4. mongodb更新语句_MongoDB更新
  5. jsf tree组件_JSF表单组件示例教程
  6. scala切片_Scala切片功能
  7. TotalCommander增加回到桌面功能
  8. C++难吗?好学吗?C++到底怎么样?
  9. 为什么要用C语言实现面向对象
  10. python generator与coroutine