? ? ? ?從編程語言的角度來看,首先是熟練使用語法、標準類庫、常用類庫。要做到這點相對容易,一些非計算機科班生也能做得特別好。如果做不到這點,則稱不上是一名合格的程序員。其次是掌握語言執行細節,需要有操作系統、編譯原理等計算機專業知識,掌握這些知識有利于寫出高性能的代碼。
而優秀的程序員(或者說架構師的入門標準)往往能更好的理解軟件工程。
首先是代碼的正確性,即功能正確性,做不到這一點,一切免談。
? ? ? ? 其次是代碼的可維護性,要理解一點,代碼不是寫給自己看的,而是寫給別人看的,否則軟件將難以維護。要做到這點不容易,為此我們往往會定義一個組織內部的編碼規范、注釋規范、模塊封裝規范、設計原則等,并結合軟件開發管控流程,諸如需求評審、設計評審、測試用例評審、安裝和升級過程評審等,盡可能的讓軟件代碼以更加標準、其他人更容易理解的方式出現。有的時候,我們寧可放棄代碼性能,也要讓代碼更可讀,因為性能瓶頸往往是架構和關鍵路徑決定的,大部分代碼不在關鍵路徑上,優化他們的性能沒有太大意義。做到這點需要有大量的經驗。
第三就是測試友好性。一般只有優秀的程序員才會注意到這一點。要知道測試人員測試代碼的主要手段就是寫測試用例,測試友好性就是讓測試人員很容易構造測試用例,否則難以構造測試用例,甚至無法構造,只好手工測試或者線上測試。例如,我們需要寫一個程序分析數據庫的數據。沒經驗的程序員會構造一個函數,參數是數據庫的用戶名、密碼、表名等信息,返回值就是分析結果。這個時候,為了測試,測試人員需要構造一個偽數據庫、表,偽造一些記錄,然后進行測試……這非常不友好。正確的做法是把連接數據庫的過程與從數據中分析結果的過程分離,把后者變成一個更單純的算法,使得測試人員可以專門測試這個算法,這樣測試可以更容易、更全面。
第四就是運維友好性。很多人把代碼寫好了以后,發現部署是一件難事,因為代碼總是假定整個操作系統只有這一個程序在運行。更容易被忽略的是軟件的后續升級。很多人在開發的時候壓根兒就沒考慮這點,等到要發布新版本的時候才意識到。例如在設計接口或者設計存儲格式的時候不加接口或格式版本號,又例如有個模塊是個單點,它一升級整個系統就要停機……這些問題給日后升級造成了麻煩。
最后才是代碼的執行性能。正如我剛才說的,性能只出現在架構和關鍵路徑上,不在關鍵路徑上的代碼,先不用關心代碼性能,一心一意讓代碼更可讀、更容易測試、更容易安裝和升級。
幸運的是,Java是一門非常優秀的語言,在開發效率和執行效率之間、易用性和嚴謹性之間都有很好的平衡。
個人覺得查bug的時候迅速一點,別人需要上網搜索的東西個人可以馬上說出來,因為搜索過好多次,僅此而已。
可是,這真的是精通嗎?我覺得還差得遠。我認識一個人,在他面前大多數人,包括我,都只是個孩紙。(畢竟經驗值與學習能力是很強的)
通常你不需要和他爭論技術問題,他說得出口的,就是正確的。技術問題包括系統架構、算法設計、某行代碼在JIT之后在什么硬件架構上大概跑幾個納秒。在他的眼里,任何一段Java程序他可以告訴你大致花費了多少個CPU cycle,似乎從Java代碼到機器碼(不是JVM的byte code)的中間過程都被本能地跳躍了。他可能是我認識的最精通Java的人,可我不是他,無法知道他的體驗。但是,從跟他的交流中我可以很明確地感受到兩個字:自信。
1 計算機基礎
這部分內容是計算機相關專業同學的課程,但是非科班的小伙伴(譬如在下)就需要花時間惡補了。
特別 是計算機網絡,操作系統,數據結構這三門課程。 至于編譯原理,個人大概懂一點就行了,我也只看過簡單的概念和狀態機相關的內容,并不是特別重要。
2 Java編程
這里的Java編程部分包含了很多內容。我們可以分別看看,大概歸納一下就是這幾個部分。
Java基礎
這里的Java基礎包括基本語法,集合類框架,以及一些高級特性,比如反射,注解等等。
Java基礎的知識點非常多,所以要真正搞懂也沒有那么簡單,另外,隨著時間推移,一些新特性也需要得 到我們的重視,比如時下流行的JDK8。
設計模式
我一直覺得設計模式可以和Java基礎一塊學,所以我也把它放在這里。當然,一些真正使用到設計模式的 地方,譬如JDK的集合類,IO流等等,也需要你足夠重視。
Java Web技術
Java Web技術包括J2EE,以及web框架,乃至一系列常用的組件
1 J2EE主要包括的就是servlet,jsp這些比較復古的web開發組件了。雖然現在直接用它們的情況比較少, 但是我們還是需要花一些時間去掌握它們的。
2 web框架常用的就是Spring了,相應的,hibernate和mybatis也需要了解一下。
3 同時,JavaWeb開發時的常用類庫,比如jnuit單元測試,log4j日志工具,以及構建工具maven,都屬 于我們要掌握的范疇。
4 最后,要注意的是,Web相關的一些基本知識,比如HTTP協議,網絡安全基礎,也是我們要考慮的部 分。
Java并發技術
Java的并發技術泛指Java的多線程技術,以及JUC包里的并發類,比如線程池,并發工具類,阻塞隊列等 等。
Java并發技術完全可以獨立出來學習,是Java進階知識的一大重點。
Java網絡編程和服務器
這一塊內容是Java中比較復雜但也很重要的一塊內容。比如BIO,NIO,AIO的一些使用和原理,以及tomcat 這類web服務器,甚至是netty這種網絡編程框架,都是可以去了解和學習的內容。
Jvm基礎與調優
JVM是提供Java程序運行的一個進程,學習JVM知識,也是我們的必經之路。除了看懂《深入理解jvm虛 擬機》以外,我們還要學習的內容就是JVM調優,使用合適的工具診斷問題,最后解決問題。
這部分內容在面試中呈現的不僅僅是GC,內存分區,以及類加載器,也包括了我所說的JVM調優問題。
3 Linux
作為后臺同學,常年被面試官問linux相關的問題,所以覺得學好linux還是蠻重要的,除了基本命令以外, 最好還能了解一些shell腳本,甚至是內核相關的知識,這方面是我的一個弱項。
4 數據相關
在這個路線圖里,數據部分囊括了非常多的數據源,我們可以來看看都有哪些是我們需要掌握的。
關系數據庫Mysq
這個不必多說,人手都要會,不管是基礎的crud,索引,抑或是進階的存儲引擎,分布式方案等,我們都 需要對應掌握。
緩存
如Redis,memcache一類的緩存,作為后端開發者的我們也需要對應掌握,當然,它們的高級特性,以 及分布式方案,也是必備的知識點。
搜索引擎
基于Lucene的solr,elasticsearch這類搜索引擎,本質上也是數據源,但是并不是后端必備的內容,不過 學一學也沒有壞處啦。
大數據
海量數據處理的場景越來越多,大數據技術如hadoop,storm等也越來越火,但是大數據應用一般會由專 業的大數據工程師來做,所以我們學一些基本內容也就足夠了。
5 算法和數據結構
算法一直是校招同學面前的一座大山,作為后端同學來講,除了基本的數據結構算法以外,也要會一些高 級的算法,譬如dp,搜索,貪心等等。 另外,通過LeetCode等題庫來刷題的方式來鞏固算法也是公認的好辦法了。
6 分布式
最后一個部分,也是內容最多,覆蓋面最廣泛的部分了。分布式相關的技術實在太多了,我們這里也會做 一下簡單的歸納。
web架構
先了解web架構的發展會對分布式的學習有更好的理解,畢竟架構的發展也對應著分布式技術的發展。
分布式理論
這部分內容包括分布式的發展演化,base理論和cap理論等等,學習分布式技術之前,最好能對這部分概 念有一定了解。
一致性問題
強一致性的解決方案:事務和鎖,弱一致性的方案:消息隊列。
分布式session
一個常見的問題,也有多種解決方案
分布式緩存
和上面說的緩存一樣,只不過這里側重緩存的分布式方案
分布式數據庫
這里指的數據庫的分布式方案,也包括hbase這種分布式數據庫。
負載均衡
負載均衡也是一個值得探討的話題,一般我們討論的是七層和四層負載均衡
消息隊列
消息隊列是一個比較復雜的分布式組件,我們可以了解常用消息隊列比如amq,kafka等的實現。
服務化
服務化的核心包括rpc,服務注冊中心等等。分布式服務相關技術也是后端同學必須掌握的內容
虛擬化
虛擬化同樣不是后端同學必須掌握的內容,只不過現在越來越多的服務部署方式使用的是docker和云服務 的方式。所以了解一下也沒有什么不好的。
當然學無止境,技術的更新天天變,還是要每天堅強學習;每個企業的項目不同,技術理念不同,但是最初的規范是統一的