在互聯(lián)網(wǎng)項目當中,相信每一個(gè)項目經(jīng)理或者制作人,最頭疼的就是技術(shù)部的管理。因為技術(shù)工作看起來(lái)是那么的棘手,一般人難以理解,而且技術(shù)人員大多數都似乎情商不高。管理人員既不能輕易了解技術(shù)工作的內涵,技術(shù)人員也覺(jué)得很難和管理人員溝通。特別是技術(shù)工作,難以在不同人之間交接,很多技術(shù)人員都聲稱(chēng)無(wú)法繼續別人做過(guò)的項目。這讓管理者覺(jué)得技術(shù)人員特別喜歡耍大牌,而且他們要偷懶也非常容易。但正如軍事中的定理,對付坦克最好的武器就是坦克,對付航母最好的武器也是航母,這條理論是通用的。要管理好技術(shù)人員,就一定要懂技術(shù)。這是任何一種其他號稱(chēng)完美的管理方法都無(wú)法替代的。
開(kāi)發(fā)是一切——何時(shí)寫(xiě)文檔
對于技術(shù)管理來(lái)說(shuō),很多公司會(huì )非常注重文檔。雖然開(kāi)發(fā)的結果是代碼,但對于管理來(lái)說(shuō),代碼往往難以閱讀,也很少有人擅長(cháng)接手別人的系統。為了讓代碼不至于被丟棄,公司管理人員就祭起文檔這個(gè)法寶。我認為文檔是很重要的,但也發(fā)現這些文檔中很典型地存在幾個(gè)問(wèn)題:文檔和代碼不同步;文檔的可讀性差,需要的文檔沒(méi)寫(xiě),不需要的文檔寫(xiě)了一大堆;文檔和代碼脫節,文檔很多,開(kāi)發(fā)出來(lái)的成果很少。
我們應該何時(shí)寫(xiě)什么文檔,這是需要有嚴格定義,并且有檢查過(guò)程的,而不是任由大家自然發(fā)展就可以完善的。代碼的編寫(xiě)需要按不同類(lèi)型,定義好在各個(gè)階段中所需要完成的部分。
設計類(lèi)文檔—— 這類(lèi)文檔往往在項目、模塊啟動(dòng)的時(shí)候,大家都會(huì )想到要去寫(xiě),作為討論和最后決議的成果,顯然是很自然的。然而在項目進(jìn)入開(kāi)發(fā)之后,碰到實(shí)際問(wèn)題時(shí),往往就不能完全按照設計的初衷去做了,所以通常設計文檔就在這個(gè)時(shí)候和代碼脫離了聯(lián)系。但有一點(diǎn)是絕對可以做的,就是在重構的時(shí)候,按照現有狀況,重新增加重構前的系統狀況說(shuō)明,然后再添加上重構后的設計。這樣就把重構的設計和文檔的更新結合到一起了。
API(應用編程接口)文檔——現代軟件都希望能提高重用的程度,因此很多程序員都會(huì )自己構造自己的業(yè)務(wù)API,以便在之后的開(kāi)發(fā)中使用。而這種業(yè)務(wù)API,也是很多分工合作的基礎。這種代碼的說(shuō)明,會(huì )直接影響日常的開(kāi)發(fā),因此非常有必要保證和代碼的高度一致性。
使用文檔—— 一般來(lái)說(shuō),一個(gè)軟件的使用文檔必須包含以下幾個(gè):《產(chǎn)品版本說(shuō)明》、《產(chǎn)品安裝和部署文檔》、《產(chǎn)品使用教程以及例程》、《產(chǎn)品FAQ文檔》。這里面的《產(chǎn)品版本說(shuō)明》應該在每次發(fā)版的時(shí)候,作為發(fā)布流程的一個(gè)固有環(huán)節來(lái)設計!懂a(chǎn)品使用教程以及例程》是我認為所有文檔中,最值得花大力氣去寫(xiě)好的!懂a(chǎn)品安裝和部署文檔》內容越少越好,應該讓安裝部署盡量智能化、自動(dòng)化。
了解什么是軟件架構
了解軟件架構的范疇,才能有針對性地去把握軟件開(kāi)發(fā)中的風(fēng)險,從而管理好軟件開(kāi)發(fā)的過(guò)程。簡(jiǎn)單來(lái)說(shuō),軟件架構就是應對需求所產(chǎn)生的“一系列決定”。軟件會(huì )根據這些決定來(lái)開(kāi)發(fā)。根據軟件需要應對的需求,軟件架構一般包含以下幾個(gè)部分。
邏輯架構 主要是為了明確“功能性需求”而做的設計,針對需求以及需求變化作為架構目標所做出的關(guān)于代碼之間的劃分、耦合、關(guān)聯(lián)的決定。采用合理的邏輯架構,將會(huì )大大降低需求變更對開(kāi)發(fā)的延遲作用。邏輯架構最直接指導代碼中互相耦合的情況,仔細設計好耦合的規則,會(huì )讓后續開(kāi)發(fā)事半功倍。
運行時(shí)架構 運行時(shí)架構是為了滿(mǎn)足運行期的質(zhì)量需求,所做出的關(guān)于對象行文、進(jìn)程結構、通信協(xié)議、數據結構等方面的決定。運行架構一旦確定,等于大部分的“實(shí)現”代碼都確定了,設計有足夠擴展性和可用性的運行架構,可以為后續工作節省時(shí)間,也降低了系統在運行期對開(kāi)發(fā)工作的干擾。
開(kāi)發(fā)架構 為了滿(mǎn)足開(kāi)發(fā)時(shí)的需求所做的決定,主要是軟件根據分工開(kāi)發(fā)、測試驗證流程等需求劃分的軟件層次和區域以及各種接口設計,也包含使用的軟件包、組件庫、開(kāi)發(fā)工具,以及編譯構建的方法。一個(gè)好的開(kāi)發(fā)架構,可以讓溝通成本降低,開(kāi)發(fā)速度提高。
部署架構 現代軟件系統,基本上都包括了客戶(hù)端和服務(wù)端程序,如何快速、高效、穩定地部署和發(fā)布這些程序,如網(wǎng)絡(luò )機房的分布、服務(wù)器硬件的搭配、監控和維護工具軟件的安裝、開(kāi)發(fā)測試網(wǎng)絡(luò )和運營(yíng)網(wǎng)絡(luò )的設置?梢垣@得安全性的配置,良好的部署能力,能推動(dòng)軟件進(jìn)行更頻繁、更全面的測試,從而提高軟件質(zhì)量和開(kāi)發(fā)效率。
數據架構 數據是軟件項目的核心財富,關(guān)于數據的結構,數據的存放、備份、傳輸會(huì )直接影響到運行性能、業(yè)務(wù)功能、部署、安全等需求。在面向對象的開(kāi)發(fā)模式下,數據到對象的ORM架構也是很重要的設計。一個(gè)完整的數據架構包括了數據流圖、數據字典、ORM結構(如果需要的話(huà))、數據索引和備份機制等幾個(gè)方面。
何時(shí)以及如何評審
相信大部分公司都有評審這個(gè)環(huán)節,評審可以包括方案評審、代碼評審、項目專(zhuān)項議題的評審,比如對存留Bug的處理評審等。而這些評審,常常會(huì )變成一個(gè)挑毛病的會(huì )議。要解決評審給產(chǎn)品帶來(lái)的負面影響,同時(shí)發(fā)揮這個(gè)活動(dòng)的優(yōu)點(diǎn),我們需要關(guān)注以下幾個(gè)方面。
評審由誰(shuí)發(fā)起 相對比較好的是,由負責此項目的“領(lǐng)導”來(lái)召集人員評審,并且一定要有負責開(kāi)發(fā)的人員參加評審。參與評審的受邀請人員可能會(huì )與方案提交者就一些問(wèn)題有分歧,但提交者有最終決定權。要把權力給有能力承擔它的人。這樣做可以讓“防止風(fēng)險”的一部分人和“注重效率”的開(kāi)發(fā)人員形成平等的意見(jiàn)交換。
什么時(shí)候做評審 應該在每個(gè)迭代、每個(gè)較大的版本開(kāi)工前,或者僅僅是某個(gè)認為比較重要的決定做出前,都來(lái)一次簡(jiǎn)短的評審。如果開(kāi)始時(shí)只是做一個(gè)DEMO,那么需要評審的東西也比較少,而隨著(zhù)不斷的開(kāi)發(fā),評審也能遍歷所有的開(kāi)發(fā)。
做評審的方法 真正對項目有幫助的,是了解項目的需求,分析面臨的難點(diǎn),思考方案為何這樣做,提出自己的解決方案,給項目開(kāi)發(fā)者以建議和啟發(fā)。多說(shuō)“我建議這樣解決這個(gè)問(wèn)題”,而不要僅僅去說(shuō)“這樣做可能有問(wèn)題,應該添補這樣的功能”。以建設性的心態(tài)和思路去做評審,而不是以找問(wèn)題的思路去做,這就是兩種做法的最大區別。
分層開(kāi)發(fā),盡快運行
為了降低軟件耦合給開(kāi)發(fā)帶來(lái)的負面影響,正確的做法是要高度重視軟件開(kāi)發(fā)方法,從代碼風(fēng)格、軟件架構、設計模式、開(kāi)發(fā)模式方面來(lái)提高水平。其中一個(gè)最簡(jiǎn)單有效的做法,就是分層。在經(jīng)典的架構模式中,分層模式幾乎是所有模式的基本模式:把代碼按照你所需的范圍劃分層次,然后規定層次之間的耦合接口,層次之間只可單向依賴(lài),而且盡量減少跨層耦合。劃分層次的范圍,由你的開(kāi)發(fā)團隊水平和項目的復雜程度決定。
非功能需求決定成敗
世界上類(lèi)似的項目非常多,但成功的占少數,失敗的占多數,這種現象的背后有一個(gè)重要的原因,就是非功能需求。非功能需求具體包括:軟件開(kāi)發(fā)效率的相關(guān)需求,比如代碼結構、代碼風(fēng)格、內容開(kāi)發(fā)工具、自動(dòng)構建部署工具;軟件的質(zhì)量穩定性的需求,如測試方面的需求,產(chǎn)品結構對于缺陷的防范,代碼質(zhì)量;軟件的運行承載力需求,包括可用性、容災性、可維護性、承載力、運行性能和成本需求;軟件的信息搜集方面的需求,如故障上報、數據統計和挖掘。
如何才能做好這些非功能需求呢?
首先是在項目成本規劃時(shí),分配足夠多的資源,比如人力和時(shí)間,去做好這個(gè)事情;其次是要盡量合理地規劃和設計這些非功能需求,既不能貪多求全,也不能無(wú)所作為。
追求代碼質(zhì)量
代碼質(zhì)量不高帶來(lái)的危害包括人員流動(dòng)后沒(méi)法接手、Bug頻繁出現、效率問(wèn)題難以定位、開(kāi)發(fā)速度慢等。
什么樣的代碼才叫高質(zhì)量的代碼?代碼質(zhì)量存在一個(gè)唯一標準,就是可閱讀性?勺x性好的代碼,結構通常更簡(jiǎn)單清晰,Bug也少;更多人愿意去閱讀的代碼,也會(huì )有更多的機會(huì )去改正Bug以及其他的缺陷?勺x性好,也意味著(zhù)你能更簡(jiǎn)單地去找到改進(jìn)性能的方法,減少修改代碼帶來(lái)的風(fēng)險。
提高代碼質(zhì)量的手段,最簡(jiǎn)單的兩條,一是執行代碼規范,二是進(jìn)行代碼評審。除了規范制定和評審外,組織學(xué)習代碼質(zhì)量的知識,提倡并獎勵高質(zhì)量代碼的人員,也是提高代碼質(zhì)量的有效手段。
搭好測試這個(gè)安全網(wǎng)