本人已經工作兩年多了,尷尬的是待過的兩家公司都是外包,大部分外包公司技術性都很一般,這也是很多人看不起外包公司的一點,有的公司招聘明確
說不要外包,就問你尷尬不?可是已經在外包公司了怎么辦,我也很絕望啊。。。。。而且我做過的項目都是很老的項目,后期做些需求。現在待的甲方公司
項目很多,我接觸的項目框架就是SSH,中間件是Redis、ActiveMQ,當然會包含企業內部開發的一些構件等。這里不是說甲方公司技術性不高,只是我接觸
到的項目技術性不高。
進入公司的時候,自己基本知道情況了,幾乎不加班,這點事挺好的(因為我們組就三個人,負責項目需求少)。自己也不想成為一個很咸的咸魚,也
期望着有天能夠進入互聯網公司。但是下班回來學習的次數很少,即使學習也靜不下心。人總是這樣,一邊玩着手機,一邊又很內疚自己浪費時間,虛度光陰。
博客在7.20號寫的,今天10.24,我從外包進入一家發展不錯的互聯網公司,算是脫離苦海,讓未來有點盼頭了,順便說下,微服務挺重要的,我面試
三家都是用Spring Cloud,你如果完全不懂,跟專業不對口差不多,可能簡歷都過不去,我本人有用微服務重構過一個小項目,算是練手吧。
后來給自己列了學習計划,也是從網上搜索一個工作兩三年的程序員需要掌握哪些知識才是合格的。
1、Java基礎知識
#反射、IO、接口/抽象類、內部類、異常、Enum、序列化、static、final、Iterator,Iterable和Comparable,Comparator等
基礎知識肯定不是只有這點內容的,這部分很多人忽略的,包括我自己,總感覺這么簡單的內容,自己已經會了,但是實際上你還差得遠,在面試之前
刷刷題,你就會了?這部分內容深入學習之后,總能發現以前不知道的知識。
我們在面試要求上總能看到基礎扎實,說明基礎真的很重要,基礎都不行,扯什么高並發、分布式。
PS:這里推薦《Java編程思想》或者一些大神博客
2、jvm相關內容
#GC、運行時數據區、類加載機制、雙親委派模型、內存溢出/泄露、Java內存模型、字節碼、jdk工具、GC調優/jvm調優、Tomcat相關等
jvm的內容是你成為一個高級工程師必須具備的知識,高工不是工作年限到了就是了,你的知識儲備能夠達到要求嗎?
這部分內容自己也學了很多了,但是真正在工作中應用很少,特別是jvm調優一部分,只是在自己的阿里雲上面進行調試,缺少真正的經驗。jvm調優總是
出現在招聘要求上,所以是需要你去注意的內容。
PS:推薦《深入理解Java虛擬機》以及我在公眾號買的課《從0開始帶你成為JVM實戰高手》,如果你在項目中這方面接觸較少,這門課會有很多生產案例去
分析,這不是廣告,只是本人買了之后感覺還不錯,比哪些只會空談jvm優化的講師強多了,就推薦一下,而且就幾十塊錢,感興趣的可以了解一下。
3、jdk源碼
#集合源碼 1.List:ArrayList,LinkedList 2.set:HashSet,LinkedHashSet 3.map:hashmap,hashtable,concurrentHashMap源碼以及區別 3.對Object,String,synchronized等類的源碼了解。 #並發包源碼 1、線程池 2、Automic源碼 3、ReentrantLock等相關Lock源碼 4、CopyOnWrite* ....
源碼部分本人只是學習了集合部分,並發相關源碼只是對Automic基本了解了一下,但是后續也是會看的。
這里說下看源碼的目的:無論是jdk源碼,還是框架源碼,首先能夠讓你對這個東西更深入的了解,第二能夠學習優秀代碼,學習到內部使用的設計模式
等。如果只是為了面試,真的沒必要花費很多時間在上面。
很多人學些Spring源碼,本人是沒看的,因為很多人都說需要花好幾個月的時間才能完全理解,我想自己肯定堅持不下來的。如果你能堅持下來,收獲
肯定也很大。之前有去學習Netty源碼,然后導致我后面一個月幾乎都沒學習,真的很枯燥,直接放棄學習,放飛自我了。學些任何框架源碼,一定是你對
這個框架有深入了解過后,否則你都不知道怎么用,看源碼更是懵逼。
4、多線程、並發
多線程、JMM、synchronized、Lock相關、volatile、ThreadLocal、線程池、線程安全、Atomic(CAS)、生產着消費者、線程安全集合類、CountDownLatch、Semaphore、CyclicBarrier等
這部分內容一般公司開發中使用很少,個人也學習了,但是不在工作中應用,學完過后就忘了。但是沒辦法,面試要求啊,這些也屬於基礎知識的。工作
中也就使用線程池、volatile、ThreadLocal吧,最近從頭學習,發現真正深入之后,wait(),join()這些簡單的方法,有很多知識點不知道的。
5、設計模式
#工廠、抽象工廠、代理、單例、策略、模板、觀察者、裝飾器、適配器、組合模式等
設計模式其實就是套路,為了解決某些問題而被總結出來的。設計模式應該被理解,被應用到項目中,而不是只是簡單理解,然后寫個demo,面試官
也會問你在項目中用到哪些設計模式。個人對這方面掌握比較薄弱。。。
6、MySQL
#基礎語法、數據類型、日志、存儲引擎、索引優化、SQL優化、觸發器、視圖、存儲過程等
常用的關系型數據庫有MySQL、Oracle、DB2等,MySQL應該是使用最多的,所以這里列舉MySQL相關內容。這部分也是開發人員需要掌握的內容,
最終能夠達到熟悉SQL調優,索引調優,設計表結構的程度。
特別是B-tree索引原理一定要很清楚,對你工作和面試都有幫助,SQL、索引優化都很重要,平時要多積累,而不是面試前背一些東西,那樣很容易穿幫。
7、框架
#SpringMVC、Spring、Hibernate、MyBatis、SpringBoot等
這里列舉了常用框架,SSH/SSM是基礎,SpringBoot你也應該掌握的,用過SpringBoot之后,你就不想用回之前的框架了,簡化配置到極致,雖然也有
着一些缺點。包括權限控制方面,可以選擇Spring Security和Oauth2、SSO、AWT等等了解一下。
以后肯定要看IOC、AOP、mybatis源碼,都說閱讀源碼能夠有很多收獲,而且面試也是一點優勢。
8、Redis
#基礎API、主從復制、持久化、集群、其他功能
我們對Redis的理解,不應該只是停留在性能強大,緩存的程度。想起來一年多之前我來上海面試的時候,簡歷上面寫着了解Redis,然后面試官問
分布式鎖,緩存雪崩這些內容,直接一臉懵逼。。。
首先,基礎API一定要熟悉,哪些命令的時間復雜度O(N),不能再生產環境使用。除了上面列舉的內容,還需要掌握
Redis實現分布式鎖,分布式ID,慢查詢,pipeline,消息隊列,排行榜,緩存穿透、緩存雪崩,緩存過期策略,更新策略等。
把這些內容了解之后,才能抗住面試官的狂轟濫炸。。。包括Redis優化方面也要接觸。
個人認為MongoDB最好也了解一下。
9、MQ
#RabbitMQ/RocketMQ/Kafka
上面RabbitMQ和RocketMQ可以選擇一種去學習,當然都學了更好,Kafka更適合大數據日志記錄等場景。而之前的ZeroMQ和ActiveMQ漸漸被
淘汰了,本人項目組就是用的ActiveMQ。我選擇學習了RabbitMQ,需要了解:
基礎組件、Java API、可靠性傳輸以及冪等性、Confirm、Return機制、限流、死信隊列、TTL、順序消費、延時消息、集群等
10、微服務
Dubbo+Zookeeper、SpringCloud/SpringCloud Alibaba、Docker
微服務這幾年很火的架構,主要是阿里系的Dubbo+Zookeeper,還有Spring系的SpringCloud,以及在此基礎上二次開發可能更優秀的SpringCloud
Alibaba。本人兩邊都有學習了解,這里需要掌握的內容:
注冊中心、應用間通信RestTemplate/Feign、統一配置中心、網關Zuul/gateway、服務容錯Hystrix、Ribbon、Sleuth、Zipkin等
這里推薦學習一下GitHub上面很好的學習項目:https://github.com/zhangxd1989/spring-boot-cloud
Docker也是需要學習的,微服務避免不了的東西。這里說下,用Docker安裝其他應用真的超級方便。。。
再加個全文搜索的內容吧,本人學習了Elasticsearch,感覺挺不錯的,也建議學習一下。
11、計算機網絡
HTTP、HTTPS、TCP、UDP、Socket等
這里把HTTP也歸類到這部分,你需要了解報文內容/參數、狀態碼、cookie、session、跨域等內容。網絡分層(四層、五層、七層),TCP的三次握手,
四次揮手,滑動窗口,擁塞控制以及相關算法,粘包、拆包等內容。
如果可以的話,也學習一個Netty,一個特別好的框架。
12、數據結構、基礎算法
以前學習Java的時候我就想這輩子我都不會再學習算法了,因為老是感覺智商有點欠費,現在還是需要把以前的債還上,mmp。。。
需要掌握的內容:
鏈表,棧,隊列和堆、樹、B+樹、二叉搜索樹、AVL樹、紅黑樹、圖等
一般面試最多問到紅黑樹的難度,還有InnDB索引用到的B+樹。
算法我只是了解基本排序算法:三大排序、希爾排序、快排。下面是需要掌握的內容,我估計這輩子我都掌握不了。。。
1.理解大O等記號 2.動態規划如:幾類背包問題最好有現成的代碼用於筆試。最長公共子序列 3.貪心算法:理解赫夫曼編碼(筆試常考概念) 4.B樹B+樹用於理解數據庫索引 5.常用的圖算法:廣度優先,深度優先,最短路徑算法(最好有現成的代碼),最小生成樹。
13、基礎工具:maven、SVN、Git等
這部分內容只要項目中有用到,應該沒啥問題的,只要平常專門看下相關文章,把你沒有關注過的點補上就可以了,可以關注一點大佬的公眾號。
14、Linux、Nginx
Linux基礎命令肯定都要會的,例如:
mv、cp、vi、vim、cat、tail、grep、more、tar、ps、netstat、kill、scp、top、編譯命令、sudo、nohup、ssh、chmod、rpm、yum、wget、find、which、whereis等
基礎命令太多了,沒法一一列舉,平常多注意點就可以了,Linux系統參數怎么看等,這也只是我知道的內容,可以自行百度了解。
特別是關於項目參數的監控,CPU、內存,硬盤等等相關命令一定很熟。
至於Nginx的部分,本人只是停留在負載均衡、反向代理這些基礎功能,和一些簡單配置上面。可以自行百度,或者學習慕課網上的一個視頻
幾百塊錢也不是很貴,畢竟現在是知識付費的年代,不想花錢,自己可以想辦法,這里不能多說,應該都知道。
PS:推薦大家都知道的《鳥哥的Linux私房菜》
15、分布式架構:
分布式緩存、分布式存儲、分布式鎖、冪等性、分布式事務、流量削峰、服務容錯、服務降級等
這部分內容我理解的很淺顯,但是很重要。
例如如何實現分布式鎖:
1、數據庫主鍵
2、Redis實現
3、Zookeeper實現(最優)
本人沒有學習過Zookeeper,所以實現不太清楚,但是網上都說它才是最佳實現。
分布式,或者秒殺等業務場景很多面試都會問到,別管我用不用得到,你必須要會,面試造核彈,工作擰螺絲,這是大環境,既然不能反抗,就默默努力吧。
本人最近在學習這部分內容,推薦:Java電商秒殺系統深度優化 從容應對億級流量挑戰,大佬的這個視頻很牛逼,366塊錢,絕對物有所值。
秒殺這種場景,不是隨便刷點題就能蒙混過關的,你要知道優化的步驟,每一步系統吞吐量提高了多少,否則面試的時候直接尷尬到死吧。
16、代碼優化
工作年限高了,代碼也要寫的更加優雅,閱讀源碼,應用設計模式,書籍都是進階的途徑。例如:《代碼整潔之道》和《Effective Java》
學習方式:
學習的渠道有很多吧,書籍,博客,公眾號,視頻等,每個人的學習方式不同,適合的也不一樣,如果想要精通某個技術,肯定還是回歸書本,博客的
學習可以選擇一些大神的博客,內容有保障,或者是公眾號。
這是本人關注的公眾號,收藏了一大堆文章,看過的沒多少。。。
至於視頻學習,比較推薦慕課網吧,特別是付費部分,講師很多都是BAT的大牛,但是視頻學習有個缺點,很多人技術好,講課不一定適合,說了一
大堆廢話,聽過后啥都沒記住。看視頻你也不敢快進,可能30分鍾的視頻,你只需要那30s的內容,這點還是比不了文字的。
公眾號的內容講真的很多質量無法保證,更重要的是一般無法系統學習,系統學習真的很重要,才能真正的提升,而不是這里學一下,哪里來一下的。
總結:
以上就是本人到工作5年的學習計划,為啥是五年呢,因為我馬上要工作3年了23333333。老實說幾乎都學了一部分,最開始學習就是東一榔頭,西一棒子的,
沒啥效率,下班回來也不想學習,大學養成的壞毛病。如果我學習的勁頭能和健身的熱情差不多,估計我都學完了。
今年開始系統學習了,因為真的要努力了,工作兩年多了,作為一個菜逼,再不學習就晚了。
花了幾個小時寫博客,BB了一大堆廢話,算是給那些迷茫的人一個基本學習計划參考吧。
本人最近剛換工作,學習真的很重要,不要說什么"面試造火箭,工作擰螺絲",如果真要你造火箭了,你什么都不會,難道去百度嗎?
這次換工作,面試了三家小互聯網公司,都通過了,想想剛來上海面試的時候,和現在差別真的不小。終於脫離外包了,希望能在這家公司學到很多。
沒有幾個人喜歡學習,但是為了工資,為了將來,也要努力啊,因為我TM想要買房啊。