App開發,怎樣又快又穩又清晰

開發者的價值,是通過技術和產品體現的,對于App開發來說,除了實現業務之外,最重要的莫過于開發的速度、質量和可維護性,速度決定你能否支撐公司搶占市場,質量決定你們能不能站穩位置不被迅速踢走,可維護性決定你們繼續前行時能否保持輕快的步伐。

速度、質量和可維護性

對速度、質量和可維護性的要求,其實就是又快,又穩,又清晰的要求。

  • 快:快其實是最容易做到,或者說最容易知道能不能做到的事情,熟悉的Android開發的朋友都知道,如果能理清業務邏輯,不受干擾地投入開發,開發速度可以很快,一般普通規模的App,一到兩周就能完成。
  • 穩:穩不像快,可以簡單地用時間進行即時的量化評價,我們要等大量bug出現之后,才知道穩不穩,可是一般趕工速度一快起來,就很容易出現大量bug。其實Android常見問題無非是內存、異步、響應等,要排除和解決這些問題很容易,難的是怎樣確保不出現這些問題。
  • 清晰:清晰是最難做到的,快可以通過時間量化,穩可以通過bug統計量化,但是清晰是很難量化的,代碼審查和可擴展性都是主觀評價,而且相當滯后,很多情況下,往往要等到需要實現擴展,甚至換人接手代碼時,才知道代碼不清晰。

對于開發者來說,怎樣才能又快又穩又清晰地開發App,這里梳理了我的幾點心得。

有限參與業務設計

從職責分工上,業務設計是運營部門和產品經理的工作,確實不應由研發負責,但我說的是參與,研發(包括測試)應當盡早參與業務設計,一方面提前發現問題,另一方面可以引導和建議技術路線。
研發參與設計,可以規避很多問題,例如通信壓力、加載速度、延遲時間、硬件負載等移動開發特有問題,不能指望運營和產品能像專業的研發一樣面面俱到,考慮周翔。
另一方面,研發參與設計還可以引導技術路線,例如采用原生App、混合App還是ReactNative形式,采用單用戶體系還是多用戶體系,采用什么收費形式等。
在實際操作中,業務設計諸如收費形式,異常提示,乃至于業務邏輯上的嚴密性,你都可能發現漏洞。

當然,參與設計必然會占用研發時間,有人會覺得委屈,感覺這是替產品做了他們的工作,但其實研發參與設計,省下的還是自己的時間,因為無論產品如何設計,最終都需要技術來研發實現,如果設計上出了問題,你修改代碼的投入,可比產品改文檔的那點兒投入大多了。
當然,公司層面也應有清楚的定位,研發對設計的投入,必須是有限的指導性的,如果大量把研發投入到設計工作,就是另一種形式的浪費了。

異常處理

在實際開發過程中,除bug其實占了相當一部分工作量,有時候好好的開發計劃,因為幾個詭異的bug就得耽誤半天,所謂“碼字5分鐘,排錯兩小時”是也。所以,能否盡早盡快處理異常,是非常影響開發效率的。
處理異常,我有這么幾條心得:

  • 提前考慮異常處理,在寫正常流程的業務代碼之前,先考慮異常,“未慮勝,先慮敗”,沿著業務流程分支,先把異常情況都處理掉,例如獲取在線數據顯示一個列表,先考慮網絡異常、服務器報錯、數據失敗等異常情況,并依次給出相應提示,最后才處理數據正常的情況,你本來就要寫正常業務代碼和異常處理代碼,你只需要調換一下工作的先后順序,其實你投入的開發時間沒有增加,但是你的效率卻大大提升了,因為一旦出現異常,我們可以迅速判斷異常原因,節省大量時間。
    這樣做還有一個好處,在你的思維陷入復雜的業務邏輯之前,先處理相對簡單的異常分支,可以避免你被業務邏輯搞到大腦缺氧后,再回來處理異常分支時一時疏忽手滑,寫錯或者寫漏異常處理。
  • 隔離前后臺對接的數據接口,最好不要直接使用后臺提供的數據,中間加一層映射,一方面,如果后臺數據出了問題(數據異常、變更字段等),你在映射數據時就能發現和定位問題;另一方面,也有利于你采用更適合App的數據形式進行數據持久化。
    另外,建議做一個接口錄入與檢查工具,形式不論,但要能輕松地維護前后臺接口,最好能自動檢測接口反饋是否正常(服務器負載過大、字段變更、第三方服務過期等)。
  • 異常信息的收集、匯總和數據持久化
    如果出現異常,最重要的是采集到異常代碼行(如MainActivity第61行)和異常原因(如空指針異常),并記錄為本地文件以備上傳和查看,具體見App的異常崩潰處理

其實java的異常處理的內容還有很多,感興趣可以看一看我以前總結過的Java異常捕獲的設計原則

結構分層

使用框架是必須的,Model層,View層必須職責單一,至于使用MVP、MVVM還是別的什么就看個人偏好和項目需要了。
個人比較偏好MVP,感興趣可以看一看MVP框架的演化,當然,Rx鏈式編程也不錯。
個人在結構分層上,有這么幾個經驗:

  • 高內聚的數據層,把與數據讀寫相關的處理,網絡讀寫、本地讀寫、緩存數據等,包括模擬數據,都集中到數據層,通過回調或鏈式調用等方式拋出數據給業務層,通過多版本機制切換模擬數據和真實數據。
  • 松耦合的Activity,界面應該是與業務相關最低的,主要提供一個顯示載體,并觸發生命周期處理,Activity應該可以很容易地被替換掉。
  • 獨立且方便測試的業務層,業務層應該可以實現自動化測試,這非常重要,即使你不去實施自動化測試,把代碼寫成可以自動化測試的,也能幫你優化代碼,該抽象的抽象,該剝離的剝離。
  • 必要時抽象特殊控件,如果控件需要復用,就不要讓控件融合進Activity,而是抽象為獨立的顯示控件,這樣既能解耦合,又方便復用。

不要過度設計

敏捷開發里有一個實踐原則,就是不要過度設計,開發的價值不在于寫出漂亮的代碼,在于實現產品并支撐其正常運轉,在能實現產品功能的前提下,代碼邏輯其實是越簡單越好,簡單往往就意味著高可靠性+低維護成本,如果將來需要擴展功能,可以通過修改和重構實現。
當然,簡單并不意味著隨意,要把事件做復雜很容易,要做簡單卻很難。能做到邏輯清晰、線程安全、內存安全,又容易修改和擴展的同時,還能保持代碼簡潔,其實反而更考驗功力的。
其實不僅在開發新功能時要避免過度設計,在維護和擴展舊代碼時,也要注意,能正常運行的代碼,都是好代碼,我覺得在維護舊代碼時,其實也適用開放封閉原則,對不得不改,不改就崩的舊代碼,是開放的,可以修改的;對能正常運行的代碼,哪怕你覺得再難看再手癢,那也是封閉的,是不可以修改的。
回到那句話,開發的價值不在于寫出漂亮的代碼,在于實現產品并支撐其正常運轉。

通用庫的建立與維護

我們知道,項目管理有四個要素,時間、成本、范圍、質量,這四個要素一般是不能兼得的,要時間,就得砍一些范圍的項目目標,降成本,就容易犧牲質量,等等,不過,建立和維護通用庫,卻能同時對四個要素都有好處。

  • 加快開發速度,專注于具體業務(時間)
    降低團隊成員熟悉項目的成本,為新業務開發提供基礎,加快開發迭代速度,有利于更快地發布版本
  • 提高代碼復用率,降低開發投入(成本)
    穩定的公共模塊采用依賴組件庫方式,提供給各個業務線協作使用,減少重復開發和升級維護工作量
  • 提升開發效率,更容易實現項目目標(范圍)
    對已實現過的功能/業務,抽象出通用模塊,再有類似的需求,能夠迅速實現,更容易實現項目的業務需求
  • 提升產品質量,持續改進通用功能(質量)
    頻繁使用的功能/業務模塊采用組件復用方式,更有利于暴露缺陷,一處修改,多處受益,提高產品質量

工具與模板等

其實說起提高效率,前面的很多經驗因為需要在實際開發中慢慢體會,難以迅速上手,反而是工具模板,真正見效快,一次安裝,終生受益 :)
就我的經驗而言,對我開發效率幫助最大的,包括代碼模板常用配置和開發插件,以及著名的程序員在線交友網站

代碼注釋

一般來說,程序員看自己一個月前寫的代碼,是完全陌生的,我也一樣,基本上過一個月就沒印象了,但是如果要修改/擴展怎么辦,這時候,就得看代碼注釋了。
就個人經驗而言,有這么幾個地方,一定要寫注釋:

  • 接口,特別是MVP的Contract接口,這里面基本定義了你的主要業務行為,誰來加載數據,誰來顯示數據,誰觸發的下一步操作,這些內容寫明白了,以后讀代碼,只要看接口就知道主要業務是怎么回事兒了。
  • 服務、廣播等,服務和廣播因為沒有界面,容易游離在業務邏輯鏈條之外,在業務邏輯上缺少上下文,就必須有詳盡的注釋,說明其業務場景。
  • 初始化、注入等,如果自定義了一些擴展的功能或控件,要求執行某些初始化函數,或者要注入特定功能的,就必須寫好注釋,提示調用者進行必要的操作。
  • TODO,工作總要排優先級的,有些工作暫時延后,自己記錄是沒用的,團隊開發最終用的還是代碼,所以一定要寫TODO,提示開發者,這里是未完成的狀態,避免不必要的誤會和延誤。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容