Java成長之路--一個非科班生的進階之路

有夢想的老王 發表於 2021-07-24
Java

前言

筆者從事Java開發六年有餘,從什麼都不懂的小白一路成長到上市公司管理20人的技術leader。管理的團隊,雖然人數不算多,但也是對於我這個非科班生這麼多年努力的一種肯定。在技術的道路上,我沒有走過什麼彎路,一切都是按照自己規劃的樣子在走下去。但對於一個非科班生來說,如果想在技術的道路堅定的走下去,那麼一定是艱辛的。大學四年的知識債務,總是要還的。通過這篇文章,相信無論是初入行業的小白,還是職場老手,我從技術提升角度,如何一步一步成長起來,從如何管理角度分享我這麼多年以來的經驗。希望能對你有所啟發,歡迎在討論區參與討論。

我與Java的邂逅

時間回到2014年的夏天,渾渾噩噩過完大學四年的我,面臨我的,就是那時人們常說的“畢業即失業”,呵呵,像我這樣大學就連四級都考不過,四年一次獎學金都拿不到,大一當班長,大二就被輔導員因為不稱職被撤職,同學眼中的混子學生,怎麼可能找得到工作?畢業季,當大家都在參加各種企業的校招,我卻天天在宿舍睡覺打遊戲,連實習經驗都沒有,我拿什麼資本去和那些優秀的學生一起去競聘崗位,所以我把這一些都歸功於我的專業垃圾,因為當年被調劑到了這個全國不超過10所學校開設的超冷門專業,我對前途不報任何期待,大一就給自己放棄奮鬥想好了藉口,專業這麼垃圾,就算好好學以後也找不到好工作。所以我很“愉快”的度過了我的大學四年,慶幸的是,腦瓜子倒是挺靈活,平時上課不聽,考試前,去讀書館自學兩三週,就能順利通過期末考試,大學沒有掛過科。

那麼我又是怎麼和程式設計有了交集,又怎麼就入了這行呢?雖然大學四年對學業不抱希望,但是我對賺錢樂此不彼,大二開始就沒有從家裡要過錢,學費生活費都是自己掙的。因為家裡的表哥堂哥都是在網際網路行業,他們有自己的渠道去幫商家做網路推廣,所以平時沒事就跟著他們一起兼職做做,利潤是真的客觀,一直到畢業,除去學費吃喝玩樂的費用,支付寶餘額還剩餘8萬多。因為在跟他們做業務的時候,經常看他們會用一些指令碼去做一些採集和自動化的操作,對此非常好奇,後來才知道,這些指令碼都是用Python寫的。由於強烈的興趣,我的第一門語言就是Python,平時沒事就在宿舍琢磨Python,自學了一段時間,已經可以去寫一些簡單的指令碼了,後來慢慢熟悉,就幫著表哥他們公司去定義一些個性化的指令碼,一開始效率低BUG多,嚐嚐被吐槽,呵呵,遇到的坑多了,經驗也就多了。後來在一些眾包平臺,也自己去接單幫別人寫一些指令碼,大學幾年寫的指令碼有幾十個了,賺了也有好幾萬,第一次嚐到了通過技術帶來的甜頭,可是靠這個零碎的收入畢竟不是長久之計。在畢業後回來家中,父母也沒有催我找工作,只是讓我好好想一想,未來到底要幹嘛?

畢業那段時間,我想了很久,最終決定,我要考研,跨考計算機專業。我要在技術的道路上走下去,因為每次寫程式碼,當軟體成功執行起來的那一刻,我是無比的興奮。說幹就幹,畢業後沒有上班,而是在家裡專心備考,買了很多考研的書,還有計算機專業課,通過那段時間自學的專業課,對計算機世界又有了新的認識,這對於我後來學習Java上手難度容易多了,對技術的思考也更深刻。經過大半年的備考,我成功的......沒有考上,哈哈,人生沒有那麼多雞湯,並不時努力就有收穫,但起碼沒有遺憾。其實也並不時沒有考上,因為當時目標院校是一所985,劃線過高,但是有機會調劑,可以調到一個普通院校,但是最終還是放棄調劑了。現在想想後悔莫及呀。

但是我並沒有因此與技術道路分道揚鑣,就在15年的年初,我們家庭聚會都一起,表哥們問到我考研結果如何,我說:“目標院校沒考上,放棄調劑了,問我下一步有啥打算,我說要嘛再戰,要嘛就去找個班上。”

他們說這樣的,“我們現在成立了一個公司了,我們希望做一個私域流量平臺,自己研發,但是呢我們這邊就一個懂技術的,公司剛起步,也沒那麼多錢去招聘開發人員,我看你挺有程式設計天賦的,你想不想加入我們,我們們一起做?”

我驚喜道:“當然想呀,可是我只會Python呀,你說的那個平臺要用什麼語言做?”

“後端用Java做,你不會沒關係,有老吳(他們團隊唯一的開發,是表哥以前的死黨,以前在訊飛幹過幾年開發)可以帶著你,你有程式設計基礎,腦瓜子又靈活,上手很快,真好我們公司還在籌備階段,你可以先跟著老吳學著,老吳很強的一個人,後端前端全能”

聽到這裡,我已難以按捺住激動的心情,眼角紅潤:“太好了,我終於有出路了!”這對當時壓力巨大的我,就像一個救命稻草,因為即使我再次二戰,就算考上,等畢業已經是二十八九歲了,才能開始上班掙錢,對於一個農村娃來說,家庭壓力是巨大的,而且父母身體還不好。所以儘早能工作賺錢,是我當時一個迫切的期望。

於是,沒多久,我就打包好生活用品之類的,來到了當時他們租的辦公場地,在一個不起眼的寫字樓裡,辦公面積不足80平,一開始工作人員只有我、表哥、堂哥和老吳四個人,我帶著我大學賺的8萬塊錢一起入股了這個公司。

到這裡,算是正式開始了我的技術生涯。由於有了一些C語言、Python基礎和計算機專業知識,對於學習Java來說上手容易多了。

我如何學習Java的

老吳是一個盡職盡責的人,對於技術分享毫不吝嗇,就是我的Java啟蒙導師,剛去就給我定製了3個月的學習計劃,從基礎到框架再到Demo,三個月時間必須全部整會,這三個月時間他們做一些前期工作。到時候我們就要進入專案開發階段,希望我不要拖後腿,有了目標,我學習起來格外賣力。

每天在公司都是在看視訊,看文件學習。當時看的視訊主要是來自於B站的某馬的課程。一邊看視訊,一邊做總結筆記,最後再自己練習。

Java基礎這款大概花了10天左右,基礎這塊還是很重要的,一定要踏實學完。現在市面上的學習資料有很多,有視訊有文件,講解的通俗易容,小白也很容易能接受。這裡的核心重點就是Java的資料結構,一定要吃透,理解其本質。

掌握了Java的基本語法,可以嘗試去刷一刷演算法題,加深對Java語法的熟悉度和資料結構的理解度。瞭解時間複雜度和空間複雜度。

具備了基礎知識,接下來就是要對資料庫、Java Web方面的學習,這裡也是很重要的一個階段,學會這裡,你就可以通過Java去運算元據庫了,可以寫一些入門的資訊管理系統了。資料庫建議把Mysql作為主要學習方向即可,MySQL目前還是現在市面上主流的資料庫。資料庫這裡,你需要掌握SQL語法,MySQL的基本原理,能夠熟練編寫SQL進行增刪改查,能夠通過JDBC運算元據庫,Java Web方面,你需要對HTML、CSS、JS、Ajax有基本瞭解,能寫出簡單的頁面,對於JSP、Servlet熟練掌握,對於XML、Filte、Listener有一定了解。

有了以上知識,可以嘗試從網上找一些管理系統專案,自己寫一寫。學到這裡,大概需要三週時間,掌握這些,恭喜你,已經入門級別了。上面兩個階段,如果想看一些書籍的話,推薦《Java基礎入門》、《Java Web程式開發入門》、《Java Web程式開發進階》、《Mysql資料庫入門》,我當時就是買了這些書,對於小白來說,非常適合入門學習,為了避免廣告嫌疑,自己可以在淘寶搜一搜相關的資料就行。

再往下一步就是各種框架、中介軟體的學習了,有以下知識點,你需要熟練掌握,框架類:Spring、Mybatis、SpringMVC這三個先學完,除了熟練使用這三個框架,還還需要具備,將三個框架整合的能力,嘗試使用這三個框架搭建一個簡單的web工程,另外你之前需要掌握maven、Git、SVN的使用。有了SSM框架的基礎後,希望你繼續學習Spring Boot框架知識,因為了解了Spring Boot之後,你會發現,你之前為了把SSM框架整合費了那多精力寫的配置檔案的問題,在SpringBoot中將不再有煩惱。

到這裡你已經具備初級開發者的能力,可以參與開發一個單體專案。但是目前很多公司基本專案都是分散式的,所以至此如果你想在一家中大小公司能夠勝任開發崗位,你還需要熟知分散式相關知識。如RPC框架、Spring Cloud相關、Redis、MQ相關、ElasticSearch、分庫分表、分散式事務等等,這裡面每一個都需要花費大量時間去琢磨,掌握這些你已經達到了一箇中級開發的水平。

以上技術點,其實基本涵蓋了市面上主流的技術棧,如果你還有餘力,可以去了解下大資料相關知識及雲原生相關。學到這裡花了大概三個月的時間,全職的學習投入,時間不算短也不算長,期間也做過一些簡單的Demo,但由於沒有實戰過,所以對很多知識都是停留在理論,沒有深刻的認識。所以技術學習是一方面,一定得多動手。

如何進階?

從中級開發向高階開發的進階,一般至少需要兩三年的沉澱,而且一般如果自己沒有明確的方向,或者沒有大佬的指引,靠自己摸索,是需要很長時間的經驗積累和深度學習。下面說下高階開發應該具備怎麼樣的素質。

1、編碼能力不用闡述,該會的都得會,熟練應用進攻式程式設計思想保證獨立模組內部邏輯能夠正確執行,異常外部依賴有感知,可處理。

2、熟悉的系統設計方法論,對分散式架構設計有初步的經驗。

3、熟悉開源框架原理以及核心設計思想與關鍵實現細節。

4、可基於架構師設定的目標主導小型分散式系統詳細設計。懂得CAP的權衡,並基於合理的判斷做出技術選型與方案設計。

5、基於業務的核心痛點可給出技術領域內的應對策略。

能掌握到以上,去面試一個公司高開,問題不大了,但是再往上,還得具備一定的管理能力如,能夠承擔大型專案管理工作,合理拆解與分配任務並通過定期的任務跟進與溝通協作機制保證如期如質交付。具備初步的團隊管理能力,會基於團隊日常工作的特徵設定管理規則與制度,做必要的日常監督,且能夠利用OKR等管理工具落實獎懲。可基於所負責的團隊短期目標制定規劃。

那麼要如何才能做到這些,才能具備這樣的能力呢?如果培養你的團隊?作為TL角度和研發角度,如何思考問題?這裡分享下我在自我驅動和團隊管理中的一些經驗,簡單可以整理為以下幾個關鍵字:

技術深,業務熟,執行力高,有創新,有owner精神,響應快,為團隊做貢獻。

技術紮實

作為一個技術人員,技術自然是最重要的,這是自己的手藝,手藝都丟了可想而知。如何提升自己的技術?簡單整理如下:

  • 多學,我們這行最大的特點就是活到老學到老,學習能力正式我們這行的門檻,無論多忙都要經常去學習新的技術,鞏固舊的技術。
  • 多做,動手能力是技術能力的最重要的一個部分,學習或者工作中遇到任何問題,去動手做,去用程式碼驗證得出來結論,這樣在跟別人撕的時候才有底氣嘛。
  • 多思考,凡是要多問個為什麼?其實這個很難,經常會問不出為什麼。我的方法是,零散的理解之後,可以串起來完整的思考一遍,一環扣一環串起來推演,過程中會發現不清楚的地方,然後想清楚,每個環節儘量的再往深處想,再多想想各個點是要解決什麼核心問題,如果不這樣做,按其它思路有什麼優缺點。
  • 多交流,多和大牛交流這是事半功倍的最好辦法,大牛直接給你指點一二的好處自然不用說了。除此之外,你永遠不要覺得自己懂了,跟不同人對同一個問題探討兩到三次以後,你會發現這時候你才真正懂了。你可以從中發現別人的思考角度似乎和自己不一樣,但是別人的也沒問題。交流也不一定是要誰說服誰,其實就是想要知道別人是怎麼想的,自己再回去重新梳理一遍,把儘可能多的場景想清楚。

業務熟

技術是為業務服務的,沒有業務不會有人為技術買單。這就是網際網路的特點。公司領導往往都是懂業務的人,熟業務的價值自然不用多說了。

如何做到對業務很熟?多梳理、多總結、不確定一定要問、多與產品業務溝通和他們一起把他們想要的東西梳理抽象清楚。

執行力

最近在我給兄弟們做分支管理規範的要求(都是一些簡單的要求),資訊也傳達下去了,但是偶爾還是有人不按規範來,作為TL會感到有點心累。我就在想,我們就這麼幾個人,如果這東西還需要費那麼大勁,我們以後做其它重要的事情還如何確保大家都能按要求完成工作呢?更別說以後人多了咋辦呢。想來想去,這就是執行力的問題。這是TL角度的思考,其實從研發人員的角度想也很簡單,至少要做到以下幾點:

  • 按要求做事,研發人員心理要有杆稱,做一件事情,自己要很清楚TL是如何要求的,自己這麼做是不是符合要求,不符合要求要麼改正要麼跟TL溝通,確認這樣做行不行。
  • 把TL的交代放在心上,網際網路公司講究的是開放寬鬆的工作氛圍,這就必然導致TL不可能每一件事情都像佈置任務一樣安排給你。更不可能把每一件事情都想清楚了再交代給你。正常情況可能就是在溝通過程中的一句話。可能這件事情並不靠譜,但這不重要,你一定要放在心上,去把他梳理清楚,得出個結論,不管結論是可行還是不可行,至少有個結論。然後如果可行,再去把這件事情做成,那就太完美了。無論如何,那些聽完就忘了,過了幾天TL想起來又來問一遍,這樣反覆下去對自己肯定是不利的。
    舉個例子,阿里的五新戰略,看上去很風光,就拿新物流來說吧,其實在菜鳥內部,從上到下,根本沒有人想清楚啥叫新物流,曾經還有個新來的高管直接問馬雲”什麼叫新物流,我們該做什麼?“。但是你再想想,你覺得馬雲能說明白什麼是新物流嗎?其實他自己也不明白,所以他給這個高管的回答是:”你太不瞭解我了,我從來不跟下面的人說該做什麼的。“。就這麼一個看似不著邊際的概念,N多的人扎堆在裡面思考,梳理,創新,目標就是實現它。至少大家知道,這個方向是對的,只是暫時還沒有探索出道路。其實阿里的很多其它的業務都是用這種方式創造出來的,盒馬鮮生就是在這種環境下孕育出來的新零售的代表。我理解這就是執行力。
  • 把事情迅速完成,網際網路行業的研發應該有個很大的特點,就是計劃經常會變,安排給你的活,永遠不是你的全部的活。經常會有新的事情插進來。對的就是這樣的,計劃只是對這件事的最低要求,你不能因為時間還有就慢慢來,你必須用最快的速度完成它,然後剩下的時間去學習和等待可能來的新的任務。

有創新

創新好理解,就是去思考工作中、業務中、產品中遇到的方方面面,提出新的想法,並推動落地。落地是創新最重要的點,往往大家都會忽略這一點,其實不落地的想法一毛不值,只有落地了才能稱之為創新(創造新的東西)

創新落地又分為小的工具和系統化的平臺。大家應該有感觸,小的東西永遠只能解決零散的小問題,而且很容易被別人copy,且不容易拿到結果。是的,要有平臺化思維,在這方面阿里做的就比較好。大部分創新都可以用平臺化

的思維去解決一個面的問題的,而且這個平臺是能夠帶來聚集效應的,可以形成閉環,更容易推廣和形成核心競爭力,對自己來說就更容易拿到結果。

有owner精神

一件事或者一個系統的owner,很好理解,就是要對它負責,它的任何東西owner都是第一責任人或者受益人。在工作中TL會指定一些owner,然後由owner來把這件事情徹徹底底的負責起來,做為owner最基本的要求就是這件事情你要負責起來,主動去解決問題(有問題可以找TL尋求幫助),多和TL溝通匯報當前存在的問題和進展。

但是我們這裡說的owner精神遠不止這些,從研發人員角度來說,可以概括為以下幾點:

  • 主動承擔一些分外事情, 你要主動去負責一些不在自己負責範圍的事情(可能TL還沒有指定這件事情的owner是誰)。為什麼要這麼做?只有這樣,你才能讓TL看到你擁有可以owner更多的事情的能力,能力提升力,才能獲得更多的機會去往下一步發展。只是把安排給你的事情做好,永遠只是自己本職工作,不具備晉級下一階段的說服力。阿里有句話是這麼說的:晉升到下一級別的基本要求是你已經在做下一級別的事情,至少做半年以上了。

  • 首任負責制,就是一件事情到你這裡了,你不能簡單的判斷不是你的事情,就不管了。你有責任去分析判斷出這件事情的責任人是誰,並找到他,讓他接下這件事情之後,你才可以撒手(有些重要緊急的情況還不能撒手,還需要不停的去確認結果,並及時反饋)。

  • 能成事,做事容易,成事很難!一個和尚抬水喝,兩個和尚挑水喝,三個和尚沒水喝。說的就是這個團隊沒有能成事的人,如果你是其中一個和尚,你能帶頭把另外兩個和尚組織起來去把水弄回來,這就是你的成事能力。另外兩個和尚充其量就是個做事的,但是成事的這個和尚重要性不言而喻。

響應快

7*24小時onCall,網際網路行業對研發人員的基本要求。如果你還在懷疑這點,你絕對不是一個合格的網際網路研發人員。舉個例子:當時在阿里時,團隊內對大家的要求是,報警響了(阿里的監控做的特別好),相關人員立馬響應(因為阿里的流量太大,響應慢一慢系統可能就掛了),這個前後不會超過5分鐘,就在這種情況下,我發現每次一收到報警開啟電腦,群裡已經有人(那幾個剛畢業的小孩)說話了:”XXX問題我在看“,過了5分鐘,群裡就會看到結論了。包括半夜的報警,我感覺這才叫響應快,TL如果不推崇這種精神那還推崇啥呢?

當然啦,響應速度和精力有關,剛畢業的小孩精力旺盛,生活瑣事相對少些。對工作多年有家有室的老程式設計師來說的確有點為難。但是不管怎樣這個意識是要有的,有時間要關注群裡的線上問題,並及時響應。線上有報警在條件允許的情況下,要主動迅速的去跟進問題。即使條件不允許,幫忙協調下,群裡問問誰有空,打個電話溝通下還是可以的。(這也是owner精神的一種體現

如果大家都有這個意識,並付諸行動,我相信基於團隊的力量做到7*24小時onCall也不是難事。

說完響應快我要強調一下,平時不關注群訊息,下班後就再也不露面的同學要注意了,其實這一點你已經損失,”有owner精神“和”響應快“這兩條了。你基本已經掉隊了(除非你其它點很強)。

為團隊做貢獻

研發人員是處在一個團隊中的,團隊中的每一個人都必須是無私的為團隊做貢獻的,如果把自己與團隊分開,處處以個人利益為主,那必然成為團隊的壞味,將是被團隊淘汰的首選。從研發人員的角度,為團隊做貢獻可以但不限於以下幾個方面:

  • 分享,幫助團隊其它成員成長,團隊內分享新技術和經驗;
  • 提升團隊影響力,幫助團隊提升在外部的影響力( 外部分享,BBS文章、專利提報);
  • 內推,幫助團隊推薦優秀的人才;
  • 提升團隊效率,通過創新性工具為團隊解決效率或者其它問題;

結語

以上就是我這麼多年以來,從技術提升,到軟實力提升的一些經驗總結,希望能對你有所啟發,歡迎提出意見!