到目前為止,接觸Java語(yǔ)言已經(jīng)有將近10個(gè)年頭。從趴在學(xué)校實(shí)驗(yàn)室中認(rèn)領(lǐng)師兄提供的論壇系統(tǒng)開(kāi)發(fā)任務(wù),到參與WebERP構(gòu)件化平臺(tái)、網(wǎng)絡(luò)資源聚合平臺(tái)、電信增值業(yè)務(wù)平臺(tái)、企業(yè)門(mén)戶(hù)網(wǎng)站以及運(yùn)營(yíng)管理平臺(tái)的研發(fā),再到后面的掌上證券、軟件商店、移動(dòng)支付平臺(tái)等移動(dòng)互聯(lián)網(wǎng)平臺(tái)建設(shè),不論是PC端,還是移動(dòng)端,底層的技術(shù)一直都是用Java架構(gòu)來(lái)進(jìn)行實(shí)現(xiàn)的。期間參與過(guò)多次的Java技術(shù)培訓(xùn)與問(wèn)題指導(dǎo),以撲火隊(duì)員的身份見(jiàn)證了形色各異的Java坑,從而不斷提醒自己要跳出Java語(yǔ)言本身,去思考一些開(kāi)發(fā)中的技術(shù)困惑和挑戰(zhàn)。成都jsp網(wǎng)站空間
Java的成長(zhǎng)經(jīng)歷
Java語(yǔ)言已經(jīng)走過(guò)二十個(gè)年頭,崗位和身份的變化,也伴隨著Java的同步成長(zhǎng),其中也包含了對(duì)技術(shù)理解的思考與變化。主要體現(xiàn)下面四個(gè)階段:開(kāi)發(fā)工程師、系統(tǒng)架構(gòu)師與技術(shù)主管、技術(shù)顧問(wèn)、技術(shù)合伙人(聯(lián)合創(chuàng)始人)。
開(kāi)發(fā)工程師
以前大學(xué)學(xué)的專(zhuān)業(yè)是數(shù)學(xué)而不是計(jì)算機(jī),Java編程之路是從《ThinkinJava》這本書(shū)開(kāi)始的,當(dāng)時(shí)每天晚上十二點(diǎn)看到凌晨二三點(diǎn),就這樣持續(xù)將近3個(gè)月,面向?qū)ο蟮木幊叹瓦@樣入門(mén)了。Java語(yǔ)言上手非常容易,裝一個(gè)IDE工具(Eclipse、Myeclipse等等),找一本參考書(shū)就可以開(kāi)始,但是要想深入,還需要學(xué)習(xí)很多東西。從Java的常用包Java.lang.*,Java.util.*,Java.net.*等等開(kāi)始,逐漸開(kāi)始學(xué)習(xí)dom4j、jdom、log4j、hibernate、spring、ibatis、struts等等以開(kāi)源為主體的各種Java擴(kuò)展技術(shù),jsp、mvc、ssh等等也是經(jīng)常掛在嘴邊的技術(shù),JSON與xml的封裝和解析也是數(shù)據(jù)配置與交換中常用的技術(shù)手段,明白和使用正則表達(dá)式也是開(kāi)發(fā)中一塊比較興奮的事情。運(yùn)行環(huán)境Tomcat、JBoss、WebLogic等等都用過(guò)也是Java知識(shí)豐富的一個(gè)佐證,能用過(guò)就懂Web容器與應(yīng)用服務(wù)器的區(qū)別。
由于Java廣泛用于各種互聯(lián)網(wǎng)的場(chǎng)景中,學(xué)習(xí)Java開(kāi)發(fā),還需要學(xué)習(xí)SQL語(yǔ)言以及各種商用關(guān)系型數(shù)據(jù)庫(kù)MySQL、SQLserver、Oracle等等(NoSQL、memcached等各種非關(guān)系數(shù)據(jù)庫(kù))的安裝與使用,在進(jìn)行專(zhuān)業(yè)領(lǐng)域還要研究Lucence等等搜索引擎開(kāi)源框架和組件。有些專(zhuān)注前端的可能還需要學(xué)習(xí)HTML、JavaScript以及jQuery之類(lèi)的知識(shí)。
Java入門(mén)階段接觸最多的開(kāi)發(fā)可能就是論壇系統(tǒng)、管理信息系統(tǒng)以及OA系統(tǒng)之類(lèi),深入學(xué)習(xí)后面臨的項(xiàng)目和平臺(tái)就比較專(zhuān)業(yè)了,比如軟件商店、支付平臺(tái)、廣告平臺(tái)等等。由于Java相關(guān)知識(shí)非常廣泛、開(kāi)源項(xiàng)目和平臺(tái)眾多,在這里一直是個(gè)學(xué)習(xí)者,Java二十周年技術(shù)人員學(xué)習(xí)的好平臺(tái)。
系統(tǒng)架構(gòu)師與技術(shù)主管
談到Java優(yōu)點(diǎn)時(shí),大部人分都記得它有一個(gè)非常先進(jìn)的垃圾回收機(jī)制,在對(duì)象不被使用時(shí)可以自動(dòng)回收,不用開(kāi)發(fā)人員關(guān)心,甚至把這個(gè)說(shuō)成為是Java優(yōu)越于C++等其他面向?qū)ο笳Z(yǔ)言的一個(gè)重要特性,而在實(shí)際中,對(duì)象引用錯(cuò)誤、JVM內(nèi)存以及堆內(nèi)存的分配設(shè)置不合理等等現(xiàn)象,往往會(huì)引發(fā)服務(wù)器應(yīng)用出現(xiàn)outofmemory的錯(cuò)誤,進(jìn)而宕機(jī)。Java的垃圾回收函數(shù)System.gc()只能發(fā)送垃圾回收請(qǐng)求,實(shí)際執(zhí)行時(shí)間仍舊不總是可靠的。在進(jìn)行內(nèi)存對(duì)象進(jìn)行處理時(shí),Java對(duì)象在強(qiáng)引用下是不可回收,使用Java的軟引用(SoftReference)機(jī)制可以做到讓內(nèi)存空間不足時(shí)自動(dòng)釋放不用的內(nèi)存對(duì)象,從而保證內(nèi)存空間一直可控。
在Java應(yīng)用開(kāi)發(fā)中,逐漸開(kāi)始使用設(shè)計(jì)模式的思想來(lái)進(jìn)行關(guān)鍵模塊的開(kāi)發(fā),單態(tài)模式、組合模式、適配器模式、觀察者模式等等面向?qū)ο蟮奶卣饕驳玫胶芎玫陌l(fā)揮;贘ava架構(gòu)設(shè)計(jì)中更多通過(guò)機(jī)制性保證來(lái)構(gòu)建一個(gè)比較穩(wěn)健可擴(kuò)展的系統(tǒng),比如無(wú)狀態(tài)設(shè)計(jì)、同步異步分離、動(dòng)靜分離、模塊服務(wù)化、多級(jí)緩存等等。
在技術(shù)選型上,像軟件商店、移動(dòng)支付平臺(tái),除移動(dòng)端使用Android實(shí)現(xiàn),服務(wù)器都可以使用Java進(jìn)行實(shí)現(xiàn),這樣一方面可以重用原有程序積累,又可以通過(guò)Java的豐富開(kāi)源組件來(lái)加快開(kāi)發(fā)速度。但技術(shù)方面的選擇上不再以Java為唯一技術(shù)選擇,后端存儲(chǔ)層面,可以把關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)以及文件系統(tǒng)進(jìn)行整合考慮,不再把單一的“Java+關(guān)系型數(shù)據(jù)庫(kù)”作為軟件系統(tǒng)的唯一設(shè)計(jì)標(biāo)準(zhǔn)。后臺(tái)任務(wù)服務(wù)以及程序邏輯都可以用Python、Shell腳本進(jìn)行實(shí)現(xiàn)也非常好。多種技術(shù)組合使用可以充分發(fā)揮每一種技術(shù)的優(yōu)勢(shì),這也是技術(shù)選型的一個(gè)重要原則。
JavaEE的分層設(shè)計(jì)思想給軟件開(kāi)發(fā)提供了有利條件,根據(jù)前端、數(shù)據(jù)持久層、控制器層、代理層、組件層等視圖可以有效地把工作模塊分解給不同的團(tuán)隊(duì)成員,從而保證大型項(xiàng)目的任務(wù)分解與工作可跟蹤。在產(chǎn)品進(jìn)行迭代和升級(jí)時(shí)只需要修改受影響的代碼部分就可以保證最大限度的代碼穩(wěn)定性。
java技術(shù)顧問(wèn)
Java技術(shù)輸出主要涉及三個(gè)方面的內(nèi)容:基礎(chǔ)知識(shí)培訓(xùn)、基于性能優(yōu)化的診斷分析、基于業(yè)務(wù)流程優(yōu)化的架構(gòu)重塑。Java基礎(chǔ)知識(shí)培訓(xùn)主要定位在Java新手快速掃盲;基于性能優(yōu)化的診斷分析主要集中在中小型公司,它們一般開(kāi)發(fā)有一套自己的Java系統(tǒng),但總出現(xiàn)系統(tǒng)問(wèn)題或者訪問(wèn)量就是上不來(lái)(特別是它們購(gòu)買(mǎi)的是性能比較好的服務(wù)器);基于業(yè)務(wù)流程優(yōu)化的架構(gòu)重塑主要對(duì)業(yè)務(wù)上有新需求的Java平臺(tái)改進(jìn),原有平臺(tái)比較混亂,需要進(jìn)行統(tǒng)一整合,它們的立足點(diǎn)不是因?yàn)楝F(xiàn)有平臺(tái)不能運(yùn)行而影響業(yè)務(wù)。在這個(gè)維度,Java語(yǔ)言本身被包裝成服務(wù),已經(jīng)不再是開(kāi)發(fā)某一個(gè)模塊那么簡(jiǎn)單了。Java平臺(tái)出現(xiàn)的不同坑也只有經(jīng)歷了才能知道。Java虛擬主機(jī)
java技術(shù)合伙人(聯(lián)合創(chuàng)始人)
以互聯(lián)網(wǎng)為載體的創(chuàng)業(yè)公司往往喜歡招募PHP的開(kāi)發(fā)人員,主要是因?yàn)榫W(wǎng)站類(lèi)開(kāi)發(fā)使用PHP比較快,同時(shí)也有一定量的開(kāi)源平臺(tái)可用。從技術(shù)合伙人的角度思考,重塑和定義業(yè)務(wù)、優(yōu)化管理是使用技術(shù)比較普遍的場(chǎng)合,依托開(kāi)源項(xiàng)目或原有積累進(jìn)行二次開(kāi)發(fā)就比較方便,對(duì)于資源比較豐富的企業(yè)可以選擇完全從零開(kāi)始進(jìn)行自主開(kāi)發(fā)。技術(shù)的應(yīng)用和功能模塊需要有一定的預(yù)見(jiàn)性和主動(dòng)性,是不是Java語(yǔ)言實(shí)現(xiàn)并不是最重要的,業(yè)務(wù)自由度越大的時(shí)候?qū)ava語(yǔ)言本身的依賴(lài)性就越小。
java有關(guān)技術(shù)挑戰(zhàn)的思考
Java語(yǔ)言的學(xué)習(xí)和運(yùn)用一開(kāi)始可以讓我們更多的關(guān)注在Java技術(shù)應(yīng)用本身,隨著身份的變化和多元化的場(chǎng)景的出現(xiàn)讓我們對(duì)Java又有更加深入的理解。那就是Java是一門(mén)編程語(yǔ)言,我們處理和解決問(wèn)題關(guān)注的更多層面不是選擇哪一門(mén)語(yǔ)言,而是如何更好地滿(mǎn)足實(shí)際場(chǎng)景的需要。跳出編程語(yǔ)言來(lái)思考問(wèn)題,可以有助于看清楚技術(shù)的優(yōu)勢(shì)和短板,方便發(fā)現(xiàn)和理解一直存在的技術(shù)困惑和挑戰(zhàn)。這里先講兩個(gè)與Java項(xiàng)目有關(guān)的真實(shí)案例。
酷派通行證Android應(yīng)用工作交接的沖突
酷派通行證Android版是一款用于酷派手機(jī)應(yīng)用進(jìn)行身份登錄鑒權(quán)以及掌上證券支付的移動(dòng)應(yīng)用,以前是西安一個(gè)團(tuán)隊(duì)負(fù)責(zé)進(jìn)行維護(hù)和升級(jí),后因工作需要移交給北京所在團(tuán)隊(duì),當(dāng)時(shí)就指派一個(gè)比較年輕的同事接手這個(gè)項(xiàng)目。Android應(yīng)用主要是用Java開(kāi)發(fā)的,兼有少量的C語(yǔ)言開(kāi)發(fā),其中C語(yǔ)言部分主要用于進(jìn)行私有協(xié)議數(shù)據(jù)交換,保證數(shù)據(jù)交換安全。代碼交接過(guò)來(lái),本地開(kāi)發(fā)環(huán)境稍加配置就可以消除所有編譯錯(cuò)誤,但打包發(fā)布成獨(dú)立APK后卻怎么也無(wú)法正確調(diào)用,與西安同事進(jìn)行過(guò)確認(rèn),所有的代碼是完整可用的。jsp虛擬主機(jī)
當(dāng)接手工作的同事向我求助時(shí),我當(dāng)時(shí)也不清楚,只是從經(jīng)驗(yàn)角度提供幾個(gè)可能的原因讓他進(jìn)行分段驗(yàn)證,進(jìn)而定位可能出現(xiàn)的原因,就這樣持續(xù)了幾天還沒(méi)有解決,但深圳總部的手機(jī)項(xiàng)目已經(jīng)反饋這應(yīng)用有Bug出現(xiàn),希望我們盡快進(jìn)行解決。由于現(xiàn)在還沒(méi)有本地運(yùn)行通過(guò),所以一直無(wú)法進(jìn)行修復(fù)和更新版本。手機(jī)項(xiàng)目的入網(wǎng)、量產(chǎn)等環(huán)節(jié)都是有非常確定的時(shí)間節(jié)點(diǎn),軟件代表的郵件和電話也在不停地跟進(jìn)這事,在這種壓力下,接手這個(gè)工作的同事甚至產(chǎn)生不干了的想法,因?yàn)椴恢肋@個(gè)問(wèn)題是怎么回事,無(wú)法進(jìn)行解決,更回答不了具體解決問(wèn)題的時(shí)間點(diǎn)。這個(gè)問(wèn)題持續(xù)兩周,經(jīng)過(guò)仔細(xì)測(cè)試和排查,發(fā)現(xiàn)問(wèn)題的關(guān)鍵出現(xiàn)在編譯環(huán)境上,交接前的編譯環(huán)境和新的環(huán)境版本不同,從而導(dǎo)致高版本的編譯程序無(wú)法運(yùn)行在低版本的環(huán)境下,調(diào)整編譯環(huán)境后問(wèn)題自然解決。
遇到未知的問(wèn)題和現(xiàn)象來(lái)臨時(shí)普遍會(huì)表現(xiàn)的比較不自信,精神壓力比較大,很難一直保持對(duì)Java專(zhuān)業(yè)知識(shí)的冷靜和思考,容易產(chǎn)生放棄解決的矛盾心理。研發(fā)人員在進(jìn)行產(chǎn)品研發(fā)時(shí)面對(duì)的問(wèn)題往往是多方面的,并不是說(shuō)一眼都能看出來(lái)是哪一行代碼錯(cuò)誤那么簡(jiǎn)單,沒(méi)有找到原因之前可能是無(wú)解的,可以說(shuō)是一種煎熬。
光合原品微信網(wǎng)關(guān)程序日志停止輸出的異象
因?yàn)楣夂显窐I(yè)務(wù)需要,微信網(wǎng)關(guān)需要增加一個(gè)功能:每次用戶(hù)關(guān)注微信公眾號(hào)“光合原品”,給用戶(hù)下行的提醒語(yǔ)要可以變化的。這種需求的簡(jiǎn)單做法就是后臺(tái)維護(hù)一系列的關(guān)注回復(fù)語(yǔ),使用Java的隨機(jī)數(shù)函數(shù)機(jī)制