官术网_书友最值得收藏!

前言

本書介紹軟件工程師經常用于編寫可靠的、易于維護的代碼的關鍵概念與技術。本書并不是簡單列舉“該做”和“不該做”的事項,而是旨在解釋每種概念和技術背后的核心理論,以及需要權衡的因素。這應該能夠幫助讀者對如何像一位經驗豐富的軟件工程師那樣思考和編程有基本的理解。

本書的讀者

本書的目標讀者是那些已經具備基本編程技能,想繼續提高編程技能的人。本書適合有0~3年軟件工程師工作經驗的人閱讀。有豐富工作經驗的工程師可能發現,本書中的許多內容他們都已經掌握,但我希望他們把這本書當作指導其他同行的有用資源。

本書的組織結構

本書分為三部分,共11章。第一部分介紹較為理論性的概念,它們組成了我們對代碼的思考方法。第二部分轉向較為實用的經驗教訓。第二部分的每一章都分為一系列主題,分別涵蓋特定的考慮因素或技術。第三部分介紹創建有效和可維護的單元測試的原則與方法。

本書各章節的總體形式是:先闡述一個可能有問題的場景(以及部分代碼),然后說明消除部分或全部問題的替代方法。從這個意義上說,每個章節往往是從展示“壞”代碼過渡到“好”代碼,但需要注意的是,是主觀的說法,與語境相關。正如本書所要強調的,在編程工作中往往要考慮一些微妙的差別和權衡,這也就意味著好壞的區別并不總是一目了然。

第一部分“理論”為一些總體性和較為理論性的考慮因素打下基礎。這些考慮因素組成我們像軟件工程師那樣編寫代碼的方法。

? 第1章介紹代碼質量的概念,特別是我們打算用高質量代碼要實現的一組實際目標。然后,我們將這些目標展開為“代碼質量的六大支柱”,為日常編程使用提供高層策略。

? 第2章討論抽象層次。這是指導我們如何構造代碼,并將其分解為不同部分的基本考慮因素。

? 第3章強調考慮必須使用我們的代碼開展工作的其他工程師的重要性。本章還將討論代碼契約,以及如何仔細考慮這些契約以防止軟件缺陷。

? 第4章討論軟件錯誤,并闡釋為何認真思考錯誤通知與處理方法是編寫優良代碼的關鍵部分。

第二部分“實踐”以更貼合實踐的方式,用特定的技術與示例介紹代碼質量的前五大支柱(第1章定義的)。

? 第5章介紹提高代碼可讀性的方法。這能確保其他工程師理解代碼的意義。

? 第6章介紹避免意外情況的方法。這能確保其他工程師不會誤解代碼的功能,從而最大限度地降低出現缺陷的可能性。

? 第7章介紹使代碼不容易被誤用的方法。這使得工程師不容易在不經意間編寫出邏輯錯誤或者違反假設的代碼,最大限度地降低出現缺陷的可能性。

? 第8章介紹實現代碼模塊化的方法。這種關鍵技術有助于確保代碼表現出清晰的抽象層次,能夠適應不斷變化的需求。

? 第9章介紹代碼的重用性和可推廣性。這能避免軟件工程師重復編寫類似代碼,使得添加新功能或構建新特性更加方便、安全。

第三部分“單元測試”介紹編寫高效單元測試的關鍵原則和實用方法。

? 第10章介紹影響單元測試代碼的一些原則和考慮因素。

? 第11章以第10章介紹的原則為基礎,為編寫單元測試提供一系列具體、實用的建議。

閱讀本書的理想方式是從頭到尾完整閱讀,因為本書前面的章節是后續章節的基礎。盡管如此,第二部分(以及第11章)中的主題通常相對獨立,而且每個主題篇幅較小,因此,即使單獨閱讀,也是有益處的。這樣的編寫方式是有意為之,目的是提供向其他工程師快速解釋既定優秀實踐的有效手段。對希望在代碼評審中解釋特定概念或指導其他工程師的工程師來說,這是非常有用的。

關于代碼

本書的目標讀者是使用靜態類型、面向對象編程語言,例如Java、C#、TypeScript、JavaScript(ECMAScript 2015或有靜態類型檢查器的更新版本)、C++、Swift、Kotlin、Dart 2或類似語言的工程師。在使用類似語言編程時,本書涵蓋的概念有廣泛的適用性。

不同編程語言表達邏輯與代碼結構的語法與范式也不同。但為了在本書中提供代碼示例,必須標準化某些語法和范式。為此,本書借鑒了不同編程語言的偽代碼。使用偽代碼的目的是為大多數工程師提供明確、清晰且易于理解的信息。請牢記這一實用的意圖,本書的目的不是說明某種編程語言的優劣。

同樣,當我們需要在無歧義與簡潔之間做出權衡的時候,偽代碼的例子傾向于無歧義這一方面。這方面的例子之一是使用明確的變量類型,而不是使用var之類關鍵字的推斷類型。另一個例子是用if語句處理空值,而不是更簡潔(但或許更不熟悉)的空值合并和空值條件運算符(參見附錄B)。在真實的代碼庫中(本書的語境之外),工程師可能更希望強調簡潔性。

如何運用本書中的建議

在閱讀任何關于軟件工程的書籍或文章時,一定要記住這是主觀的論題,并且對現實問題的解決方案通常不是完全明晰的。按照我的經驗,優秀的工程師總是帶著健康的懷疑心態去閱讀任何文章,并渴望理解其中的基本思路。人們的觀點各不相同且不斷發展,同時可用的工具和編程語言也在不斷改進。想要知道在何時運用特定建議、何時忽略它們,就必須理解它們的緣由、背景以及限制范圍。

本書旨在收集一系列有用的主題和技術,以引導工程師寫出更好的代碼。盡管考慮這些主題和技術或許是明智之舉,但不應該將其看成絕對正確的理論,或者將其作為絕不能破壞的硬性規則。良好的判斷力是優秀工程師必不可少的特征。

延伸閱讀

本書旨在成為軟件工程師進入編程世界的敲門磚。它應該能夠幫助讀者大致了解代碼的相關思維方式、可能出現的問題以及避免這些問題的技術。但我們的旅程不應該止于此,軟件工程是一個龐大且不斷發展的領域,博覽群書并跟上最新發展是可取的做法。除閱讀文章和博客之外,下面這些相關書籍也可能對讀者有幫助:

Refactoring: Improving the Design of Existing Code[1], second edition, Martin Fowler (Addison- Wesley, 2019);


[1] 本書中文版《重構:改善既有代碼的設計(第2版)》已由人民郵電出版社引進出版,ISBN:978-7-115- 50865-2。

Clean Code: A Handbook of Agile Software Craftsmanship[2], Robert C. Martin (Prentice Hall, 2008);


[2] 本書中文版《代碼整潔之道》已由人民郵電出版社引進出版,ISBN:978-7-115-21687-8。

Code Complete: A Practical Handbook of Software Construction, second edition, Steve McConnell (Microsoft Press, 2004);

The Pragmatic Programmer: Your Journey to Mastery, 20th anniversary, second edition, David Thomas and Andrew Hunt (Addison-Wesley, 2019);

Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Addison-Wesley, 1994);

Effective Java, third edition, Joshua Bloch (Addison-Wesley, 2017);

Unit Testing: Principles, Practices and Patterns, Vladimir Khorikov (Manning Publications, 2020)。

致謝

寫書并非單打獨斗,我要感謝每一位為本書的出版提供幫助的人。特別感謝我的開發編輯Toni Arritola在整個寫作過程中的耐心指導,以及她對讀者和高質量教學始終如一的關注。我還要感謝策劃編輯Andrew Waldron從一開始就相信本書介紹的理念。他在出版過程中提出了許多寶貴意見。感謝我的技術開發編輯Michael Jensen在技術方面的洞察力,以及對全書各章節提供的建議。感謝我的技術校對Chris Villanueva仔細審查本書的代碼和技術內容,并感謝他給出的出色建議。

我還要感謝所有的審稿人員——Amrah Umudlu、Chris Villanueva、David Racey、George Thomas、Giri Swaminathan、Harrison Maseko、Hawley Waldman、Heather Ward、Henry Lin、Jason Taylor、Jeff Neumann、Joe Ivans、Joshua Sandeman、Koushik Vikram、Marcel van den Brink、Sebastian Larsson、Sebastián Palma、Sruti S、Charlie Reams、Eugenio Marchiori、Jing Tang、Andrei Molchanov和Satyaki Upadhyay——在出版的各個階段花時間閱讀本書,并提供了準確、可付諸行動的反饋。對這些反饋的重要性和實用性如何夸大都不過分。

本書涉及的絕大多數概念是軟件工程領域享有盛譽的理念與技術,因此最后我要向多年來所有對這些知識做出貢獻、分享成果的人表示感謝。

主站蜘蛛池模板: 嫩江县| 崇礼县| 丽江市| 疏附县| 许昌县| 石渠县| 同德县| 武威市| 清镇市| 镇远县| 克拉玛依市| 宽甸| 诏安县| 邛崃市| 绍兴市| 南雄市| 青州市| 德保县| 沾化县| 三都| 临邑县| 乐昌市| 白山市| 郴州市| 剑河县| 和政县| 扎囊县| 广平县| 南和县| 宜君县| 永州市| 庐江县| 旬邑县| 丽水市| 略阳县| 郸城县| 黑龙江省| 康平县| 荆门市| 江华| 阳朔县|