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