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