软件工程的瀑布, 大泥球, 教堂,集市,和银弹
0x1 No Silver Bullet
1?????????? There is no royal road, but there is a road
軟件工程缺乏一劑良藥,在硬件成本隨著發(fā)展速度快速下降的同時,軟件工程的成本并沒有出現(xiàn)明顯的下降,然而,隨著軟件工程持續(xù)的、堅持不懈的發(fā)展,軟件工程正在發(fā)生著重量級的變化。
2?????????? Does It Have to Be Hard?--Essential Difficulties
必須觀察到異常不是軟件進(jìn)展如此緩慢,而是計算機(jī)硬件進(jìn)步太快。沒有其他技術(shù)文明能夠像計算機(jī)硬件這樣已經(jīng)六個數(shù)量級在性能價格上漲30年。沒有其他技術(shù)可以以這樣的速度提高性能或降低成本的。這些收益從計算機(jī)制造裝配行業(yè)流轉(zhuǎn)到加工制造工業(yè)。
一個軟件實(shí)體的本質(zhì)是聯(lián)鎖的構(gòu)造概念:數(shù)據(jù)集,數(shù)據(jù)項(xiàng)之間的關(guān)系,算法,以及調(diào)用的函數(shù)。這本質(zhì)上是抽象的,這樣一個概念性的構(gòu)造在不同的表現(xiàn)形式下都是一樣的。它無疑是非常準(zhǔn)確和豐富詳細(xì)的。軟件設(shè)計的難度不在于計算的精確度和功能測試,但是更重要的是規(guī)格說明書的設(shè)計和概念意義上的結(jié)構(gòu)。
現(xiàn)代軟件系統(tǒng)的固有屬性決定了軟件開發(fā)發(fā)展的難度:復(fù)雜性、整合性,可變性和不可見性。
復(fù)雜性:團(tuán)隊成員之間交流困難導(dǎo)致產(chǎn)品缺陷,成本超支、進(jìn)度拖延;難以列舉所有程序的可能狀態(tài)導(dǎo)致程序是不可靠的;函數(shù)調(diào)用函數(shù)的復(fù)雜性使項(xiàng)目難以使用。難以擴(kuò)展程序新功能而不產(chǎn)生副作用造成結(jié)構(gòu)的復(fù)雜性。
一致性:雖然說軟件工程并不是唯一復(fù)雜的學(xué)科,但是同樣面對復(fù)雜對象的物理學(xué)家,由于大自然的規(guī)律,他們有統(tǒng)一的規(guī)律可以遵循。
易變性:軟件產(chǎn)品是嵌入在一個文化的應(yīng)用程序,受制于用戶,法律,和機(jī)器。所有這些變化不斷,他們無情地把改變強(qiáng)加于軟件產(chǎn)品的變化。
不可見性:軟件不像地圖可以繪制出幾何圖層便于理解,在空間中往往是難以理解的。
3?????????? 過去的小突破
3.1???? 高級程序設(shè)計語言:它使一個程序的偶發(fā)復(fù)雜度。抽象的程序包括概念結(jié)構(gòu):操作、數(shù)據(jù)類型、序列,和交互。具體的機(jī)器嗎是和寄存器,條件,分支,通道,磁盤等相關(guān)的。在某種程度上,高級語言構(gòu)造了一個較低的抽象程序,極大降低了編程的復(fù)雜性。
3.2????????? 分時系統(tǒng):分時系統(tǒng)帶來了一個重大的改進(jìn),提高了程序員的生產(chǎn)率和產(chǎn)品質(zhì)量,
盡管不像高級語言帶來那么大的作用。但是分時產(chǎn)生了一個截然不同的困難。分時需要及時保存信息。批編程的緩慢輪轉(zhuǎn)意味著會不可避免地忘記細(xì)節(jié),如果沒有恰當(dāng)?shù)臅r機(jī)刷新內(nèi)存就直接進(jìn)行編譯和執(zhí)行。這個中斷是昂貴的,必須不斷地更新內(nèi)存。
3.3????????? 統(tǒng)一的編程環(huán)境
4?????????? 潛在的良方
4.1????????? Ada and other high-level language advances.
Ada哲學(xué)比Ada語言更多的是一種進(jìn)步,因?yàn)檫@是模塊化的哲學(xué),抽象數(shù)據(jù)類型的層次結(jié)構(gòu)。
4.2????????? Object-oriented programming:提供了封裝機(jī)制
4.3????????? Artificial intelligence:關(guān)于人工智能存在兩種定義,使用電腦來解決問以往只能通過人類的智慧來解決的問題;使用一組特定的編程技術(shù)被稱為啟發(fā)式或基于規(guī)則的編程,讓計算機(jī)模仿人類解決問題的方式。事實(shí)上,真正的人工智能是無法實(shí)現(xiàn)的。
4.4????????? Expert systems:專家系統(tǒng)是一個程序,包含一個廣義推理引擎和一個規(guī)則庫,需要輸入數(shù)據(jù)和假設(shè),通過推理規(guī)則庫可誘導(dǎo)產(chǎn)生結(jié)論和建議,并提供解釋。推理引擎通常可以處理模糊或概率數(shù)據(jù)和規(guī)則,除了純粹的確定性邏輯。
0x2 big ball of mud
???????? 我認(rèn)為這依賴于良好的編程習(xí)慣,如果能夠在編程的同時進(jìn)行系統(tǒng)化模塊化測試,那么編程效率就會大大提高,處理Bug的速度也會加快。
???????? 除此之外,代碼是需要不斷進(jìn)行完善精簡的,不能因?yàn)檠矍暗腂ug就隨便修改代碼,破壞了當(dāng)初設(shè)計的代碼的結(jié)構(gòu),軟件的架構(gòu)也非常重要。
所謂大泥球,是指雜亂無章、錯綜復(fù)雜、邋遢不堪、隨意拼貼的大堆代碼。這些年來,為了對付這個泥球,多種指導(dǎo)方法一起出現(xiàn),然而實(shí)際情形沒多大變化,“大泥球”看起來仍然是設(shè)計軟件架構(gòu)的最常見方法。我們現(xiàn)在慣用的敏捷性開發(fā)的很多方面會直接導(dǎo)致泥球,包括:缺少前期設(shè)計、應(yīng)對需求變化過晚、應(yīng)對架構(gòu)變化過晚、碎片式增長。
那么我們?nèi)绾伟l(fā)現(xiàn)爛代碼?爛代碼要不要改呢?應(yīng)該怎么改?如果爛代碼不是先天性的,那是不是可以預(yù)防?
程序是面向用戶的,為了方便應(yīng)用的更新,應(yīng)提前設(shè)計好程序的結(jié)構(gòu),便于后續(xù)優(yōu)化。
我們團(tuán)隊的代碼中也肯定存在著大泥球,這需要我們不斷進(jìn)行完善。
0x3 CatB – Cathedral and the Bazaar
???????? 我感受比較深的一句話是——如果你把公測參與者作為最寶貴的資源來對待,那么他們就會成為你最寶貴的資源。我們需要擴(kuò)大軟件的用戶群,這樣才能更好的完善功能。
???????? 盡早和盡量頻繁的發(fā)布是Linux開發(fā)模式的一個重要部分。然而對于一個大型工程來說這并不是個好辦法。因?yàn)樵缙诎姹編缀蹙褪菃栴}版的同義詞,而過早地發(fā)布會把用戶的耐心消耗殆盡 。但是隨著功能的完善,可以進(jìn)行預(yù)發(fā)布來測試軟件的穩(wěn)定性。
0x4 Lost in CatB這些情況在你的團(tuán)隊中出現(xiàn)過么?
作者主要講述了開源軟件中的過度依賴問題。我自己在寫程序的過程中,常常為了方便調(diào)試把測試文件放的到處都是,也沒有集中在同一個目錄下,這樣在后期的軟件維護(hù)過程中造成了很大的不便。
在今后的開發(fā)中,我們團(tuán)隊將固定好軟件結(jié)構(gòu)框架,保持結(jié)構(gòu)思路的清晰。
?
0x5 Managing the development of large software systems: concepts and techniques
我覺得瀑布模型的其核心思想是按工序?qū)栴}化簡,將功能的實(shí)現(xiàn)與設(shè)計分開,便于分工協(xié)作,即采用結(jié)構(gòu)化的分析與設(shè)計方法將邏輯實(shí)現(xiàn)與物理實(shí)現(xiàn)分開。瀑布模型將軟件生命周期劃分為軟件計劃、需求分析和定義、軟件設(shè)計、軟件實(shí)現(xiàn)、軟件測試、軟件運(yùn)行和維護(hù)這6個階段,規(guī)定了它們自上而下、相互銜接的固定次序,如同瀑布流水逐級下落。
瀑布模型有利于大型軟件開發(fā)過程中人員的組織及管理,有利于軟件開發(fā)方法和工具的研究與使用,從而提高了大型軟件項(xiàng)目開發(fā)的質(zhì)量和效率。而對于我們這種較小規(guī)模的軟件開發(fā)項(xiàng)目,瀑布模型并無裨益。
0x 6 軟件工程的方法論到底有多少用處?
???????? 現(xiàn)代軟件工程方法論大致可以分為重方法論和敏捷方法論兩大陣營,在很多書籍中將它們之間的區(qū)別總結(jié)為"文檔量"的重與輕,實(shí)際上有些以偏蓋全!如果從對開發(fā)工作的影響角度看,它們之間更重要的區(qū)別在于:重方法論更加強(qiáng)調(diào)前期設(shè)計,為未來設(shè)計;而敏捷方法論則更加強(qiáng)調(diào)只為現(xiàn)在設(shè)計,未來再重構(gòu)它!而就是這個最為本質(zhì)的區(qū)別才是根據(jù)項(xiàng)目實(shí)際特點(diǎn)進(jìn)行正確選擇的基礎(chǔ)。
在軟件技術(shù)的發(fā)展道路中,方法論起著決定性的作用。軟件技術(shù)人員有必要站在哲學(xué)的高度、從方法論的角度,重新審視軟件開發(fā)過程中各個環(huán)節(jié),深刻體會軟件工程和方法論的聯(lián)系,從而改進(jìn)和發(fā)展的現(xiàn)有的軟件工程技術(shù),消化吸收先進(jìn)的思想、方法和技術(shù),提高軟件的質(zhì)量和生產(chǎn)率,以適應(yīng)現(xiàn)實(shí)世界對軟件產(chǎn)業(yè)新的要求。軟件工程應(yīng)運(yùn)而生。為了更好地發(fā)展和改進(jìn)軟件工程技術(shù),我們有必要從方法論的各個角度分析軟件工程的方法、工具和過程,從而有的放矢地改進(jìn)軟件工程中各個過程的思想、方法、模式和規(guī)則.
轉(zhuǎn)載于:https://www.cnblogs.com/someonefighting/p/4963118.html
總結(jié)
以上是生活随笔為你收集整理的软件工程的瀑布, 大泥球, 教堂,集市,和银弹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构之双端队列
- 下一篇: UVA216 ——dfs