搜索一下“造輪子”或者“程序員為什么喜歡造輪子”罪裹,會(huì)看到很多相關(guān)的討論,這是個(gè)老生常談的話題孝常,很多人談過了,談了很多年蚓哩。不過還是有再談的必要构灸。
“造輪子”的含義:
明知道你做的不可能比前輩做得更好,卻仍然堅(jiān)持要做岸梨。
就軟件開發(fā)而言喜颁,“造輪子”是指,“業(yè)界已經(jīng)有公認(rèn)的軟件或者庫(kù)了曹阔,卻還堅(jiān)持要自己做”半开。
在軟件開發(fā)過程中,有時(shí)你想造輪子老板卻極力反對(duì)赃份,有時(shí)你不想造輪子老板卻堅(jiān)持要造一個(gè)出來寂拆,為什么會(huì)有這種兩極狀況?
這篇文章就來討論“造輪子”這件事抓韩,包括下列主題:
- 程序員為什么會(huì)重復(fù)造輪子
- 為什么有人不讓“造輪子”
- 什么時(shí)候可以造輪子
為什么會(huì)重復(fù)造輪子纠永?
每個(gè)造輪子的程序員都有自己“不得不造”的理由。比如:
- 以為自己的需求獨(dú)一無二谒拴,現(xiàn)有的庫(kù)就是在某個(gè)點(diǎn)上滿足不了
- 老輪子沒有規(guī)格說明書尝江,或者接口太復(fù)雜,不知道怎么用彪薛,搞明白太難
- 需要在老輪子上添加新功能茂装,然而老輪子代碼難讀無人可問,不知道何時(shí)能弄明白善延,看不到結(jié)果少态,容易放棄
- 眼界有限,不知道已有這樣的輪子
- 版權(quán)原因無法使用第三方庫(kù)易遣,比如Google Android實(shí)現(xiàn)JVM(Google曾因?yàn)橐恍写a而和Oracle打官司)彼妻,比如阿里YunOS自己實(shí)現(xiàn)JVM
- 就想鍛煉自己,因?yàn)樵燧喿訉?duì)自己的設(shè)計(jì)豆茫、編碼能力有很大好處侨歉,對(duì)理解業(yè)務(wù)也有很大好處
- 自己造輪子,有“控制感”揩魂,看得見摸的著幽邓,可以一步一步來,一個(gè)一個(gè)小目標(biāo)迭代出大目標(biāo)火脉,不斷成功的小激勵(lì)牵舵,會(huì)帶給自己前行的動(dòng)力
- 創(chuàng)新成分多(對(duì)自己而言)柒啤,有成就感
- 不相信老輪子,譬如老輪子可能有后門畸颅、漏洞(想想OpenSSL的心臟出血漏洞)担巩、后期萬一要修改沒把握等,反正是覺得自己造輪子心里更踏實(shí)
- 不想讓自己產(chǎn)品的關(guān)鍵技術(shù)掌握在別人手里没炒,也不想讓自己的核心用戶數(shù)據(jù)流經(jīng)別人的系統(tǒng)
- 別人的輪子不開放涛癌,我就是要趕緊造(山寨)一個(gè)出來以便獲得話語權(quán)或商業(yè)利益
為什么有人不讓“造輪子”
有堅(jiān)持要造輪子的,也有高呼“不要重復(fù)造輪子”的送火。那為什么有人不讓造輪子呢拳话?
- 項(xiàng)目(產(chǎn)品)時(shí)間緊張,用第三方庫(kù)搭積木快漾脂,能節(jié)約時(shí)間
- 領(lǐng)導(dǎo)上(或隊(duì)友)認(rèn)為想造輪子的程序員水平就那樣假颇,不可能造出比現(xiàn)有庫(kù)(軟件)更好的輪子,顯然會(huì)漏洞百出推高維護(hù)成本
- 造輪子是個(gè)看上去很美做起來很操蛋的事兒骨稿。復(fù)雜一點(diǎn)的輪子笨鸡,造出來很費(fèi)勁,道阻且長(zhǎng)坦冠,很可能騎虎難下或半途而廢形耗,導(dǎo)致精力和時(shí)間的浪費(fèi)
- 待造的輪子不是產(chǎn)品的關(guān)鍵(比如一個(gè)字符串類、一個(gè)XML解析類)辙浑,不屬于核心競(jìng)爭(zhēng)力激涤,不值得花費(fèi)人力,要把精力放在最重要的事情上
結(jié)合為什么要造輪子以及為什么不讓造輪子判呕,就可以理解本文一開始提到的那種反差極大的狀況倦踢。
什么樣的輪子可以重新造?
看現(xiàn)在的軟件發(fā)展趨勢(shì)侠草,越來越多的基礎(chǔ)服務(wù)能夠“開箱即用”辱挥、“拿來用就好”,越來越多的新軟件可以通過組合已有類庫(kù)边涕、服務(wù)以搭積木的方式完成晤碘。這是趨勢(shì),將來不懂開發(fā)語言的人都可以通過利用現(xiàn)有軟件組件快速構(gòu)建出能解決實(shí)際問題的軟件產(chǎn)品功蜓。
在這種趨勢(shì)下园爷,軟件(服務(wù))就慢慢演化為兩極:
- 滿足終端用戶的應(yīng)用類產(chǎn)品
- 解決軟件產(chǎn)品通用問題的基礎(chǔ)服務(wù)(組件)
比如你在自己的App中需要即時(shí)通信功能,完全可以使用融云式撼、環(huán)信童社、網(wǎng)易云信等服務(wù)快速集成。
比如你想在自己的App中添加支付功能著隆,完全可以使用Ping++或Pay++來解決諸多支付渠道的集成問題叠洗。
比如你想添加分享功能甘改,ShareSDK、友盟SDK可以節(jié)省你很多時(shí)間灭抑。
比如你想做跨平臺(tái)的游戲,使用Cocos2d-x遠(yuǎn)比自己在Android抵代、iOS上從底層從OpenGL ES干起要高效得多腾节。
比如你想讓你的網(wǎng)站支持更多用戶更多并發(fā),能夠快速部署荤牍、遷移案腺、規(guī)模復(fù)制,那完全可以借助阿里云康吵、AWS劈榨、Azure等而沒必要自己搞。
比如你想推送消息給用戶晦嵌,就可以用騰訊信鴿同辣、極光、個(gè)推惭载、百度云推送旱函、友盟等。
……
類似的場(chǎng)景很多很多描滔。這種趨勢(shì)使得一部分廠商集中精力開發(fā)基礎(chǔ)服務(wù)(組件)棒妨,一部分企業(yè)集中精力解決用戶需求。對(duì)基礎(chǔ)服務(wù)(組件)廠商來講含长,他通過解決更復(fù)雜的基礎(chǔ)問題為其他廠商帶來便利而盈利券腔。對(duì)終端軟件產(chǎn)品企業(yè)來講,他通過解決用戶問題給用戶創(chuàng)造價(jià)值而盈利拘泞,從理論上講纷纫,只要其產(chǎn)品從用戶端或第三方獲取的價(jià)值大于支出給基礎(chǔ)服務(wù)廠商的價(jià)值,生意就可以做下去田弥。
有了這樣的認(rèn)識(shí)涛酗,什么樣時(shí)候可以造輪子什么時(shí)候最好不重復(fù)造輪子就不再是問題了。
對(duì)于提供基礎(chǔ)服務(wù)的軟件廠商偷厦,很多輪子必須造商叹。因?yàn)樗峁┓?wù)給其他軟件廠商,你拿友商的組件換個(gè)包裝提供給其他軟件廠商只泼,沒有競(jìng)爭(zhēng)力剖笙。所以你看到在某個(gè)軟件服務(wù)市場(chǎng)上,會(huì)有多家企業(yè)各自在造輪子请唱,為的就是自己掌握核心科技有自己的競(jìng)爭(zhēng)力弥咪。比如提供云服務(wù)的过蹂,有阿里,七牛聚至,百度……比如提供即時(shí)通信服務(wù)的酷勺,有融云、環(huán)信扳躬、阿里云信……比如提供語音服務(wù)的脆诉,有科大訊飛、百度贷币、OKVoice击胜、Google、微軟……
對(duì)于開發(fā)滿足終端用戶的應(yīng)用類產(chǎn)品的公司役纹,很多輪子就沒必要造偶摔。比如你提供一個(gè)健身類的App,可能需要引入即時(shí)通信功能促脉,用第三就好了辰斋。
從公司的角度講是這個(gè)樣子,那對(duì)程序員來講呢嘲叔?
對(duì)程序員來講亡呵,在一開始的學(xué)習(xí)成長(zhǎng)階段,造輪子則具有特殊的學(xué)習(xí)意義硫戈,學(xué)習(xí)別人怎么造锰什,了解內(nèi)部機(jī)理,自己造造看丁逝,這是非常好的鍛煉汁胆。每次學(xué)習(xí)新技術(shù)都可以用這種方式來練習(xí)。
當(dāng)我們掌握了一門技術(shù)霜幼,可以用于實(shí)際產(chǎn)品開發(fā)中時(shí)嫩码,關(guān)于造輪子,就有了另外的劃分:
一些基礎(chǔ)的工具類庫(kù)罪既,比如String铸题,比如Xml,比如Json琢感,比如Http丢间,比如推送,比如流媒體協(xié)議驹针,重新造的必要性不大烘挫。而與業(yè)務(wù)相關(guān)的,可以嘗試重構(gòu)柬甥、再造饮六,對(duì)理解業(yè)務(wù)有好處其垄,也能更好適應(yīng)新需求。
相關(guān)閱讀: