[翻譯] 成為優秀開發者指南 Step By Step Path to Becoming a Great Software Developer

原文網址為 http://simpleprogrammer.com/2014/06/30/step-step-path-becoming-great-software-developer/

作者是John Sonmez,經作者同意翻譯並轉載於此。


我收到部份來信,基本上都是在問「我要怎麼成為一個好/優秀的軟體開發者?」

這種信通常會讓我有點不爽,因為我覺得,當你在問這種問題的時候,你似乎是想要找到什麼魔法藥水,喝下去就瞬間變成超級開發者。

我猜測,有極少數問這些問題的人是真的想要變成優秀的軟體開發者,但是看來卻像是想要找個快速或是容易的途徑。

另一面來看,我覺得有些真誠的開發者,只是不懂得如何正確地表達他們「如何到達理想未來」的問題。我覺得他們呢,尤其是一些新手,在尋找的是邁向優秀開發人員的 step-by-step 導引。

 

我想要用我的經驗與所有我所知道的,來嘗試提供一份 step-by-step 導引。

現在呢,當然,我知道並不存在魔法般的公式,而且通往成功的路徑有很多種,然而我等一下要說的將會是一份合理的步驟大綱,依這份大綱來走,新手可以到達高熟練程度,也可望成為一個好的-甚至是優秀-的開發者。

Step 1: Pick one language, learn the basics
選擇一個語言,學習它的基礎

 

在我們會跑之前,我們要先學會走路。利用一種程式語言來學會怎麼寫程式,而不是一次去學五千萬種東西來學會寫程式。

太多程式設師的初學者企圖一口氣跳到想到的地方,卻沒有耐心在跳之前先好好學會一種程式語言。他們總認為他們需要去知道所有最新最熱門的技術,才能找到工作。然而事實是你必須對一個程式語言有超越基本的了解。

選一個你想要用來做為你職涯基礎的程式語言。你應該要以長遠來打算,所以語言本身並不是最重要的。我的意思是你不應該去以學習「容易」的程式語言來做為開始。就去找個你有興趣的、未來幾年都會去用的程式語言即可,你應該著眼於持續性的價值。

一旦你決定了程式語言,你將會去試著去寫去學,去尋找只關於這個語言的書或是教學文件。我的意思是,你不需要去找一次就教你一大堆東西的學習素材,你需要的是找一個初學者教材,專注在那個語言本身而不是完整的技術列表(technology stack;譯註:wiki)。

在看教學文件時,不管是用讀的還是怎麼樣的方式,一定要確實的去寫程式碼。儘量的做練習,去寫你學到的東西,試著去把你學到的觀念什麼的全都組織在一起。這很痛苦沒錯,把書從頭到尾看完比較簡單沒錯,但是如果你真的想學,這種痛苦是免不了的。

當你在寫程式的時候,確保一件事,就是你確實了解每一行你寫的程式碼。在讀程式碼的時候也是,每一行你都要能理解。在那些程式碼面前,你要慢下來,確實的弄懂它們。遇到不懂的就查。花時間做這些動作,以後才不會動不動就卡關。

最後,把你的書或教學文件看完三次以上。你不可能第一次就會「寫程式」了,沒有人這麼強的。在你終於弄懂、終於進入狀況之前,你要重覆的面對這些東西。在學會之前,你會覺得很失落,沒關係的,這是必經之路,吞下去繼續衝就對了。

Step 2: Build something small
做一些小東西

 

現在你對那個語言有了基本的認識,可以開始實現你理解到的東西,同時也讓你知道自己還缺了什麼。最佳的方式就是去試著做一些小東西出來。

在這個階段不要有太大的野心,但也不要太沒膽。想個點子來做個應用程式,要夠簡單,具備一些功能,但所需的時間不超過一個月。把這個小專案限制在只用你選的程式語言本身,不要去使用到一堆不同的技術,像是使用者介面的製作或是資料庫的操作。然而,在製作的過程式可能難以避免的需要用到一些框架或API。

你可能會想要抄一些簡單的現有程式來做為你的第一個專案。找一些簡單的應用程式,像是「待辦事項」列表的程式,用力的給他抄下去,不要讓你的設計技巧妨礙了你的程式設計學習之路。

我會建議建立手機應用程式,因為它們通常夠小又不複雜,同時,越來越多公司都開始需要手機應用程式的開發技術。在現代,你可以用任一種程式語言去建立手機應用程式。有太多的解決方案可以讓你在不同的手機作業系統下建立手機app,還可以有多種不同程式語言選擇性呢。

你也可以建一個小的web應用程式,試一試就好,不要太深入複雜的web應用程式開發。我通常會建議用手機app來開始,是因為要進入web應用程式開發,需要付出更多的代價,你至少要理解HTML,或是後端框架與JavaScript。

不管你最後想要建立什麼東西,你可能會需要去學一些關於框架的知識,這樣很好,但是不要被陷在框架的細節裡面。例如,依照一些簡單的教學文件,你可以很快的建立一個簡單的Android app,甚至不需要去知道太多Android API與Android運作的細節。不要花太多時間去學框架的所有東西,只需要學會你這個專案所需要的東西就夠了,想學那些細節以後再說。

這會很難喔,這就是是如何去學東西,你掙扎著去理解怎麼把東西做出來,然後你去找到答案。不要跳過這一步。在成為軟體開發者的路上,往往需要很快地學會、馬上能理解狀況。這對你的未來是個很好的訓練。

Step 3: Learn a framework
學習一種框架

 

現在才是你專心在學框架的時機。現在你應該對至少一種程式語言具備正面的理解,也對一些手機app或是web應用程式的框架具有一些經驗了。

選一個框架來學,可以讓你在某些環境中更有生產力。要選擇哪一種框架,是基於你想成為哪一種開發者。如果你想成為一個web開發者,你會想要找一個適用於你在用的語言的web開發框架。如果你想成為一個手機開發者,你會需要學習一種手機作業系統,還有適用的框架。

試著深入你選的那個框架,當然這需要花很多時間,但是你應該要投資你的時間在這個你選的框架上,你才會用得順。目前先不要想學一堆不同的框架,只會讓你分心而已。試著去專注在一個限定的工作上,去學習如何使用這個框架、程式語言來完成這個工作的所需技巧。其它的技巧你以後總會學到的。

Step 4: Learn a database technology
學習一種資料庫技術

大部份的軟體開發生都會需要知道多多少少的資料庫,因為許多應用程式都有後端的資料庫。所以呢,不要忽略了這方面的投資。

如果你學了SQL,其實是很有幫助的。即使你可能打算針對NoSQL資料庫來做事,像是 MongoDB或是Raven,但是學會SQL會讓你的基礎更紥實。在很多工作中,知道SQL比知道NoSQL更重要。

不要太在意SQL語言的版本、分支問題,只要你對一種SQL語言夠熟悉,切換到其它版本的SQL語言就不會是什麼大問題,他們都很像,差不了多少。你至少要學會關聯表、查詢與其它常用操作的資料庫技術。

我會建議你找一本SQL的好書,然後建立一些小專案來練習你學到的東西,你一定要持續去練習你在學的東西!

當你學會下列東西時,就表示你對SQL的知識已經差不多了

  • 建立關聯表
  • 執行基本查詢
  • 合併(JOIN)關聯表以取得資料
  • 了解索引運作的基礎
  • 插入、更新與刪除資料

另外,你會想要學一些物件關聯技術(Object Relational Mapping, ORM),要學哪一種,要看你工作上所使用的技術來決定,找一下有沒有符合你用的框架的ORM,選擇可能不多,所以大概選擇最流行的就是最好的選擇啦。

Step 5: Get a job supporting an existing system
找個支援現在系統的工作

現在你所學到的技術已經可以讓你找個軟體開發者的基本工作了。如果你可以證明你了解一種程式語言的基礎、會使用框架、懂資料庫而且層經建立過你自己的應用程式,我會想要聘用你,其它的老闆們也會這樣想。

此時的重點是不要好高騖遠,也不要找太專注於某領域,目前還不是得到你夢想工作的時機,你還不夠格啦。相反的,找一個維護現有程式的工作,而這些程式剛好是由你所學的程式語言與框架打造的。

你大概找不到那麼剛好的,但是最好儘量去找,試著應徵那些使用你學會的技術的工作。

即使你沒有多少經驗,但若是你剛好符合技術需求,又願意當個維護工程師,你應該是可以找到工作的。

這種工作是很無聊沒錯,沒有創造新東西來得興奮,但是找這份工作的目的不在於有趣或賺錢,只是為了學習與取得經驗

跟一個開發者團隊一起做個現有的程式,可以幫助你延伸自己的技巧,同時學到大型系統的結構。你大概會負責修bug或是增加一些小功能,而你將可以把你所學到的技巧應用上去。

把心放在工作上,儘可能的學,儘量把工作做好,不要去想升官發財或是公司裡的政治,那些都是未來的事,就目前而言,專注在完成更多有意義、有生產力的工作上,還有延伸你的技巧。

Step 6: Learn structural best practices
學習結構

 

現在可以在寫程式這件事上開始變得更好了,但還不用去擔心設計的事。你要去學著怎麼寫出乾淨俐落好維護的程式碼,要達到這個目標,你需要去讀很多的良好程式碼範例。

用這些書去強化你的書庫吧:

針對程式語言結構的書,像是:

在此時,你會想要把你的學習專注在有結構的一種流程,關於寫程式碼與使用現有系統的流程。你應該要能夠輕鬆的用你選的程式語言去實作出一個演算法,而且寫出來的程式碼是好懂好理解的。

Step 7: Learn a second language
學習第二種語言

到這個階段,你己經成長到可以把第二種程式語言學得很好的程度了。無疑地,你在此時己經遇到了需要多種程式語言的處境,而你該做的是專注在一個新的語言就好,最好是跟你之前學的那個語言差很多的。

這樣聽起來是很怪,我解釋給你聽喔。當你對一種程式語言很熟悉的時候,就會難以理解那個語言在軟體開發上的獨特概念是啥,也難以明白這個語言比其它語言或技術優秀的地方在哪。如果你花時間在一個新的語言、新的開發環境,你看事情的角度就不一樣了,你會開始以實用的角度而不是慣用的角度去學習。

做為一個新手程式設計師,你可能在做事情的時候,用某個方式去做,但卻知其然而不知其所以然。當你具備第二種語言的知識的時候,你才會開始了解為什麼要這樣寫。相信我,你會因為這樣做而成長的,尤其是你選的第二個語言是你很討厭的那種。

用這個新語言去建置一些專案,不用大,但是要夠複雜,複雜到你抓破頭還是用頭撞牆。

Step 8: Build something substantial
建立一些實在的東西

 

好啦,現在來證明一下你開發的能力吧。你能不能靠你自己去建立一些確實有用的東西?

如果你要繼續走這條路,有為某個工作打基礎的信心,甚至是幫你老闆設計什麼東西,你必須知道你能做到。而知道你能不能做到的最佳方法,就是做了才知道。

選一個可以用到你混身解數的專案,用到資料庫、框架與任何你需要的東西。這個專案可能會耗費你幾個星期的時間,而且需要認真的思考與設計。最好是可以收到錢的專案,這樣你才會認真去做,也才有繼續做下去的動機。

不要拖延,也不要對這個專案有太大的野心。找一個有挑戰性的,而不是註定挑戰失敗做不完的。這將是你職涯中的轉捩點,當你堅持到底的完成這個專案時,你會有很大的進步,如果你撐不下去沒完成….我什麼都不知道。

Step 9: Get a job creating a new system
找一個能建立新系統的工作

現在你可以去找新的工作啦。在目前,你己經從你目前的工作得到最大獲益,尤其是你還在做維護的情況下。

現在是找個對你有挑戰性的工作的時機,但不要越級打怪。你還有很多東西要學,所以不要一下子衝太遠,理想中的狀況是,你可以找到一個可以讓你跟一個團隊一起建立新項目的工作。

你可能不是當系統架構師,但是參與一個系統的創立,會讓你的技巧變廣,也在不同的面向讓你得到不同於做維護的挑戰性。

既然你都已經自己建立過系統了,你對於建立新系統應該已經有一點信心,面試的時候不用緊張,要有你可以完成工作的信心。這份信心非常可能讓你拿到你應徵的工作。

你要確認你找工作時有聚焦而不是亂找,把焦點放在你會的技巧上。不要想用一大串無關的能力去嚇人,專注在最重要的技巧上,找最相關的工作,不能完全相關也要儘量相關。

Step 10: Learn design best practices
學習設計

現在可以從菜鳥升級到老鳥了,菜鳥維護系統,而系統則是由老鳥來建立與設計。(這是一般的情況,有些老鳥依然負責維護。)

你現在應該可以建立系統了,但你需要去學習怎麼去設計系統。

把學習的重點放在設計與一些進階的主題上,像是:

  • Design patterns
  • Inversion of Control (IOC)
  • Test Driven Development (TDD)
  • Behavior Driven Development (BDD)
  • Software development methodologies like: Agile, SCRUM, etc
  • Message buses and integration patterns

這個列表可以用好一段時間,你永遠學不完的。重點是你要從最重要的部份開始,而重不重要則要看你有沒有興趣,還有你想要哪一種職涯。

你的目標不只是建立一個別人設計過的系統,更應該是加入你對與設計、對於什麼問題該該用什麼架構的個人思考。

Step 11: Keep going
繼續走下去

 

到這個時候,你已經成功了,好吧,你永遠不可能「成功」,但你應該已經是個很好的軟體開發者了,或是非常優秀的軟體開發大師。但不要自滿了,你永遠有新的東西要學。

需要花多久的時間才能到達這一步?我不知道。可能需要花幾年,也可能超過十年,要看你花多少心力,還有你得到多少機會。

一個捷徑是試著去跟比你優秀的開發者混在一起。

What to do along the way
在這條路上我還能做什麼

 

在這十個步驟中,你應該做這些事,這些事情要列在每個步驟中,不太容易,所以我簡單的列在這裡。

教別人-你在學的同時,也應該要教。這跟你是菜鳥或是專家無關,你總會有特別的東西可以教別人,而且呢,教學相長,教導是最好的學習。把你的心得、心路歷程記錄下來,幫助其它人。

自我行銷-這是我覺得超重要的東西,我甚至開了一門課來講這個。學習如何行銷自己,而且在你的職涯中要持續地做。要去理解如何在產業中打造自己的品牌、累積自已的聲望,你就不用再找工作了。學會行銷自己,你會有選擇自己未來的能力。這需要花心力,但很值得。你可以讀到這篇文章,就是因為我在做這種事。

讀書-不要停止學習,不要停止讀書,要努力去讀,要改善自己。學習的旅程尚未結束,學海無涯,如果你在職涯中不斷學習,你就能不斷超越你的同儕。

去做-在旅程中,不只是學,要去做。把你學到的東西做出來。偷閒去練習你的技巧、去寫程式碼、去建置一些專案。你可以把所有高爾夫的書都讀完,但你不去揮桿,就絕不可能像老虎伍茲那樣。

 

Want more?

想要更多?

Sign up here to become a Simple Programmer. It’s free and over 4,500 other developers have shown their support for making the complex simple.

 

 


 

以上是翻譯。

我覺得以台灣的環境來看,要再加一條,就是英文要夠好,不用到多益800、900那樣,但是原文的討論或是文章,應該要以看懂為原則,不然走這條路會很辛苦。

 

Leave a Reply

你的電子郵件位址並不會被公開。 必要欄位標記為 *