追本溯源是人類的天性。當面對問題時,人們都會問,為什麼這樣做不行?為什麼那樣做就行?談及軟體研發過程中的問題和改善措施,需要首先分析其問題的本質,究竟是什麼原因造成了軟體研發過程的眾多問題。這樣我們才能說服自己,也說服別人,從根本上做些改變。
在分析軟體研發特點之前,讓我們首先討論一下人類另外兩大類主要活動:一類是物質財富生產,另一類是科學技術研究。物質生產的特點是大部分活動日復一日的重複性,比如我們生產汽車,製造電視,耕種莊稼等等。雖然每一次生產週期可能有些過程改進、技術進步,但是其本質上的創新還是很少。而科學技術研究,特別是基礎研究,其突出的特點就是創新性。如相對論,宇宙起源,黑洞理論等等。開創性是這類活動的最大特點。比較這兩類活動有很多角度,單從過程控制來看,生產控制遠比基礎研究控制來的容易,現代化生產管理的宗旨就是設法以最高的效率、最高的質量,穩定地大規模生產產品。我們今天極大豐富的物質生活,很大程度上依賴於各行各業行之有效的重複的物質生產過程。而基礎研究,因其天然的不確定性和巨大的風險性,雖然也有一定的規律可循,但是如果試圖對基礎研究過程進行完全地精確控制卻仍是十分困難,或者根本不可能。很難想象我們能對霍金先生目前的黑洞研究提出乙個有明確研究計畫和日程安排的黑洞理論
2.0專案。
作為資訊時代重要組成部分的軟體,作為後來者,從其萌芽到今天發展成為乙個巨大的產業並徹底改變了人們日常生活和工作方式,它至始至終都受到既有理論和工作方法的影響。最初,軟體研發基本沒有過程控制,軟體研發被看做是一群「藝術家」的活動,基本沒有管理的痕跡。目前在一些小公司還存在這種作坊式的軟體研發模式,它的問題就是軟體研發的質量進度高度不可控、不可知。隨著軟體規模的日益擴大,所謂的軟體危機爆發。人們為了加強過程控制,求助於生產領域的既有經驗,提出了所謂的瀑布式軟體研發流程。在我看來,瀑布式流程基本上是工廠產品生產過程在軟體研發活動中的模仿。其基本思路是,類似於工廠產品生產流程,把整個軟體研發生命週期劃分成前後銜接、日期任務明確定義的若干階段(就像工廠生產產品的各個工序)、並對每次階段跳轉進行嚴格控制(就像工廠生產產品時每個工序的質量檢驗)。人們寄希望於這個結構定義清晰,責任劃分明確的軟體研發模式,把以前混亂的軟體研發過程改造好,使之可以像工廠生產電視、汽車那樣,質量穩定地、進度可控地進行軟體研發。雖然目前在許多軟體公司還能看到這種瀑布模型的影子,但是無數的實踐證明,這種仿效工廠產品生產流程的軟體研發模型,在大規模、邏輯複雜、市場狀況瞬息萬變的現代軟體研發環境中,卻屢屢難以奏效。
瀑布模型最根本的問題在於,雖然它定義了嚴格的階段跳轉驗收標準,卻沒有回答一旦在一階段末期,發現該階段驗收指標沒有達到,或者在乙個階段發現前面階段的錯誤時,如何回溯,如何可控地解決問題。瀑布模型缺乏有效的彌補機制,它往往是在專案後期才發現軟體研發的進度和質量遠遠未達預期。那時,除了專案延期、增加投入這些不得已而為之的選擇之外,不再有更早發現問題的機制和優雅的補救措施。所以,我經常說,瀑布模型基本上就是一錘子買賣或者賭博式的研發方式,憑運氣,要麼成功,要麼成仁。
那為什麼軟體研發即不能被當作純粹基礎理論研究來對待,也不能當作物質產品生產來對待呢?因為軟體研發,究其本質,是一種既有一定創新性、又有成本、資源和市場限制的、介於科學研究和物質產品生產之間的一種特殊的生產活動。承認其創新性,就要求以一種靈活的方式來對待;認識其投入和日程限制的商業性,又要求對其過程進行嚴密有效的監控,以最高可能的穩定性,規模化地生產軟體產品,達到各軟體研發機構合理的投入產出預期。
下面較詳細地闡述軟體研發的幾大特點:
軟體研發是一定程度上的開創性、創新性活動
軟體研發有時具有一定的重複性,但是完全重複的勞動卻極少。絕大部分軟體研發活動是做新功能。因為如果某功能以前已經做過了,完全可以直接復用原來的模組或者把原來模組適當改造成可復用的模組,從而避免重複勞動。因為軟體是軟的。這點是軟體研發跟物理產品重複生產最大的區別。物理產品生產,比如製造汽車,雖然每一輛汽車完全相同,卻也要經歷乙個全新的花費相當成本的生產過程。而軟體產品的複製,如軟體安裝程式的複製、傳播,相對於軟體研發本身來說,基本可以忽略其工作量。所以人們常說軟體設計開發即是生產。
軟體需求經常是不完整的或者經常發生變化的
軟體之所以叫做軟體,就是其軟的特性。由於軟,人們經常很難在研發之初提出或得到完整正確的、符合終端使用者需要的需求全集。使用者經常不擅於表達對軟體功能的需求,往往等到看到實在的軟體產品時,才意識到某些功能不完整或者有更好的想法。也是由於軟體軟的特點,很難限制使用者對軟體功能提出修改的衝動。這方面也是軟體研發和一般產品生產很大的區別。比如蓋一幢樓,蓋好後,其實使用者也有可能對樓房設計有新的更好的想法,但是改造已經蓋好的樓房卻十分困難或者根本不可能,這一定程度上也就限制了使用者天馬行空的改造動機。而軟體卻沒有這麼幸運。
對軟體需求的理解,終端使用者和研發團隊比較容易不吻合
軟體由於其前期不可觸控性,再加上終端使用者和研發人員的知識背景,語言習慣、表達方式上的不同,很容易造成對同乙個功能理解上的差異。即便有完備的文件幫助大家理解、澄清需求,甚至雙方都簽字畫押,但自然語言畢竟不是程式**,而且自然語言本身也可能有二意性,因此功能需求誤解也是軟體研發過程中比較容易發生的事情。
軟體研發過程中,進度和質量比較難以正確衡量、跟蹤
軟體由於其設計和**的不容易直觀接觸性,在較長的研發過程中,極有可能進入一種神秘的不可知的狀態。不同於生產線上的產品,生產線上每個工序每個環節都可能定義出明確的操作規範和質量進度控制指標。而軟體研發過程中的進度和質量控制,如果沒有真正有效的方法,很容易流於形式。我曾經多次見過簡單無效的進度跟蹤方法,比如進入寫**階段後,我們經常簡單地讓程式設計師定期地報告其完成百分比,
10%,
20%...100%
。這樣的百分數很難真實反映軟體研發進度。我們往往在聽到每個程式設計師都報告百分之百完成開發任務,想當然認為可以向下一階段系統測試前進時,才發現那時的軟體質量根本不夠進行系統測試。很多基本的功能都無法執行。系統測試隨即陷入無窮無盡的找
bug修改
bug再找
bug無限迴圈的狀態。軟體一旦進入這樣的狀態,嚴重的日程延期,嚴重的超預期投入,甚至於最終專案被取消幾乎成了不可避免的結局。
軟體研發是商業行為,有時效性和投入產出的要求和限制
市場經濟條件下,軟體研發基本都是公司行為。作為商業軟體公司,軟體研發活動必定要符合商業活動的基本要求,軟體公司才能在市場上生存。因此軟體的發布時間(週期)、投入產出比就成了衡量軟體研發是否成功的重要指標。在這樣的商業環境下,用對待純粹基礎研究的態度對待軟體研發顯然不適合。
本章首先通過對比軟體研發與物質產品生產、基礎研究之間的不同之處,分析了軟體研發的特點,讓我們認識到,要改善和提高軟體研發的生產率和過程控制,就必須採用適應軟體研發特點的新思維和新方法。為後續章節討論具體改善措施做了思想理論鋪墊。
軟體研發行業防洩密需求特點
最近一直致力研發行業防洩密方案,做源 加密防洩密的解決方案 目前為止,了解實施了不少專案,概括下來該行業有如下特點 1 軟體研發人員水平比較高,首先得做到不易被破解 2 軟體研發人員的反監控 反加密 反防洩密的水平比較高,比較難防。普通的加密產品,很容易被秒殺。想花時間的人,程序偽造ip偽造dll注...
軟體研發之道 有關軟體的思考
軟體是一種智財權,軟體生產主要是一種智力活動。磁碟或光碟上的資料體現了軟體產品開發團隊的集體智慧型。磁碟上體現的智力水平越高,創造的智財權就越多,產品的價值也就越高。有了價值更高的產品,就可以賺更多的錢,獲得更多客戶,也可以讓智力活動影響到更廣泛的人群,並為開發者和他人帶來更多利益。如果你特別關注將...
軟體研發之道 有關軟體的思考
軟 件是一種智財權,軟體生產主要是一種智力活動。磁碟或光碟上的資料體現了軟體產品開發團隊的集體智慧型。磁碟上體現的智力水平越高,創造的智財權就越 多,產品的價值也就越高。有了價值更高的產品,就可以賺更多的錢,獲得更多客戶,也可以讓智力活動影響到更廣泛的人群,並為開發者和他人帶來更多利益。如果你特別關...