給編輯的信

2022-09-10 02:36:09 字數 4684 閱讀 4469

2023年5月19日

來自:jack w. reeves,加利福尼亞州聖何塞

親愛的編輯,

請允許我從您回覆的最後一部分開始。我宣告(提供上下文)「這可能不是乙個很好的(軟體)設計,但它是乙個(軟體)設計。」您建議將軟體設計與橋梁設計進行比較,並建立了以下陳述「它可能不是乙個很好的橋梁,但它確實是一座橋梁。」這裡用「橋梁」一詞代替「(軟體)設計」。這種解釋似乎是「你會相信被建造而幾乎沒有沒有設計的東西嗎?」顯而易見的答案是「當然不是!」然而,這種比較是無效的。對於大多數工業來說看起來有效的這一事實正是我想要表達的重點。

不是改變句子,而是改變上下文。現在的陳述是「這可能不是乙個很好的(橋梁)設計,但它是乙個(橋梁)設計。」你會自願成為第乙個穿過這座橋的人嗎?直接的答案可能是「不,糟糕的設計並不比沒有設計好!」稍微思考一下就會表明同樣有效的答案是「什麼橋?」在您真正從設計中建造橋梁之前,無需擔心穿過它。關鍵是我們不會從倉促的設計中建造橋梁。在橋梁實際建造之前,設計將大大改進。我們會做分析。我們將建立計算機模型並執行模擬。我們甚至可以建立比例模型並在風洞和其他方式中對其進行測試。在我們建造橋梁之前,我們將盡一切努力確保設計是乙個好的設計。我們稱這個為「工程」(有時,儘管如此,它仍然不完全正確……塔科馬有這座橋)。

回到軟體。我們在軟體行業也改進我們的設計,只是我們不稱之為工程。我們稱之為「測試和除錯」。軟體生命週期的這個階段需要很長時間。經常需要比計畫的時間要長。不幸的是,通常這並不充分,我們變成可交付軟體的最終設計仍然沒有它們應有的那麼好。這似乎是軟體生命週期中的乙個事實。許多人對此感到遺憾並問為什麼我們軟體開發人員沒有更好地「工程化」我們的設計?有很多的解釋,但對我來說從來都沒有乙個是最明顯的——簡單的經濟學。軟體的構建成本非常低。

我瘋了嗎?我不這麼認為!在您的486上編譯和鏈結50,000行c++**似乎要花很長時間,但是您希望如何組裝具有50,000個獨立元件的電路卡,或構建具有50,000個結構元素的橋梁?我們不構建軟體正確性的數學證明或通過符號執行器執行我們的**,因為構建和測試它需要更少的時間和精力。如果我們做更多的前者,我們可能會得到更好的軟體,但我們沒有。為什麼不?

可能有很多原因,但我想建議其中許多原因是我們沒有將測試和除錯視為軟體設計過程的一部分。我們希望它完全消失。既然它不會,我們嘗試將其視為某種「質量保證」功能,並盡可能少地花費時間、精力和金錢。測試和除錯要佔據典型的軟體開發周期的一半的時間,這讓我們視為軟體工業的羞恥。真的這麼糟糕嗎?我懷疑其他學科的大多數工程師都不知道實際建立設計所花費的時間百分比以及用於測試和除錯結果的時間。一些行業可能是比軟體更好。我很確定其他行業實際上要差得多。考慮「設計」一架新客機必須採取什麼措施。

當人們開始在軟體設計和其他工程學科之間進行無端的比較時,我變得有些暴躁。主要的微處理器邏輯上存在錯誤,橋梁倒塌,水壩破裂,飛機從天而降,成千上萬的汽車和其他消費者召回的產品----所有在最近的記憶和所有設計錯誤的結果。

軟體的問題是——設計不僅僅是重要的,它基本上是一切。說程式設計師不應該設計就像說魚不應該游泳。當我編碼時,我在設計。我在憑空創造乙個軟體設計。有時演算法很簡單,設計很瑣碎。很多時候,我必須設計資料結構和演算法來匹配。可能有替代方案,我必須根據我對每種的優點和缺點的看法來在它們之間做出選擇。有時我認為設計變得太複雜了,我指定乙個或多個子模組。當我完成設計時,我測試它看看它有多好,然後改進它以使其更好。改進不僅會來自發現原始設計中的錯誤,也來自其他**,例如夥伴瀏覽和正式審查。底線是我的設計必須是正確的,否則從它構建的每個軟體都是錯誤的。因此我專注於正確地做,就像任何其他創意設計活動一樣,它需要智力上的努力和技能。

儘管如此,大多數軟體系統都相當大且相當複雜,我的乙個模組只是一小部分。雖然我專注於模組x的**設計細節,但可能還有數百個其他模組和數千個其他細節我可以不太可能同時擔心。軟體設計的一些重要方面也不能完全歸入資料結構和演算法的範疇。大多數人在說軟體設計時指的就是這些「其他方面」。

確實,程式設計師在設計**時不想擔心設計的「高階方面」。無論如何,他們往往最終不得不擔心。高階設計顯然會影響詳細設計。反之亦然。也是如此。內部設計的細節可能(或應該)幫助在高層替代方案中做出決定。完善設計的所有方面是乙個應該在整個開發周期中發生的過程。如果設計的某些方面被「凍結」了在細化過程中,您可能最終會得到乙個糟糕的甚至不可行的最終設計。

我的一些同事將我在這個主題上的長篇大論解釋為「傑克說忘記設計並開始編碼」。事實並非如此(儘管我明白他們是如何獲得這種印象的)。我並不反對傳統的軟體設計。我們在各個層面都迫切需要好的設計。不管我們把早期的流程稱為頂層設計、結構設計、模組設計還是其他什麼都沒有關係。我一直在爭論的是觀念上的兩個變化。首先,我們認識到早期設計步驟的結果不是乙個完整的軟體設計,就像第乙個粗略的草圖是乙個完整的橋梁設計。第二,我們使用乙個真正的骨架軟體設計的符號來捕捉我們的設計思維。這意味著使用程式語言。

根本上,計算機並不關心我們如何獲得最終的軟體設計,就像建造橋梁的高架千斤頂關心橋梁設計如何改進和驗證一樣。對他們中的任何乙個來說,重要的是他們正在工作的設計足以讓他們正確地構建產品。另一方面,對於我們這些負責建立軟體設計的人來說,建立乙個好的軟體設計所需要的東西顯然很重要。早期設計越好,後期需要改進的工作就越少。這才是我們真正要談論的,不是嗎。

我所爭論的不是更少的軟體設計,而是乙個現實的軟體設計過程。我們需要認識到設計軟體和軟體設計之間的區別。使用我們在設計過程中找到幫助我們的任何工具和技術是有意義的。忘記什麼是真正的軟體設計是沒有意義的。當我們解決了軟體設計的某些方面時,我們不應該讓與硬體工程學科的不正確比較使我們無法正確文件化我們在軟體設計中的工作。是的,我們應該對它進行編碼。如果我們真正在做的是軟體設計,那麼我們所做的一切都會以某種方式反映在**中。我們在做出影響**的決定時也會寫**(或其中有意義的部分)。

我知道「語言無關」軟體設計符號的所有論點。他們都忽略了乙個基本問題。軟體設計涉及將一些問題空間的概念翻譯成程式語言。這種翻譯必須由人工完成,由於我們的程式語言通常完全不足以直接表達問題空間的概念,這通常是乙個困難且容易出錯的過程。當我們把概念從一種形式翻譯成另一種形式,尤其是哪些複雜的,我們經常會丟失重要資訊。如果涉及多次翻譯,我們最終得到的最終產品可能會丟失太多重要資訊,不能準確反映我們的原始概念,和/或僅包含錯誤。每一步的翻譯都是不同的。記住,c++(或ada、c、smalltalk、lisp或任何程式語言)沒有什麼神聖的。它不是我們計算機的母語。從根本上說,程式語言本身只是一種設計符號。如果可以避免,我認為引入額外的翻譯步驟沒有任何意義。

我承認我的「**即設計」方法存在一些問題。首先,即使是最好的程式語言作為表達軟體設計某些方面的工具也存在嚴重的弱點。資訊在**中(如果不是,那麼它不是軟體設計資訊)但很難以人類可讀的形式將其取出。這些是上面提到的軟體設計的「其他方面」。第二個問題是類似的。資訊從問題空間進入軟體設計,但不能從軟體設計本身被重新構造。我們希望捕獲這些資訊,以防我們以後需要更改軟體設計。典型的源**注釋不是一種充分的機制。

這兩個問題都意味著輔助文件對於軟體設計與任何其他工程學科一樣重要,如果不是更重要的話。然而,我們必須認識到輔助文件,而不是將其與軟體設計混淆。我們真正需要的是更具表現力的程式語言。 這就是我關於c++是軟體設計藝術的重大進步的宣告的原因。c++是一種更具表現力的程式語言,這使其成為更好的軟體設計工具。

作為最後乙個主題,請考慮我的觀點揭示了傳統軟體開發過程的哪些方面。最終,所有軟體設計過程最終都會通過構建/測試週期來驗證和完善最終設計。否則,任何偽裝都是愚蠢的。然而,傳統的mil-std 和其他瀑布模型開發過程甚至不允許編寫一行**,直到產生和審查了一定數量的輔助文件。通常,製作此文件的人會繼續做其他事情,留下一群新的、通常更年輕、經驗不足的人實際生成真正的軟體設計。這個過程已經聲名狼藉,以至於沒有真正的開發人員提倡它,這並不奇怪(無論如何對我來說)。他們在嘗試什麼?

現在我們有了快速原型和螺旋式開發。在我看來,很容易理解為什麼這些正在取代瀑布方法。這兩者都只是在開發周期早期編寫**的藉口,以便通過構建改進設計的過程/測試可以盡早開始。他們通常也會讓相同的人參與頂層設計和實際**設計。毫不奇怪,這兩種方法都被視為重大改進。即使是最好的傳統方法也繼續嘗試打破軟體設計進入具有單獨符號和產品的不相交步驟,然後他們繼續想知道為什麼他們在獲得正確的最終軟體產品時遇到問題。

在ada中完成的專案在整合、測試和除錯所需的時間方面顯示出顯著改善(以犧牲一些額外的頂級設計工作為代價)。結構化程式設計在當時被認為是乙個突破。物件導向的設計和c++正在走向世界風暴。忘記對這些現象提供的所有解釋,並考慮哪些不起作用。案例工具?流行,是;通用,否。結構圖?同樣的事情。同樣,warner-orr圖,booch圖,物件圖,你說出它的名字。每個都有它的優點,還有乙個基本的弱點——它真的不是軟體設計。最終,程式設計技術的改進對軟體開發來說比其他任何東西都重要。

軟體社群似乎有乙個集體幻想,如果我們能找到正確的圖形設計符號,使軟體設計看起來像其他工程設計,那麼我們就可以取代其他學科的軟體工程師。我不同意。工程是關於你如何做這個過程,而不是關於最終產品是否需要乙個cad系統來渲染它。我們在軟體業務中是如此接近,但又如此遙遠。軟體是如此——嗯,軟。乙個軟體系統可以代表任何東西。這,加上構建/測試週期的經濟性,使得我們不太可能找到除當前試錯之外的通用方法來驗證軟體設計。但是,我們可以改進過程。也許如果我們開始將軟體開發視為同質設計過程,並專注於改進最重要的階段(程式設計、除錯和測試),我們可能會發現我們的行業比我們想象的更像是一門嚴格的科學。

我仍然不知道我是否表達了我的觀點,但總而言之:

歷史筆記

在討論這封信的出版及其與原始信件關係的電子郵件通訊中,

「事件的順序如下:我在c++期刊的一期中閱讀了一篇關於軟體設計的文章。我給編輯發了一封信,抱怨某事(我不記得是什麼,而且這些天在我的系統上找不到這封信)。編輯列印了這封信和回覆。我所附的是我通過電子郵件傳送給編輯的信,作為對他的回應的回應。我想你會覺得它很熟悉。我個人認為它比文章本身寫得更好。編輯livleen singh提出讓我把我的觀點變成一篇完整的文章,我做到了。」

給加西亞的信

這是一篇管理人必讀的文章,雖然過去很多年,就象永遠不變的人性,它仍然散發著它的光輝。以下是全文 如果你為乙個人工作,以上帝的名義 為他幹!如果他付給你薪水,讓你得以溫飽,為他工作 稱讚他,感激他,支援他的立場,和他所代表的機構站在一起。如果能捏得起來,一盎司忠誠相當於一磅智慧型。在一切有關古巴的事件...

兒子給母親的信

兒子給母親的信 我的母親 你身體還好嗎?農忙還那麼的勞累嗎?母親節來了,我忠心的祝願您 身體健康,每天少一點煩惱,多一點開心!我的母親,您知道嗎?兒子一直都想著你,可能只是你不太理解你兒子有些地方的做法,其實我知到母親您只是希望你的兒子能養乙個家就行了,不要什麼好大的作為,其實不只是您這麼想吧 慈母...

給丁總的信

丁總 我是敏,想我這樣叫你,你不會見外。最近好吧,什麼都不如自己的健康重要!一直以來都想給你寫信了,可找不到很好的措詞,因為如果只是蜻蜓點水一帶而過,估計你也不會當回事。但事態發展到現在,也管不了這麼多了。還記得一年多前的在武漢時候吧,有一次你信誓旦旦描繪著你的巨集願 辦報紙,全國開分點。那時候看得...