在這個開發者不學新技術會被嘲諷成原始人的時代,我們不乏吹捧讚嘆新技術的推坑文(不說別人,我自己就常寫)。 前幾天讀到這篇「我是一名技术总监,被技术选型给埋坑里了」 宛如清流,格外覺得痛快,切中過去幾年自己的觀察體驗,講出我說不出口的心聲。

這篇中文文章源自 Dan McKinley 2015 年的老文章 Choose Boring Technology 以及演講(投影片)。

原文作者是位技術總監,待過大公司、小公司,也自己創業過,漫談自己在「如何選擇合適的技術」上的心得。

新技術讓開發者成為熱力四射的自走砲,但...

閞發者熱愛學習與使用新技術,將馬斯洛的需求層次理論套在開發者身上會長歪。

得知要做新專案,開發者們通常興高采烈地優先討論該用何種平台,什麼語言,哪個框架,又最近剛學或想學某項新技術, 要不要拿來用?等基本需求都滿足了,最後才會想到操作動線、客戶需求、產品定位這些事情。

開發人員精力有限,接觸學習新技術需要時間精力,會排擠實際生產及解決其他重要問題的資源。

而使用新技術則有易被忽略的潛在成本。未知有兩種,一種是已知的未知(Known Unknowns),一種是未知的未知(Unknown Unknowns)。例如: 當資料庫出現效能問題,如果你已使用多年,依據經驗會猜測跟 CPU、記憶體、Disk IO 有關,甚至有茶包處理 SOP, 記滿檢查步驟與那些年我們一起踩過的雷。雖然該次問題的真實原因未知,但手上已有嫌犯清單,逐一清查通常能抓出兇手。這就是所謂已知的未知,

至於那些你不熟悉的新技術,開題引爆點可能藏在你根本沒學過沒聽過的領域,嫌犯躲在你壓根沒想到的地方, 只能靠爬文,地毯式搜索,再靠點運氣找出答案。問題多半還是能解決,但耗費時間精力及過程的幸酸,體驗過的人都知道。這就屬於未知的未知。

而新技術與舊技術相比,未知的未知比例高出許多,換個通俗講法,就是有踩不盡的雷跟摔不完的坑。

歷經一段時間學習與經驗累積(踩的雷夠多之後),未知的未知才會下降,但這段路程需要付出可觀代價。

選用技術的成本效益分析

作者用問題與技術的關聯圖闡述選用技術如何形響開發成本。

技術是用來解決問題的,學習與掌握一項新技術需要付出成本,但應用技術解決問題多半能加速開發,得到一些效益。

所有的問題都該被解決,故:

總成本 = (解決問題1的加速效益+解決問題2的加速效益+解決問題3的加速效益+...) - (掌握技術A的成本+掌握技術B的成本+掌握技術C的成本+...)

在真實世界裡,引進一項新技術的成本常常比我們想像來得大。 因此,使用愈少種技術解決愈多問題可獲得最大投資效益。那些我們已經熟知的老技術(例如:jQuery), 無聊歸無聊,重複使用它們解決新問題只增加少許成本(面對新挑戰可能需要研究進階技巧) 即可換取解決問題的效益,是門划算好生意。

技術多元化的「坑」

開始學習一門新技術不難,難的是對它的掌握度提升到專業水準,因應長期維運常會遇到各式挑戰。 魔鬼在細節裡,有許多東西是寫 Hello World 時會想到的。 若放任開發團隊自由選用自己偏好的技術,很容易演變成災難。

作者舉了一個實例,在開發某項功能時決定不引進新資料庫 Redis,而是寫一堆程式維護記憶體快取, 搭配現成已有專人維護的共用 MySQL 資料庫平台。幾年後,開發團隊早把它忘了在忙其他專案, 某天才驚訝發現該功能的使用量不知不覺間已成長 20 倍,系統卻不需要修改, 全靠共用平台的維護人員默默地擴充了機器。 若當年為此新建 Redis,在成長過程中一定會面臨到瓶頸,被迫處理資料庫擴充事宜。

選定技術建立共用資源,投入必要維運資源確保其穩定性及可用性,會有不錯的效益。

如何選擇新技術?

但講了這些,不意味著我們不該引進新技術,重點是「慎選」!

簡單地說,就是大家一起討論,達成共識。採用新技術涉及公司整體利益,不是工程師個人的事。 討論時可聚焦在「如果不用新技術,我們可以怎麼解決這個問題?」 覺得不用新技術就無法解決問題,常常是因為我們想得不夠多。(或是潛意識裡想讓新技術黃袍加身) 仔細思考後,多半能找到解決方法,或許有點費事看起來有點醜,但肯定比不上引進一項新技術帶來的麻煩。

當然,也有另一種可能,在評估所有考量後,發現採用新技術利多於弊,是當下較佳的選擇。 此時別急著砍掉重練,最好循序漸進,一次修改一點試水溫,逐步建立信心, 並保留退回上一步的空間,將風險降到最低。

新技術成功引進後,則儘可能把舊技術汰換掉,避免同時維護兩種技術。

為什麼我們總是見異思遷?

作者提了一個有趣的理論,在落實應用(不只是嚐鮮)任何新軟體、新技術的初期, 你會遇到很多問題(Kink 的意思是糾結、抽筋,也可想成踩雷、摔坑), 隨著時間演進,謎團會逐一解開,知識經驗累積,問題會愈來愈少。

但通常我們沒那麼多耐心,在線上環境跟各式茶包博鬥一陣子後,聽到最近有個看起來很酷的新技術, 就會想著「XXX 的毛真多,下回我們改用 OOO 好了」。

如果在此階段跳船,你永遠沒機會體驗「精通階段」的美妙境界,發生任何狀況都是兵來將擋水來土掩, 令人煩心的見鬼問題消失無蹤。

反過來想,會覺得 XXX 毛真多,不也意味著你對它了解夠深? 只是人類習慣忽略好的一面,過度放大痛苦點,紅玫塊成了牆上一抹蚊子血, 對新技術則充滿過度美好的想像,宛如床前明月光。 事實是,那些你沒用過的新技術,存在很大一塊未知,裡面也藏了滿滿的痛苦點,這些都要等你切換過去才會發現。

技術選用心法

總結選用技術的心法:

  1. 選擇大家熟知的技術(Proven Technology)。
  2. 精選幾項好技術,試著用它們解決所有問題
  3. 精通你使用的工具,努力把技能點好點滿,不要輕言跳船
  4. 選擇新技術必須依循程序,大家一起討論是個好方法
  5. 試著在 Maslow 需求金字塔向上爬,從全局看問題,而不是只關心選什麼框架,用哪一種DB

Some thoughts of when and how to add new technology to your tech stack.


Comments

# by jk

倒覺得這中間要有一部分是,團隊固定對於新技術的共同學習與 PoC 試做。 有個好處是至少在職涯發展上,不會因為公司政策關係限制了自已職涯發展只能拘泥在舊技術上 XDD

# by Huang

何必老拿user當白老鼠?簡單成熟才是王道,原味最好。

# by wellxion

所以一般來說引入新技術都要先做前期技術驗證和POC吧? 不然直接全部專案都投入爆炸是常有的事 至於拿user做實驗... 不管用不用新技術都會發生不是?

# by 卡比

固封在舊有技術,瓶頸落在當時未知的限制;新技術一般只因為自己未探知,只要不太新的很多很完善。試過幾次轉編碼,學習是很痛苦,但空間比以前闊很多

# by SY

就只是選擇的問題,開發成本分成很多種,金錢成本、時間成本、開發者的痛苦成本,就像是為了省下MS的$$而使用文字編輯器寫程式一樣。 可以寫嗎? 可以 有省錢嗎? 有 痛苦嗎? 我在寫離職單了

Post a comment