干貨 – 軟件開發(fā)從業(yè)18年,我總結(jié)了9個最有價值的經(jīng)驗(軟件開發(fā)的職業(yè)前景如何)
★★★建議星標我們★★★
2020年Java原創(chuàng)面試題庫連載中
【000期】Java最全面試題庫思維導(dǎo)圖
【020期】JavaSE系列面試題匯總(共18篇)
【028期】JavaWeb系列面試題匯總(共10篇)
【042期】JavaEE系列面試題匯總(共13篇)
【049期】數(shù)據(jù)庫系列面試題匯總(共6篇)
【053期】中間件系列面試題匯總(共3篇)
【065期】數(shù)據(jù)結(jié)構(gòu)與算法面試題匯總(共11篇)
【076期】分布式面試題匯總(共10篇)
【077期】綜合面試題系列(一)
【078期】綜合面試題系列(二)
【079期】綜合面試題系列(三)
【080期】綜合面試題系列(四)
【081期】綜合面試題系列(五)
【082期】綜合面試題系列(六)
【083期】綜合面試題系列(七)
【084期】綜合面試題系列(八)
【085期】綜合面試題系列(九)
【086期】綜合面試題系列(十)
【087期】綜合面試題系列(十一)
【088期】綜合面試題系列(十二)
【089期】綜合面試題系列(十三)
更多內(nèi)容,點擊上面藍字查看
作者 | Fernando Doglio
譯者 | 張健欣
策劃 | 褚杏娟
從 14 歲起,我就開始在父母的臥室里寫代碼。當時,通過非常慢的網(wǎng)絡(luò),我閱讀任何能夠獲得的東西。20 歲時,作為一名 Web 開發(fā)人員,我簽了人生中的第一份勞動合同,當時學(xué)的是 PHP 和 JavaScript。
在這個領(lǐng)域,我花了 18 年時間,才發(fā)現(xiàn)編程只是職業(yè)的一小部分。即使是空閑時間出于興趣,我也不會停止編碼,但工作中還有很多其它事情。有些事情,開發(fā)者往往很晚才能領(lǐng)悟到,這也是為什么我想和大家分享我的經(jīng)歷,以及我覺得很重要的 9 個經(jīng)驗教訓(xùn)。
1 放下自負
開發(fā)者通常很自負。這是事實。
為什么呢?我認為,任何認真對待自己職業(yè)的人都會認為自己有點兒像藝術(shù)家。我們雖然不會在數(shù)百萬人面前唱歌或者作畫,但我們有時候在以一種非常優(yōu)雅高效的方式編寫代碼、解決非常復(fù)雜的問題,我們同樣為自己的工作感到自豪。
開發(fā)者和數(shù)學(xué)家一樣,解決問題的方式都有點兒像藝術(shù)家。
正因如此,我們很維護自己的代碼——就像熊媽媽照顧她的后代那樣。親手寫下這些代碼的我們,無法忍受別人對他指指點點。
但這對任何人都沒有幫助。我們熱愛自己的工作,但更重要的是我們正在解決問題。通過與其他人討論我們的想法和方案,可能會出現(xiàn)更好的替代方案。這沒有什么不對的。事實上,合作通常會產(chǎn)生最佳解決方案。
我見過各種各樣自負的開發(fā)者,但沒有見過哪種自負對開發(fā)者會有所幫助。
因此我的建議是:當你開始作為一名開發(fā)者工作時,請把你的自負拋掉,多聽聽其他人對你工作的看法。學(xué)會接受這樣一個事實:更好的想法可能來自你的頭腦之外,它們只會幫你提高自己的技能。只有傾聽反饋,你才能贏。
2 語言只是工具
如果你只懂 JavaScript,所有的問題都會像釘子一樣。不要再稱自己是一名 Java 開發(fā)者或 JavaScript 開發(fā)者。
由于某些語言的特性或語法,你可能會偏愛一些語言,這很正常。然而,如果你能學(xué)點別的東西,就會受益匪淺。學(xué)習(xí)新語言,尤其與你日常工作所用的范式不同的語言,會幫助你打開思路,發(fā)現(xiàn)解決問題的不同辦法。
這一點我怎么強調(diào)也不過分:學(xué)習(xí)多種語言并使用一段時間,你會從中受益。
我?guī)啄昵白x過一本書《七周七語言》,展示了各種可用的選項,這讓我思路大開。很多選擇是我從來沒有想到過的,因為我太專注于自己的日常任務(wù)和日常工具,從來沒有停下來看看其它東西。
我們是開發(fā)者,知道如何通過代碼來解決問題,但不要把自己放到一個盒子中,你會被那個盒子的大小所限制??纯茨莻€盒子外面的東西,跳出那個盒子思考,試試其它選項、其它語言、其它解決問題的方法。即使只是一會兒,你也會帶著新的想法和更大的心態(tài)做出更好的抉擇。
3 編程不需要記下所有的東西
有時候,開發(fā)新手認為他們需要把所有事情都記在心里,因此當他們意識到自己開始忘記如何寫一個簡單的 for 語句時,就會感到很糟糕。
這不僅是正常的,而且我認為這也是健康的。
有太多東西需要記憶了,但我們其實不需要記憶,我們只需要擁抱這樣一個事實:互聯(lián)網(wǎng)是另一個有力的工具。就像我們需要 IDE 一樣,我們需要互聯(lián)網(wǎng)來尋找答案。
我們都這樣做,如果你一開始就感覺不好,就不要在這種感覺上浪費時間。只需要尋找你的答案并解決你的問題。
這樣想一想:每一種語言都有一種類似但又稍有不同的觀察者(Observer)模式的實現(xiàn)方式。你認為什么更現(xiàn)實?理解觀察者模式有什么好處以及它能解決什么問題,還是記住你所使用的每一種語言如何實現(xiàn)它?
如果你知道它能解決你的問題,那么你就真的解決了你的問題。剩下的只是搜索實現(xiàn)它的最佳方法。
其它搜索也是一樣。只專注于我們職業(yè)中重要的解決問題的方面,讓谷歌幫你慢慢回憶。這才是正確的方式。
4 你需要終身學(xué)習(xí)
或者說,“你應(yīng)該終身學(xué)習(xí)”,這完全取決于你自己是否要跟上行業(yè)的最新發(fā)展。如果你想要保持相關(guān)性,那么你就必須一直學(xué)習(xí)。
技術(shù)在發(fā)展,語言在變化,這都很正常。誠然,有些生態(tài)系統(tǒng)比其它生態(tài)系統(tǒng)變化得更快,跟上他們的步伐似乎是一項艱巨的任務(wù)。但是,記住你只是一個人,不可能無所不知,只需專注于重要的事情。如果你必須學(xué)會一件事情,那么我的建議是學(xué)會如何學(xué)習(xí)。
這聽起來很傻,但這可能是一名開發(fā)人員需要的首要技能。我們必須在快速學(xué)習(xí)新技能方面表現(xiàn)得更好。否則,你將陷入被標記為“過時”的風(fēng)險。
同時,這也是本文提到的其它經(jīng)驗發(fā)揮作用的地方。變化、改變、新的挑戰(zhàn)、沒有自負——所有這些都會幫助你學(xué)習(xí)并拓展技能范圍。你做的越多,效果就會越好。最終,你會發(fā)現(xiàn)所有的語言都是類似的。你將開始看到它們公共的根本,你將能夠用其中任何一種語言工作。你所要做的就是閱讀一些關(guān)鍵的東西。
你的整個職業(yè)生涯都要學(xué)習(xí):
-
新語言
新(老)編程范式
新工作方法
解決問題的新方法
與團隊互動的新方法
檢查和測試代碼的新方法
如果你還沒有準備好永遠當一名學(xué)生,那你需要考慮下這個職業(yè)是否適合你。請注意,我不是說“立刻辭職”,而是考慮下是否愿意開放思維來持續(xù)學(xué)習(xí)。
5 代碼要解決問題,而非完美
這個問題我說過很多次,但是作為開發(fā)者,我們傾向于認為自己的代碼在發(fā)布之前需要是完美的。雖然這并沒有什么不對,但也可能是一個潛在的問題。
早期優(yōu)化是一個問題,因為你可能在某件可能并不需要優(yōu)化的事上花費大量時間,而且在某些情況下執(zhí)行優(yōu)化時,你會做出破壞功能的假設(shè)。
所以,把注意力集中在需要做的工作和你正在嘗試解決的問題上,一旦問題修復(fù),立馬測試、迭代結(jié)果,看看團隊對你的解決方案有什么想法——即使你已經(jīng)看到了改進的方法。如果你需要花費兩天以上的時間來讓它完美,但它現(xiàn)在就可以投入生產(chǎn),很有可能現(xiàn)在就應(yīng)該投入生產(chǎn)。
歸根結(jié)底,你是在解決問題。解決問題越快,對你的用戶就越好。
6 先讓代碼起作用,然后再優(yōu)化
跟上面提到的觀點一樣,不要陷入早期優(yōu)化的黑洞。
即使你認為你可以快速優(yōu)化,但一旦你開始做,你就會發(fā)現(xiàn)時間膨脹效應(yīng)是真的。
作為軟件開發(fā)人員的首要任務(wù)是寫一個功能或修復(fù)一個 bug 來讓它起作用——無論代碼看起來多丑或者你的方案可能多么低效。如果它起作用了,你就證明了它是可行的。這就成功了一半。
第二步是優(yōu)化它。這是可選的一步。一些人容易忘記的細節(jié),你可以用來優(yōu)化代碼的時間取決于很多變量,這些變量有時候不受你的控制。因此,集中精力讓它起作用,然后再看看你是否真有時間來優(yōu)化它。
早期優(yōu)化意味著要邊寫代碼邊優(yōu)化,這是一種危險的方式,因為優(yōu)化時,我們都是在對執(zhí)行時間、數(shù)據(jù)要求、內(nèi)存需求以及其它我們尚未看到的因素進行假設(shè),任何這樣的假設(shè)都可能是錯誤的,最終會在你的邏輯中引入 bug。
想想 TDD 工作流:
-
編寫測試來理解你的功能需要做的所有事情(它將失敗)。
編寫代碼來通過測試。
現(xiàn)在考慮優(yōu)化你的代碼。
步驟 2 是必需的。你首先需要考慮通過測試,也就是說讓功能起作用。測試不關(guān)心你使用的算法或者你是否使用了三層嵌套的 if 語句。稍后才會做那些,可能是代碼評審過程中的一部分。
7 項目最后的 10% 往往要花費 90% 的時間
如果你一個人獨自工作,這一點尤其重要,但是團隊也會有這種細節(jié)計算失誤的問題。
任何一個做完項目的人都會告訴你同樣的事情(這不僅僅適用于我們行業(yè)):你一開始會略過很多細節(jié),最后才不得不考慮它們。
這很正常。我們都傾向于一開始專注于重大的功能,將比較小的細節(jié)或已知的 bug 留到最后。但是它們?nèi)匀恍枰鉀Q,這就是額外 90% 的工作。精細的工作比較花時間。你需要測試、修復(fù)、重新測試、寫文檔、執(zhí)行用戶培訓(xùn)、展示最終方案等等。
當然,這取決于你的環(huán)境、客戶以及很多其它因素,但總會有一些東西。所以記?。寒斈阏J為你已經(jīng)寫完代碼的時候,你很可能忘記了一些東西。
8 寫過一次以上的代碼,需要進行抽象
編碼是關(guān)于抽象的行為。通過抽象通用邏輯,我們可以在其它地方復(fù)用它,但是一開始的時候,我們有時會注意不到抽象的重要性。
這是我個人的經(jīng)驗法則:如果我在兩個地方寫了相同的代碼,那么就將它們放到一個函數(shù)中(或者一個方法,一個模塊等等… 你懂的)。
即使數(shù)字二對你來說很低,但是要考慮到將來你可能在其它地方使用抽象后的代碼。而且通過把它放到一個常用的地方,你現(xiàn)在就可以使用它了。
抽象和規(guī)模有關(guān)。一段抽象的邏輯可以用很少的精力就被復(fù)用很多次,而到處復(fù)制粘貼代碼雖然很容易,但用的越多需要的精力就越多。想想,如果你因為一個 bug 不得不改變一段邏輯,而它在你的項目中被重復(fù)了 5 次,會發(fā)生什么?你在修復(fù)這個 bug 時,會有 5 次機會犯錯。
同樣的邏輯也適用于你的日常任務(wù)。如果你發(fā)現(xiàn)自己做某件事一次以上,那么它可能就可以用某種方式自動化。這是效率的關(guān)鍵,因此不要僅僅在代碼中尋找重復(fù)模式,在你的動作中也可以尋找重復(fù)模式。如果你能自動化完成一項每天需要 10 分鐘的任務(wù),你一個月就能節(jié)省 5 個小時。
9 副業(yè)項目不是必需的,但它們確實有幫助
有人說,如果你想要成為一名成功的開發(fā)人員,你需要創(chuàng)建副業(yè)項目。我并不認同這一點。我個人認識很多優(yōu)秀的開發(fā)者,他們只在朝九晚五工作時寫代碼。
老實說,我很欽佩他們。他們能夠在做好工作的同時,享受他們的空閑時間做其它事情。這絕對沒有什么問題。
然而,有時候你需要一些額外的練習(xí)。有時候你覺得自己落后于其它同事。而這時,副業(yè)項目就會有所幫助。
我不是說構(gòu)建一個新項目,讓數(shù)以百萬計的人使用,或者對產(chǎn)業(yè)進行革命性改變,當然如果你喜歡的話,就去做。但是我討論的是拷貝其他人的項目,以便從中學(xué)習(xí)。我說的是通過解決 bug 或者增加額外功能來向其他人的項目做貢獻。
你可以用副業(yè)項目來體驗?zāi)悴唤?jīng)??吹降牡胤?。如果你每天寫 8 小時的單元測試,也許可以考慮從頭創(chuàng)建一些東西并且開發(fā)一些功能。如果你厭倦了獨自工作,可以考慮為現(xiàn)有的項目做貢獻,體驗一下如何與其他人協(xié)調(diào)工作。
你可以使用副業(yè)項目來強化自己的薄弱環(huán)節(jié),從而幫助你提高自己的技能。但同樣,不要為了被認為是一名嚴肅的開發(fā)人員,而認為你需要為他們工作或者擁有一個綠色的 GitHub 活動圖。那太傻了。
10 結(jié)論
這是我作為一名開發(fā)者在過去 18 年中學(xué)到的最難的 9 個經(jīng)驗教訓(xùn),希望通過我的分享,能對你的新(或者已經(jīng)從事的)職業(yè)有所啟示。
原文鏈接:
https://medium.com/better-programming/9-hard-lessons-i-struggled-to-learn-during-my-18-years-as-a-software-developer-14f28512f647
之前,給大家發(fā)過三份Java面試寶典,這次新增了一份,目前總共是四份面試寶典,相信在跳槽前一個月按照面試寶典準備準備,基本沒大問題。
-
《java面試寶典5.0》(初中級)
《350道Java面試題:整理自100 公司》(中高級)
《資深java面試寶典-視頻版》(資深)
《Java[BAT]面試必備》(資深)
分別適用于初中級,中高級,資深級工程師的面試復(fù)習(xí)。
內(nèi)容包含java基礎(chǔ)、javaweb、mysql性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列,高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級等等。
看到這里,證明有所收獲