【前言】
掌握軟件開發(fā)需要學(xué)習一組完全不同的概念。無論你是一名初級的軟件開發(fā)人員,還是更有經(jīng)驗的開發(fā)高手,這看起來都是一個不可逾越的障礙。你是否應(yīng)該花時間去學(xué)習面向?qū)ο笫澜缰屑扔械闹黝},比如SOLID原則、設(shè)計模式或測試驅(qū)動開發(fā)?你是否應(yīng)該去嘗試一些越來越流行的東西,比如函數(shù)式編程?
即使你已經(jīng)選擇了一些主題來學(xué)習,通常也很難確定它們是如何結(jié)合在一起的。什么時候應(yīng)該在項目中應(yīng)用函數(shù)式編程思想?什么時候擔心測試問題?如何知道在什么時候引入或改進這些技術(shù)?是否需要讀一本關(guān)于這些主題的書,然后再讀一些博客文章或看視頻來弄清楚如何把這些主題結(jié)合在一起?該從哪里開始呢?
不用擔心,本書就是來幫助你的。它將通過一個綜合的、項目驅(qū)動的方式來幫助你學(xué)習。你將學(xué)習成為一名高效的開發(fā)人員所需了解的核心主題。不僅如此,我們還展示了如何將這些東西組合起來,以應(yīng)用于更大的項目。
【為什么寫作本書】
多年來,我們在教授開發(fā)人員編寫代碼方面積累了豐富的經(jīng)驗,我們都寫過關(guān)于Java 8的書籍,并圍繞專業(yè)軟件開發(fā)運營了一些培訓(xùn)課程。在這個過程中,我們被認證為了Java Champion并成為多個國際會議的演講者。
這些年我們發(fā)現(xiàn)許多開發(fā)人員都可以從幾個核心主題的介紹或復(fù)習中受益。通過實踐,通?梢院芎玫馗采w到設(shè)計模式、函數(shù)式編程、SOLID原則以及測試,但是很少看到它們?nèi)绾瘟己玫毓ぷ饕约跋嗷ヅ浜。人們有時甚至會因為對學(xué)習內(nèi)容的選擇性麻木而放棄提高自己的技能。我們不僅想教授人們核心技能,而且還要以一種容易接近和有趣的方式來做這件事。
【面向開發(fā)者的方式】
本書也給了你一個以面向開發(fā)者的角度去學(xué)習的機會。書中包含大量的代碼示例,每當我們引入一個主題時,都會提供具體的代碼示例。你可以獲得書中項目的所有代碼,因此,如果你想繼續(xù)學(xué)習,甚至可以在集成開發(fā)環(huán)境(IDE)中單步調(diào)試書中的代碼,或者運行程序來嘗試它們。
涉及技術(shù)的書籍通常是以正式的、講義式的方式編寫的,那不是正常人說話的方式!本書采用會話式風格,幫助你參與到書的內(nèi)容中來,而不是被居高臨下地教導(dǎo)。
【本書內(nèi)容】
本書每章都圍繞一個軟件項目展開。在每章的結(jié)尾,如果你一直在跟進,應(yīng)該能夠編寫出那個項目。這些項目一開始是簡單的命令行批處理程序,但隨著復(fù)雜度的增加,它們會發(fā)展成功能齊全的應(yīng)用程序。
你將從項目驅(qū)動的結(jié)構(gòu)中以多種方式獲益。首先,你將看到不同的編程技術(shù)如何在集成環(huán)境中協(xié)同工作。當我們在本書的最后部分看到函數(shù)式編程時,它不僅僅是抽象的集合處理操作,而是為了計算所討論的項目中要使用的實際結(jié)果而提出的。這解決了一個問題,那就是:對于教學(xué)資料中看起來很好的想法和方法,開發(fā)人員經(jīng)常會不恰當?shù)鼗蛎撾x上下文地使用它們。
其次,項目驅(qū)動的方法有助于確保在每個階段都能看到實際的示例。教學(xué)資料中經(jīng)常有很多被稱為Foo的示例類和被稱為bar的方法。而我們的示例與所討論的項目相關(guān),并展示了如何將這些想法應(yīng)用到實際問題中,這些問題類似于你在職業(yè)生涯中可能會遇到的那些問題。
本書每章都是一個全新的項目,是一個學(xué)習新事物的新機會。我們希望讀者能從頭到尾讀完本書,并且真正享受閱讀的過程。這些章節(jié)以一個將要解決的挑戰(zhàn)開始,帶你去了解它的解決方案,然后通過評估你學(xué)到了什么以及如何解決這個挑戰(zhàn)來結(jié)束。我們在每章的開頭和結(jié)尾都特別指出這個挑戰(zhàn),以確保你清楚它的目標。
【本書目標讀者】
我們相信,各種不同背景的開發(fā)人員都將在本書中發(fā)現(xiàn)一些有用和有趣的東西。而且,某些開發(fā)人員將會從這本書中獲得最大的價值。
初級的軟件開發(fā)人員,通常是剛從大學(xué)畢業(yè)或從事編程工作幾年的開發(fā)者,我們認為他們是本書的核心讀者。你將了解一些基本的主題,我們希望這些主題與你的整個軟件開發(fā)生涯都是息息相關(guān)的。不要求讀者一定有大學(xué)學(xué)歷,但是要知道編程的基礎(chǔ)知識,這樣才能更好地利用本書。例如,我們不會解釋if語句是什么或循環(huán)是什么。
你不需要了解太多關(guān)于面向?qū)ο蠡蚝瘮?shù)式編程的知識就可以開始閱讀本書。在第2章中,除了假設(shè)你已知道類是什么并且能使用集合和泛型(例如,List)之外,我們沒有做其他任何假設(shè)。我們是從基礎(chǔ)開始的。
另一個對本書特別感興趣的群體是正在學(xué)習Java的開發(fā)人員,他們可能熟悉其他編程語言,如C#、C++或Python。這本書幫助你快速掌握語言結(jié)構(gòu),以及編寫好的Java代碼所必需的原則、實踐和習慣用法。
如果你是一名很有經(jīng)驗的Java開發(fā)人員,你可能想跳過第2章,以避免重復(fù)你已經(jīng)知道的基本內(nèi)容,但是第3章將會包含對許多開發(fā)人員都有用的概念和方法。
【示例代碼】
可以從https://github.com/Iteratr-Learning/Real-World-Software-Development下載補充材料(示例代碼、練習等)。
【推薦序】
軟件開發(fā)是互聯(lián)網(wǎng)、軟件、工業(yè)等行業(yè)中最核心的智力活動。需要從業(yè)者具備知識的大量輸入和高度聚合能力,并在實際業(yè)務(wù)中,充分運用在軟件工程基礎(chǔ)理論和實踐兩大方向所學(xué)所感的多種技能。軟件工程基礎(chǔ)理論的核心是對編程語言和設(shè)計模式、設(shè)計原則的深刻理解,并將兩者融會貫通。工程實踐是對各種方法論的理解和使用。
本書通過各章實例,很好地向讀者傳授了基礎(chǔ)和實踐相結(jié)合的實踐方法。項目驅(qū)動下的軟件設(shè)計不再是空談,我們耳熟能詳?shù)腟OLID原則、KISS原則、DRY等理論,在各章的實例中準確地指導(dǎo)了項目案例的設(shè)計。同時,作者在每章的實踐中,展示了在設(shè)計模式和原則的指導(dǎo)下,如何優(yōu)雅地完成編碼。
此外,本書還從實踐角度展示了工程構(gòu)建(Gradle)和測試驅(qū)動開發(fā)(TDD)。通常實際的業(yè)務(wù)項目都是模塊化的,如何利用構(gòu)建工具對項目進行編譯、調(diào)試、構(gòu)建、分發(fā),如何運用TDD等理論實現(xiàn)快速迭代和持續(xù)交付,這些都是開發(fā)者的基本修養(yǎng)。這本書雖然沒有面面俱到地講到工程實踐的完整技術(shù)棧,但是開而弗達,將讀者引到以工程項目為主視角的設(shè)計和開發(fā)的正確道路上來。
對初學(xué)者來說,通過閱讀本書,可以在較短的時間內(nèi)對軟件開發(fā)有較清晰的理解,并能產(chǎn)生與自身結(jié)合的學(xué)習路線圖。對于有一些工作經(jīng)驗的開發(fā)者來說,本書可以幫助你梳理這些年積累的理論和實踐,溫故而知新,然后再出發(fā)。
—阿里巴巴資深Java技術(shù)專家,韓陸
【譯者序】
Java作為OOP(面向?qū)ο缶幊蹋┑募蟪烧撸诤狭似渌Z言的諸多優(yōu)點,在經(jīng)歷了多個版本更新之后,它也重新煥發(fā)出新的生機,特別是Java 8的發(fā)布,更是讓開發(fā)者體驗到了函數(shù)式編程的精妙及強大之處。而隨著這幾年開源社區(qū)的蓬勃發(fā)展,越來越多的組件、框架、方案如雨后春筍般涌現(xiàn),現(xiàn)代工程師們大多不用再像前輩們那樣從零開始編寫代碼,而是更多地將精力放在業(yè)務(wù)功能的實現(xiàn)上,這在很大程度上提高了軟件開發(fā)的效率。特別是在Java方面,其技術(shù)體系之龐大,解決方案之豐富,完全超出任何其他語言平臺,可以說,我們遇到任何一種“釘子”,都能隨手找到一大堆“錘子”。但同時我們也會發(fā)現(xiàn),開發(fā)中所遇到的很多問題也并非一個新框架、新方案能完全解決的。以代碼級別的擴展性、可維護性等問題為例,它考察的是工程師對常見設(shè)計原則、模式的理解,以及對軟件工程最佳實踐的掌握程度,而這才是工程師真正的核心競爭力!
所以我一直認為,工程師在學(xué)習編程技術(shù)時,除了要詳細了解編程語言的核心API、組件和框架之外,還應(yīng)該去探索編程語言的最佳開發(fā)模式,就像習武之人一樣,招數(shù)重要,但內(nèi)功心法更重要。幸運的是,編程語言發(fā)展數(shù)年,前輩們留下很多已被無數(shù)次證明的最佳實踐,這些實踐經(jīng)過時間的沉淀和打磨,逐漸形成一套基本的設(shè)計原則,它們是超越框架,甚至是超越語言的存在。作為現(xiàn)代工程師,想要獲取這些資料易如反掌。由于設(shè)計原則或設(shè)計模式都是經(jīng)過高度抽象和提煉形成的,初學(xué)者非常容易被各種“概念”“詞匯”帶偏。目前市面上很多模式相關(guān)的書籍資料,為了讓工程師便于理解,其示例代碼都力求簡單直接,甚至做了非常多的不切實際的具象化(擬人擬物)。所以現(xiàn)實情況是,很少有資料是以真實的項目迭代為藍本進行講解的,這會導(dǎo)致大家“即使懂很多道理,但仍寫不好代碼”。
而這本書填補了這方面的空白。首先,本書是以項目驅(qū)動式的方式來講解的,即核心章節(jié)都會根據(jù)一個項目案例來引出開發(fā)過程中遇到的問題,然后引導(dǎo)讀者一起去思考這些問題的解決方案,甚至包括一些設(shè)計權(quán)衡上的討論。這種結(jié)合具體的業(yè)務(wù)場景進行反復(fù)驗證、持續(xù)迭代的講解方式,能讓讀者有身臨其境之感。其次,本書在內(nèi)容上涵蓋了工程師必知必會的一些基本設(shè)計原則或模式,比如SOLID原則。SOLID是一組旨在幫助開發(fā)易于維護的軟件的原則集,包括:單一職責原則(SRP)、開閉原則(OCP)、里氏替換原則(LSP)、接口隔離原則(ISP)、依賴倒置原則(DIP)。書中并不會很生硬地介紹每個原則,而是會根據(jù)實際情況來引出這些原則的使用方式。最后,本書還介紹了TDD(測試驅(qū)動開發(fā))、流式API、函數(shù)式編程等目前比較流行的主題,相信大家同樣會有所收獲。
當然,由于篇幅有限,本書不可能全面介紹上述所有內(nèi)容,很多時候只是給讀者指明一個思考的方向,同時在很多問題上,作者并不會很武斷地表達出對某種設(shè)計選型上的肯定或否定。一般情況下,我們需要根據(jù)實際情況做出選型上的權(quán)衡,以找出當下的最優(yōu)解。假如我們總是期望在最開始就能找到一個絕對正確的答案,很可能會失望而歸。
本書的兩位作者在Java領(lǐng)域都有一定的造詣,他們曾在多個大型國際會議上發(fā)表過精彩的主旨演講,同時也是多本暢銷書的作者,比如Raoul-Gabriel Urma博士曾出版過《Java 8實戰(zhàn)》,而Richard Warburton博士曾出版過《Java 8函數(shù)式編程》,這兩本書可謂是學(xué)習Java 8的必備資料,大家應(yīng)該都比較熟悉。由如此經(jīng)驗豐富的作者來執(zhí)筆,本書在質(zhì)量上也是經(jīng)得起推敲的。
由于我是第一次翻譯整書,所以剛拿到原著時,比較擔心自己能否準確地呈現(xiàn)原著之意,好在快速讀完原著之后,發(fā)現(xiàn)書中所講內(nèi)容也是自己多年來心中所思所想,所以翻譯過程比較順利,竟然實現(xiàn)了人生第一次提前交稿。不過由于譯者水平有限,書中所譯內(nèi)容難免存在詞不達意的情況,在此也請各位讀者朋友批評指正。我的郵箱是angel6380@126.com,對書中有任何疑問,都可以通過該郵箱聯(lián)系我,謝謝!
在本書的翻譯工作完成之際,我首先要感謝機械工業(yè)出版社華章公司王春華老師的信任,在今年年初,正是她詢問我是否有興趣翻譯本書,最終才促成了這次合作。然后非常感謝本書的責任編輯李忠明老師,在翻譯過程中他幫我解答了大量問題。
最后,感謝家人、朋友的支持與陪伴,你們是我前進路上的最大動力!