- 你真的會寫代碼嗎
- (意)馬爾科·法埃拉
- 2214字
- 2021-07-28 17:52:10
關于本書
本書的核心思想是通過對不同方面的代碼質量(又稱非功能需求)進行比較,使你了解經驗豐富的開發者的思維模式。
序之前的圖展示了本書內容與專業開發人員所需的廣泛知識之間的關系。首先,你要從學習一門編程語言的基礎知識開始。在Java中,你需要了解類、方法、字段,等等。然而,本書并不會教你這些基礎知識。你最好按照以下三個路徑來學習。
● 編程語言的學習路徑:學習語言的更多高級特性,如泛型和多線程等。
● 算法的學習路徑:學習扎實的理論原則、標準算法和數據結構,以及衡量其性能的方法。
● 軟件工程的學習路徑:學習設計原則、方法論和有助于管理復雜性的最佳實踐,尤其是在大型項目中。
本書用一條主線串聯起了所有這些內容。我并沒有把這些不同的方面分開講授,而是根據每一章的需要進行混搭。
每一章都集中關注一個特定方面的軟件質量,比如時間效率或可讀性。我之所以選擇這些方面,不僅是因為它們的重要性和普遍性,還因為它們可以被有意義地應用到一個小的代碼單元(一個類)上。此外,我盡量把重點放在通用的原則和編碼技術上,而不是具體的工具上。在適當的時候,我會指出可以幫助你評估和優化特定軟件質量的工具和庫。
目標讀者
對于接受過較少正規訓練的初級開發人員來說,本書是一個理想的起點,可以拓寬其軟件開發的視野。具體來說,本書的目標讀者有兩種。
● 對于幾乎沒有接受過正規訓練或者非計算機科學/計算機工程專業的開發者來說,本書提供了對計算機科學和工程技術的概覽,闡述了所有重要編程任務都會涉及的權衡之術。
● 對于計算機科學或計算機工程專業的學生來說,本書為各種傳統教學課程中的知識點做了一些補充,提供了一些實戰案例。因此,它可以作為編程和軟件工程課程的補充材料。
要在這兩種情況下最大限度地利用本書,你應該熟悉以下內容。
● 基本的編程概念,如迭代和遞歸等。
● 面向對象編程的基本概念,如封裝和繼承等。
● 中級Java語言技能,包括泛型、標準集合和基本的多線程(線程創建和synchronized關鍵字)。
內容結構
下面是各章的簡介和對應的代碼質量。請不要忽略章末的所有實操練習。它們附帶了詳細的解決方案,并通過在不同的上下文中應用所學技巧來完善各章的核心內容。
● 第1章首先介紹要解決的編程任務(一個水容器類),接下來給出一個樸素的實現,展示了缺乏經驗的程序員的常見誤區。
● 第2章詳細介紹一個參考實現(隨后稱之為Reference版本),它是在不同方面的質量之間進行平衡后的結果。
● 第3章聚焦在時間效率上,你會將Reference版本的運行時間縮短兩個數量級(縮短到原來的約1/500),并發現不同的用例需要不同的性能權衡。
● 第4章對空間(內存)效率進行實驗。與Reference版本相比,你將使用對象把容器的內存占用量縮小50%以上,然后放棄對每個水容器使用對象,從而將其內存占用縮小90%。
● 第5章通過監控來實現可靠性,介紹契約式設計的方法論,并展示如何基于方法契約和類不變式、通過運行時檢查和斷言來強化Reference版本中的類。
● 第6章通過單元測試來實現可靠性,介紹如何為類設計和執行測試套件,以及測量代碼覆蓋率的方法和工具。
● 第7章關注可讀性,你將遵循最佳實踐來重構Reference版本,編寫出整潔且自描述的代碼。
● 第8章研究并發和線程安全,你會重溫線程同步的基本概念,并發現演進示例需要一些重要的技術來避免死鎖和競爭條件。
● 第9章重點關注可復用性,你將使用泛型對Reference版本的類進行泛化,以兼容其他具有類似通用結構的應用。
● 附錄A在討論簡潔性的同時,提出一個使用了遞歸的緊湊實現,其源代碼的長度只有Reference版本的15%。不出所料,結果是無法閱讀、難以讓人滿意的混亂代碼,會讓你立即被趕出任何代碼審查會議。
● 附錄B把最重要的幾方面軟件質量放在一起,給你一個終極的水容器類。
在線代碼庫
本書中的所有代碼是按章組織的,都可以在一個公共的在線Git代碼庫中找到(在Bitbucket網站中搜索mfaella/exercisesinstyle)。大部分代碼是同一個Container類的不同實現版本。每個版本都有一個名字,對應于它的包名。例如,1.8節中出現的第一個版本名為Novice。在代碼庫中,它對應的類是eis.chapter1.novice.Container。本書最后的表列出了主要的類及其描述。
本書的示例代碼也可從圖靈社區本書主頁下載。
為什么選擇Java,哪個版本的Java
眾所周知,Java的發展速度越來越快,每隔半年就會有一個新版本發布。截至本書寫作時,最新的版本是Java 12。
不過本書關注的重點并不是Java編程本身,而是如何培養一種評估和平衡各種軟件質量的習慣,無論你使用哪種語言都用得上。本書的例子之所以用Java來寫,只是因為我自己對Java比較熟悉,也因為它是最常用的語言之一。
本書講授的原則在其他語言中也同樣適用。使用的語言與Java越接近,你就越能不加修改地復用本書中的內容。例如,C#與Java非常接近,書中也確實有一些關于C#的備注,突出了相關內容在C#中的區別。
至于書中展示的、存儲在在線倉庫中的Java代碼,99%是用Java 8寫的。在一些地方,我使用了Java 9的少數工具,比如用靜態方法List.of創建列表。
線上論壇
購買本書之后,你就可以免費進入Manning出版社的私有論壇。在這里,你可以對本書發表評論,提出技術問題,并得到作者和其他用戶的幫助。此論壇的鏈接是https://livebook.manning.com/#!/book/seriously-good-software/discussion。你還可以在https://livebook.manning.com/#!/discussion上了解更多關于Manning論壇的信息和規則。
Manning出版社向讀者承諾提供一個讀者之間以及讀者與作者之間進行有效對話的場所,但是并不保證作者的具體參與量,作者對論壇的貢獻是自愿且無償的。我們建議你嘗試向作者提出一些具有挑戰性的問題,從而保持作者對此論壇的興趣。只要本書還在售,此論壇以及過往的討論就都是可以訪問的。
更多信息
掃描下方二維碼,即可獲取電子書相關信息及讀者群通道入口。
- Advanced Quantitative Finance with C++
- R語言數據可視化之美:專業圖表繪制指南
- TestNG Beginner's Guide
- Lua程序設計(第4版)
- Ext JS 4 Web Application Development Cookbook
- Android底層接口與驅動開發技術詳解
- Unity 2018 Shaders and Effects Cookbook
- 寫給程序員的Python教程
- 微課學人工智能Python編程
- Anaconda數據科學實戰
- Mastering ASP.NET Core 2.0
- IBM RUP參考與認證指南
- 劍指大數據:企業級電商數據倉庫項目實戰(精華版)
- MonoTouch應用開發實踐指南:使用C#和.NET開發iOS應用
- 開發者測試