文章翻譯 :楊旋
發(fā)表時間:2015 年 7 月 21 日
原文作者:Jason Roell 在 Great American Insurance 任職的高級軟件工程師
文章分類:職業(yè)規(guī)劃與加薪
本文中作者分享了從一個剛?cè)腴T的“菜鳥”到一個高級開發(fā)人員的經(jīng)歷。作者分步的描述了在每個階段一個開發(fā)者應該干什么事情,很詳細的解讀了每個開發(fā)人員可能遇到的問題。與其把這篇文章歸結(jié)為一篇技術博客,那還不如把它當成是一篇短篇小說,因為它不僅有趣,而且實用。如果你也想成為一個大神,那么快快閱讀它吧!
關于題目中所提到的問題,很多學生或是一些剛剛開始他們軟件開發(fā)職業(yè)生涯的人問過我(尤其是當我發(fā)布了這篇文章之后)然而,讓我們先來看一些問題吧。
1. "偉大"是一個相對的概念。作為一名"偉大"的軟件程序員對不同的人可能意味不同。而我把“偉大”定義為那些可以領導一個軟件工程師團隊的人,那些可以輕松且高效處理開發(fā)周期中的任何一部分中的任何事物的人,或者是那些可以憑借自己出色的能力去解決開發(fā)過程中發(fā)生了的意外或者解決一些錯誤問題的人。
2. 當您準備讓您的事業(yè)更上一層樓的時候,那么閱讀這篇文章可能會給您一個正確的指引。當然,通往成功有不同的捷徑,對你而言,這篇文章或許不是最好的指引,不過,閱讀以下也并無壞處。
那么我們就不再啰嗦,開始來閱讀它吧!
首先,在這里并沒有一個通向成功的神奇公式。然而,我只是想把我的經(jīng)歷,我的導師以及其他我尊重的開發(fā)人員的職業(yè)軌跡分享給大家,以了解如何去成為我心中所想的那個“偉大”的開發(fā)人員。我寫這篇文章的意圖是幫助那些和我以前有一樣疑惑的,在剛開始不知道怎么去達到一個新的水平開發(fā)人員。
我記得當我大學畢業(yè)的時候也有很大的工作壓力,其他開發(fā)人員總談一些我不太熟悉的東西。這總是令我心煩。我只是剛畢業(yè)而已!我覺得我想要在這個“現(xiàn)實的世界”中成功。我也應該需要這些技能,我也應該要準備好。有些時候我開始去想,也許我只是沒有得到良好的教育。
我很快意識到,許多開發(fā)人員都有這種感覺。好吧,我會第一個告訴你,它可能不是你缺乏教育的問題。真的,這里根本就沒有問題!其實你已經(jīng)了解了你所應該知道的知識(希望如此) 并且您可能不會知道一切在學校外才能學到的知識 (無論您的學校有多好)。很多偉大的軟件開發(fā)人員的知識都來自于他們多年的經(jīng)驗 (一個原因是當你獲得任何職業(yè)中的高級職位之前你并不具有這個工作經(jīng)驗) 。
這真是一件悲傷的事情...
這里仍有許多偉大的開發(fā)人員采取的一些路徑和有用的方式,這些方法使他們更加快速的達到他們現(xiàn)在所處的位置。下面是我認為對我最有益的一些過程。
請記住這只是一個導引,為了幫助您在走向“偉大”的職業(yè)生涯中指對正確的方向!
在奔跑之前,我們一定要先學會走路。
對于很多的程序員,他們一開始就急于操作一切,在真正進步之前沒有足夠的耐心來學習一種編程語言。
請不要成為這樣的人
選擇一種你感興趣,并且你在未來的幾年編程過程中會用到一種編程語言。你想要選擇一種東西并且擁有持久的價值。如果找到一份工作對你很重要,你可能想要選擇一種目前最受歡迎的語言,并且在你學習和使用它的時候它將一直保持流行的狀態(tài)。
一旦您已經(jīng)選擇好了要嘗試和學習的編程語言,試著找一些書或僅僅討論該編程語言的教程。我的意思是您不想找到一種能馬上教你很多知識的學習材料。您現(xiàn)在需要找的就是一種僅僅討論該語言的初學者的學習資料,而不是一個技術的百科全書。
現(xiàn)在,你對一種編程語言有一個基本的了解,是時候把您的這些理解付諸于實踐了,通過此來找出你的差距在哪里。做到這一點的最好的辦法是試著建立一些東西。
在這一點上不要過于雄心勃勃 — — 但也不要太膽小。通過一些努力,為您的應用程序挑選一個想法是很簡單的,但不要挑選一個需要數(shù)月時間才能完成的項目。試著將它局限于僅僅圍繞使用編程語言。不要嘗試做一些全棧的事情 (即從用戶界面到數(shù)據(jù)庫,您使用了所有的技術) — — 你可能需要使用一些種現(xiàn)有框架或 API。
對于您的第一個真正的項目,您可能會考慮復制一些已經(jīng)存在的東西。尋找一個簡單的應用程序,比如一個待辦事項列表的 app 應用程序,然后嘗試直接去復制它。不要讓你自己站在學習設計技巧的角度去寫代碼。
您即將要進入"只是它不能運行"的過程了。不要讓這些問題使你沮喪。你要學習成為一個好的問題解決者,那么就永遠不要讓這些失敗來阻止你向前。你并沒沒有失敗。你只是發(fā)現(xiàn)了一種方法,只是在這種方法下,這個程序不能運行而已。那么就尋找另一個解決辦法。解決一個問題可以有很多種不同的方法,有可能您的方法是另一個問題的答案。
無論如何請記住,谷歌永遠是你的朋友:)
現(xiàn)在是時候把重點放在學習一個框架上了。您已經(jīng)熟悉了您的編程語言并且您已經(jīng)建立了一個小應用程序,所以現(xiàn)在應該告訴你如何去構(gòu)建更大更好的應用程序并且更快的生成它們。
框架可以在上述所說的地方幫助您進行開發(fā)。框架是一套其他開發(fā)人員編寫好的代碼庫(通常人們參與創(chuàng)建它,但不是總是這樣)并且您可以使用它。在這些庫中已經(jīng)實現(xiàn)了一些常用的功能,比如程序經(jīng)常要處理的一些瑣碎的事物和任務。在這個庫中通常也會創(chuàng)建一些常用的數(shù)據(jù)結(jié)構(gòu),所以您不必親自去做這些事。
出人意料的是,我見過很多開發(fā)人員把這一步跳過或忽略了,不過到最后他們還是只有回過頭來學習它??蚣芸梢詭椭涯墓ぷ髯龅酶谩D赡苤廊绾斡媚恼Z言實現(xiàn)哈希表或鏈表的數(shù)據(jù)結(jié)構(gòu),但很多時候這是只是在浪費時間和精力。因為這里已經(jīng)有一個很好的框架幫您完成了這些事情。
花一些時間來學習框架的里里外外。它將幫助您更快地開發(fā),并且不用重復的編寫其中已有的邏輯。它也很周到的給您提供了一些函數(shù)庫。所以你可以放心的使用這些"封裝"的代碼。
大多數(shù)軟件開發(fā)人員需要知道一些數(shù)據(jù)庫技術,因為大多數(shù)應用程序都有一個后端數(shù)據(jù)庫。因此,您一定不能忽略學習此方面的時間和經(jīng)歷的投資。
在以前,如果您只是學了 SQL 語句(結(jié)構(gòu)化查詢語言) ,那么您在您的這一領域算是入門了。不過在現(xiàn)在,有很多種不同類型的數(shù)據(jù)庫技術和查詢語言充斥在我們的周圍,并且它們正在被使用著。
我對您的建議是去學習最受歡迎的以及您選擇的框架所要使用的數(shù)據(jù)庫技術。例如,如果您選擇 C# 作為編程語言以及 .NET 作為您的框架,那么 SQL Server 可能是您最好的選擇,并且 SQL 語句將成為您的查詢語言。另一方面,如果你選擇了 JavaScript 和 Node.js,那么 MongoDB 將是一種很好的數(shù)據(jù)庫技術,但 MongoDB 使用的是用來查詢文檔數(shù)據(jù)庫(不是傳統(tǒng)的關系數(shù)據(jù)庫)的查詢語言。
這些便是所有的您想探究的東西,因此您可以了解如何"獲得"和如何分析持久性數(shù)據(jù)!
很好,現(xiàn)在您已經(jīng)有足夠的技能和知識得來作為一個軟件開發(fā)人員去找一個基本的工作。如果您告訴我您已經(jīng)了解編程語言的基礎知識,可以使用框架來工作,并且了解數(shù)據(jù)庫技術以及建立了自己的應用程序,和很多雇主一樣,我當然也想要雇傭你 。
現(xiàn)在,當然,這份工作可能不是您夢想的工作,而且它甚至可能會很無聊。它不再像創(chuàng)造新的東西那樣的令人激動了,但這項工作的目的并不是去玩或者賺錢,而是學習和積累經(jīng)驗。
和開發(fā)團隊中的成員一起使用現(xiàn)有的應用程序,將幫助您拓展您的技能,可以了解大型軟件系統(tǒng)是怎樣進行構(gòu)建的??赡苣墓ぷ魇切迯?bug 或添加一些小的事物,但是您可以學習,把你的技能投入到行動。
完全把您的精力放在這份工作上。學習一切你可以學習的東西。盡可能的把工作做到最好,不要去想賺錢,加薪的事情或者玩政治游戲 — — 這些東西到后來您都可以獲得 — — 現(xiàn)在,只是專注地做這些有意義的工作,盡可能的擴充您的技能。
當您到達這個步驟的時候!您已經(jīng)知道很多了,您也擁有了很多屬于您自己的經(jīng)驗了。恭喜!現(xiàn)在您想要關心的是自己是如何寫好清潔、 可維護的、 可測試的、 可讀的和友好 (我在這里把它排到了最后) 的代碼。
通過閱讀以下書本來擴充您的庫:
語言特定結(jié)構(gòu)的書如下:
現(xiàn)在不要考慮和擔心太多有關設計以及設計模式的問題?,F(xiàn)在您只要集中精力學習如何在結(jié)構(gòu)化過程中寫好你的代碼,并利用現(xiàn)有的系統(tǒng)來工作。你應該努力的去獲得能夠輕松地在您選擇的編程語言上實現(xiàn)的算法的能力,并且很容易被閱讀和理解。
現(xiàn)在您已經(jīng)進步了很多了。當您進行到這一步的時候,您進步的最好的方式就是學習第二種編程語言。您也會毫不懷疑,當您到達這一步時,您也期望接觸不僅僅是一種編程語言,現(xiàn)在您會想要把重點放在一種新語言 — — 理想的情況是一種和您以前使用的截然不同的語言。
當您僅僅只是很了解一種編程語言的時候,您很難了解哪些概念在軟件開發(fā)中對您使用的編成語言而言是獨特的,哪些概念超越了某一特定語言或技術。
當您選擇一種新的技術并且學習完它的里里外外時,您會開始以不同的方式看問題。這樣您就會對一些編程問題有不同的看法,然而這些問題在您的第一語言中您并沒有考慮過。這已經(jīng)毫無疑問是一種幫助我學習黑客來加速我開發(fā)的能力的一種方法。所以請不要跳過這一步!
有句俗話說的好"當您擁有一把錘子時,任何東西看起來都像一個釘子"。這的情況說的就是如果您不擺脫束縛去把第二種語言學得就像您的第一語言那么好,那么您就不會發(fā)現(xiàn)您有驚人的能力。
這一步才是是真正的樂趣所在?,F(xiàn)在是時候來使用你已經(jīng)擁有的開發(fā)技術來開發(fā)一些比較大并且比較新的東西了。創(chuàng)建一些你以為你能做的項目吧。
選擇一個可以用上您的所有技能的項目。請確保把數(shù)據(jù)庫、 框架和一切您需要用來構(gòu)建一個完整的應用程序的東西進行合并。這個項目至少會花費您一個星期的時間,并且在這期間您需要認真思考其中的一些東西。您可以通過這個項目來掙取一部分錢,試這樣的話你會認真的對待它,并且激勵著你一直堅持做下去。
選取一個完全由您自己從頭開始從上到下創(chuàng)作的并且可以自豪的給您的朋友家人進行展示的項目。這樣會提升您的自信心,會讓您自己知道你可以和這些最好的開發(fā)人員一起堅持下來把這項工作完成,當您以后在面試一份工作的時候,這將成為一個給你的雇主進行展示的重要的資本。
很好,現(xiàn)在是時候再去找一份工作了。當你達到這一步時,你幾乎已經(jīng)獲得了你可以在這個工作中獲得的所有好處--尤其是您仍然只做那些維護性的工作。
現(xiàn)在是時候去找一份具有挑戰(zhàn)性的工作了。理想情況下,你想要找一份可以和一個團隊來共同建立一些新東西的工作。
你可能不是這個應用程序的構(gòu)建者,但參與創(chuàng)建這個應用程序?qū)椭鷶U展您的技能以及在不同的方面挑戰(zhàn)你,這比僅僅保持現(xiàn)有的代碼更具有益處。
現(xiàn)在是時候從初級開發(fā)人員變成高級開發(fā)人員了。初級開發(fā)人員維護系統(tǒng)、 高級開發(fā)人員構(gòu)建以及設計它們。(這是一個泛泛的概括,很多情況下,一些高級的開發(fā)人員也維護系統(tǒng))。
現(xiàn)在你應該準備好來建立一個系統(tǒng)了,但現(xiàn)在你需要學會如何來設計它們。
你應該將您的學習重點放在設計的一些好方法上,一些高級的主題如下:
設計模式
控制 (IOC) 的反演
測試驅(qū)動開發(fā) (TDD)
行為驅(qū)動開發(fā) (BDD)
軟件開發(fā)的方法,例如: Agile, SCRUM,等等
完成此列表所列舉的內(nèi)容可能會花費您一段時間 — — 在這些領域里面你永遠不會覺得自己已經(jīng)學到了足夠多的技術。首先要保證你在做的事是重要的-這很大程度上取決于什么東西吸引你、你想要從事什么樣的職業(yè)。
你在這里的目標不是去建立一個別人設計的系統(tǒng),而應該形成你自己的關于應該如何設計軟件以及如何為不同的問題設計不同的體系結(jié)構(gòu)的觀點。
我只是開個玩笑。你永遠不會真正的完成學習,這也是作為一個開發(fā)人員的有趣的地方 — — 這里總是有很多的東西需要去學習以及總有新的思想和技術被創(chuàng)造著。
下面有一些東西,在你完成這 10 個步驟的過程中你也可以遵循。我難以在每一步一一列舉它們,我會在這里簡要的列舉它們:
教 — — 整個時間你都在學習東西,你還應該也教教別人。不管你是一個初學者或?qū)<?,你都有價值的東西可以去教別人,此外,教學是學習的最好方法之一。記錄下您的過程和旅程,一路走來幫助別人的事情。
讀 — — 永遠不要停止學習,永遠都不要停止閱讀,至始至終的閱讀書本,總是會提高你自己的。你永遠不會完成你的學習旅程。你也永遠不能知道所有的東西。如果你在你職業(yè)生涯的過程中不斷的學習,你會不斷超越你的同齡人。
做 — — 在這一路走來的過程,不只是學習,還要做。把你正在學習的一切付諸行動。留出一部分時間來練習你的技巧以及編寫代碼來創(chuàng)建一些東西。你可以閱讀所有學習打高爾夫球的書籍,但是如果你不揮動球棒去練習,你永遠不會成為 Tiger Woods。
如果你喜歡這篇文章,請花一分鐘把它分享給你認為可能會對他們很有用或者會訂閱我的博客 @ jasonroell.com 的人或跟隨我的 LinkedIn 賬號。讓我知道在你們的評論中來了解你們在軟件開發(fā)者的旅程的收獲吧!
更多IT技術干貨: wiki.jikexueyuan.com
加入極客星球翻譯團隊: http://wiki.jikexueyuan.com/project/wiki-editors-guidelines/translators.html版權聲明:
本譯文僅用于學習和交流目的。非商業(yè)轉(zhuǎn)載請注明譯者、出處,并保留文章在極客學院的完整鏈接
商業(yè)合作請聯(lián)系 wiki@jikexueyuan.com
原文地址:https://www.linkedin.com/pulse/how-become-great-software-developer-jason-roell