閱讀849 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何麵對JAVA架構師,和學習方法。

宏觀上:

1.技術廣度方麵

至少要精通多門開源技術吧,研究過struts\spring等的源碼。

2.項目經驗方麵

從頭到尾跟過幾個大項目,頭是指需求階段,包括需求調研。

尾是指上線交付之後,包括維護階段。

3.架構經驗方麵

有過分布式係統的架構和開發經驗。對於跨係統的結構優化,數據存儲的性能指標等有豐富經驗。什麼緩存啊、數據庫的垂直切分什麼的,業務的抽象和水平拆分啊,這些應該都輕車熟路吧。

4.行業領域方麵

最起碼得精通一到兩門業務吧,所謂精通,就是比如做金融證券業務的,至少等當半個經融分析師。做電力業務的,至少等當半個電力工程師。

5.個人修為

有自己一些獨到的見解,不會人雲亦雲啦。

微觀上:

1.你需要精通麵向對象分析與設計(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應該十分了解UML,尤其是class,object,interaction以及statediagrams。

2.你需要學習java語言的基礎知識以及它的核心類庫(collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。

3.你應該了解JVM,classloaders,classreflect,以及垃圾回收的基本工作機製等。你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。

4.如果你將要寫客戶端程序,你需要學習WEB的小應用程序(applet),必需掌握GUI設計的思想和方法,以及桌麵程序的SWING,AWT, SWT。你還應該對UI部件的JAVABEAN組件模式有所了解。JAVABEANS也被應用在JSP中以把業務邏輯從表現層中分離出來。

5.你需要學習java數據庫技術,如JDBCAPI並且會使用至少一種persistence/ORM構架,例如Hibernate,JDO, CocoBase,TopLink,InsideLiberator(國產JDO紅工廠軟件)或者iBatis。

6.你還應該了解對象關係的阻抗失配的含義,以及它是如何影響業務對象的與關係型數據庫的交互,和它的運行結果,還需要掌握不同的數據庫產品運用,比如

racle,mysql,mssqlserver。

7.你需要學習JAVA的沙盒安全模式(classloaders,bytecodeverification,managers,policyandpermissions,codesigning, digitalsignatures,cryptography,certification,Kerberos,以及其他)還有不同的安全/認證 API,例如JAAS(JavaAuthenticationandAuthorizationService),JCE (JavaCryptographyExtension),JSSE(JavaSecureSocketExtension),以及JGSS (JavaGeneralSecurityService)。

8.你需要學習Servlets,JSP,以及JSTL(StandardTagLibraries)和可以選擇的第三方TagLibraries。

9.你需要熟悉主流的網頁框架,例如JSF,Struts,Tapestry,Cocoon,WebWork,以及他們下麵的涉及模式,如MVC/MODEL2。

10.你需要學習如何使用及管理WEB服務器,例如tomcat,resin,Jrun,並且知道如何在其基礎上擴展和維護WEB程序。

11.你需要學習分布式對象以及遠程API,例如RMI和RMI/IIOP。

12.你需要掌握各種流行中間件技術標準和與java結合實現,比如Tuxedo、CROBA,當然也包括javaEE本身。

13.你需要學習最少一種的XMLAPI,例如JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。

14.你應該學習如何利用JAVAAPI和工具來構建WebService。例如JAX-RPC(JavaAPIforXML/RPC),SAAJ (SOAPwithAttachmentsAPIforJava),JAXB(JavaArchitectureforXMLBinding),JAXM(JavaAPIforXMLMessaging), JAXR(JavaAPIforXMLRegistries),或者JWSDP(JavaWebServicesDeveloperPack)。

15.你需要學習一門輕量級應用程序框架,例如Spring,PicoContainer,Avalon,以及它們的IoC/DI風格(setter,constructor,interfaceinjection)。

16.你需要熟悉不同的J2EE技術,例如JNDI(JavaNamingandDirectoryInterface),JMS (JavaMessageService),JTA/JTS(JavaTransactionAPI/JavaTransactionService),JMX (JavaManagementeXtensions),以及JavaMail。

17.你需要學習企業級JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。

18.你需要學習如何管理與配置一個J2EE應用程序服務器,如WebLogic,JBoss等,並且利用它的附加服務,例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上麵封裝和配置應用程序並且能夠監控、調整它的性能。

19.你需要熟悉麵向方麵的程序設計以及麵向屬性的程序設計(這兩個都被很容易混淆的縮寫為AOP),以及他們的主流JAVA規格和執行。例如AspectJ和AspectWerkz。

20.你需要熟悉對不同有用的API和frame work等來為你服務。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。

21.如果你將要對接或者正和舊的係統或者本地平台,你需要學習JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。

22.你需要熟悉JINI技術以及與它相關的分布式係統,比如掌握CROBA。

23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。

24.你應該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什麼了:

25.JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。

26.你需要熟悉一種單元測試體係(JNunit),並且學習不同的生成、部署工具(Ant,Maven)。

27.你需要熟悉一些在java開發中經常用到的軟件工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。

28.你需要能夠深入了解加熟練操作和配置不同的操作係統,比如GNU/linux,sunsolaris,macOS等,做為跨平台軟件的開發者。

29.你還需要緊跟java發展的步伐,比如現在可以深入的學習javaME,以及各種java新規範,技術的運用,如新起的web富客戶端技術。

30.你必需要對opensource有所了解,因為至少java的很多技術直接是靠開源來驅動發展的,如java3D技術。

1、具有1-5工作經驗的,麵對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。 
2、在公司待久了,過得很安逸,但跳槽時麵試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。 
3、如果沒有工作經驗,但基礎非常紮實,對java工作機製,常用設計思想,常用java開發框架掌握熟練的,可以加群。 
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有係統化,很難在技術領域繼續突破的可以加群。 
5.群號:532259952 裏麵可以學習和交流,也有資料可以下載
6.阿裏Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全麵、科學地建立自己的技術體係和技術認知!

學習方法

1:掌握良好的學習心態 
2:掌握係統化的學習方法 
3:知識如何內化成能力 
4:廣度和深度的選擇 實戰技巧

1:你需要學會的編碼習慣 
2:在業務團隊做開發如何成長 
掌握良好的學習心態

空杯心態

首先要有空杯的學習心態,而不是傲嬌自滿,故步自封,空杯子才可以裝下更多的東西。首先要學會取百家之長,帶著欣賞的眼光看團隊的同事或學校的同學,欣賞每位同事或同學的優點,然後吸取他們的優點,每個同事都有其擅長的能力,比如有的同事技術能力強,那麼可以觀察下他如何學習的(或者找他請教學習方法),有的同學擅長解決線上問題,那麼觀察他是如何解決線上問題的,解決思路是什麼?如果他解決不了時,他是如何尋求幫助。有的同學擅長使用IDE或MAC的快捷鍵,那麼可以向他學習提高工作效率。有的同學能快速理解業務知識,觀察他是如何做到的,自己如何達到他的程度。溝通能力,解決問題能力以及規劃能力都可以向同事學習。

挑戰權威

從書上看到一個知識點,或者從別人那裏聽到一個知識點,一定要去挑戰和質疑這個知識點的正確性,否則學到的知識點可能是錯誤的。先用邏輯思維推測下,再實戰檢測下,一定要記住實踐是檢驗真理的唯一標準。比如同事說這個SQL加這個索引是最快的,首先要思考同事的結論是如何得出的,是靠曆史經驗還是測試過,如果我們沒有經驗,就加上這個索引跑下SQL,看看執行計劃和執行時間,再換下其他索引試試會不會更快。依次類推,並發一定比串行快嗎?無鎖一定比加鎖快嗎? 很多結論都是在特定的場景下才會產生的,一定要自己親手實踐驗證下。

堅持學習

有的同學可能工作了五年,但是學習的時間可能一年都不到。學技術不能急於求成,隻要學習方法正確,量變一定會引起質變。我在大學剛學JAVA時,怎麼都學不會,但是堅持學習了幾個月,每天看張老師的JAVA視頻教學,買書按照書裏的代碼一行一行的敲代碼,白天睡覺,晚上學習和寫代碼,寫到宿舍關燈時就去避風塘呆一晚上,早上6點鍾回宿舍睡覺,學到一定時間後,突然恍然大悟,才入了門。

在工作中,我曾經花了一個月的時間學習AOP的實現原理,學習了各種方式來實現AOP的原理,並寫了幾種實現方式的代碼,雖然花的時間很多,但是到現在仍記憶猶新,對於排查問題和學習其他知識都非常有幫助。

要做到堅持學習,學習的環境非常重要。如果你想學,但是又不在學習狀態,可以考慮換個學習環境,我經常會去星巴克看書和學習。我聽說有的同事會周末抽一天去大學教師上自習。

把事做精

對自己要求越高,進步越快。要有強烈的把事情做完美的心態,我剛開始工作的時候,總是快而不精,做事做的不夠細致,總希望快速拿出結果證明自己,但是反而證明不了什麼,技術能力也得不到提升,缺少技術亮點,在團隊中也沒什麼影響力,後麵就開始鍛煉一次就把事情做對的心態和方法。我觀察過,很多人都擅長快速做事情,但是把事情做好做精致的人會比較少,但是結果卻是 在精益求精的路上才會快速提高自己的能力 。比如用100行代碼實現的功能,思考下是否可以用10行來實現,以便於降低運維成本,提高下次的編碼效率。引用GUAVA等類庫,提取公共方法,和使用JDK8新特性等。係統的方法壓測過後,單機隻能承受1700QPS,可以思考和實踐能否優化下程序提高QPS,減少服務器數量。

把事情做精,一定是要強迫自己多花心思多花時間在這件事情上。有位技術牛人給我分享了一個心得,我覺得說的非常好,老板給你布置了一個任務, 你要花百分之150的精力做到100分,這樣在老板那裏你就能拿到80分或者60分 。

掌握係統化的學習方法

如果學習到的知識不成體係,那麼遇到問題時就會非常難解決。有些同學會出現這些情況,比如編碼時遇到問題百度搜索,如果百度上找不到答案,這個問題就解決不了。再比如,在開發中要用到某個技術點,就學習下API,程序調通後就不再深入研究,淺嚐輒止,如果程序遇到其他問題也不知道如何解決。

以上情況我認為叫 點狀學習 。遇到一個問題,解決一個問題,需要一項技術,學習一項技術。那麼如何由點到麵,由麵到體,形成係統化學習呢。

首先要確定學習的知識領域,需要達成的學習目標,針對目標製定學習計劃,就像你要寫一本書一樣,先把目錄寫出來,然後根據目錄上的知識點逐步去學習,最後把這些知識點關聯起來,形成一個係統化的知識體係。學習的時候,可以製定一個計劃,以周為單位,比如第一周學什麼,第二周學什麼。

比如我最近在學習人工智能,學習步驟是:

1: 高數基礎知識:線性代數,微積分和統計學。最近在打德州撲克時,我也會用統計學裏的知識計算下輸贏的概率。 
2: 人工智能基礎:買幾本書人工智能的基礎書籍,如《機器學習基礎教程》《Python機器學習》 
3:框架:TensorFlow等。 
4:實戰:在工作中找到一個應用場景,把學到的知識運用進去。 
知識如何內化成能力

作家格拉德威爾在《異類》一書中指出,1萬小時的錘煉是任何人從平凡變成世界級大師的必要條件。1萬小時有多久?每天學習10小時,需要大約三年。但是很多人都工作了五年甚至更長,但是為什麼成為世界級大師的卻非常少。讀者可以先自己思考下這個問題。接下來談談我的看法。

成長必須經曆一個步驟,就是把知識內化成能力。 知識是用腦記住的,能力是用手練習出來的 。在工作的幾年裏,我們可能看過很多書,聽過很多技術講座和視頻,但是通過聽和看隻是讓你能記住這些知識,這些知識還不能轉換成你的能力。

聽和看隻是第一步,更重要的是實踐,通過刻意練習把聽到和看到的知識內化成你的能力。

刻意練習,就是有目的的練習,先規劃好,再去練習。首先給自己定一個目標,目標可以有效的引導你學習,然後使用3F練習法:

1: 專注(Focus),專注在眼前的任務上,在學習過程中保持專注,可以嚐試使用番茄工作法。 
2:反饋(Feedback),意識到自己的不足,學習完之後進行反思,思考下自己哪些方麵不足,為什麼不足, 
3: 修正(Fix),改進自己的不足。 
不停的練習和思考可以改變大腦結構,大腦像肌肉一樣,挑戰越大,影響越大,學習更高效,並且也會產生突破性。

廣度和深度的選擇

技術人員的學習路徑有兩個維度,深度和廣度。很多程序員都有這個疑問,是先深後廣,還是先廣後深呢?

通過這麼多年的學習和思考,我的建議先深後廣,因為當技術學到一定深度後,就會有觸類旁通的能力,自己掌握的廣度也自然有了深度。但是在實際學習過程中,深度和廣度相互穿插著學習,比如學習並發編程時,首先學習JDK源碼,然後學進去之後,開始看JVM源碼,最後看CPU架構,在技術點逐漸深度研究的過程中,廣度也得到了完善。

所以無論哪種學習方式,學習態度才是最重要的,在廣度學習的時候有深入研究的態度就能達到一定的深度,在深度學習的時候,主動學習相關的技術點,廣度也得到拓寬。

你需要學會的編碼習慣

程序員應該學會通過技術的手段來提高效率。幾個常用的手段是使用工具,快捷鍵和編寫腳本。

使用各種工具 
技術人員電腦盡量用MAC,使用命令行效率一定比在 10241024 像素中找一個 1010 像素的按鈕更快。IDE用IDEA,比Eclipse更智能。命令行工具用iTerm和IDEA裏的Terminal。寫文章用MAC的客戶端工具MacDown,左邊編寫,右邊展示,比Word等工具方便快速很多。有時候我還會用按鍵精靈裏配置腳本需要解決工作問題,比如通過點擊我們的係統,來執行任務。這樣的工具很多,隻要能提高工作效率的工具,大家都可以嚐試使用。

使用快捷鍵 
MAC,IDEA和Eclipse有很多快捷鍵都要學會使用,比如在MAC命令行中通過idea .快速打開工程,通過open . 快速的打開文件夾,把IDEA裏通過快捷鍵把一段代碼抽成一個單獨的方法,快速生成getter setter方法。

用腳本寫工具 
當我們用人工的方式做一件重複性很強的事情,首先要考慮使用工具來幫我們自動完成,如果沒有類似工具,可以自己寫個腳本來實現,這樣除了能快速解決問題,還能提高自己的技術能力。

比如,我經常要在兩個maven倉庫發布jar包,我就寫了個腳本來實現jar包的發布, deploy.sh代碼如下:

cp pom.xml pom.xml.bakrm pom.xmlln -s pom-2-deploy.xml pom.xmlmvn deployrm -rf pom.xmlcp pom.xml.bak pom.xmlrm pom.xml.bak 
在業務團隊做開發如何成長

我一直在業務團隊中做開發,在業務團隊最主要的提高的能力是業務抽象和架構能力,通過業務場景,不斷思考如何通過合理的架構和業務抽象能快速支持業務,降低運維成本。同時在這個過程中鍛煉技術能力,比如寫一些技術框架來快速支持業務,做到技術驅動業務。

可配置化的方式支持業務

設計業務的領域模型,把不隨著業務邏輯變化的領域模型做成係統能力,把隨著業務邏輯變化功能,做成可配置化,上一個新業務,通過配置的方式或少量開發就能支持。

在做客戶後台功能時,由於需要展示的數據種類非常多,每種數據展示可能需要花費幾天的時間,所以設計了一個通用的技術框架,實現了通過配置化的方式展示各種數據。

寫框架解決業務問題

我在上家公司經常做一些CRUD的業務功能,我就自己開發了一個快速做CRUD的框架 jdbcutil,通過配置實體生成SQL語句,實現了子類隻要繼承父類,就自動擁有CRUD的能力。後麵還寫過生成CRUD頁麵代碼的程序。

目前我們團隊在做的TITAN框架通過模塊化開發的方式,解決易變的業務係統在多人開發時遇到的問題。

技術驅動業務

在業務團隊,一定要不斷的思考如何利用技術來支持快速支持業務,配置化是一種思路,但是有些功能配置複雜度比較高,配置加驗證的工作量,可能需要一個星期的時間,那麼能不能減少人工配置,實現係統自動化配置,於是可以研究下人工智能,通過人工智能的方式實現,係統告訴人需要配置哪些東西,然後交給人來進行確認,這樣可以大大減少人工成本,更快的支持業務。

1、具有1-5工作經驗的,麵對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。

2、在公司待久了,過得很安逸,但跳槽時麵試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機製,常用設計思想,常用java開發框架掌握熟練的,可以加群。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有係統化,很難在技術領域繼續突破的可以加群。


最後更新:2017-10-18 16:03:25

  上一篇:go  《Web前端開發修煉之道》-讀書筆記CSS部分
  下一篇:go  這是史上最全的雲棲大會珍貴花絮,看完倍感驕傲!