為什么軟件開發(fā)這么難?
有些人認(rèn)為,一種好的編程語言可以減輕軟件開發(fā)人員的負(fù)擔(dān),并相應(yīng)地提高他們的效率。
毫無疑問,這在很久以前的匯編和Fortran時代是真的。
然而,現(xiàn)在編程語言已經(jīng)足夠好了,我們?nèi)匀幻媾R著其他一些困難和挑戰(zhàn)。目前,許多開發(fā)人員認(rèn)為編程仍然非常困難,但這些困難與編程語言無關(guān),原因如下。
1.阿姆達(dá)爾定律。
當(dāng)我們需要執(zhí)行一系列任務(wù)時,我們會想到阿姆達(dá)爾定律。這條法律告訴我們,僅通過加快某項任務(wù)獲得的整體速度提高是有限的。
假設(shè)燒開水需要10分鐘,然后煮面條需要10分鐘。即使你找到了加快沸水速度的方法,烹飪時間也不會少于10分鐘。無論爐子有多旺,烹飪速度都不可能翻倍。
該定律的數(shù)學(xué)公式是:如果某件事的總時間比為p,您將永遠(yuǎn)無法獲得超過1/(1-p)的加速比。假設(shè)這部分工作占90%,即p=0.90。在優(yōu)化過程中,如果這部分時間減少到0,整體工作速度將提高1/(1-0.90)=10倍。
阿姆達(dá)爾定律的關(guān)鍵在于,您可以獲得的大速度提升僅限于優(yōu)化工作的比例
![1648971207861340.png ZI1(N(V]{[9IY~A%3ETBYNC.png](/static/upload/image/20220403/1648971207861340.png)
編程工作困難的原因有很多。簡單地說,我們可以認(rèn)為這是因為我們需要處理的工作必須按照一定的順序完成。畢竟,人類并不擅長同時處理許多任務(wù)。在某個時間點(diǎn),你可能會使用建筑工具、閱讀文檔、編寫代碼或參加會議。當(dāng)然,你也可能會在會議上無私地寫代碼,但你只能做同樣的工作,而不能同時寫代碼和會議。因此,我們可以使用阿姆達(dá)爾定律,假設(shè)您可以將施工時間降低到0,但項目的整體速度只能稍微加快一點(diǎn)。您的工作效率仍將受到其他因素的限制。
曾經(jīng),很難將程序轉(zhuǎn)換為計算機(jī)可以運(yùn)行的代碼。很久以前,我們甚至需要將程序轉(zhuǎn)換為1和0,然后不厭其煩地將其輸入計算機(jī)。我不知道這需要多長時間,但我們可以假設(shè)這項工作占編程時間的90%。這意味著,如果我們能找到更好的方法(如Python)告訴計算機(jī)該做什么,我們可以將編程效率提高10倍以上。
然而,現(xiàn)在我們的編程語言越來越好,告訴計算機(jī)做什么的時間也越來越少。將程序轉(zhuǎn)換為代碼不需要90%的時間。假設(shè)我們現(xiàn)在只需要10%的時間。這意味著,即使這部分工作時間減少到0,效率也只能提高1.11倍。效率比以前低了81倍。
這是因為其他90%的軟件開發(fā)是一項非常艱巨的任務(wù),無論編程語言有多好,不能(直接)減輕我們的負(fù)擔(dān)。
2.為什么編程還這么難?
傳達(dá)需求
我在這里說的編程工作很困難,但實際上與編程語言無關(guān)。為了找出原因,暫時假設(shè)我們根本不使用電腦。你不需要告訴電腦該做什么,但你需要告訴你的朋友該做什么。你不能告訴你的朋友你必須為他們做出所有的決定。
你會發(fā)現(xiàn)解釋關(guān)鍵的背景信息需要很多時間。你的朋友需要了解程序需要處理的實際問題,以及你認(rèn)為程序應(yīng)該提供什么功能。你必須解釋所有的縮寫字母和術(shù)語,并討論各種外部因素。
你的朋友需要知道所有可能的情況,有很多細(xì)節(jié)需要處理。
同時,你還需要考慮不同功能的狀態(tài),用戶可能嘗試的各種動作,以及所有可能的事件,你需要和你的朋友討論很多極端的情況。
向你的朋友解釋這一切有幾個困難。首先,你必須掌握所有的實際細(xì)節(jié);其次,你必須了解程序在每種情況下應(yīng)該執(zhí)行的操作;此外,你必須通過你的朋友能夠理解的方式傳達(dá)所有信息。這意味著你必須組織這些信息,以確保易于理解。
請注意,到目前為止,我們甚至還沒有提到計算機(jī),當(dāng)然,我們也沒有提到編程語言。理解需求,掌握程序應(yīng)該做什么,以及組織表達(dá)是一項非常困難的任務(wù)。
描述與規(guī)格
我們很容易混淆描述和規(guī)格之間的區(qū)別,這是我們經(jīng)常進(jìn)入的思維陷阱。如果你只有一個描述(紅色汽車),你可以測試實際情況是否符合描述(紅色,但不是汽車),但這個描述不足以傳達(dá)如何制造汽車。這就是標(biāo)準(zhǔn)化的目的。
創(chuàng)造事物需要做出很多決定。如果你記錄每個決定的結(jié)果,你就會得到一個(混亂的)規(guī)范。在編寫程序時,你需要做出這樣的決定,所以僅僅通過描述是不夠的,你需要一個規(guī)范。當(dāng)我們看到一個描述(列出文件)時,我們很容易認(rèn)為這是一個規(guī)范,所以我們認(rèn)為我們應(yīng)該能夠告訴計算機(jī)執(zhí)行這個動作。但事實上,有很多決定需要考慮(文件應(yīng)該按什么順序列出?每個文件都有一行嗎?
在編寫程序時,你得到的規(guī)范通常只是一個描述。計算機(jī)不能繪制矩形,它必須知道矩形的顯示位置、大小和顏色。當(dāng)你編寫這個代碼時,你會發(fā)現(xiàn)很多尚未做出的決定。做出這些決定需要付出很多努力。我們經(jīng)常犯錯誤,把這些工作歸咎于編程語言,但這只是因為我們很難根據(jù)描述創(chuàng)建規(guī)范。
計算機(jī)本身
現(xiàn)在,讓我們回到計算機(jī)上。開發(fā)軟件不僅僅是為了了解軟件應(yīng)該做什么,并將各種想法轉(zhuǎn)換為代碼。計算機(jī)本身也有許多程序必須解決的問題。您的程序必須在硬件和網(wǎng)絡(luò)上快速運(yùn)行。該程序需要處理機(jī)器故障。工具和協(xié)議的復(fù)雜性使該領(lǐng)域面臨更多的問題。這些困難不是由向計算機(jī)解釋該做什么的過程造成的,它們也需要解釋。
此外,你需要在腦海中運(yùn)行一些程序。有時邏輯很容易理解,但有時你不能把一系列的事件和狀態(tài)都塞進(jìn)腦海里。為了正確理解程序的詳細(xì)信息,在錯誤的情況下修復(fù)程序,您需要了解程序本身在各種情況下的狀態(tài)。
編寫代碼的過程可以讓你清楚地掌握程序的工作方法。然而,這個程序永遠(yuǎn)不會停止改變。你會發(fā)現(xiàn)錯誤,添加新的功能或修改現(xiàn)有的行為。即使最初的組織方法非常有效,這并不意味著它的結(jié)構(gòu)總是正確的。你需要花時間結(jié)合各種情況,考慮未來的需求,并在事故發(fā)生時清理混亂。
人員合作
很多時候,我們需要與他人合作編寫程序,這也會帶來挑戰(zhàn)。
所有的團(tuán)隊成員都必須各司其職。為了不妨礙他們之間的工作,你必須分工。為了建立合理的分工,您首先需要了解程序的結(jié)構(gòu)(請參見康威定律)。
如果你有多個團(tuán)隊,情況會更復(fù)雜。每個團(tuán)隊都有不同的目標(biāo),所以你必須權(quán)衡各個方面。有時,一個決定對其他團(tuán)隊非常有益,但它會阻礙你的工作。很難設(shè)身處地為他人著想,找到合理的妥協(xié)計劃,但必須完成。
在大型項目中,沒有一個團(tuán)隊能理解整個系統(tǒng),更不用說一個人了。然而,您仍然需要了解系統(tǒng)的各個部分是如何設(shè)計和組織的。這比你自己承擔(dān)整個設(shè)計要困難。
雖然與人打交道并不是真正意義上的編寫代碼,但它也是軟件開發(fā)中非常重要的一部分。
3.如何解決軟件開發(fā)的外部問題?
我們可以找到一些不受阿姆達(dá)爾法律限制的方法。如果每個任務(wù)的速度不是完全獨(dú)立的(例如,優(yōu)化一個任務(wù)可以加快另一個任務(wù)的速度),我們希望通過技術(shù)解決方案來改善這個問題。
我們需要更好的語言和發(fā)展環(huán)境。如果我們可以用更少的人編寫程序(例如,兩個人可以取代整個團(tuán)隊,或者一個團(tuán)隊可以取代一個部門),我們可以減少組織規(guī)模。如果同一個人編寫接口的前后平臺,則無需開會討論。生產(chǎn)率的提高不僅可以降低編寫代碼的成本,還可以改變工作方式,從而降低其他工作的成本。盡管如此,這種方法也有局限性,因為程序員無法將所有業(yè)務(wù)納入他們的腦海。
迭代速度是另一個杠桿。你需要知道如何編寫程序。
