因為是「最早」,所以這篇講的東西以經被大家(包含Google自己)用新工具給取代、或是直接給丟到垃圾桶裡面了。
文章開頭就提前告知,免得閱讀完有覺得被浪費時間的感受。
就我個人的「狹隘」經驗來看,一個專案團隊中,好像除了極少數工程師以外,沒有人喜歡「工程」「工程邏輯」「工程開發」這種東西。
就連工程師自己——以Android開發來看——會喜歡、會鑽研、會用工程角度去思考的也慢慢變成少數。(或是說單純的「不講這套的工程師太多了」。)
因為.......從PM或某些管理者角度來看,商業邏輯的進度好掌握,可能每週都可以看到工程師工作的成果穩定的朝著規格書的樣貌一點一點「增長」,然後固定會議上都可以有個很漂亮的進度報表展現出來,像是「A功能本週已經完成,並且可以測試。預計下週開始製作B功能,下下週可以測試。」
但如果用工程邏輯的方式......(以下的需求為舉例。)
「這個專案要求不要讓畫面因為資料傳輸讀取而鎖住,要可以在傳輸資料時持續的使用整個APP,即使離開了啟動傳輸資料的功能也要把傳輸完成、而不是終止傳輸,如果傳輸完成後當下還在啟動傳輸資料的功能,要即刻在畫面上更新資料顯示傳輸結果.........所以必須要讓資料傳輸不會被Activity限制住,能夠反應或偵測到啟動它的Activity是處於何種狀態.........」
現在有了RxJava或DataBinding,能夠上面這個要求的工程師好像變成了「只是通過基礎門檻」而已.......(等一下評論這點。)
但在沒有這些套件的年代,要做這件事情必須要(以下只是一種「我認為最簡單的」「不吃效能」「又不會造成Leaking、資料無法回收而霸佔記憶體」的策略)「將所有資料傳輸都交給某個Service執行,而Service執行完任務不呼叫CallBack,而是發出Intent給BroadcastReciever,將所有更新資料任務都交由Broadcast執行,如果BroadcastReciever中不存在對應Intent的任務,就不會有事情發生。所有的任務會有Stack/List/Map的方式公開讓所有Context進行存取刪除............」
只是如果這樣做,大概兩個禮拜就過去,這兩個禮拜中間每天都會看到PM氣呼呼地跑來質問工程師到底都在做些什麼、為什麼都沒有東西可以展示、為什麼專案永遠只有一個空畫面和意義不明的按鈕......
學漫威來個「If...」吧!
如果這個專案當初碰到一個完全不知道、沒想到、想到了也不敢做(我上述列出的工程架構)的工程師,凡是碰到連線就只想著去弄個Volley/OkHttp...之類的套件,然後「Activity關閉時就把Activity夏啟動的連線終止」、再順便跟PM「討論」說「這個需求技術上真的不可行、不穩定、不可靠!請重新跟客戶討論吧!」
然後.......可能經歷過一兩次這樣的需求、換過三四個工程師後,PM們會自以為很專業的學會了「哎~Android做不到啊!客戶提出這種需求時就擋下來吧!」
真是「美好」「和諧」「大家都感覺很良好」的發展啊!
但事實是........
PM會自以為很專業的在會議上把Android工程師叫起來,自以為很專業的說「你真的認為客戶這個要求辦得到嗎?」然後傻傻沒進入狀況的工程師會挖挖鼻孔心裏好奇「你們找我來不就是要我做這些事情嗎?」、嘴巴講「當然,有點難度,但絕對可以做。」
然後.........(倒帶!快速回顧接下來兩個禮拜PM整天抓狂的畫面。)等過了兩個禮拜後,連線核心完成,開始施作「可以讓客戶實際看到摸到的功能」時......第一週,PM會繼續罵「專案從一開始進度就慢了兩個禮拜!請你再快一點!(而且連線功能肯定會出問題!效率這麼差的工程師是能做好什麼啊!)」......第二週,PM會繼續罵「專案從一開始進度就慢了兩個禮拜!請你再快一點!(而且連線功能肯定會出問題!效率這麼差的工程師是能做好什麼啊!)」......第N週,PM會繼續罵「專案從一開始進度就慢了兩個禮拜!請你再快一點!(而且連線功能肯定會出問題!效率這麼差的工程師是能做好什麼啊!)」......專案開始驗收前,PM會繼續罵「專案從一開始進度就慢了兩個禮拜!請你再快一點!(而且連線功能肯定會出問題!效率這麼差的工程師是能做好什麼啊!)」......專案驗收結束,PM會請工程師進小會議間,語重心長的說「專案從一開始就很不穩定,我個人審慎評估後認為問題都出在你的沒效率上,所以你就做到今天。請去打包然後準備跟坐你隔壁的新工程師XXX交接一下你完成的東西.....」
…………….
這樣的專案算是成功還是失敗呢?
(By the way,兩個月後,PM助理很客氣地打了電話來找被離職的工程師說「可以請你跟工程師XXX講解一下你的框架原理嗎?他說他不懂這種技巧.........」)
(對了,上面提到了一個連線功能的模組,這模組在概念上算是Android比較早期、也比較基礎的設計框架。但印象中,從沒在官方釋出的範例中看過它,也沒有任何Guide文件中說明過它,更不可能為它提出個專有名詞來定義。)