軟件開發!=軟件工程 你真的希望如此嗎?
英文原文:Software Development != Software Engineering. Do we want it to?
端著咖啡,你大步走向書房,只余腳步聲回響在空蕩的走廊里。跨過門檻,停下來咯噠一聲打開頭頂上的節能燈,放在書桌中央的筆記本電腦一下子映入 你的眼簾,明亮的屏幕上圖表正在發出誘惑的光芒。放下咖啡,你決定最后再研究一次,看看還有什么錯誤或誤算是先前被遺漏的。不斷地熬夜,熬夜,但最后,終 于讓你獲得了客戶的認可。
喝一口依然還滾燙的咖啡,你決定最后一次檢查客戶需求。用早餐的位置?有了。四個浴室,其中一個要在天花板上安裝花灑淋浴頭?有了。三車車庫以 及寬敞的院子?有了。一切準備就緒,各就各位。最后的審查讓你充滿自信:想必客戶定會滿意,施工也馬上可以開始。合上筆記本電腦,抓起它走出房門,興沖沖 地想要展示給客戶看。
正如你所預期的那樣,客戶很滿意!他對院子的大小很滿意,他和他的家人也很喜歡你設計的游泳池和早餐位置。但是美中不足的是….
“你能讓它飛起來嗎?”
這是工藝,而不是工程
上面的故事顯然是荒謬的:只要是思維正常的人都不會要求讓房子飛起來,因為我們都見過房子,它們都是不會飛的。然而,這樣的情景卻經常在軟件開 發上重演,一遍又一遍。客戶要求的東西——他認為是合理的,但對我們開發人員而言可能是完全不可能的——至少目前為止我們清楚這是不可能的事情。現在的軟 件開發很少有章程,雙方協定的標準就更少了。我們能做的,通常就是,創建的東西盡可能地符合客戶的期望。
幾年前,有一個關于軟件開發是否可以被稱為軟件工程的大辯論,這源于一篇名為《Software Engineering: An Idea Whose Time Has Come and Gone?》的文章,作者是 Tom DeMarco。DeMarco 認為,短命的軟件工程已經死去,這對于所謂軟件“變革”的創建并不重要。
DeMarco 的論文認為由于缺乏測量力度(和“軟件”一詞所代表得深度和廣度),軟件工程已經走向了滅亡。但是我看到的是一種截然不同的現象:軟件工程從未存在過。
首先鄭重聲明,我贊同 DeMarco 先生的主要觀點。軟件開發不是工程,因為在傳統的工程中輸出是有把握的,且可被反復衡量和控制的。DeMarco 的著名論據“你無法控制你不能衡量的東西”是對此理念的完美總結:如果你不能衡量你將要實施的變化的影響,那么讓我們怎么相信你能控制它們呢?
這一點,在我看來,正是我們不能將軟件開發稱為“工程”的首要原因:我們不能衡量將要實施的變化的影響。當然,我們可以執行單元測試,集成測試 ——我們能想到的所有測試,但我們依然無法準確估計當我們實施所有潛在的變化時,它們對現有系統所造成的影響范圍。我們現在根本沒有足夠的工具來做到這一 點,并且據我所知,我們一直以來就沒有這樣的工具。
我認為軟件開發可以當作一門手藝。“工藝”一詞或許能夠更好地描述我們開發人員的實際工作。
工藝和工程之間的主要區別是,后者使用已經廣為人知且公認的知識來解決問題,而前者使用的是更專業的知識,懂這些知識的人不如前者那么多,甚至 這些知識可能是不成文的或并不為大眾所認同。因此,我們可以得出軟件工程一說根本不存在的觀點,因為沒有足夠普遍都接受的知識來證明它可以叫做“工程”。
那么“軟件工程”可以存在嗎?是否有用?
軟件工程這說法是否可行?
假設將軟件開發的整個領域轉換到工程學科是可能的。然而,我們真的想要這么做嗎?
在我看來,創建有用的軟件需要具備一定層次的藝術技能,有的形式的創造并不能用數學和工程精確地表現出來。創造力能讓我們面對從未見過的問題時,也能想出新穎的解決方案。但是如果我們不小心,它也會讓我們搬起石頭砸自己的腳。
對我而言,將軟件開發制定為工程學科會消弭大量的創造自由(當然并非全部),從而阻礙我們從多方面思考來解決當前問題。
另一方面,利用工程策略可以顯著提高例如標準規格、可測試性,以及項目管理等理念。此外,它提供的公共知識池,可作為使用來源用于參考解決方案,使它們更容易交叉引用。
既然這樣,那么共享和控制所有知識是否值得我們失去一些創造的自由?我認為這不值得,哪怕上述權衡真的可以實現。軟件可用于所有基本的事情,與 其說偉大的多元化思維自由是我們解決問題的阻礙,倒不如說它是福音。如果硬是將軟件塞進工程領域,那么就會有太多的變量,太多的問題,太廣泛的問題范圍需 要考慮。對所有軟件開發使用工程策略將會是一場災難。
這篇文章開頭的故事,就是一個當我們將軟件開發與工程作比較時,常見但不正確的假設:即將軟件設計比作是蓋房子。這嚴重偏離了事實。房子是有形 的,受到物理定律如重力的約束,并且我們已經擁有了上千年的筑造歷史,知道如何建筑適宜居住的房子。而軟件是沒有這些條件的,因此這樣的比較說好聽點是天 真,說難聽點就是誤人子弟。
總之,軟件開發永遠不可能是軟件工程。
我們的專業是一門手藝,我們是工匠。軟件開發是一個過程,作為程序員的我們吸取關于項目的專業信息和設計內容,然后實施滿足客戶需求的解決方案。它是藝術,它充滿了創造性;它不是工程,它也不需要成為工程。這應該成為我們的共識。
你有什么看法?你認為軟件開發成為軟件“工程”是一個值得追求的目標,還是一項不可能完成的任務?歡迎分享你的評論,請暢所欲言!
-
譯文鏈接:http://原網站已經失效/article/software-development-not-software-engineering.html