Java开发与技术挑战——关于技术的技术思考
Java開發與技術挑戰——關于技術的技術思考
width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-05-19%2F2824716-Java&type=3&count=&appkey=&title=Java%E8%AF%AD%E8%A8%80%E5%B7%B2%E7%BB%8F%E8%B5%B0%E8%BF%87%E4%BA%8C%E5%8D%81%E4%B8%AA%E5%B9%B4%E5%A4%B4%EF%BC%8C%E5%B2%97%E4%BD%8D%E5%92%8C%E8%BA%AB%E4%BB%BD%E7%9A%84%E5%8F%98%E5%8C%96%EF%BC%8C%E4%B9%9F%E4%BC%B4%E9%9A%8F%E7%9D%80Java%E7%9A%84%E5%90%8C%E6%AD%A5%E6%88%90%E9%95%BF%EF%BC%8C%E5%85%B6%E4%B8%AD%E4%B9%9F%E5%8C%85%E5%90%AB%E4%BA%86%E5%AF%B9%E6%8A%80%E6%9C%AF%E7%90%86%E8%A7%A3%E7%9A%84%E6%80%9D%E8%80%83%E4%B8%8E%E5%8F%98%E5%8C%96%E3%80%82%E4%B8%BB%E8%A6%81%E4%BD%93%E7%8E%B0%E5%9C%A8%E5%9B%9B%E4%B8%AA%E9%98%B6%E6%AE%B5%EF%BC%9A%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88%E3%80%81%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%B8%88%E4%B8%8E%E6%8A%80%E6%9C%AF%E4%B8%BB%E7%AE%A1%E3%80%81%E6%8A%80%E6%9C%AF%E9%A1%BE%E9%97%AE%E3%80%81%E6%8A%80%E6%9C%AF%E5%90%88%E4%BC%99%E4%BA%BA%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1432037504955" frameborder="0" scrolling="no" allowtransparency="true">摘要:Java語言已經走過二十個年頭,崗位和身份的變化,也伴隨著Java的同步成長,其中也包含了對技術理解的思考與變化。主要體現在四個階段:開發工程師、系統架構師與技術主管、技術顧問、技術合伙人。
到目前為止,接觸Java語言已經有將近10個年頭。從趴在學校實驗室中認領師兄提供的論壇系統開發任務,到參與WebERP構件化平臺、網絡資源聚合平臺、電信增值業務平臺、企業門戶網站以及運營管理平臺的研發,再到后面的掌上證券、軟件商店、移動支付平臺等移動互聯網平臺建設,不論是PC端,還是移動端,底層的技術一直都是用Java架構來進行實現的。期間參與過多次的Java技術培訓與問題指導,以撲火隊員的身份見證了形色各異的Java坑,從而不斷提醒自己要跳出Java語言本身,去思考一些開發中的技術困惑和挑戰。
Java的成長經歷
Java語言已經走過二十個年頭,崗位和身份的變化,也伴隨著Java的同步成長,其中也包含了對技術理解的思考與變化。主要體現下面四個階段:開發工程師、系統架構師與技術主管、技術顧問、技術合伙人(聯合創始人)。
開發工程師
以前大學學的專業是數學而不是計算機,Java編程之路是從《ThinkinJava》這本書開始的,當時每天晚上十二點看到凌晨二三點,就這樣持續將近3個月,面向對象的編程就這樣入門了。Java語言上手非常容易,裝一個IDE工具(Eclipse、Myeclipse等等),找一本參考書就可以開始,但是要想深入,還需要學習很多東西。從Java的常用包Java.lang.*,Java.util.*,Java.net.*等等開始,逐漸開始學習dom4j、jdom、log4j、hibernate、spring、ibatis、struts等等以開源為主體的各種Java擴展技術,jsp、mvc、ssh等等也是經常掛在嘴邊的技術,JSON與xml的封裝和解析也是數據配置與交換中常用的技術手段,明白和使用正則表達式也是開發中一塊比較興奮的事情。運行環境Tomcat、JBoss、WebLogic等等都用過也是Java知識豐富的一個佐證,能用過就懂Web容器與應用服務器的區別。
由于Java廣泛用于各種互聯網的場景中,學習Java開發,還需要學習SQL語言以及各種商用關系型數據庫MySQL、SQLserver、Oracle等等(NoSQL、memcached等各種非關系數據庫)的安裝與使用,在進行專業領域還要研究Lucence等等搜索引擎開源框架和組件。有些專注前端的可能還需要學習HTML、JavaScript以及jQuery之類的知識。
Java入門階段接觸最多的開發可能就是論壇系統、管理信息系統以及OA系統之類,深入學習后面臨的項目和平臺就比較專業了,比如軟件商店、支付平臺、廣告平臺等等。由于Java相關知識非常廣泛、開源項目和平臺眾多,在這里一直是個學習者,Java二十周年技術人員學習的好平臺。
系統架構師與技術主管
談到Java優點時,大部人分都記得它有一個非常先進的垃圾回收機制,在對象不被使用時可以自動回收,不用開發人員關心,甚至把這個說成為是Java優越于C++等其他面向對象語言的一個重要特性,而在實際中,對象引用錯誤、JVM內存以及堆內存的分配設置不合理等等現象,往往會引發服務器應用出現outofmemory的錯誤,進而宕機。Java的垃圾回收函數System.gc()只能發送垃圾回收請求,實際執行時間仍舊不總是可靠的。在進行內存對象進行處理時,Java對象在強引用下是不可回收,使用Java的軟引用(SoftReference)機制可以做到讓內存空間不足時自動釋放不用的內存對象,從而保證內存空間一直可控。
在Java應用開發中,逐漸開始使用設計模式的思想來進行關鍵模塊的開發,單態模式、組合模式、適配器模式、觀察者模式等等面向對象的特征也得到很好的發揮。基于Java架構設計中更多通過機制性保證來構建一個比較穩健可擴展的系統,比如無狀態設計、同步異步分離、動靜分離、模塊服務化、多級緩存等等。
在技術選型上,像軟件商店、移動支付平臺,除移動端使用Android實現,服務器都可以使用Java進行實現,這樣一方面可以重用原有程序積累,又可以通過Java的豐富開源組件來加快開發速度。但技術方面的選擇上不再以Java為唯一技術選擇,后端存儲層面,可以把關系型數據庫、非關系型數據庫以及文件系統進行整合考慮,不再把單一的“Java+關系型數據庫”作為軟件系統的唯一設計標準。后臺任務服務以及程序邏輯都可以用Python、Shell腳本進行實現也非常好。多種技術組合使用可以充分發揮每一種技術的優勢,這也是技術選型的一個重要原則。
JavaEE的分層設計思想給軟件開發提供了有利條件,根據前端、數據持久層、控制器層、代理層、組件層等視圖可以有效地把工作模塊分解給不同的團隊成員,從而保證大型項目的任務分解與工作可跟蹤。在產品進行迭代和升級時只需要修改受影響的代碼部分就可以保證最大限度的代碼穩定性。
技術顧問
Java技術輸出主要涉及三個方面的內容:基礎知識培訓、基于性能優化的診斷分析、基于業務流程優化的架構重塑。Java基礎知識培訓主要定位在Java新手快速掃盲;基于性能優化的診斷分析主要集中在中小型公司,它們一般開發有一套自己的Java系統,但總出現系統問題或者訪問量就是上不來(特別是它們購買的是性能比較好的服務器);基于業務流程優化的架構重塑主要對業務上有新需求的Java平臺改進,原有平臺比較混亂,需要進行統一整合,它們的立足點不是因為現有平臺不能運行而影響業務。在這個維度,Java語言本身被包裝成服務,已經不再是開發某一個模塊那么簡單了。Java平臺出現的不同坑也只有經歷了才能知道。
技術合伙人(聯合創始人)
以互聯網為載體的創業公司往往喜歡招募PHP的開發人員,主要是因為網站類開發使用PHP比較快,同時也有一定量的開源平臺可用。從技術合伙人的角度思考,重塑和定義業務、優化管理是使用技術比較普遍的場合,依托開源項目或原有積累進行二次開發就比較方便,對于資源比較豐富的企業可以選擇完全從零開始進行自主開發。技術的應用和功能模塊需要有一定的預見性和主動性,是不是Java語言實現并不是最重要的,業務自由度越大的時候對Java語言本身的依賴性就越小。
有關技術挑戰的思考
Java語言的學習和運用一開始可以讓我們更多的關注在Java技術應用本身,隨著身份的變化和多元化的場景的出現讓我們對Java又有更加深入的理解。那就是Java是一門編程語言,我們處理和解決問題關注的更多層面不是選擇哪一門語言,而是如何更好地滿足實際場景的需要。跳出編程語言來思考問題,可以有助于看清楚技術的優勢和短板,方便發現和理解一直存在的技術困惑和挑戰。這里先講兩個與Java項目有關的真實案例。
酷派通行證Android應用工作交接的沖突
酷派通行證Android版是一款用于酷派手機應用進行身份登錄鑒權以及掌上證券支付的移動應用,以前是西安一個團隊負責進行維護和升級,后因工作需要移交給北京所在團隊,當時就指派一個比較年輕的同事接手這個項目。Android應用主要是用Java開發的,兼有少量的C語言開發,其中C語言部分主要用于進行私有協議數據交換,保證數據交換安全。代碼交接過來,本地開發環境稍加配置就可以消除所有編譯錯誤,但打包發布成獨立APK后卻怎么也無法正確調用(如圖1效果所示),與西安同事進行過確認,所有的代碼是完整可用的。
當接手工作的同事向我求助時,我當時也不清楚,只是從經驗角度提供幾個可能的原因讓他進行分段驗證,進而定位可能出現的原因,就這樣持續了幾天還沒有解決,但深圳總部的手機項目已經反饋這應用有Bug出現,希望我們盡快進行解決。由于現在還沒有本地運行通過,所以一直無法進行修復和更新版本。手機項目的入網、量產等環節都是有非常確定的時間節點,軟件代表的郵件和電話也在不停地跟進這事,在這種壓力下,接手這個工作的同事甚至產生不干了的想法,因為不知道這個問題是怎么回事,無法進行解決,更回答不了具體解決問題的時間點。這個問題持續兩周,經過仔細測試和排查,發現問題的關鍵出現在編譯環境上,交接前的編譯環境和新的環境版本不同,從而導致高版本的編譯程序無法運行在低版本的環境下,調整編譯環境后問題自然解決。
遇到未知的問題和現象來臨時普遍會表現的比較不自信,精神壓力比較大,很難一直保持對Java專業知識的冷靜和思考,容易產生放棄解決的矛盾心理。研發人員在進行產品研發時面對的問題往往是多方面的,并不是說一眼都能看出來是哪一行代碼錯誤那么簡單,沒有找到原因之前可能是無解的,可以說是一種煎熬。
圖1酷派通行證Android應用的沖突
光合原品微信網關程序日志停止輸出的異象
因為光合原品業務需要,微信網關需要增加一個功能:每次用戶關注微信公眾號“光合原品”,給用戶下行的提醒語要可以變化的。這種需求的簡單做法就是后臺維護一系列的關注回復語,使用Java的隨機數函數機制來隨機提取后臺的提示語即可,程序開發完成后部署到生成環境,運行發現下面的異常:
2014-06-21 12:19:22 INFO [com.jiuxf.weixin.protocol.xml.MessageXMLUtil] jsonObject data is null
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
后面的程序日志就徹底打印了,而這些程序在本地進行測試時運行也是正常的,這兩個方面有點自相矛盾,也就是我們常說的悖論。
為了開發這個功能,程序中增加Redis為緩存處理中間件,用于臨時存放關注緩存數據,緩存數據是以JSON的形式進行存放,程序中啟用json-lib-2.4-jdk15.jar第三方jar用于完成對JSON的封裝與解析。由于本地開發環境與服務器不一樣,JSON封裝解析運行還有其他依賴包(commons-beanutils-1.8.0.jar、commonscollections-3.1.jar、commons-lang-2.5.jar、commonslogging-1.1.1.jar、ezmorph-1.0.6.jar),jar沖突在Java平臺下出現非常普遍,解決起來也非常讓人無語,主要是不同的jar包設計者為了保證自己的程序運行不出現異常,往往會隱藏調用中的異常痕跡,導致看不到程序錯誤日志,程序問題定位難度很大。通過對jar的調用部分邏輯進行常量替換跟蹤測試,發現問題依舊存在,jar沖突給予排除,還要繼續尋找其他原因。經過調查和文件對比,真正的原因是沒有在beanfactory.xml配置文件中新增的class聲明,如圖2所示。
beanfactory.xml的修改是手動進行修改的,遺漏了一條新增加的Service類。這種日志最奇怪的地方是程序出錯,日志文件就不輸出信息,傳統的Java程序運行故障都會拋出Exception日志,專業人士一眼就看到問題所在,但沒有錯誤提示想解決就難度大了。
未知與悖論是技術人員無法回避的兩大技術挑戰
上面提到的兩個真實案例非常簡單,其中包含了技術人員經常面臨的兩個挑戰:未知和悖論。
未知是指人受特定的時間和空間的限制及影響,對于現有事物的認知產生一定的局限性,且處于一種迷茫的感知狀態。未知體現在沒有技術人員沒有進行開發工作前的一種狀態,這個狀態中Java人員的心理不是不會寫class,而是不知道當前工作與什么類和函數有關。遇到這種狀態都會本能地使用搜索引擎查詢相關資料,或與朋友同事進行交流,以獲求最直接的幫助和解惑,但沒有效果,因為他們也不知道。處在這個狀態中,技術人員也會呈現不那么自信,不知道如何解決,不知道什么時候能解決,甚至會做出各種極端的舉措。一定程度上,技術人員會寫各種各樣的Java代碼,熟悉各種開發組件和開發包,關鍵是不知道自己要寫什么,這就是未知的挑戰。
另外一個挑戰就是“悖論”了,這個必須打引號,說是悖論,其實并非真正的悖論,它只是當局者不能使用先驗知識解釋當前現象的一種錯覺,代碼都是對的,環境都是OK的,怎么就出現讓自己不可理解的效果呢,實踐證明這類問題在技術上往往都能解決。剛才說未知是技術人員沒有開始工作前遇到的挑戰,悖論往往是已經按照原有的技術討論開展工作后的挑戰,看似已經完成特定的任務,但結果卻不是自己預期那樣。在這個狀態中,一開始可以按照理性的方式進行分析和確認問題,當幾輪分析下來,可能就會走彎路(比如放棄和懷疑自己原有的知識結構的正確性,在錯誤的方式上不斷循環驗證等等),從而導致走進死胡同中出不來。
做技術研發時間越長,越要關注實現細節,利用完整的知識結構來驗證每一個環節,悖論自然消除,未來的東西也是可以用已知的知識來解釋和分析。技術人員面臨的挑戰和壓力更多已經不是某一項新技術目前還不會怎么辦,而是會原有技術的情況下出現的各種未知和悖論該怎么做。
寫在最后的話
前文雖然解釋了技術挑戰的發生與特點,限于篇幅的限制尚不能展開敘述,為了更好地梳理開發中遇到的各種坑,正視各種看似荒誕無奇、甚至不可能出現的悖論現象,本人將在2015年撰寫一本新書《技術的觸動》(暫定書名),會結合自身真實經歷,講解各種具象(假設、一致性、技術認知、邊界、依賴等等)的特征和內幕。有興趣者可以關注我個人微信:hexi30nian(發送關注請備注來自CSDN)。細節問題也可以進行交流。
作者簡介:王繼輝網名河西三十年,北京光合原品科技有限公司聯合創始人&CTO,有8年的互聯網從業經驗,在職期間曾提交通過20多件國家級發明專利,知識產權評審專家,CSDNCTO俱樂部會員與撰稿人。對分布式計算、軟件架構、標簽人格化等領域感興趣。
總結
以上是生活随笔為你收集整理的Java开发与技术挑战——关于技术的技术思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java最大的优势真的在于跨平台吗?
- 下一篇: DMLC深盟分布式深度机器学习开源平台解