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