我的一家咨詢客戶為郵電做軟件項目,對于不同的項目,雖然項目不同,但是都是郵電行業(yè)的,或多或少都有相同的部分,但是每個項目幾乎都是白手起家,從零開始。B項目的一位成員曾經做過A項目,發(fā)現A項目的部分函數可以B項目中,他就把這些函數copy過來。這么做顯然節(jié)約了他一點編碼時間,然而大家有沒有想過,如果他們能夠搭建軟件平臺框架,把很多項目都可能會用上的功能模塊識別出來,封裝成公共的基礎模塊,為各個項目所使用,會很大程度較少項目工作量、縮短項目周期、提升項目質量。
會提升質量嗎?或者有人有這樣的疑問。軟件平臺為許多產品所用,就大大增加平臺中缺陷發(fā)現的機會,有助于平臺的迅速穩(wěn)定。人的美麗不僅是外在美,內在美一樣很重要;軟件也一樣,軟件的質量不僅是外在的、用戶可以感知的質量,也包括內在的、用戶感知不到的質量,比如可維護性、可移植性的優(yōu)劣。軟件平臺之所以能夠成為平臺,通常會有精心設計的架構,提升軟件的“內在美”,而沒有基于平臺開發(fā)的軟件,通常迫于項目的進度壓力,開發(fā)人員關注的是如何把客戶需求實現了,哪里顧得上軟件的內部質量屬性。因此,基于軟件平臺開發(fā)的軟件,有助于讓軟件同時具備“外在美”和“心靈美”。
會減少工作量、縮短工期嗎?好像沒有人有疑問。但是,估計你會低估平臺所能帶來的工作量和工期的縮減程度?;谥赜闷脚_的軟件開發(fā),毫無疑問節(jié)約了開發(fā)時間,但是往往很多人忽略了測試的時間也得到了節(jié)約,維護的工作量也得到大大縮減。以維護工作為例,當修復了一個平臺bug,如果該平臺為十個產品所用,那么實際上是用解決一個bug工作量解決了十個產品的bug。
軟件平臺往往會成為企業(yè)的核心競爭力之一。比如,有些軟件項目競標,你覺得少于100萬你就會虧錢,而有的公司敢報50萬,他們還賺錢,為什么?因為人家只需要有20%開發(fā)工作量,另外80%是已有的軟件平臺。H3C在國內異軍突起,短短幾年時間已經成為企業(yè)網市場的領先者。一切都沒有偶然,H3C在市場的卓越表現是因為內部有強大的研發(fā)能力,而這種強大的研發(fā)能力的一個重要體現是他們的平臺軟件。H3C大部分軟件工程師都從事平臺軟件的開發(fā)和維護工作,而各個產品的軟件工程師相對并不多,因為各產品的軟件開發(fā)工程師要開發(fā)的僅僅是一小部分與硬件相關的驅動而已,大部分功能都由平臺軟件提供。即使驅動軟件與硬件相關,他們也盡量提出一些公用模塊,比如設備的啟動界面模塊,可見,想方設法地重用已經成為H3C的一種研發(fā)習慣。試想,如果H3C沒有平臺軟件,那么他們的軟件開發(fā)和測試人員要翻十倍或許都不夠用。
有的人會說,我們的企業(yè)不一樣,產品各異,根本不需要也可能構建軟件平臺。或許這是事實,我曾經的咨詢客戶,軟件開發(fā)人員一共不超過二十人,而編程語言就有五六種,在規(guī)范他們軟件開發(fā)過程之前,我向總經理提出了癥狀背后的一個本質問題:業(yè)務方向不明確、產品不聚焦。享譽全球的蘋果公司也只有幾款可以數得過來的產品,而我們國內很多名不見經傳的小企業(yè)研發(fā)出的產品琳瑯滿目,可是有多少賺錢的?所以,有人說了,在這個時代,管理者要學的是如何做減法,不是做加法,要成功,就要專注!如果你的業(yè)務專注了,必然就有了構建平臺的可能和需要,而一旦你構建起了強大的平臺,雖不能保證你會成為這個領域的Number one,但會使你成為這個領域的Professional。
現在,或許你已經有了強烈的構建屬于自己的平臺的沖動,但如何下手呢?下面告訴你軟件平臺DIY六步驟法。
步驟一:選擇基準產品
首先,選擇一個具有對本業(yè)務領域最具代表性的產品,以此產品的軟件作為軟件平臺的雛形。構建軟件平臺不必從零開始,平臺從產品中,又到產品中去。
步驟二:組建平臺團隊
再則,要組建各個軟件平臺架構師團隊??萍家匀藶楸荆瑯嫿ㄆ脚_軟件的極其關鍵的人是軟件架構師,架構師就好比建筑行業(yè)的設計師,架構的質量決定了整個平臺的質量,而架構師的能力水平又決定了架構的質量。架構師要精通軟件設計,同時也要對所選擇的代表性產品軟件技術非常熟悉。此時,你也許要撓頭了,我們工程師都很年輕,沒有這樣的人才怎么辦?或者挖一個本行業(yè)的架構師來,或者借助外力,引入培訓、咨詢幫助經驗相對豐富的工程師一同去設計軟件架構。對許多公司來講,第二種方法的可操作性會更強一些,我曾輔導過一些企業(yè)工程師去設計平臺框架,我提供方法,他們提供產品技術知識,一同討論互動的過程中,迅速構建起了平臺架構,更重要的是,在這個過程中,工程師的設計能力得到了提升,平臺設計好了,同時也培養(yǎng)出來了一批軟件架構師。
除了構建平臺之初需要架構團隊之外,在平臺實現和后期的維護升級還需要平臺軟件開發(fā)維護人員。強烈建議從組織上要把平臺的開發(fā)、維護工作獨立出來,目的是:1、確保平臺工作有較充分的資源。因為產品開發(fā)屬于緊急而重要的工作,而平臺開發(fā)相對來說不太緊急,如果沒有獨立的專職的平臺團隊,開發(fā)人員往往都被安排到了緊急的工作上,即產品開發(fā),然而重要度要大的平臺開發(fā)沒人來做了;2、確保平臺的架構不被要求各異的產品所破壞。我曾經的咨詢客戶很重視軟件平臺建設,辛辛苦苦構建好了之后,因為沒有獨立的平臺團隊專門負責平臺的開發(fā)和維護,導致最后的平臺被各個產品改得面目全非,已不能稱之為平臺了。
步驟三:平臺架構設計
首先對所選的產品軟件進行總體架構設計,總體架構首先要對軟件進行層次劃分。如果你學過計算機網絡知道OSI/RM,就會知道分層的好處,就是使用下層提供的服務而為上層提供統(tǒng)一的服務,屏蔽本層及以下層的差異,當本層及以下層發(fā)生了變化不會影響到上層。
做軟件設計要學習硬件設計,硬件的設計越來越簡單,二十年前,哪怕是一個功能很簡單的電路,電路板上也要鋪上密密麻麻的元器件,而如今,一塊電路板上焊幾塊集成芯片(IC),就可以實現很復雜的功能,對硬件設計人員的電路設計能力恐怕還沒有三十年前高,因為主要功能都集成到了芯片里面,設計人員不必了解芯片內部如何實現,只要讀懂芯片手冊、了解了各個管腳的定義,可以利用IC實現所要的功能了。軟件架構進行了分層,每一層就相當一塊大的IC,層與層之間的互動都不必了解層內部是如何實現的,只需要搞清楚每一層的對外接口函數(相當于IC的管腳)即可,當軟件開發(fā)人員只需要關心本層的技術細節(jié)時,軟件實現的難度將大大降低,對開發(fā)人員的技能要求也隨之降低。
以目前應用較廣的Android軟件系統(tǒng)為例。Android共分四層,最底層為LINUX KENEL層,作為硬件和軟件之間的抽象層,它隱藏具體硬件細節(jié)而為上層提供統(tǒng)一的服務。其上一層為LIBRARIES和RUNTIME,顧名思義,這一層是一個C/C++庫集合,相當于中間件,各個應用通過APPLICATION FRAMEWORK層訪問。APPLICATION FRAMEWORK層存在的目的就是為了簡化組件的重用,任何應用程序都能發(fā)布他的功能且任何其他應用程序可以使用這些功能。APPLICATION層是指運行在Android系統(tǒng)上的五花八門的應用程序了,如日歷、地圖、郵箱等。
?
?
有了總體架構設計之后,接下來便是對每一層進行展開設計,如Android架構所示,每一層在細分出多個組件,每個組件又可以看出一個小IC,同樣,此時不必關注小IC內部如何實現的,只要把這個IC的功能和相應的管腳(也就是軟件接口)定義出來。最好,每個小IC可以做出編譯可裁剪的,即用條件編譯保證只編譯自己需要的功能模塊。
步驟四:平臺實現和驗證
在平臺架構設計完成后,接下來是實現了。此時,也不必所有的代碼都要一行行地重新編寫,可以把已實現了產品軟件拿來借鑒、甚至可以重用,但一定確保不與設計相違背,代碼的風格也要遵循統(tǒng)一的規(guī)范。實現之后,要對每個模塊、以及各個模塊的集成進行測試,確保正確實現了。
步驟五:平臺發(fā)布
最后,平臺軟件要發(fā)布給用戶,也就是產品開發(fā)人員。此時,要注意以下兩點,第一,發(fā)布的平臺軟件最好為二進制的,而不是源代碼,目的是從技術上防止平臺被產品開發(fā)人員改動。第二,要為平臺的客戶,寫平臺軟件的使用手冊。使用手冊應對每個模塊的功能、如何裁剪、在什么情況下裁剪、它的對外接口進行詳盡描述,便于使用者能夠方便地、正確地使用軟件平臺。
?步驟六:平臺的維護和升級
最后一步,恐怕也是最不易做好的一步。打天下容易,坐天下難;建軟件平臺容易,維護平臺難。為什么?一個企業(yè)不斷面臨原有產品維護、升級和全新產品開發(fā)的情況,而且各個產品的研發(fā)工期通常比較緊張,產品維護時對bug解決時間通常也有急迫的要求,如何保證這些面臨著時間壓力的研發(fā)和維護工作中,各個產品依然考慮平臺軟件的完整性,哪怕忽略短期的便利性也不犧牲平臺軟件的完整性,確實是一個很大的調整。許多企業(yè)在建好了平臺之后,各個使用平臺軟件的產品,在維護和升級過程中,自行地改動、增刪平臺代碼,導致最后各個產品的平臺軟件部分已各不相同,此時平臺完全地跟著產品走了,已不能稱之為平臺了。
要解決以上的問題,有兩個關鍵前提,其實在前面已經提過。第一,從組織結構上要保證有獨立的團隊專門負責平臺軟件的維護和升級;第二,平臺軟件提供給產品的軟件包一定是二進制的,而不是源代碼。的確,如果提供源代碼可能會給產品的開發(fā)和維護人員提供方便,然而這樣小小的好處的代價導致整個平臺遭到破壞這樣巨大的損失。有人說,可通過制度來保證產品人員不改動平臺,是的,是可以通過制度來保證,但是監(jiān)督、檢查所帶來的成本一定非常巨大,好比我們也可以通過制度規(guī)定而不是銀行卡加上密碼的方式來保證每個人都取自己的錢,然而沒有那個銀行敢這樣做的。
有了以上兩個關鍵前提,還要建立平臺的升級開發(fā)和維護機制。當產品不斷有新的需求,而當前的平臺軟件又不滿足這些的需求,此時,產品不可以為了所謂的快速市場反應獨自開發(fā)這些需求,而不考慮要求平臺升級從而滿足這些需求。因此,當產品面對市場需求時,要評估這些需求需要平臺增加或改動哪些功能,然后向平臺軟件團隊提出開發(fā)任務,平臺開發(fā)完成后再向產品發(fā)布,這樣就保證了平臺軟件也是隨著客戶需求而發(fā)展演進的。
平臺的維護工作涉及了一個很重要的bug同步問題,即任何一款使用平臺軟件的產品發(fā)現了屬于平臺軟件的bug時,不可以只在該產品上修復, bug的修復一定要同步到平臺軟件上(如果平臺軟件提供給產品的是二進制文件,該bug同步很容易實現),既該bug最終是在平臺軟件上得到了修復,并把修復后的平臺軟件在何時的時機升級其它產品,如此,一個產品bug的解決,所有的產品也都不存在該bug了。
同時,平臺軟件不會只有一個版本存在,因為在使用的平臺軟件版本需要維護,另外要若干增加新特性、特性定制等開發(fā)版本的存在,平臺軟件的版本管理將是非常重要的一項工作。版本管理不僅涉及軟件的配置管理,包括版本的規(guī)劃,即規(guī)劃出要開多少個版本分支,為何要開出這些分支,何時這些分支在回到主線,何時將發(fā)布XX版本,等等,也包括版本的監(jiān)控、版本發(fā)布管理,以及不同版本間的bug同步,即不可以在舊版本中已解決掉的bug又重新出現在新版本里。因而,平臺軟件的開發(fā)維護工作想要做好,需要較全面的高水平的研發(fā)管理,平臺軟件建設得如何特別能反映一個企業(yè)的研發(fā)管理水平和研發(fā)實力。