0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java工程師的修煉之道

工程師人生 ? 來(lái)源:工程師吳畏 ? 2019-07-01 17:17 ? 次閱讀

一、軟件開發(fā)的核心原則

此處所說(shuō)的是軟件開發(fā)應(yīng)該遵循的一些核心原則:

1、Don’t Repeat Yourself: 這是軟件開發(fā)的一個(gè)基礎(chǔ)原則,即不要做重復(fù)性勞動(dòng)。也是現(xiàn)在所說(shuō)的“極客文化”的一種。代碼重復(fù)、工作重復(fù)在軟件開發(fā)中都是不合理的存在。利用各種手段消除這些重復(fù)是軟件開發(fā)的一個(gè)核心工作準(zhǔn)則。

2、Keep it simple stupid:即KISS原則。在做軟件設(shè)計(jì)的工作中,很多時(shí)候都不要想得過(guò)于復(fù)雜,也不要過(guò)度設(shè)計(jì)和過(guò)早優(yōu)化,用最簡(jiǎn)單且行之有效的方案也就避免了復(fù)雜方案帶來(lái)的各種額外成本。既有利于后續(xù)的維護(hù),也利于進(jìn)一步的擴(kuò)展。

3、You Ain’t Gonna Need It: 即YAGNI原則。只需要將應(yīng)用程序必需的功能包含進(jìn)來(lái),而不要試圖添加任何其他你認(rèn)為可能需要的功能。因?yàn)樵谝粋€(gè)軟件中,往往80%的請(qǐng)求都花費(fèi)在20%的功能上。

4、Done is better than perfect: 在面對(duì)一個(gè)開發(fā)任務(wù)時(shí),最佳的一個(gè)思路就是先把東西做出來(lái),再去迭代優(yōu)化。如果一開始就面面俱到,考慮到各種細(xì)節(jié),那么很容易陷入牛角尖而延誤項(xiàng)目進(jìn)度。

5、Choose the most suitable things: 這是在做方案選擇、技術(shù)選型時(shí)候的一個(gè)很重要的原則。在面對(duì)許多技術(shù)方案、開源實(shí)現(xiàn)的時(shí)候,務(wù)必做到的是不能盲目求新,要選擇最合適的而非被吹得天花亂墜的。

二、軟件過(guò)程

一個(gè)軟件的生命周期中,除了開發(fā)還有很多其他步驟,也都是需要掌握的一些技術(shù)。

1、項(xiàng)目管理:項(xiàng)目管理對(duì)于一個(gè)軟件的開發(fā)是非常重要的,能夠保證項(xiàng)目進(jìn)度有條不紊地進(jìn)行,在可控的時(shí)間內(nèi)以一定的質(zhì)量交付。瀑布開發(fā)模型、螺旋開發(fā)模型是傳統(tǒng)的項(xiàng)目管理模型。在互聯(lián)網(wǎng)的開發(fā)工作中,敏捷開發(fā)則是比較受推崇的開發(fā)方式。所謂敏捷開發(fā)即快速實(shí)現(xiàn)原型,然后快速迭代。Scrum是目前普遍流行的敏捷開發(fā)方式之一。

2、測(cè)試驅(qū)動(dòng)開發(fā):在平時(shí)的開發(fā)過(guò)程中,目前比較流行也是行之有效的一種方式就是Test Driven Develop,即測(cè)試驅(qū)動(dòng)開發(fā)。此種方式的核心就是編寫單元測(cè)試。簡(jiǎn)單來(lái)講,就是先完成某一個(gè)功能的單元測(cè)試用例,然后在逐步消除測(cè)試用例的編譯錯(cuò)誤的過(guò)程中完成功能的開發(fā)。

3、持續(xù)集成:某一個(gè)軟件功能完成開發(fā)之后,后續(xù)還有測(cè)試、預(yù)發(fā)布、部署等過(guò)程。整個(gè)過(guò)程稱之為集成,而持續(xù)集成指的是無(wú)需人工干預(yù)可以不斷地進(jìn)行這個(gè)過(guò)程。Jenkins、Quick Build都是比較典型的持續(xù)集成工具。

三、日常開發(fā)

日常開發(fā)指的是一些日常需要掌握的技能、工具等。

1、編輯器:開發(fā)中現(xiàn)在用的比較多的編輯器包括Emacs、Vim和SublimeText。筆者用的最多的就是SublimeText,基本能夠滿足自己的開發(fā)需求,包括編寫腳本代碼、查看代碼文件等。Vim和Emacs這兩款編輯器相對(duì)SublimeText來(lái)說(shuō)需要記住很多命令,有一定的上手門檻。

2、源碼版本管理:代碼的版本管理工具由CVS到SVN再到現(xiàn)在的Git,已經(jīng)在事實(shí)上形成了以分布式版本管理為主的版本管理方案?;贕it,可以采用Git Flow做為源碼管理模型。

3、項(xiàng)目工具:Github是一個(gè)第三方Git中央倉(cāng)庫(kù),目前是世界最大的開源代碼庫(kù),也能夠做為私人的代碼管理軟件;Facebook開源的Phabrictor提供了非常強(qiáng)大的任務(wù)管理、Bug管理、測(cè)試、代碼管理等,但其上手門檻相對(duì)較高;禪道是國(guó)人開發(fā)的一款項(xiàng)目管理工具,但是其免費(fèi)版功能有限;以Tower.im為代表的第三方項(xiàng)目管理服務(wù)也是一個(gè)可選擇的方案,風(fēng)險(xiǎn)在于數(shù)據(jù)都不再是私有的。

四、運(yùn)行環(huán)境

后端應(yīng)用開發(fā)完成之后是需要部署到服務(wù)器上對(duì)外提供服務(wù)的。從最開始的直接在物理機(jī)上部署服務(wù)到后來(lái)的虛擬環(huán)境、云環(huán)境再到現(xiàn)在火熱的容器,直至最近興起的無(wú)服務(wù)器技術(shù)。都是為了讓服務(wù)的運(yùn)行環(huán)境能夠更加便于建立、更容易維護(hù)、更容易擴(kuò)展。

1、Linux: 說(shuō)到后端服務(wù)器肯定繞不過(guò)Linux。至少現(xiàn)在互聯(lián)網(wǎng)的后端服務(wù)絕大多數(shù)都是部署在Linux的各種服務(wù)器版本中的。其中CentOS、Ubuntu以及Debian是用的比較多的版本。對(duì)于Linux,需要熟練掌握的就是很多常用Shell命令如ps、netstat、lsof、ss、df、dh等等。此外,很多性能分析命令如top、vmstat、iostat、sar等也需要熟練使用。

2、應(yīng)用服務(wù)器:就Java來(lái)講,很多時(shí)候開發(fā)的都是Web應(yīng)用,以HTTP協(xié)議對(duì)外提供服務(wù)。除了對(duì)性能要求比較苛刻的情況下會(huì)自己構(gòu)建HTTP服務(wù)之外,大部分情況是需要依賴于支持Java程序的應(yīng)用服務(wù)器的。目前最為常用的有:Tomcat、Jetty。嚴(yán)格來(lái)講,這兩者只是Servlet容器,真正的JavaEE應(yīng)用服務(wù)器如Jboss、Weblogic在互聯(lián)網(wǎng)領(lǐng)域很少使用。當(dāng)然,這些軟件并沒(méi)有提供URL重寫、請(qǐng)求委托等Web服務(wù)器功能,還不足以擔(dān)當(dāng)完整Web服務(wù)器的角色。Nginx則是目前最為流行的Web服務(wù)器。

3、負(fù)載均衡:在高并發(fā)流量環(huán)境下,后端服務(wù)會(huì)以集群的模式對(duì)外提供服務(wù)。在集群的前面,需要負(fù)載均衡器將請(qǐng)求分配到集群的各個(gè)結(jié)點(diǎn)上。LVS是最為流行的四層負(fù)載均衡軟件,HAProxy是另一個(gè)即支持四層又支持七層負(fù)載均衡的軟件,Nginx則是七層負(fù)載均衡最為流行的解決方案。當(dāng)然,性能最為好的負(fù)載均衡方案是以F5為代表的硬件負(fù)載均衡,但由于其昂貴的成本因此在互聯(lián)網(wǎng)團(tuán)隊(duì)中很少使用。此外,這里需要補(bǔ)充的是為了保證同等角色的服務(wù)的高可用,如LVS經(jīng)常作為流量的入口,因此會(huì)部署多個(gè)LVS結(jié)點(diǎn)互為主備防止一個(gè)掛掉的時(shí)候造成服務(wù)不可用。而實(shí)現(xiàn)互為主備的技術(shù)目前用的最多的就是Keepalived。

4、虛擬化:虛擬化技術(shù)是前幾年經(jīng)常用來(lái)做私有云的一種技術(shù)。即將自己的物理主機(jī)通過(guò)虛擬化技術(shù)分裂為多個(gè)虛擬主機(jī),能夠隔離資源。其中,VPS(虛擬專用服務(wù)器)的代表技術(shù)包括:微軟的Virtual Server、VMware的ESX Server、SWsoft的Virtuozzo。此外,OpenStack提供的構(gòu)建私有IIAS的功能、Cloud Foundry提供的構(gòu)建私有平臺(tái)運(yùn)行環(huán)境以及Docker帶來(lái)的容器服務(wù)都是虛擬化技術(shù)的一種。

五、第三方服務(wù)

雖然從根本上講所有的軟件服務(wù)都是可以自己開發(fā)的或者部署到自己服務(wù)器上的。但是受限于成本、周期或者其他客觀因素,很多服務(wù)還是需要使用第三方的。

1、IAAS:Infrastructure As A Service, 是云計(jì)算最開始的一種模式,現(xiàn)在基本上所有的云服務(wù)商都有IAAS的服務(wù)。其中,全球最強(qiáng)大的云服務(wù)提供商是亞馬遜的AWS,國(guó)內(nèi)的則當(dāng)屬阿里云。就目前來(lái)看,即使是強(qiáng)如AWS也會(huì)出現(xiàn)一些運(yùn)維故障,因此國(guó)內(nèi)的這些云計(jì)算提供商很多時(shí)候的服務(wù)健壯性、運(yùn)維響應(yīng)更是經(jīng)常被人吐糟。就筆者自己的經(jīng)歷來(lái)看。2010年左右,盛大云的云服務(wù)其實(shí)做的還不錯(cuò),但后來(lái)由于種種原因現(xiàn)在基本已經(jīng)沒(méi)啥份額了。國(guó)內(nèi)除了阿里云,UCloud算是專注做云計(jì)算的一個(gè)比較靠譜的公司了。此外,還有一個(gè)青云,做的東西略顯高大上,也是一個(gè)不錯(cuò)的選擇。當(dāng)然,現(xiàn)在這些云服務(wù)商早就不僅僅是IAAS了,也做了很多PAAS的服務(wù)。

2、PAAS:Platform As A Service,即只需要提交代碼到指定的運(yùn)行環(huán)境,其他的諸如代碼打包、部署、IP綁定都由平臺(tái)完成。除了可以使用Cloud Foundry構(gòu)建自己的PAAS平臺(tái)以外,現(xiàn)在最為流行的第三方PAAS服務(wù)有:新浪的SAE、百度的BAE以及Google的GAE。

3、域名:有個(gè)可以提供服務(wù)的應(yīng)用后,那么域名也是一個(gè)必須的基礎(chǔ)設(shè)施。一個(gè)好的域名不僅僅代表企業(yè)的形象,也能夠更加方便用戶的記憶與傳播。目前購(gòu)買域名可以通過(guò)國(guó)外的name.com、godaddy以及國(guó)內(nèi)的萬(wàn)網(wǎng)等。有了域名之后下一步就得進(jìn)行備案,域名提供商一般都提供了配套服務(wù)或者去找一些代理也可以辦下來(lái)。此外,對(duì)于域名的解析,域名提供商一般會(huì)內(nèi)置解析功能,也可以使用獨(dú)立的DNS服務(wù),如dnspod。

4、CDN: 內(nèi)容分發(fā)網(wǎng)絡(luò),即就近請(qǐng)求的一種技術(shù)實(shí)現(xiàn)。服務(wù)提供方將會(huì)被大量訪問(wèn)的內(nèi)容在全國(guó)的多個(gè)結(jié)點(diǎn)都做緩存,這樣當(dāng)用戶訪問(wèn)時(shí)就能夠就近選擇,從而減少網(wǎng)絡(luò)傳輸延時(shí),提高訪問(wèn)速度。國(guó)內(nèi)目前七牛和又拍都提供了不錯(cuò)的CDN服務(wù),當(dāng)然像阿里云、UCloud這種綜合云服務(wù)商也都有CDN服務(wù)。

5、郵件發(fā)送:這個(gè)主要需要依賴郵件服務(wù)器,然后通過(guò)SMTP協(xié)議就可以實(shí)現(xiàn)發(fā)送。可以選擇自己搭建,也可以選擇諸如騰訊郵箱、網(wǎng)易郵箱等。

6、短信發(fā)送:使用短信發(fā)送驗(yàn)證碼、營(yíng)銷短信是很常見的應(yīng)用場(chǎng)景。由于短信是需要運(yùn)營(yíng)商支持的,所以這一塊基本上都是需要依賴第三方代理的。市面上也有很多短信網(wǎng)關(guān)代理。

7、消息推送:在移動(dòng)應(yīng)用上,推送已經(jīng)成為一個(gè)標(biāo)配功能。目前個(gè)推應(yīng)該是第三方推送服務(wù)中的佼佼者,而且由于其客戶很多,在聯(lián)盟喚醒上有很大的優(yōu)勢(shì)。

8、開放平臺(tái):通過(guò)開放平臺(tái),可以使用OAuth等協(xié)議獲取用戶在第三方平臺(tái)上的信息實(shí)現(xiàn)第三方平臺(tái)登錄等。目前,微博、微信、QQ是最常見的第三方登錄方式,基本上都是使用OAuth協(xié)議為第三方開發(fā)者提供服務(wù)的。

9、支付接口:支付接口是很多內(nèi)置購(gòu)買功能軟件的必備組件。目前,接入最多的無(wú)非是支付寶和微信,都提供了開放平臺(tái)供商家接入。當(dāng)然,也有直接綁定銀行卡支付的,此時(shí)需要走的就是銀行或者銀聯(lián)的網(wǎng)關(guān)接口。

七、計(jì)算機(jī)基礎(chǔ)科學(xué)知識(shí)

對(duì)于像數(shù)據(jù)結(jié)構(gòu)、算法、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、計(jì)算機(jī)組成原理這些計(jì)算機(jī)科學(xué)基礎(chǔ)知識(shí),不管是后端還是其他領(lǐng)域都是必須的技能,也是所有軟件開發(fā)的基礎(chǔ)。扎實(shí)的計(jì)算機(jī)科學(xué)基礎(chǔ)才能讓你在學(xué)習(xí)、使用某種技術(shù)開發(fā)軟件、調(diào)試軟件、排查問(wèn)題時(shí)能夠心里有底、有據(jù)可循。

1、數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)是組成程序的基礎(chǔ)。經(jīng)典的數(shù)據(jù)結(jié)構(gòu)包括:字符串、數(shù)組、鏈表、哈希表、樹(二叉樹、平衡樹、紅黑樹、B樹)、堆棧、隊(duì)列、圖。

2、算法: 經(jīng)典的排序和查找算法在平時(shí)的開發(fā)工作中經(jīng)常會(huì)用到,如:冒泡排序、插入排序、選擇排序、歸并排序、快速排序、希爾排序、堆排序以及二分查找等。此外,在函數(shù)/方法的算法實(shí)現(xiàn)中要注意遞歸和迭代各自的優(yōu)缺點(diǎn)。而衡量算法性能無(wú)外乎空間復(fù)雜度和時(shí)間復(fù)雜度。

3、業(yè)務(wù)相關(guān)算法:除了上面的基本算法之外,業(yè)務(wù)中還會(huì)經(jīng)常涉及到一些更為復(fù)雜的算法,如:壓縮算法、LRU緩存算法、緩存一致性、編譯原理中的狀態(tài)機(jī)等。此外,目前越來(lái)越火的機(jī)器學(xué)習(xí)中有很多算法也是在很多業(yè)務(wù)場(chǎng)景中有很大用途的,如:用于文本分詞的結(jié)巴分詞和中科院ICTCLAS;用于關(guān)鍵詞提取的TF-IDF和TextRank;用于計(jì)算文本相似度的主題模型、Word2Vec、余弦相似度以及歐幾里得距離;用于文本分類的樸素貝葉斯;用于推薦的聚類、協(xié)同過(guò)濾、用戶畫像、隱語(yǔ)義模型等。

4、計(jì)算機(jī)網(wǎng)絡(luò): TCP/IP協(xié)議是網(wǎng)絡(luò)最根本的協(xié)議,其七層/四層協(xié)議棧的設(shè)計(jì)都是非常精華的東西,連接的建立、斷開以及連接的各種狀態(tài)的轉(zhuǎn)換都是排查、解決網(wǎng)絡(luò)問(wèn)題的根本依據(jù)。從TCP/IP往上,HTTP協(xié)議是現(xiàn)在絕大多數(shù)后端應(yīng)用對(duì)外提供的協(xié)議,發(fā)展到現(xiàn)在已經(jīng)將要步入HTTP2.0時(shí)代,帶來(lái)了持久連接、連接復(fù)用等令人振奮的新特性。此外,基于HTTP的HTTPS協(xié)議由于其安全性在逐漸的成為后端服務(wù)對(duì)外開放的主流協(xié)議。業(yè)務(wù)層面,基于HTTP協(xié)議的RESTful規(guī)范正成為對(duì)外接口的主流規(guī)范,而OAuth2.0協(xié)議也在成為開放平臺(tái)對(duì)外的主流協(xié)議。除了HTTP之外,SMTP是另一個(gè)基于TCP/IP的應(yīng)用協(xié)議,主要用在發(fā)送郵件上。

5、設(shè)計(jì)模式: 在軟件開發(fā)中,前人的經(jīng)驗(yàn)形成了很多經(jīng)典設(shè)計(jì)模式供我們使用,能夠使得軟件的實(shí)現(xiàn)可服用、可擴(kuò)展、可維護(hù)。經(jīng)典的工廠模式、簡(jiǎn)單工廠模式、單例模式、觀察者模式、代理模式、建筑者模式、門面模式、適配器模式、裝飾器模式在日常的很多開發(fā)場(chǎng)景下都具有很重要的意義。

八、數(shù)據(jù)

現(xiàn)在互聯(lián)網(wǎng)的所有業(yè)務(wù)其實(shí)都是圍繞數(shù)據(jù)來(lái)進(jìn)行的。而數(shù)據(jù)傳輸、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析處理都是關(guān)鍵的部分。

1、高速緩存:目前用的最為廣泛的緩存軟件Redis能夠支持豐富的數(shù)據(jù)結(jié)構(gòu),如:字符串、列表、有序集合等多種數(shù)據(jù)的存儲(chǔ)。了解緩存實(shí)現(xiàn)的原理、內(nèi)存淘汰的策略能夠更好地使用緩存。此外由于緩存的成本較高,在使用緩存的時(shí)候一定要做好量化和存儲(chǔ)優(yōu)化工作。

2、數(shù)據(jù)庫(kù):掌握數(shù)據(jù)庫(kù)的很大一個(gè)關(guān)鍵點(diǎn)就在于對(duì)索引的使用,可以說(shuō),正確地使用索引就基本等于掌握了數(shù)據(jù)庫(kù)的使用。目前絕大多數(shù)據(jù)庫(kù)都是使用B樹做為索引的數(shù)據(jù)結(jié)構(gòu),目的就是為了利用磁盤順序讀寫的特性。不同的數(shù)據(jù)庫(kù)由于本身設(shè)計(jì)目的的不同,都有一些獨(dú)特的優(yōu)勢(shì),如:MongoDB天然支持sharding,但受限于NoSQL,在重事務(wù)、有關(guān)聯(lián)關(guān)系的場(chǎng)景下并不適用;HBase使用LSM作為底層數(shù)據(jù)結(jié)構(gòu),犧牲了讀性能來(lái)?yè)Q取高速的寫性能。

3、搜索引擎:搜索引擎主要應(yīng)對(duì)全文檢索以及多維度查詢的業(yè)務(wù)場(chǎng)景。掌握搜索引擎使用的數(shù)據(jù)結(jié)構(gòu)、集群方式、配置的關(guān)鍵點(diǎn)有助于更好地使用搜索引擎服務(wù)于業(yè)務(wù)應(yīng)用。

4、消息隊(duì)列:消息隊(duì)列有兩種角色:生產(chǎn)者和消費(fèi)者,兩種角色對(duì)于消息隊(duì)列的需求也不一樣。其中,對(duì)于消費(fèi)者來(lái)說(shuō),消息消費(fèi)的方式包括發(fā)布-訂閱和隊(duì)列兩種。消息隊(duì)列在語(yǔ)義保證上分為:At Most Once、At Least Once、Exactly Once三種模式,需要更具特定的業(yè)務(wù)場(chǎng)景選擇合適的語(yǔ)義保證。此外,消息隊(duì)列對(duì)于高可用、消息安全的保證決定了此消息隊(duì)列的可靠性。

5、數(shù)據(jù)存儲(chǔ)和處理:數(shù)據(jù)存儲(chǔ)下來(lái)最終還是要用來(lái)做分析和處理的。數(shù)據(jù)的處理分為離線處理和實(shí)時(shí)處理。離線處理的優(yōu)勢(shì)在于能夠處理大量數(shù)據(jù),但是一般會(huì)有T+1的延遲,適用于計(jì)算量大但是對(duì)于結(jié)果允許有延時(shí)的場(chǎng)景。但對(duì)于離線數(shù)據(jù)分析,還有一個(gè)很關(guān)鍵的就是數(shù)據(jù)傾斜問(wèn)題。所謂數(shù)據(jù)傾斜指的是region數(shù)據(jù)分布不均,造成有的結(jié)點(diǎn)負(fù)載很低,而有些卻負(fù)載很高,從而影響整體的性能。因此,處理好數(shù)據(jù)傾斜問(wèn)題對(duì)于離線數(shù)據(jù)處理是很關(guān)鍵的。而實(shí)時(shí)處理一般是流式處理方式,適用于數(shù)據(jù)能夠轉(zhuǎn)換為數(shù)據(jù)流,對(duì)于結(jié)果要求及時(shí)性的場(chǎng)景。對(duì)于實(shí)時(shí)數(shù)據(jù)分析,需要注意的就是實(shí)時(shí)數(shù)據(jù)處理結(jié)果寫入存儲(chǔ)的時(shí)候,要考慮并發(fā)的問(wèn)題,雖然對(duì)于Storm的Bolt程序來(lái)說(shuō)不會(huì)有并發(fā)的問(wèn)題,但是寫入的存儲(chǔ)介質(zhì)是會(huì)面臨多任務(wù)同時(shí)讀寫的。通常采用的方案就是采用時(shí)間窗口的方式對(duì)數(shù)據(jù)做緩沖后批量寫入。

6、數(shù)據(jù)同步:數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)來(lái)源除了直接的日志外還有一個(gè)很關(guān)鍵的就是業(yè)務(wù)數(shù)據(jù)庫(kù)。從業(yè)務(wù)數(shù)據(jù)庫(kù)到數(shù)據(jù)倉(cāng)庫(kù)的過(guò)程稱為數(shù)據(jù)同步。有基于SQL的同步方案,也有基于MySQL binglog的增量同步方案。

九、Java

對(duì)于Java方面的技能來(lái)說(shuō),主要有兩個(gè)大的部分,包括Java編程和JVM。

先來(lái)看一下Java編程部分,這也是Java工程師最最基礎(chǔ)的技能。

1、IDE: 目前用的最多的Java IDE當(dāng)屬Eclipse和Intellij IDEA。前者是老牌IDE,逐步淘汰了Jbuilder以及Netbeans,占領(lǐng)了大部分Java IDE市場(chǎng)。后者則是后起之秀,由于其增量編譯、智能分析代碼等帶來(lái)的性能提升,現(xiàn)在已經(jīng)得到了大規(guī)模使用,大有取代Eclipse之勢(shì)。

2、核心語(yǔ)法:目前用的最多的當(dāng)屬JDK6的Java語(yǔ)法。而到了Java7引入了try with resource、switch string、diamonds等語(yǔ)法。Java8則又引入了lambda、stream等語(yǔ)法。

3、集合類:集合類是Java語(yǔ)言中非常精華的部分,包括:HashMap、ArrayList、LinkedList、HashSet、TreeSet以及線程安全的ConcurrentHashMap、ConcurrentLinkedQueue等線程安全集合。了解他們的實(shí)現(xiàn)原理以及查詢、修改的性能以及使用場(chǎng)景是非常必要的。

4、工具類:Google Guava、Apache commons、FastJson提供了很多JDK本身沒(méi)有的工具類、集合等。此外,ASM字節(jié)碼操作以及CGLIB代碼生成能夠提供更底層的java編程功能。

5、高級(jí)特性:拋開Java核心的基本編程,并發(fā)編程、泛型、網(wǎng)絡(luò)編程、序列化RPC都屬于java的高級(jí)編程特性。其中并發(fā)編程需要掌握Executors提供的各種并發(fā)工具、Java7帶來(lái)的fork/join框架以及CountDownLatch、Semaphore、CyclicBarrier等同步工具;網(wǎng)絡(luò)編程要區(qū)分好BIO、NIO以及AIO;序列化中除了JDK自帶的序列化實(shí)現(xiàn)之外,Protobuf和Kryo是比較高效的第三方實(shí)現(xiàn);RPC的實(shí)現(xiàn)中,Thrift、Hessian、Dubbo以及RMI則是比較常用的幾個(gè)協(xié)議,其中的Hessian是基于Http協(xié)議的,Dubbo是基于TCP協(xié)議,而Thrift則同時(shí)支持。

6、JavaEE: JavaEE現(xiàn)在是Java應(yīng)用最為普遍的一個(gè)領(lǐng)域。Servlet是JavaEE中最根本的組件之一。而Servlet3.0帶來(lái)的異步Servlet提高了其處理請(qǐng)求的性能。

7、項(xiàng)目構(gòu)建:目前用的最多的Java項(xiàng)目構(gòu)建工具包括Maven和Gradle,提供了源碼包依賴管理、編譯、打包、部署等一系列功能。

8、編程框架:Spring是Java編程中避不開的一個(gè)框架,發(fā)展到現(xiàn)在除了Spring核心的IOC、AOP之外,SpringMVC、Spring Data、Spring Cloud、Spring Boot等等都給Java開發(fā)者們帶來(lái)了開發(fā)上的便利,大大提高了開發(fā)效率;ORM框架MyBatis也是Java領(lǐng)域比較火的框架之一,實(shí)現(xiàn)了數(shù)據(jù)庫(kù)記錄到Java對(duì)象的映射操作;Jersey則提供了從客戶端到服務(wù)端的一整套符合RESTful規(guī)范的開發(fā)框架。此外,Vert.x、Spring Flux這種非常適用于IO密集型應(yīng)用的異步響應(yīng)式編程框架也開始興起。

9、測(cè)試:測(cè)試是任何編程都需要的一步。黑盒測(cè)試主要指的通常進(jìn)行的功能測(cè)試,白盒測(cè)試則主要指的對(duì)代碼功能、質(zhì)量進(jìn)行的測(cè)試。此外,關(guān)鍵的單元測(cè)試則是開發(fā)工程師需要著重注意的地方,“測(cè)試驅(qū)動(dòng)開發(fā)”的理念也是值得推崇的開發(fā)方式。JUnit是目前Java中實(shí)現(xiàn)單元測(cè)試的主流方案。

一般來(lái)說(shuō)掌握上面所述的Java編程技能是能夠應(yīng)付大多編程工作的。但是如果在代碼層面已經(jīng)做到最大努力卻還是達(dá)不到性能要求的時(shí)候,就需要在JVM虛擬機(jī)層面做一些努力了。可以說(shuō)掌握J(rèn)VM相關(guān)技術(shù)是Java開發(fā)進(jìn)階的一個(gè)關(guān)鍵步驟。

1、虛擬機(jī)實(shí)現(xiàn): Java的虛擬機(jī)實(shí)現(xiàn)除了我們常用的HotSpot外,還有JRockit、J9以及移動(dòng)平臺(tái)的Dalvkit、ART(Android4.4后引入)。我們通常鎖描述的JVM優(yōu)化絕大多是是針對(duì)HotSpot虛擬機(jī)來(lái)說(shuō)的。

2、類加載機(jī)制:JVM的類加載機(jī)器遵循雙親委派原則,即當(dāng)前類加載器需要先去請(qǐng)求父加載器去加載當(dāng)前類,如果無(wú)法完成自己才去嘗試進(jìn)行加載。OSGI框架則打破了此機(jī)制,采用了平等的、網(wǎng)狀的類加載機(jī)制,以實(shí)現(xiàn)模塊化的加載方案。

3、運(yùn)行時(shí)內(nèi)存組成: 程序計(jì)數(shù)器、堆棧、方法區(qū)、堆、堆外內(nèi)存,這些一起組成了JVM的運(yùn)行時(shí)內(nèi)存。

4、Java內(nèi)存模型:Java的主內(nèi)存+線程私有內(nèi)存的模型是線程安全問(wèn)題產(chǎn)生的根本。

5、GC原理和調(diào)優(yōu):與C、C++這些語(yǔ)言相比,GC是Java的優(yōu)勢(shì),但因?yàn)镚C的細(xì)節(jié)被JVM屏蔽了,在對(duì)內(nèi)存、性能要求非??量痰那闆r下難以進(jìn)行自由控制,某種程度這也是劣勢(shì)。如果想在某些場(chǎng)景下發(fā)揮GC的最大性能,能做的就是對(duì)GC的各種參數(shù)做優(yōu)化配置,如新生代和老年代的垃圾回收器選擇、各種垃圾回收參數(shù)的配置等。此外,很多時(shí)候由于代碼質(zhì)量或者外部客觀因素,造成了JVM頻繁GC,需要使用相關(guān)的工具快速進(jìn)行問(wèn)題定位和解決。

6、性能調(diào)優(yōu)和監(jiān)控工具:JDK自帶了很多強(qiáng)大的調(diào)優(yōu)和監(jiān)控工具,包括jmap、jstack、jcmd、jconsole、jinfo等。此外,btrace是一款非常強(qiáng)大的在線問(wèn)題動(dòng)態(tài)排查工具,能夠無(wú)須重啟Java進(jìn)程,動(dòng)態(tài)的插入一些代碼邏輯,從而攔截代碼執(zhí)行邏輯打印日志,從而排查問(wèn)題。

十、系統(tǒng)架構(gòu)

一個(gè)應(yīng)用從0開始一般會(huì)經(jīng)歷單體應(yīng)用、垂直應(yīng)用到分布式服務(wù)架構(gòu)的演化。如下圖所示:

Java工程師的修煉之道

1、單體應(yīng)用:當(dāng)應(yīng)用規(guī)模、團(tuán)隊(duì)規(guī)模比較小的時(shí)候,只需要一個(gè)包括了所有功能的應(yīng)用即可。減少部署結(jié)點(diǎn),也減少了部署成本。此時(shí),對(duì)數(shù)據(jù)庫(kù)的ORM操作是架構(gòu)實(shí)現(xiàn)的關(guān)鍵點(diǎn)。

2、垂直應(yīng)用:當(dāng)應(yīng)用的用戶規(guī)模越來(lái)越大,請(qǐng)求量越來(lái)越高的時(shí)候。單體應(yīng)用增加結(jié)點(diǎn)帶來(lái)的資源浪費(fèi)會(huì)凸現(xiàn)出來(lái),因?yàn)榻^大多數(shù)接口請(qǐng)求量并沒(méi)有特別大,根本沒(méi)必要擴(kuò)充到多個(gè)結(jié)點(diǎn)。此時(shí),就可以將單體應(yīng)用拆分成互不相關(guān)的幾個(gè)應(yīng)用,分別對(duì)外提供服務(wù)。此時(shí),加速每個(gè)應(yīng)用開發(fā)的MVC框架是架構(gòu)實(shí)現(xiàn)的關(guān)鍵點(diǎn)。

3、分布式服務(wù):當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間的交互不可避免。抽離核心業(yè)務(wù)單獨(dú)部署,逐漸形成穩(wěn)定的服務(wù)中心。而隨著團(tuán)隊(duì)規(guī)模的相應(yīng)擴(kuò)大,服務(wù)會(huì)隨著團(tuán)隊(duì)的增多變得越來(lái)越多,粒度也會(huì)變得越來(lái)越小,也就逐步形成了分布式服務(wù)的架構(gòu),而當(dāng)粒度細(xì)到某種程度、服務(wù)數(shù)量多到一定程度則可以稱之為微服務(wù)。即在設(shè)計(jì)好業(yè)務(wù)邊界之后將原來(lái)的單體應(yīng)用分解成一個(gè)個(gè)細(xì)粒度的服務(wù),彼此之間通過(guò)某種方式進(jìn)行通信。微服務(wù)架構(gòu)的關(guān)鍵在于如何做好服務(wù)的治理、調(diào)度、維護(hù)工作。目前,Dubbo算是微服務(wù)架構(gòu)中用的比較多的框架,但Dubbo僅僅解決了微服務(wù)架構(gòu)中的一部分問(wèn)題。Spring Cloud則基本上涵蓋了微服務(wù)架構(gòu)的各個(gè)方面。

十一、部署架構(gòu)

對(duì)于Web應(yīng)用來(lái)說(shuō),LVS+Nginx+Tomcat+MySQL+Redis即可構(gòu)成一個(gè)簡(jiǎn)單通用的部署架構(gòu),如下圖所示:

1、LVS作為最前置的結(jié)點(diǎn),負(fù)責(zé)在網(wǎng)絡(luò)第四層轉(zhuǎn)發(fā)流量、負(fù)載均衡。

2、多個(gè)LVS使用Keepalived互為主備實(shí)現(xiàn)高可用。

3、Nginx作為反向代理,負(fù)責(zé)在網(wǎng)絡(luò)第七層轉(zhuǎn)發(fā)流量、負(fù)載均衡。

4、Tomcat做為業(yè)務(wù)容器,主要的應(yīng)用代碼都在這里面。

5、Redis作為緩存,隔離高并發(fā)請(qǐng)求和后端數(shù)據(jù)庫(kù)。

6、MySQL以主從模式對(duì)數(shù)據(jù)做持久化。

其中,虛線部分是數(shù)據(jù)庫(kù)層,采用的是主從模式。也可以使用Redis Cluster(Codis等)以及MySQL Cluster(Cobar等)來(lái)替換。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 工程師
    +關(guān)注

    關(guān)注

    59

    文章

    1571

    瀏覽量

    68574
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2973

    瀏覽量

    104904
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    正是拼的年紀(jì)|65歲電子工程師上班VLOG #65歲退休 #電子工程師 #搞笑 #上班vlog

    電子工程師
    安泰小課堂
    發(fā)布于 :2024年07月25日 11:31:02

    用二創(chuàng),1:1復(fù)刻工程師的職場(chǎng)現(xiàn)狀

    工程師
    揚(yáng)興科技
    發(fā)布于 :2024年07月19日 18:30:07

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    嵌入式軟件工程師和硬件工程師的區(qū)別? 嵌入式軟件工程師 嵌入式軟件工程師是軟件開發(fā)領(lǐng)域中的一種專業(yè)工程師,他們主要負(fù)責(zé)設(shè)計(jì)和開發(fā)嵌入式軟件,
    發(fā)表于 05-16 11:00

    大廠電子工程師常見面試題#電子工程師 #硬件工程師 #電路知識(shí) #面試題

    電子工程師電路
    安泰小課堂
    發(fā)布于 :2024年04月30日 17:33:15

    如何入門硬件工程師

    想跨行業(yè)做硬件設(shè)計(jì)工程師,應(yīng)該如何學(xué)習(xí)規(guī)劃呢
    發(fā)表于 03-17 21:49

    一位硬件工程師的歷練之路:從入門學(xué)習(xí)理論到... #搞笑 #硬件工程師 #電子工程師 #揚(yáng)興科技

    硬件工程師揚(yáng)興科技
    揚(yáng)興科技
    發(fā)布于 :2024年03月13日 17:50:21

    企業(yè)老工程師和高校老師有啥區(qū)別

    電子工程師硬件
    電子發(fā)燒友網(wǎng)官方
    發(fā)布于 :2024年02月28日 17:50:00

    如何搞崩一個(gè)硬件工程師心態(tài)?試試對(duì)ta說(shuō)這幾句

    硬件工程師
    揚(yáng)興科技
    發(fā)布于 :2024年02月20日 18:05:49