論要不要重複造輪子

在程序界有一句話很流行,不要重複造輪子。然而,這句話被濫用了。已經漸漸淪爲程序員懶惰的藉口。甚至因此而盲目指責那些勤奮的人。
    大多數情況下初學者很難分清楚自己是不是在重複造輪子。當我頭一次聽到這句忠告的時候,我變得異常敏感,在做什麼之前都要判斷一下是否在造輪子。我跟大多數普通人一樣,容易受到他人隻言片語的不良影響。事實上很多時候,避免造輪子並不是我的首要目標。我的目標是完成一項任務,任務完成的速度要儘量快,質量要儘量好。而不是去判斷自己在不在造輪子。
    使用他人的現成輪子是實現快速任務的一項捷徑。然而,並不總是這樣子的。重複造輪子的正面是另外一句行話:吃自己的狗食。在涉及到關鍵技術點的地方,依賴他人的輪子容易造成高風險。高風險的原因在於:第一、它不是你寫的。憑藉註釋和教程獲得支持很有限,當需要功能拓展或者定製時,用起這個初期看起來很好的輪子反而變得礙手礙腳了。第二、當依賴輪子程度比較高的時候,那麼它容易限制自己的思維。有些功能用輪子很難拓展,我們會推脫說輪子產生限制。反而不去思考這些功能的提出是否合理。第三、輪子可能是個一次性產品,輪子的開發者不願再花時間維護。輪子不能與時俱進,那麼就會被淘汰。因此你的產品也會遭到淘汰。“吃自己的狗食”的優勢便是上述情況的反義。善於吃狗食的人,並不滿足應用輪子做事,他們也會樂於閱讀不同輪子的源碼。去粗取精,博採衆長。最終寫出屬於自己的鋒利輪子,達到期望的目標。
    除了在關鍵技術點儘量不要使用他人的輪子。還有重要一點,那就是不要被“重複造輪子”這句話嚇怕了。windows有現成的記事本和掃雷,但是每年還是有成千上萬的大學生樂此不疲的編寫記事本和掃雷程序。更有喜歡折騰的人嘗試自己實現紅白機上的經典遊戲。實踐是最好的老師,學生們並不是在重複造輪子,而是以提高爲自己的目的。許多開源項目的初始目的並不只是爲了做出一件產品,而是爲了學習。高手們都明白實踐出真知的道理,只是他們實踐的技術含量更高而已。所以,千萬不要被輪子嚇怕,更不要以“輪子”爲藉口拒絕學習成長。
    上面我說了濫用重複造輪子的幾個情況以及他們的危害。現在我想將自己的一點小小心得介紹出來——到底什麼時候不要重複造輪子?
    若我有天想去九寨溝旅遊,我想要選擇租車自駕遊,我肯定不需要關心汽車是怎麼工作的。汽車對我來說只是個工具,因爲我的目標是旅遊。情景發生轉變時,一切就變得不一樣了。假如我是個汽車設計師,我想測試汽車在九寨溝的山路上能否平穩駕駛。那麼我不該關心九寨溝的旅遊景點有哪些,而應該關心汽車的內部構成怎樣,有沒有問題,能否改進。
當使用輪子是爲了達成一個日常任務,或是以一個工具形態出現的時候。那麼請不要重複造輪子,除非爲了學習目的。我常常督促自己多多學習一些shell命令,這樣可以避免自己寫出一堆輪子腳本。同樣的,當我有個新奇想法的時候。我常常會上網搜索有沒有朋友已經實現,若有的話直接使用現成的輪子即可。如果沒有,那麼我只有親力而爲,自己去實現。
    有時候我會突然興沖沖的充滿野心。用數據庫用的很不爽,不是說“吃自己的狗食”嗎?那麼把它寫出來吧!當然最後一籌莫展,因爲這對我來說太難了。也許我花上三五年時間都沒法徹底搞懂。同樣的還有寫個操作系統、寫個語言。這些東西也許最佳應親力而爲,但如果它對於自己來說過於複雜,那麼就用它吧。因爲這別無選擇。優秀的程序員不會樂於被這些困難的東西牽着鼻子走,他們會嘗試消化並改善它們。
    除了遇見這些困難的東西,有時候還會碰到一些並不困難但是很佔時間的東西。沒有必要盲目開工寫這些佔時間的東西。在仔細分析已有的幾種輪子後可以直接選擇其中最優秀的,在它不能合適工作的時候就大刀闊斧的修改它。這其中的關鍵之處在於你明白輪子工作的原理,如果願意,只要花上幾個月的時間,你能重新寫出一個來。
    市面上有很多同類產品。明明有肯德基,爲什麼還出來麥當勞、李先生之類的。有時我會爲開發產品的“山寨”而耿耿於懷,這無疑是重複造輪子的行爲。別人已經有了,爲什麼我還要做?幾乎同樣的邏輯,爲什麼要重複實現一遍?這的確是重複造輪子,但是這是必要的。原因有:1.雖然產品形態和使用技術類似,但是後臺的資源是不同的。用戶需要不同的輪子,這樣可以使市場有活力。肯德基和麥當勞雖然都是快餐店,經營方式和食品類型也差不多。但總有些微差異,而正是這份差異帶來了活力。2.平臺化、縱向發展。TX老是被網民罵抄襲,但是似乎越罵用戶量反而越高了。因爲TX造輪子有深厚的商業目的,它希望做出一個整合一切的平臺。統一的平臺給資源聚合帶來了巨大的好處,用戶也會變得更加喜歡用這個簡單好用的整合平臺。這種造輪子行爲從這個角度上說是非常有利的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章