輪子還是要重復(fù)發(fā)明的

“不要重復(fù)發(fā)明輪子”,很多開發(fā)者在新入行不久,就經(jīng)常會被這樣叮囑:這個世界上程序員已經(jīng)太多,遇到的問題已經(jīng)夠多,而解決方案層出不窮。你走過的路,跳下的坑,已經(jīng)有無數(shù)的先驅(qū)在你之前路過,跳過。

所以在做技術(shù)選擇的很多時候,你不需要自己從頭去實現(xiàn)一個東西,就可以在現(xiàn)實世界中找到現(xiàn)成的趁手的利器,小到一個類庫,工具,大到一個框架,平臺,來滿足自己的“需求”。你以為你看到了絕美的風(fēng)景,后面是一馬平川。

![Uploading logo_for_Gradle_950197.png . . .]

而這,只是不愿意拒絕懶惰和誘惑的借口,背后很可能面臨更多的困難,陷入其中不得自拔。

開發(fā)者在技術(shù)選型的過程中,很容易對已有的神往已久的某個技術(shù)或者工具情有獨鐘。

“什么都是現(xiàn)成的,直接拿來用(一套)就好了!”

而往往忽略了它們在后期定制化需求,或者彈性及擴展方面對自己可能存在的限制。下面看兩個例子。

關(guān)于構(gòu)建工具的例子

比如Maven在Java的世界里很長時間都是主要的自動化構(gòu)建工具,它的插件化結(jié)構(gòu),提供的很多現(xiàn)成的archetype和插件,以及命令行和插件化擴展的可能讓很多程序員眼前一亮。

而隨著手頭的項目變得愈加復(fù)雜的時候,你會發(fā)現(xiàn)Maven的XML聲明式結(jié)構(gòu)和插件化,恰恰是阻礙自身伴隨項目復(fù)雜度進化的絆腳石,因為它缺乏靈活性,以及對于自動化測試實踐的支持,尤其在持續(xù)交付方面。

Ant有同樣的問題,我們不斷發(fā)現(xiàn)團隊在不可維護的Ant和Nant構(gòu)建腳本上耗費了巨大的精力。由于工具自身與生俱來缺少的表現(xiàn)力以及清晰的模塊性,這些腳本難以理解和擴展。

XML配置文件中太多讓人覺得多余的尖括號,以及粗糙的插件架構(gòu)。雖然語法問題可以通過升級換代來解決,但插件化架構(gòu)嚴重限制了構(gòu)建工具隨著項目變得愈加復(fù)雜自我優(yōu)雅進化的能力。我們發(fā)覺插件的抽象層次是錯誤的,相反我們更青睞基于語言的工具,比如Gradle和Rake,因為提供了細粒度的抽象,以及更多的靈活性。

Gradle是一個把理智帶入企業(yè)級構(gòu)建世界的嘗試,它把劃時代的技術(shù)和最佳工具組合相結(jié)合。Gradle可以讓你訪問你已有的Maven倉庫,但通過清晰的領(lǐng)域特定語言為你的構(gòu)建添加腳本功能。

logo_for_Gradle.png

相對于像Ant和Maven這樣基于XML和插件的構(gòu)建工具,像Gradle和Rake這種基于語言的構(gòu)建工具,在持續(xù)提供細粒度的抽象和更多的靈活性。這樣它們就能伴隨項目變得越來越復(fù)雜而隨機優(yōu)雅地應(yīng)對。

關(guān)于前端可視化框架的例子

另外一個例子是關(guān)于前端(可視化)框架的選擇上,一些提供了豐富UI渲染樣式的框架庫很是奪人眼球,漂亮的表格和圖表樣式,簡單的Demo示例代碼,讓開發(fā)人員都以為這是實現(xiàn)當(dāng)下棘手UI需求的不二法寶,可以極大地提高開發(fā)的效率。

比如ExtJS,開發(fā)人員在經(jīng)歷了初期的甜蜜之后,會發(fā)現(xiàn)他們很難控制Ext渲染出的HTML和DOM,而編寫功能測試代碼看起來也不太可能,尤其是當(dāng)對UI的外觀和樣式有個性化的定制變化需求時,會顯得一籌莫展。

Ext會把你限制在它的UI實現(xiàn)思想框框里面,這樣也許可以在那些不需要投資UX的團隊里面工作得很好。

Highcharts是個另外一個例子,豐富的圖表類型,以及基于提供的圖表類型的定制化功能,優(yōu)異的JavaScript引擎,對HTML內(nèi)嵌SVG文檔的支持,一度是我們在項目中選擇前端圖表展現(xiàn)庫的不二選擇:

highcharts.png

但隨著對圖表渲染的個性化UX定制需求的加入,我們會發(fā)現(xiàn)Highcharts通過公開API提供的很多靈活性,比如對于X軸、Y軸和渲染細節(jié)的定制,已經(jīng)很難滿足我們對更多圖表本身的修改,和添加新的樣式。

而這時候,如果不是讓UX設(shè)計遷就Hightcharts既有的實現(xiàn),也許更好的選擇是D3,雖然它會在開始顯得底層,需要團隊更多的精力來創(chuàng)建通用的不那么復(fù)雜的可視化元素,但這也意味著更多的靈活性,加上它的插件模型,以及像Rickshaw和Crossfilter這樣的庫支持,會讓D3比以前更具親和性。

最后

所以對于技術(shù)的官方網(wǎng)站提供的所見即所得的特性展示,簡單的示例代碼,和想當(dāng)然的心滿意足,開發(fā)者需要在接受誘惑的同時,多考慮一些在技術(shù)投資后可能存在的風(fēng)險,以及是否有足夠的支持。

需要考量的因素和角度可能但不限于:

  • 文檔和社區(qū)支持的成熟度
  • 復(fù)雜的代碼示例
  • 可能的功能性需求變化
  • UI呈現(xiàn)上可能的需求變化
  • 性能,安全等非功能性需求
  • 團隊知識和學(xué)習(xí)能力
  • 后期的維護成本

需要針對這些因素,做一一的評估和偵測,才能最大限度地保護成本的投入。

有的時候,你真的需要重復(fù)發(fā)明輪子。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,315評論 4 61
  • 知史以明鑒,查古以至今。了解產(chǎn)品的盈利模式才能為自己的產(chǎn)品指明方向,互聯(lián)網(wǎng)行業(yè)創(chuàng)造了很多新鮮的盈利模式,以前是“羊...
    游社長閱讀 1,163評論 0 4

友情鏈接更多精彩內(nèi)容