【譯】如何寫出一份優秀的軟體設計文件
作為一名軟體工程師,我花了很多時間閱讀和編寫設計文件。在完成了數百篇這些文件之後,我親眼目睹了優秀設計文件與專案最終成功之間的強烈關聯。
本文試圖描述什麼使設計文件變得更好。
本文分為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表示法?)。
試著變得有趣
規範不是學術論文。此外,人們喜歡閱讀有趣的東西,所以這是讓讀者保持參與的好方法。儘管如此,不要喧賓奪主。
進行測試
在將設計文件傳送給其他人進行稽核之前,請自己作為稽核人員過一遍。您對此設計有什麼疑問?然後先發制人地解決它們。
做假期測試
如果您現在無法訪問網際網路,那麼您團隊中的某個人是否可以閱讀該文件並按照您的意圖實施該文件?
設計文件的主要目標不是知識共享,但這是一種評估清晰度的好方法,以便其他人可以實際為您提供有用的反饋。
處理
設計文件可幫助您在浪費大量時間實施錯誤解決方案或解決錯誤問題之前獲得反饋。獲得良好反饋有很多藝術,但這是以後的事。現在,讓我們專門討論如何編寫設計文件並獲取反饋。
首先,參與專案的每個人都應該參與設計過程。如果技術主管最終推動了很多決定,那也沒關係,但是每個人都應該參與討論並參與設計。因此,本文中的“你”是一個真正的複數“你”,包括專案中的所有人。
其次,設計過程並不意味著你盯著白板寫些理論化的想法,隨意製作潛在的解決方案原型。這與在編寫設計文件之前開始為專案編寫生產程式碼不同,不要那樣做。但你絕對應該隨意寫一些一次性程式碼來驗證想法。
之後,當您開始瞭解如何進行專案時,請執行以下操作:
請您團隊中經驗豐富的工程師或技術負責人成為您的評審員。理想情況下,這將是一個受到尊重和/或熟悉問題細節的人。
進入帶白板的會議室。
向這位工程師描述你正在解決的問題(這是非常重要的一步,不要跳過它!)。
然後解釋你想到的實現,並說服他們這是正確的構建。
在開始編寫設計文件之前完成所有這些操作可以讓您在投入更多時間並接受任何特定解決方案之前儘快獲得反饋。通常情況下,即使實施保持不變,您的稽核員也可以指出您需要覆蓋的極端案例,指出任何潛在的混淆區域,並預測您以後可能遇到的困難。
然後,在您撰寫了設計文件的粗略草稿之後,讓相同的審閱者再次閱讀它,並通過在設計文件的“標題和人物”部分中新增他們的名稱作為審閱者來標記它。這為審閱者創造了額外的激勵和責任。
在這方面,考慮為設計的特定方面新增專門的審閱者(例如SRE和安全工程師)。
一旦您和稽核人員確定了,請隨時將設計文件傳送給您的團隊,以獲得額外的反饋和知識共享。我建議將反饋收集過程的時間限制在1周左右,以避免延誤。致力於解決人們在該周內留下的所有問題和評論。
最後,如果您,您的審閱者和其他閱讀該文件的工程師之間存在很多爭議,我強烈建議您在文件的“討論”部分中合併所有爭議點。然後,與各方召開會議,當面談論這些分歧。
每當討論主題長度超過5條評論時,轉向當面討論往往效率更高。請記住,即使每個人都無法達成共識,您仍然有責任進行最後的溝通。
在最近與Shrey Banga談論此事時,我瞭解到Quip有一個類似的過程,除了在您的團隊中擁有經驗豐富的工程師或技術負責人作為審閱者之外,他們還建議讓不同團隊的工程師稽核該文件。我沒有嘗試過這個,但我當然可以看到這有助於從不同角度的人那裡獲得反饋,並提高文件的一般可讀性。
完成上述所有操作後,即可開始實施!對於額外的布朗尼點,在實施設計時將此設計文件視為活文件。每次您更改原始解決方案或更新範圍的內容時,請更新文件。這樣你就不必向所有利益相關者反覆解釋事情,你會感謝我的。
最後,讓我們真正瞭解一下:我們如何評估設計文件的成功?
我的同事Kent Rakip對此有一個很好的答案:如果完成正確的投資回報率,設計文件就會成功。這意味著成功的設計文件實際上可能導致這樣的結果:
您花了5天時間編寫設計文件,這迫使您通過技術架構的不同部分進行思考
您可以從審閱者那裡獲得反饋,即X是建議架構中最具風險的部分
您決定首先實施X以降低專案風險
3天后,你發現X要麼不可能,要麼比你原先想要的要困難得多
您決定停止處理此專案並優先處理其他工作
在本文開頭,我們說設計文件的目標是確保正確的工作完成。 在上面的示例中,由於這個設計文件,您可能只花了8天時間而不是浪費幾個月才能中止此專案。 對我來說似乎是一個非常成功的結果。
如果您喜歡這篇文章,請在Twitter上關注我,瞭解有關工程,流程和後端系統的更多帖子。
相關文章:
【推薦】 《深入理解計算機系統》之淺析程式效能優化
【推薦】 知物由學 | 內容平臺、社交媒體如何應對虛假新聞?
【推薦】 網易雲深度剖析Kubernetes優化與實踐