1. 程式人生 > >【譯】如何寫出一份優秀的軟件設計文檔

【譯】如何寫出一份優秀的軟件設計文檔

我沒 截圖 支持 不同的 跟蹤 cat 編輯 系統 ngs

作為一名軟件工程師,我花了很多時間閱讀和編寫設計文檔。在完成了數百篇這些文檔之後,我親眼目睹了優秀設計文檔與項目最終成功之間的強烈關聯。

本文試圖描述什麽使設計文檔變得更好。

本文分為4個部分:

  • 為什麽要寫一份設計文檔

  • 要包含在設計文檔中的內容

  • 怎麽寫

  • 相關過程

為什麽要寫一個設計文檔?

設計文檔 - 也稱為技術規範 - 描述了您計劃如何解決問題。

已經有很多文章闡述過為什麽在開工之前編寫設計文檔很重要。所以我在這裏要說的是:

設計文檔是確保正確完成工作的最有用工具。

設計文檔的主要目標是通過強迫您思考設計並收集其他人的反饋來提高您的效率。人們通常認為設計文檔的目的是教會其他人關於某個系統或稍後作為文檔。雖然這些可能是一部分作用,但它們並不是最根本的目的。

作為一般經驗法則,如果您正在處理可能需要1個工程師月或更長時間的項目,那麽您應該編寫設計文檔。但不要止步於此 - 許多小型項目也可以從迷你設計文檔中受益。

如果您還在閱讀,您會相信設計文檔的重要性。但是,不同的研發團隊,甚至同一團隊的工程師,經常以非常不同的方式編寫設計文檔。讓我們來談談優秀設計文檔的內容,風格和寫作流程吧。

設計文檔中應該包含哪些內容?

設計文檔描述了問題的解決方案。由於每個問題的性質不同,您自然希望以不同的方式構建您的設計文檔。

首先,以下是您應該至少考慮在下一個設計文檔中包含的部分列表:

標題和參與者

您的設計文檔的標題,作者(應該與計劃參與此項目的人員列表相同),檢查者(我們將在“處理”部分中詳細討論),以及最後更新日期。

概覽

高度概括的,公司的每位工程師都應該理解並能夠通過閱讀概覽來決定是否有必要閱讀其余的文檔。最多3段。

背景

對手頭問題的描述,為什麽這個項目是必要的,人們需要知道什麽來評估這個項目,以及它如何適應技術戰略,產品戰略或團隊的季度目標。

目標和非目標

目標部分應包括:

描述項目的用戶驅動影響 - 您的用戶可能是另一個工程團隊甚至是另一個技術系統
指定如何使用指標衡量成功 - 如果您可以鏈接到跟蹤這些指標的儀表板,則可以獲得獎勵
非目標同樣重要,它描述了您不會修復哪些問題,因此它也和目標在同一頁面上。

裏程碑

一個可衡量的檢查點列表,因此您的PM和您的經理的經理可以瀏覽它並大致了解項目的不同部分何時完成。如果項目超過1個月,我建議您將項目分解為面向用戶的主要裏程碑。

使用日歷日期,以便考慮無關的延遲,假期,會議等。它應該看起來像這樣:

開始日期:2018年6月7日
裏程碑1 - 以暗模式運行的新系統MVP:2018年6月28日
裏程碑2 - 下掉舊系統:2018年7月4日
結束日期:將功能X,Y,Z添加到新系統:2018年7月14日

如果其中一些裏程碑的ETA發生變化,請在此處添加[更新]子部分,以便相關方可以輕松查看最新的情況。

當前解決方案

除了描述當前的實現之外,您還應該通過一個高級示例流來說明用戶如何與此系統交互和/或數據如何通過它。

用戶故事是構建此框架的絕佳方式。請記住,您的系統可能包含具有不同用例的不同類型的用戶。

推薦解決方案

有人稱之為技術架構部分。再次,嘗試通過用戶故事來具體化這一點。可以包含許多子部分和圖表。

先提供一張大圖,然後填寫大量細節,確保即使你出去度假了,團隊中的另一位工程師也可以閱讀它並按照你的描述實施解決方案。

替代方案

在提出上述解決方案時,您還考慮了什麽?替代品的優點和缺點是什麽?您是否考慮購買第三方解決方案 - 或使用開源解決方案 - 解決此問題而不是構建自己的問題?

監控和警報

我喜歡包括這一部分,因為人們經常事後才去考慮它們或者幹脆忽略它們,當事情出了岔子,他們一籌莫展。

跨團隊配合方面

是否會增加外呼和開發團隊的負擔?
它會花多少錢?
它是否會導致系統延遲?
它是否暴露了安全漏洞?
有什麽負面後果和副作用?
支持團隊如何與客戶溝通?

討論

任何你不確定的公開問題,你想讓讀者權衡的有爭議的決定,建議未來的工作,等等。

詳細的範圍和時間表

本節主要是由參與該項目的工程師,他們的技術主管和他們的經理閱讀。因此,本節在文檔的最後。

從本質上講,這是您計劃執行項目每個部分的方式和時間的細分。有很多內容可以準確地確定範圍,因此您可以閱讀這篇文章以了解有關範圍的更多信息。

我傾向於將設計文檔的這一部分視為正在進行的項目任務跟蹤器,因此每當我的範圍估計發生變化時,我都會更新它。但這更多的是個人偏好。

怎麽寫

下面讓我們來談談寫作風格。我保證這與你的高中英語課不同。

寫得盡可能簡單

不要試著寫你讀過的學術論文。它們是為了給期刊評論家留下深刻印象。您的文檔是為了描述您的解決方案並從您的隊友那裏獲得反饋而編寫的。多運用類似這些:

  • 簡單的話

  • 短句

  • 項目符號列表和/或編號列表

  • 具體的例子,如“用戶愛麗絲連接她的銀行賬戶,然後…”

添加大量表格和圖示

表格通常可用於比較幾個可能的選項,圖表通常比文本更容易解讀。我已經用Google Drawing創建圖表了。

專業提示:請記住在屏幕截圖下添加指向圖表的可編輯版本的鏈接,以便以後在事情不可避免地發生變化時輕松更新。

包括數字

問題嚴重程度通常決定了解決方案。為了幫助審閱者了解實際狀況,請包括實際數字,如數據庫行數,用戶錯誤數,延遲 - 以及這些數據如何隨著使用情況而擴展(請記住您的Big-O表示法?)。

試著變得有趣

規範不是學術論文。此外,人們喜歡閱讀有趣的東西,所以這是讓讀者保持參與的好方法。盡管如此,不要喧賓奪主。

進行測試

在將設計文檔發送給其他人進行審核之前,請自己作為審核人員過一遍。您對此設計有什麽疑問?然後先發制人地解決它們。

做假期測試

如果您現在無法訪問互聯網,那麽您團隊中的某個人是否可以閱讀該文檔並按照您的意圖實施該文檔?

設計文檔的主要目標不是知識共享,但這是一種評估清晰度的好方法,以便其他人可以實際為您提供有用的反饋。

處理

設計文檔可幫助您在浪費大量時間實施錯誤解決方案或解決錯誤問題之前獲得反饋。獲得良好反饋有很多藝術,但這是以後的事。現在,讓我們專門討論如何編寫設計文檔並獲取反饋。

首先,參與項目的每個人都應該參與設計過程。如果技術主管最終推動了很多決定,那也沒關系,但是每個人都應該參與討論並參與設計。因此,本文中的“你”是一個真正的復數“你”,包括項目中的所有人。

其次,設計過程並不意味著你盯著白板寫些理論化的想法,隨意制作潛在的解決方案原型。這與在編寫設計文檔之前開始為項目編寫生產代碼不同,不要那樣做。但你絕對應該隨意寫一些一次性代碼來驗證想法。

之後,當您開始了解如何進行項目時,請執行以下操作:

  1. 請您團隊中經驗豐富的工程師或技術負責人成為您的評審員。理想情況下,這將是一個受到尊重和/或熟悉問題細節的人。

  2. 進入帶白板的會議室。

  3. 向這位工程師描述你正在解決的問題(這是非常重要的一步,不要跳過它!)。

  4. 然後解釋你想到的實現,並說服他們這是正確的構建。

在開始編寫設計文檔之前完成所有這些操作可以讓您在投入更多時間並接受任何特定解決方案之前盡快獲得反饋。通常情況下,即使實施保持不變,您的審核員也可以指出您需要覆蓋的極端案例,指出任何潛在的混淆區域,並預測您以後可能遇到的困難。

然後,在您撰寫了設計文檔的粗略草稿之後,讓相同的審閱者再次閱讀它,並通過在設計文檔的“標題和人物”部分中添加他們的名稱作為審閱者來標記它。這為審閱者創造了額外的激勵和責任。

在這方面,考慮為設計的特定方面添加專門的審閱者(例如SRE和安全工程師)。

一旦您和審核人員確定了,請隨時將設計文檔發送給您的團隊,以獲得額外的反饋和知識共享。我建議將反饋收集過程的時間限制在1周左右,以避免延誤。致力於解決人們在該周內留下的所有問題和評論。

最後,如果您,您的審閱者和其他閱讀該文檔的工程師之間存在很多爭議,我強烈建議您在文檔的“討論”部分中合並所有爭議點。然後,與各方召開會議,當面談論這些分歧。

每當討論主題長度超過5條評論時,轉向當面討論往往效率更高。請記住,即使每個人都無法達成共識,您仍然有責任進行最後的溝通。

在最近與Shrey Banga談論此事時,我了解到Quip有一個類似的過程,除了在您的團隊中擁有經驗豐富的工程師或技術負責人作為審閱者之外,他們還建議讓不同團隊的工程師審核該文檔。我沒有嘗試過這個,但我當然可以看到這有助於從不同角度的人那裏獲得反饋,並提高文檔的一般可讀性。

完成上述所有操作後,即可開始實施!對於額外的布朗尼點,在實施設計時將此設計文檔視為活文檔。每次您更改原始解決方案或更新範圍的內容時,請更新文檔。這樣你就不必向所有利益相關者反復解釋事情,你會感謝我的。

最後,讓我們真正了解一下:我們如何評估設計文檔的成功?

我的同事Kent Rakip對此有一個很好的答案:如果完成正確的投資回報率,設計文檔就會成功。這意味著成功的設計文檔實際上可能導致這樣的結果:

  1. 您花了5天時間編寫設計文檔,這迫使您通過技術架構的不同部分進行思考

  2. 您可以從審閱者那裏獲得反饋,即X是建議架構中最具風險的部分

  3. 您決定首先實施X以降低項目風險

  4. 3天後,你發現X要麽不可能,要麽比你原先想要的要困難得多

  5. 您決定停止處理此項目並優先處理其他工作

在本文開頭,我們說設計文檔的目標是確保正確的工作完成。 在上面的示例中,由於這個設計文檔,您可能只花了8天時間而不是浪費幾個月才能中止此項目。 對我來說似乎是一個非常成功的結果。

如果您喜歡這篇文章,請在Twitter上關註我,了解有關工程,流程和後端系統的更多帖子。


原文地址


相關文章:
【推薦】 React server rendering —— 網易美學主站同構實錄
【推薦】 數據庫路由中間件MyCat - 使用篇(1)
【推薦】 MyCat - 背景篇(1)

【譯】如何寫出一份優秀的軟件設計文檔