2014年4月28日 星期一

新技術的採用,先考量成本和效益

最近發生了一件事,就是我又掉進了要不要採用「新東西」的胡同裡。這個新東西,叫作 angular js ,最後我的決定是不採用 angular js,並且把已經採用 angular js 的專案,改寫回傳統的 jquery 版本。這一篇文章就是在說明過去的經驗,以及相關的決策。

Google AppEngine (python)

好幾年前我很愛 Google ,當 Google App Engine 一推出的時候,我二話不說就買了一本書,由於白天還在上班,大概前後花了半個月的閒餘時間,換算成全職大概是2~3天吧!才把 python +  Google AppEngine 搞懂。當初更熱血的是,我把工具邦由 PHP 整個搬移到 Google App Engine 上了!當初搬過去的原因大概是:

  1. 寫 python 好像很利害
  2. Google AppEngine 上面好便宜

我來解釋理由一 ,當你做了一個決定時,你一定可以在網路上找到許多取暖文章,說 python的好:易讀、簡短、好維護、Google 都用 python。(這個跟政治還蠻類似的);而你反過來查詢你正要遺棄的 PHP ,也可以找到許多咒罵的文章。所以沒人能阻止我,我就搬過去了。理由二就不用解釋了,我當初搬過去時,每個月都不用付錢。


兩年後,在 Google App Engine 漲價了幾十倍之後,我重新思考了 python 的架構,並做出一個重大的決定:搬回 PHP。理由如下:

  1. python 很難!而且不適合用做 web 語言
  2. Google App Engine 變得很貴很貴
寫一個 hello world 要多久? 這是判斷一個新技術要採用的最佳辦法。 一個技術太難,人才就不好找。創業注重的在於你 busniess model 如何快速轉變和執行,產品的生產速度,而不是你用了多高的科技。hello world 簡單,其它地方也一定簡單;hello world 複雜,其它方法也會更複雜,debug 也就更難了。再者,python 不是 web 專用的語言,php 的 urlencode ,我上一次為了這個函數的查詢 document 大概是10年前學 php 的時候,因為太簡單好記了;而 python 就要查 document ,要先 import urllib ,又或者是 urllib2 ,而且 python 2 和 python 3 又不一樣!用 php 我花5秒鐘寫好了 urlencode ,python 我要花 50秒在寫 urlencode ,生產力差十倍!當然, hello world 只要一行和 hello world 要十行的程式,請問維護成本誰比較高呢?

angular js

記得在 2007 年,我以新鮮人的身份加入了公司,部門每週一次的資訊分享,我分享了一個正掘起的新技術,叫作 jQuery ,在學習 jQuery 之前,我也摸過 prototype js ,當時覺得 prototype js 太複雜了,而 jQuery 的新潮的 coding style ,解決和簡化了前端開發。學 jQuery 要多久?可能幾個小時就可以,在新的專案中就可以很輕易的導入。

而另一個最重要的問題是,導入 jQuery 的生產力有沒有提升?我想答案已經夠明顯了。

那再來反觀 angular js ,當初我先請同事用 angular js 在新的專案導入,同事寫好了 angular js 版本的程式,在專案尾聲時,我要做 code review ,才發現我看不懂!於是我花了一個休假日,跟著 angular js 官方的tutorial 做一遍,我理解了 angular js 了嗎?我只能說,如果有一個三天的前端程式,我可能要花五天來進行導入。又花了一個下午的時間來研究同事的 angular 版本的前端程式,做了幾個重大的 comment:
  1. 因為 SEO 因素要把 angular 改成半殘:angular 用 js 透過 template 來產生 html,不能這樣用!因為 SEO 不好,要改!
  2. 因為效能考量又要把 angular 漂亮的 data model 給改壞:採用了兩個 data model 來顯示兩件不同的東西,但這會造成 2 個 ajax requests,要合併為一個
  3. 把 angular 漂亮的 angular service 改成四不像:由於 data model 的資料是來自 server ,所以在頁面 load 出來的時候,angular 會透過 ajax 來要資料。但 mobile 上 request 很珍貴,不能這麼做!也就是說 第一個 ajax 的資料要和頁面一起載入
上述的理由讓我們難以採用 angular js ,再來反觀 angular js 的本質

  1. 前端程式用 MVC 切開,程式碼並不會變得比較短。
  2. angular js 並不會讓成本降低,因為
    1. 學習的曲線很高
    2. 程式碼並不會比較短。
    3. 維護也相對比較複雜

於是最後決定:放棄導入,改寫回傳統的 jquery style ,以利後續維護。

結論

技術開發和導入是不一樣的。當前的新技術很多,像是 nodejs、angularjs、backbone js、laveral php、RoR 等...,但導入就要有實質的成本和效益的考量,兩個工程師多花一週來學習、導入、轉換等於多花了少錢?新的技術都會說明自己可以解決很多問題、提升很多問題。就像是保健食品一樣,你吃了這麼多年真的有變強壯嗎?

導入的另一面則是開發,開發可以重覆使用的 library 。 工具邦自己專有的 library 就有五個以上,這些 library 是依據我們專有的需求來開發的,我們會先尋找 open source 有沒有相關的解決方案,沒有,我們再自行開發!預計還有很多  library 要開發,要花時間在自己的需求上。

接觸外頭的新技術是必要的。我知道 node.js 很多年了,始終沒有去接觸,因為想不到能為工具邦帶來什麼轉變。直到最近 phantom js,才為此眼睛一亮,因為似乎可以用來偵測頁面上的 javascript 是否會發生錯誤,可以解決長久以來的問題。