原文作者 John Sonmez 為資深軟體開發者,同時也是軟體社群 Simple Programmer 的創辦人。以下文字以作者第一人稱撰寫。
我收到不少郵件,基本上都在說:「我怎麼成為一位優秀的軟體開發員?」
這類郵件,通常我會直接刪掉。因為這讓我感覺,當你在問這些問題時,你正尋找某些神奇藥水,能讓你一躍成為天才開發員。
我猜想在這類郵件中,應該只有極少數人,真正想知道如何成為一位優秀的軟體開發者,而不是想從我這得知捷徑或一個簡單的答案。
另一方面我認為,也有一些真的很有誠意的開發者,他們只是不知道該問哪些問題,去指引他們達到理想目標。我覺得這些開發者,尤其是初學者,他們正尋找一步一步的指導,繼而成為一位優秀的開發人員。
我想,我會嘗試用我的經驗、我的知識,去提供這一步步的指導。當然,我知道這是沒有神奇的公式和捷徑,所以接下來我要說的步驟,是被大家認同,成為優秀開發者必備的條件。
- 步驟一:選擇一個程式語言,掌握其基本知識
我們必須先學會走路,才懂得跑步,就像你可以計畫如何學習單一的程式語言,但不要一次性學太多,那樣你會跌倒。
我看過太多的程式設計師試著一次搞定一切,而且沒有耐性去學單一的程式語言。他們認為,他們只要知道所有最熱門的科技新知,就能得到一份工作,但事實上,你需要知道得不僅僅只有單一程式語言的基礎而已。
挑選一個你認為,未來工作會時常碰到的程式語言,你不應該只是選一個「簡單」的作為開始;學習你感興趣的程式語言,我相信幾年後可以看到你自己編寫的。
一旦你選擇某語言,請你試著尋找一些相關書籍和教學課程,並將程式語言的部分隔離出來,我的意思是,你不希望找到什麼都教的教材;你只想要找在講語言的初學者教材,而不是一推技術。
在你結束教材和課程的學習,請確保你能真正寫出程式碼,並盡你所能地練習,另外,你還可以試著運用你所學的概念,將東西放在一起。我承認,這是一種痛苦!但,如果你真的想學,那麼你就需要這麼做。
當你在寫程式時,請確認每一行的程式碼你都了解其意義,這同樣適用於你讀其他程式碼。在你接觸程式碼時,放慢速度並確定你都懂了,如果你卡在某個地方,那就抬起頭來休息一下。
從來沒有人,一開始就懂什麼是程式設計,失落、懊惱是必經的過程,接受但不需掛在心上,重要的是,從開始到學會你必須一直接觸程式碼,了解它是怎麼一回事。
- 步驟二:創建一些小東西
現在,你有了基礎,該嘗試去學以致用,像創建一些小東西等,你會從中發現哪部分是你不足,需要加強的。
不需花太多心思在這,但也不能太隨便;想個點子,花些功夫,做出簡單的應用程式,盡可能只用到程式語言就好,不須做到「全端能力 (full stack )」,它的意思是,掌握從前端的使用者介面,到後端資料庫的所有技術。
你的第一個項目,可能要考慮去複製一個已經存在,如 To-Do List(待辦事項工具),不要讓你的設計巧思去阻撓你學編碼。
我會建議你創建手機上的 App,因為多數都很簡單,你可以只用程式語言來創建;另外,學習手機開發技術很實用,現在越來越多公司需要開發手機 App。
你也可以創建一個小型的 Web 應用程式,通常建議你從手機 App 開始,是因為 Web 開發需要較高成本,且至少要知道一些 HTML、JavaScript 和後台架構。
不論你選擇創建什麼,可能會不得不學一點框架,這是件好事,但不要太拘泥於細節,可以等到以後再慢慢深入,例如:你可以寫一個非常簡單的 Android 應用程式,但無需浪費太多時間去了解所有 Android APIs。
一開始你會困惑該怎麼學習,直到你理清頭緒並找到答案,這個過程對於你的未來是很好的訓練,如果你跳過它,你永遠不會成為一名軟體開發者。
- 步驟三:了解框架
現在,你熟悉至少一種程式語言,及擁有手機或 Web 應用程式的工作經驗。
那麼你想成為什麼類型的開發人員,就選擇什麼樣的框架來學習;如果你想成為手機 App 的開發員,那你需要了解手機的架構,連同它的操作系統一塊學。
還有,試著花點時間,深入了解框架,但不要嘗試學太多種,這樣只會讓你分心。
- 步驟四:掌握數據庫技術
多數軟體開發人員,都需要了解一些數據庫技術,因為大多應用程式背後有一個後台數據庫,所以不能忽略這領域的投資。
即便你打算工作用 NoSQL 數據庫,如 MongoDB 或 Raven,來處理海量數據,但學習 SQL,會讓你在工作上有很好的基礎,而且事實上有很多工作需要 SQL 的知識多過於 NoSQL。
不同的 SQL 技術,它們的本質其實是相似的,當你掌握一個 SQL 技術的基礎時,你要在它們之間做切換,是不太會有問題。
對於 SQL 你有足夠的認識時,你可以:
1. 創造表格 (tables)
2.執行基本的查詢
3.加入表格取得數據
4.了解索引如何運作
5.插入、更新和刪除數據
此外,你會需要學關係映射 (ORM, Object Relational Mapping),它是一種「抽象化資料庫映射方法」。
尋找可以配合你所學(框架)的 ORM 技術,可能會有幾個選項,挑出最流行的那一種。
- 步驟五:找到一份支持你學習的工作
現在,你有足夠的知識和技能,可以得到一份軟體開發者的工作。
如果你能表現出,你熟悉程式語言的基本知識、了解數據庫,以及能夠創建屬於你自己的應用程式等,我當然會想僱用你!
但一開始先不要到你理想目標工作,因為目前的你還沒有資格;相反地,你應該先嘗試找符合你以往學習(不管是程式語言、框架,還是數據庫技術)的工作。
即使沒有太多經驗,但如果你具有相配的技能,且願意擔任維護程式設計師,我想你應該會找到一份工作。
你或許會嫌這樣的工作有點無聊,因為它幾乎不會去創造新的東西,但這個工作目的是為了學習和累積經驗。與開發團隊一起為現有的應用程式工作,你可以學到一些技能,像如何修復 bug 或新增小功能等,你還能觀察到大型軟體系統怎麼被建構。
不要想著錢、升遷等,目前你只須要專注在完成有意義的生產工作,並投入全部心力,我相信你將學到一切。
- 步驟六:結構典範實務
現在你需要學習如何寫出清晰簡潔的程式碼,並且要做到容易理解、維護這點,你需要閱讀大量、優秀程式碼的例子。
我建議你的書櫃可以增加下列書籍:
1.《Code Complete》
2.《Clean Code》
3.《Refactoring》
4.《Working Effectively With Legacy Code》
5.《Programming Pearls 》
還有語言的特定結構書籍:
1.《JavaScript: The Good Parts》
2.《Effective Java》
3.《Effective C#》
- 步驟七:學習第二種程式語言
現在,我希望你把重點放在一個新的語言上面,最好與你之前學的,有明顯差異。為什麼?
當你只有 A 語言相當熟練時,你用 A 語言開發的軟體概念,別人會很難理解那些超越語言或技術的部份。如果你花時間在新的語言,你會以不同的方式去看待,並開始學會「實用性」,而不是「慣例」。
作為一位菜鳥程式設計師,你可能被指定用一種特殊的方式,但你卻不知道為何要用這種方式來做事。在你擁有第二種程式語言,及一堆技術時,你會開始看到更多的為什麼。相信我,如果你做到這一點,你會成長很多,特別是你選擇你所厭惡的語言。
另外,記得確認你有使用此語言創建一些東西,不必太大型,但需要夠複雜,可以讓你動動腦筋。
- 步驟八:建立實質性的系統
這是真正考驗你的軟體開發能力的時候,你可以靠自己創建出實質性的系統嗎?
挑選一個能展現你全端能力 (full stack ) 的項目,並試著讓它收費,如此誘因,是繼續工作的動力。
如果你沒有什麼企圖心,那麼選一個對你來說具有挑戰,但不是不能完成的項目,這將會是你職業生涯中重要的轉折點。
- 步驟九:找到一份能創造新系統的工作
是時候該換工作了,在此之前確認你應該摸透上一個崗位,尤其是你的工作內容,還是只有維護方面。
尋找一些對你來說具有挑戰性,但不是太困難的工作,因為你還有很多東西需要學習;理想情況下,你得到一份可以和開發團隊,合作創建新東西的工作機會。
你可能不是該應用程式的設計師,但作為參與應用程式開發,將幫助你擴展你的技能,並以不同的方式挑戰你自己。
現在的你應該有建立新系統的自信,因為你剛剛自己創建出實質性的系統,所以在面試時,你不需要過於焦躁不安,你要相信你可以得到這份工作,這份自信,會讓你申請什麼工作,就得到什麼!
- 步驟十:設計典範實務
這階段是初級開發者晉身為高級開發者;初級開發人員負責維護系統,高級開發人員則負責建構、設計它們(這只是一般來講,事實上一些高級開發人員還是有在負責維護系統)。
你現在需要學習如何設計它們,專注你的研究於設計典範實務,如:
1. 設計模式
2. 控制反轉 (IOC)
3.測試驅動開發(TDD)
4.行為驅動開發(BDD)
5. 軟體開發方法論:Agile、Scrum 等
6. 消息總線和整合模式
此列表還可維持一段時間(你永遠更新、學不完這領域的技術),只需從最重要的(你感興趣的)開始,並藉此開啟職業生涯。
你的目標,不只要能建構出別人已經設計的系統,還要有自己的觀點 —— 如何設計軟體?什麼樣的架構對各種問題是具有意義?
- 步驟十一:繼續走下去
如果你能做到這點,你應該是位不錯的軟體開發者,或者是位優秀的。
它帶我到今天這地位有多久?可能有十幾年的時間,我也忘了。它只是取決於你多麼用功,並利用機會表現自己。
最好的捷徑,是身於憂患(想像你的同事都比你優秀,你還有很多地方需要學習),那麼你將不會死於安樂。
- 一路走來,你該做些什麼?
有幾件事情,是你一路走來必須遵守的,我把它歸類成十項,但我很難 一一 列舉這十項的每個步驟,所以我只在這簡短提一些:
教學:你所有的時間都在學習,也該嘗試教導別人,不管你是一位專家或只是一位初學者,你總有一些值得傳授的東西,再說,教學是學習的最佳途徑之一;它記錄了你學習的過程,並幫助別人前進。
行銷自己:我覺得這是非常重要!懂得如何行銷自己,並不斷地在職業生涯中這麼做。如何創造個人品牌,並在業界建立自己的名聲?你不再渴望得到一份工作,如果你學會行銷自己,將由你自己決定你的未來,前提是需要一些工作基礎,但是值得的。
閱讀:不要停止學習!不要停止閱讀!在這,能找到你工作的方式;從這,你能提升自己。學習是沒有盡頭,如果你在職業生涯中不斷地學習,那麼你將不斷地超越同齡人。
執行:這一路,不只是學習,還有執行,把你所學付諸行動,另外,撥出時間來進行任何你想做的事,像閱讀、打高爾夫等。
延伸閱讀:
想學程式設計,你怎麼能錯過這 31 個學 Coding 的網站
(資料來源:Simple Programmer/圖片來源:kirainet,CC Licensed)
Source: techorange.com