1. 程式人生 > >《程式人生》風雨十年-從大學到技術專家我做了啥?

《程式人生》風雨十年-從大學到技術專家我做了啥?

你知道的越多,你不知道的越多


點贊再看,養成習慣


本文 GitHub https://github.com/JavaFamily 上已經收錄,有一線大廠面試點思維導圖,也整理了很多我的文件,歡迎Star和完善,大家面試可以參照考點複習,希望我們一起有點東西。

前言

你們都知道的,帥丙我本身肯定是達不到技術專家的地步的。

呸,敖丙你個渣男,又標題黨 !

我不是但是我身邊很多人是呀,位元組跳動,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。

這就是強者的世界,我所向往的世界,當然我知道這樣的世界,只有一步一個腳印才能涉足。

王者-泰山之巔

最後王者其實我不會寫任何內容,能到這個領域的人本身就是屈指可數了,敖丙身邊有,但是我覺得大家自己體會吧,一般就是人脈,交際,能力都到了一定的高度了,這個階段的事情我也體會不到。

能想到的就只有先祖的詩句:指點江山,揮斥方遒。

算是給大家留下無限遐想的空間吧,未來或許你就是你所在領域的王者也說不定的呢對吧。

總結

不知不覺寫了這麼多了,以上是我個人眼裡的一般向JAVA 程式設計師的發展線路,限於篇輻也不全面,實際個人成長路線可能因為工作內容的不同差異會很大,有的人偏向了底層研究,有的人偏向了業務需求設計,有的帶有濃重的行業色彩,而且技術之外,還有很多知識也很重要,做JAVA沒有輕鬆的方向,但一個對技術抱有興趣的人,走到這一步時,仍然會對開發抱有熱情,想要寫出好的專案。

純為了生計而工作的程式猿是走不到這一步的,這一行來都來了,大家一天都是24小時,為啥有差距,我想你我都明白的,知道為啥那就幹出點名堂吧。

敖丙的絮絮叨叨

上週還發起了一個投票大家記得麼?就是我要修改我公眾號的名字,下面是投票的結果

敖丙也是真男人來的,說改就改了,你們會發現我所有部落格平臺的廣告,也會在週末悄無聲息的被我改掉的,以後三太子敖丙就取代JavaFamily了。

並且也做了個很重要的決定,這一個多月來,公眾號文末的廣告多多少少都有點積蓄了,但是這個錢說實話我出去恰個火鍋都夠嗆,差不多每天都是這樣吧。

那我一想這個錢是大家給我的,我最後就還給大家,以後也是一樣,每次到月底我就抽個獎,買十幾本書送大家。

不知道大家喜歡不喜歡呀!!!

還有就是抽小夥伴喝咖啡了,這裡好像就杭州的小夥伴我能線下約了,外地的小夥伴我就打20塊吧,雖然不多但是是個心意嘛。

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。

我後面會每週都更新幾篇一線網際網路大廠面試和常用技術棧相關的文章,非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「敖丙」我有點東西的話 求點贊