前言
我給你看一下一個初級程式員,到高級需要學習哪些東西,你應該會有個清晰的認知,
你們都知道的,我本身肯定是達不到技術專家的地步的,
我不是但是我身邊很多人是,位元組跳動,PDD,阿里等等的大佬我認識很多,所以以下是我問了他們的成長路徑的總結,還是具有一定的代表性,
身邊這些朋友都是在互聯網領域多年的大牛了,因為生活和個人習慣的原因,很多都沒有寫博客的習慣,或者沒有公開出來,但是他們卻遇到了我,我可以幫他們整理出來啊,
目的是為了讓很多跟我一樣的新人,對一條完整的職業規劃之路有一個清晰的認知,青銅到王者要經歷些什么?
青銅-萬惡之源
《計算機基礎》,這是所有讀者大學最開始都會上的課吧,我問了群里的仔,他們都說是的,我想大家也是,
在計算機基礎中我們會學到計算機的歷史、計算機的特點、進制轉換、記憶體管理、線性資料結構、網路請求協議等等,
計算機基礎真心很重要,無比重要,究極重要,為啥我這么說呢,里面涉及的計算機知識還有很多網路協議的知識,大家以后一定會用到,我可以負責的告訴你,面試也一定會問,什么Http、Https、Tcp/Ip、三次握手、四次揮手面試不要太常問,
Tip:這里有個小插曲就是我身邊那個架構師團隊Leader這周面試阿里p8崗位的時候,我以為問的都是什么原始碼,中間件的究極操作,我想大家跟我想的一樣,但是大家錯了,反而問的很多計算機的基礎知識,
我聊天大概問了一下面試內容,有什么求二叉樹的鏡像,內核態和用戶態的理解,計算機的快取頁等,
? 大家是不是驚了,這他*不是我校招的題目么?怎么P8級別的大佬還問這個?其實很好理解,大家想一下到了一定的作業年限技術的廣度深度都有一定的造詣了,你寫代碼就這樣了沒辦法優化了,機器配置也是最好的了,那還能優化啥?
? 底層,我們都知道所有語言到最后要運行都是變成機器語言的,最后歸根究底都是要去跟機器互動的,那計算機的底層是不是最后還是要關注的東西了?
福利:他這周會來我們公司面試,屆時我會詳細問一下具體的面試內容,如果大家想看我可以到時候整理一下寫出來,看看那種級別的強者的世界到底是怎么樣的,
學完計算機基礎你基本上對計算機的整個知識體系都一知半解了,對于編程或許還是很懵懂,但是你現在已經要踏入編程的門了,
白銀-編程第一課
計算機基礎學了,后面就要編程的入門課程了,
想必看我這篇文章有99%的小伙伴都是以下面這段代碼開始的自己的程式人生的吧:
我還記得我就是大一開始學習的C語言,《C語言程式設計》譚浩強老師的課本,在第27頁就是第一章,HelloWord,現在回憶起來還歷歷在目,老師在黑板上寫下這兩個莊嚴的單詞,同桌的她和我露出無限的求知欲……
我想所有的語言都是語法基礎開始的,而且編程語言的基礎語法也都是大同小異的,
If、For、While等關鍵字,List、Set、Map等集合,Int、float、Double等基礎型別,大家第一次學的時候我想也不會知道,這些關鍵字將會陪伴我們走完各自的程式生涯吧?
接下去就難一點比如JDBC、IO、檔案流啊什么的,帥丙依稀的記得當時還是代碼里面寫SQL然后查詢,也不知道記錯沒有,
學到這里,你可能覺得你JavaSE無敵,出去可以找作業了,反正當時的帥丙,覺得自己可以闖出一片天了,不知天高地厚,四處炫技,
但是幼稚的我根本不知道,未知的前方還有什么等著我,我也不知道自己其實才剛入門,但是如果要往WEB方向發展,這些倒是基本足夠了,
但是你到現在為止學的東西都是服務端的東西呀,怎么讓你的服務端東西展示給別人看呢?
這個時候我們就應該去做個丑不拉幾的頁面,進行簡單的互動了,你這個時候要學HTML 、Servlet、MySQL、 JavaScript、Tomcat、CSS等,
目標呢就是寫出第一個動態網站,也許只是個登陸功能,只能展示下個人資料,但這是很重要的一步,你要弄清楚的是,一個用戶的點擊產生的請求,是從哪里發起,哪里接收,哪里處理,哪里回傳,你得理解瀏覽器和服務器的關系和分工,Cookie和Session,Request和Response,
Tip:我記得我剛出來面試就有面試題是這樣的,一個Http請求從網頁發起到服務端產生資料回傳中間經歷了些什么,或者Spring做了什么?大家可以思考一下
還有有一個自己的專案真心很重要,我就是在大學期間做了專案,至今在校園內網上穩定運行著,出來實習面試的時候基本上也是一路披荊斬棘,吊打了同行面試的仔,反正大學有個專案賊加分,是讀者的大學生記住了么?
黃金-初出茅廬
上面的只是WEB開發的學習初級階段,這都是些JAVA誕生以來最原始的最官方的WEB開發技術,當然現在真正的專案很少直接采用這些技術了,現在都是前后端分離了,Vue、Node.js、React等前端的語言更新迭代速度非常快,帥丙我學了一點剛用舒服,前端的朋友告訴我又迭代了……我他*不學了!
為了不斷提高技術的易用性、開發效率和可維護性、可擴展性,無數開源專案都是在這些原始技術的基礎上封裝、改進,
所以這個階段不要盲目樂觀地跑去找作業或者對實習挑三揀四,你會被打擊到的,又或者找個小公司渾渾噩噩幾年過去感覺跟新的技術堆疊脫節,
有人跟你說小公司學的東西多,他害你的,剛開始能去多大的去多大的,越大越好,你想你去了大的你想去小的分分鐘的事情,但是你小的要去大的就相對難了,
好,初始階段完成,開始進入WEB開發的正題,首先是傳說中的框架,SSM(Spring SpringMVC Mybatis)成為熟練的增刪改查程式員是必須的,在這個階段你還要理解為什么要用這仨而不是那些Jsp、Servlet、Jdbc,你要體會到寫MVC、三層架構的好處,
這個階段不要輕易質疑框架的價值,也許剛開始你會覺得麻煩,覺得他們有時候是多此一舉,我最開始這么寫的時候發現,真的惡心,什么dao,service,Controller等等,分這么多干嘛,
等過一兩年后回過頭來你會覺得少了這些框架你已經很難干活了,沒有分層清晰的系統,你反而開口大罵專案的架構師的,
不過要提醒大家的是,這個階段還要避免的心態是,能熟練地增刪改查了,就自認為寫程式不過如此,然后往簡歷上填個精通,這也是新手面試被批得體無完膚的原因之一,
淺嘗即止,是新手的大忌,為啥這么寫,這么寫有啥好處,有啥壞處,多問幾個為什么,你多年后會感謝小編的,
如果你學得好,這會應該能熟練地寫個博客啊,小論壇啊之類的WEB專案了,也就是達到了就業的基本要求,
Tip:而且說一下作為一個應屆生,你除了基礎知識,如果你有自己的技術博客,還有像樣的專案能展示給面試官看,是真的很加分,搭建個簡單的專案,專案流程你也知道了,技術堆疊也熟悉了,還可以手機訪問網頁給面試官現場演示,很加分的,
像我身邊的朋友Java3y,JavaGuide,我沒有三顆心臟等,就是在這個階段就已經開始寫了自己的博客,并且各自都做出了成績,這些以后都是你面試的議價能力的一部分,也是你的加分項,和你自身的財富,
我問了一下他們,都是靠博客就已經得到不少大公司的面試邀約了,反正有專案,有不錯的履歷,有不錯的博客,都會給你加分,如果你什么都沒有,現在動手去多學點,少打兩局LOL等你到我這個年紀就會發現,索然無味,
鉑金-小試牛刀
這會是程式員生涯的一個轉折點,把握好了人生起飛,把握不好全盤皆輸!
慢慢的你會發現資料庫性能實在不行,出于不甘現狀,或者趕時髦,你該去了解NoSQL了,Memcached、Redis、Mongodb等非關系型資料庫眼花繚亂,沒關系,試著用用,能很好地緩解MySQL、Oracle之類關系資料庫的壓力,
出于公司某些業務需要,你可能會鉆研一個特定技術領域,比如全文搜索技術ElasticSearch(以下簡稱Es),那你了解了Es,你又要想到資料庫的資料怎么同步進Es呢?
你可能會接觸到Logstash,Canal等中間件,然后發現可視化也是個問題,那Kibana就應運而生,用的時候發現歐洲人的分詞習慣跟我們不一樣,那Ik中文分詞器又得了解啦,
使用之后你還會發現他底層的Lucene有很多坑要怎避免,時間多你還可以了解Solr等等,
總之知識就是一個體系,我經常跟群里的仔說,形成知識體系,你面試說了Es那相關的技術堆疊你一樣要了解的,我題目取了叫《吊打面試官》就是噱頭,你去面試如果面試官技術深度真的很深,我想被吊打的100%是你,
你甚至會開始對系統中一些比較特殊的存在感興趣,比如權限系統,單點登陸之類的,又或者某些特定業務領域的演算法研究,這些是你的加分項,
你還發現服務拆分后Http通信有諸多弊端,就開始接觸優秀的Rpc框架還有訊息佇列中間件了,如Dubbo、RocketMQ等,
再再后來你發現呀,資料量大得一批,表頂不住了,幾億資料查出來要好幾秒,那分庫分表就出來,什么水平拆分,垂直拆分,還學習了TDDL、Sharding-JDBC、DRDS等這樣的分庫分表中間件,
但是你用了發現全域的唯一id生成又是一個問題,或許中間件有自帶的,但是你還是要了解原理,什么雪花演算法,uuid等等也得學,
再再再后來呀,你發現分庫分表也頂不住了,業務體量爆炸式增長了,你可能就需要了解動態分庫分表的解決思路和解決方案了,特別是FaceBook開源的一些方案,
再再再再后來呀,你發現動態分庫分表也不行啊,很多離線的資料也很多啊,每天幾個T,公司都要被敗光了,那你就要了解大資料場景的離線分析啊,資料快取啊,資料清洗,資料可視化等等啊什么的,
那就需要學什么ODPS啊,Hadoop、Hive、Hbase等等中間件或者工具了,
再再再再再后來你開始發現你的代碼很亂,久了以后自己都看不懂,重復的,難以重用的代碼堆積如山,不想維護,BUG百出,
于是你要開始重視設計模式,合理地改造下自己的代碼習慣,不再被僵化的SSH、MVC三層架構束縛住,
再再再再再再…..(你是不是沒玩了?哈哈其實還真有我就不列舉了)
到這里不知道你有沒有體會到我每篇文章開頭那句話的意思?就是作業之后發現自己越來越無知了,你再品一下下面這句話,
你知道的越多,你不知道的越多
Google和各種資料是你進步的動力,極少再遇到必須請教別人才能解決的問題,如果你這個階段還老是問別人,你的技術生涯也就快到頭了,
這個階段,如果你技術卓越和跟我一樣能吹,你的收入將是白領水平,至少接近了,或者大幅領先同齡人了,
我覺得多數程式員在作業多年之后都能達到這個水平,有的人只需要一兩年,有的人卻要用上五六年,在這個階段落伍的人,有的是出于天賦和思維所限,有的是出于對技術缺乏熱情,有的是出于作業內容的制約,
等到年近中年,再也拼不過年輕人,被淘汰出局,只能在自嘲為屌絲和碼農的無奈中黯然轉行,
這是個很重要的分水嶺,你能不能繼續進步,能不能在30歲以后繼續從事技術作業,能不能在公司里獨當一面,我覺得就看你能不能超越這個階段了,
很多爛公司里作業數年的專案經理,連這個層次都還沒達到…
為了30歲的自己聽到裁員完全不虛,為了家里的老母親不再為了省電費不舍得開燈,為了讓自己……
我想這個階段你應該要做好準備,這也是我大篇幅介紹這個階段的原因,
磚石-揚帆遠航
你要讀讀優秀開源專案的原始碼,你要搞懂一些當年不懂的基礎知識,你開始理解《thinking in java》的精髓,你能寫一些底層的代碼,有時還會覺得自己封裝的比某些開源工具更好用更簡單,
當年看不懂的《深入分析JVM虛擬機》現在你已經可以對里面的知識點如數家珍,張口就來,并且能夠將大量知識點帶入到專案中優化,并且能夠看到實質性的變化(暗示KPI),
WEB的難點和重點永遠都在于性能、負載能力上,而現在網路的發達造成了資料量和操作密度的大大上升,硬體卻沒有相應的進步,
你得試著更好地運用更多的服務器來協同作業,從WEB端到服務端到資料庫,全都需要集群,需要分布式,需要合理的控制資料的流向,掌握好網站上下,一大堆機器的平衡,找出性能的瓶頸,找出穩定性和安全性的瓶頸,硬體出現故障,第三方技術出現錯誤,將被當成家常便飯融入到你的系統和代碼里仔細考慮,
你會開始覺得方案無比地重要,一將無能累死千軍將不斷應驗,一個不好的設計,一個不好的方案,會讓一群優秀的程式員作業成果大打折扣,
你要關注架構知識,不能再滿足于SSH三層架構到底,
領域驅動設計,面向事件開發,敏捷開發等等一系列的思想在關鍵時刻能決定你專案的生死,這個階段不再有標準范例讓你照抄,你只知道思想和原理,實踐卻需要自己不斷嘗試和改進,
多關注各種雜七雜八的開源技術,有些你可能前面已經接觸過了,和通信有關的,和集成開發環境有關的,和架構有關的,各個領域你都應該能信口說上幾個主流技術,雖然你可能只是聽說過,了解,
但關鍵時刻你得知道如何去選擇技術,并快速掌握它,
你還會去考慮嘗試下別的語言,這里不是說轉向什么C++ C#之類的,那和JAVA程式員不相干,我說的是一些運行于JVM之上的語言,比如scala和groovy,初識他們時你會覺得Java真的老了,
但當你回到一個綜合性的大型專案中,又會覺得Java積累下來的整個體系技術是如此完善,就像一個工業化標準一樣,你可能發現光是Spring家族的東西你都受用終身,無法完全通讀,
你能把這個階段實踐好,勝任專案經理,乃至中小公司的技術總監,大廠的小團隊Leader都是可以的,
大師-登峰造極
其實寫到上面這個階段的時候我覺得,這是很多人滿足的地方了,都是小公司技術總監了,那我圖啥?
但是未知的人生還在那等著你呢,我問了身邊頂級的大神,為啥要走出舒適區?去像位元組、阿里等這些壓力大很多的地方呢?
他們給的回答都不太一樣,但是一樣的就是挑戰自我吧,誰也不知道哪里是自己的終點,那為啥不多做點嘗試,新的環境,新的技術堆疊,新業務場景挑戰新的自我,
這個階段你的一舉一動可能都關系一個專案的生死存亡,一個錯誤或者正確的決策就可能改變整個專案的命運,水能載舟亦能覆舟,我想用在這里也恰到好處,
我身邊這樣級別的大佬鳳毛麟角,但不是沒有,他們在公司都是核心人物,大型專案或者專案緊要關頭都是他們帶領團隊沖沖沖,除了問題也是能最快給出解決思路和方案的,
Tip:我現在的老大就是這樣的人,雙十一大家還手忙腳亂去追資料的時候,他上來一套操作,寫了幾個腳本就搞定了,我們當時周圍一群人,從頭到尾的知識盲區,結束了還沒反應過來,只能拍手叫666,
這就是強者的世界,我所向往的世界,當然我知道這樣的世界,只有一步一個腳印才能涉足,
王者-泰山之巔
最后王者其實我不會寫任何內容,能到這個領域的人本身就是屈指可數了,小編身邊有,但是我覺得大家自己體會吧,一般就是人脈,交際,能力都到了一定的高度了,這個階段的事情我也體會不到,
能想到的就只有先祖的詩句:指點江山,揮斥方遒,
算是給大家留下無限遐想的空間吧,未來或許你就是你所在領域的王者也說不定的呢對吧,
總結
不知不覺寫了這么多了,以上是我個人眼里從0向Java程式員的發展線路,限于篇幅也不全面,實際個人成長路線可能因為作業內容的不同差異會很大,有的人偏向了底層研究,有的人偏向了業務需求設計,有的帶有濃重的行業色彩,而且技術之外,還有很多知識也很重要,做Java沒有輕松的方向,但一個對技術抱有興趣的人,走到這一步時,仍然會對開發抱有熱情,想要寫出好的專案,
純為了生計而作業的程式猿是走不到這一步的,這一行來都來了,大家一天都是24小時,為啥有差距,我想你我都明白的,知道為啥那就干出點名堂吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104937.html
標籤:Java
上一篇:一起來讀官方檔案-----SpringIOC(05)
下一篇:總結類初始化時,代碼執行順序
