原文連線:Tips for Aspiring Developers (Self-Taught Story)
就像是一個不斷髮展的科目,每天都有新人加入,其中,"我該學什麼程式語言","我怎麼開始","我怎麼找到一份工作","我該從何處學習"等等是最常見的普遍問題。
這些都是有效的問題,並且,希望這篇文章能幫助你們更好的管理這個不斷變化的科目,或許變的比以往更好。
注意: 請不要完全以我的建議為標準,我希望你保有自己的看法。他們大多數來源於我個人的經驗,以及我周圍人的經驗,以及我在網路上與他人的交流。另外,如標題所示,本文並不僅僅只針對於開發人員,而是一個希望進取的人,或者剛剛踏入某個領域的人。
我該學什麼程式語言
這可能是最常被問到的問題了。你對程式設計很感興趣並且決定學習一門程式語言,但是,選誰呢?
在我看來,一開始並沒有什麼這個語言比那個好。選擇一門語言很大程度取決於學習他的人對這門語言的痴迷程度。有些人傾向於 Web 開發(PHP & JavaScript 可能是最為人熟知的),有些人傾向於遊戲開發(C#, C++),有些人傾向於桌面應用開發(Objective C, Swift, Java)並且有的傾向於各個方面(Java, C#, Python)。這兒有無數種語言可以選擇,有些專注於某個領域,有些則相反。
如果你真的瞭解自己喜歡的領域,那麼你的選擇就會比較明確,但如果你不能決定是隻專注某個領域,還是多面接觸,那麼較好的選擇就是被用於大多數領域的語言,比如 Java, C#, Python等。
有些人可能會對此有爭議——像 Java 和 C# 那樣的語言並不是開始的較好選擇,有些觀點是認為初學者應該從C 或者 C++ 開始入門打基礎,但是我個人的首個程式語言是 Java,我和他的聯絡很深,我非常喜歡和他一起工作。我很高興我能為 Java 寫一些新書,或者可與其一起使用的任何技術書籍。
Java 和 C# 有許多相似之處。資源和記憶體管理的差異使 C# 在遊戲開發中成為更好的選擇 ,即使 Java 的速度和記憶體管理多年來已經得到了顯著的改善和提升,C# 仍然被選擇適用於遊戲領域,並且一段時間內仍會如此。而在另一方面,製作大型企業 Web 和桌面應用程式通常使用 Java 完成,不過我不會再多說了,因為這開始偏離主題了。
Python 最近越來越受歡迎了,並且行業內的使用量也在增加。他被用於遊戲開發,Web 開發,機器學習等等。正如我所知的,他比前兩個更容易學習,所以對於初學者來說這可能會是一個不錯的選擇。
我怎麼開始
你應該去上大學嗎,你應該報名參加課程嗎(傳統的或線上的),你應該買些書籍嗎?
我不認為成為一名合格的開發者必須需要大學。很多人在大學時很失落,並且不覺得他們獲得了足夠的知識。在我看來,無論你身處什麼環境,無論好壞,只要你想學,你就會學到的。
一開始我去參加了本地的一些課程,這是我開始打基礎的地方,並且我還可以在這之上再建立一些基礎的事物。接下來的幾年裡,我一直致力於購買像 Udemy (不過這網站emm,我就推薦一下慕課,實驗樓啥的吧)這樣的網站上的課程,並在像 Packt Publishing (至於這個我推薦一下圖靈社群)這樣的網站上購買書籍。
不用說,我還非常依賴論壇和社群,StackOverflow 成為了我最好的夥伴,YouTube之類的,我見過很多人都很樂意在網上提供幫助,並且社群真的幫助了我很多很多。
我還注意到一個常見的現象,就是人們通常會關注學習一個事物的前置條件。就像"我需要擅長數學嗎","我需要了解物理嗎","這對我來說是否太複雜了"之類的。我不確定這些想法事怎麼來的,老實說。是的,數學好是一個加分項,有些領域需要廣泛的使用和理解數學,比如人工智慧和深度學習。但是請明白,對於大多數領域,瞭解基礎,基本數學是正常的。你不需要成為一位數學專家來學習程式設計。
我甚至遇到很多對數學並不感興趣的人,在程式設計領域學習過一段時間後,發現程式設計更容易理解,更有趣。
瞭解一些相關概念或者一些簡單的電腦科學在學習程式設計方面是一個優勢,但這不是必須的。
在我看來,程式設計本身並不是那麼的複雜,學習語言的語法並不難,因為大多都邏輯清晰使用簡單。但是,成為一個優秀的程式設計師需要知道如何使用語言的語法來使其更加高效的工作。他需要具有通用性和實用性,有時那會是一個抽象的方法。並且那需要通過大量的思考而且這是非常關鍵的部分。幸運的是,他們不需要是與生俱來的特性,如果在一開始他就是有缺陷的,可以通過其他方式去實現。
我可以在哪裡學習
我個人的看法是,在哪裡都可以學習。無論環境或是周圍的人如何。但我想回答這個問題的更好的方法是舉幾個例子。
網上有許多免費或者付費的服務,你可以使用他們開始學習!
這裡是幾個例子:
- CodeAcademy - 一個非常受歡迎的網站,擁有著良好的聲譽。該網站提供了一種互動的方式,通過提供部分理論來平衡實踐和理論,你可以線上使用他的內建編譯器來練習你所看到的內容。
- freeCodeCamp - 他有些不同,首先他關注理論,然後是練習,他支援你建立自己的專案,獲得證照,並將開源專案新增到你的簡歷中。
- CodeWars - 本文後面有一個關於他的單獨內容。
- W3Schools - 主要關注 Web 開發,這是學習HTML, CSS, JavaScript等技術的較好的場所之一,尤其對初學者來說。
- Udemy - 我的最愛之一。Udemy 提供各種各樣的課程,而且很便宜。在我看來,我更喜歡付費課程,並且再強調一下 Udemy 的課程真的便宜。不要被矇蔽了,雖然你經常都能看到價格標籤是 $ 200 - 300, 但是那只是一種營銷手段。Udemy 一直都有各種折扣。 一次我沒有再折扣時間內獲得一些課程,之後才迎來了一場大折扣,預計每門課程不超過 $10 。
- edX - 由麻省理工學院和哈佛大學提供支援的知名教育網站。包括一些免費課程和付費認證。
- Khan Academy - 另一個受歡迎的網站,提供各種領域的課程。
- Udacity - 提供程式設計相關或者非相關的免費課程,以及有償學位和證照。
- Packt Publishing - 我的另一個最愛。Packt 的書從不讓我失望,並且我很高興總能得到一些新事物。不幸的是,他們的書相當貴,但是幸運的是,你還是可以享受折扣並以便宜的價格購買-約 15$ 美元左右。
總是保持好學的心
我認為好學是非常重要的。這是一個每天都在變化的科目。一年前的理想解決方案,現在可能就被淘汰了。我去年買了一本 Angular2 的書來擴充套件我的工作領域,但是我仍然還沒有閱讀他,然後突然間我發現,Angular6 幾個月前已經發布了。
我喜歡教學,並認為這是進步的一個重要方面。愛我所做的事情讓我每天都能學到新東西,而學不感興趣的事或者強制性的學習會讓我很難受。我不認為這是時候學習並且學習幾個小時了。我注意到自己正在閱讀新文章,獲取最新的資訊,併為他的樂趣製作應用程式,測試自己的挑戰,只是因為他很有趣。
老實說,學習這些需要花費大量的時間,保持不斷的跟進和學習,但如果你喜歡這樣做,那就不難了。
"成為開發人員"需要多長時間
"成為開發人員",這是一個需要討論的主題,而另一個則沒有答案。
我可以告訴你的是,通常平均需要多長時間才能達到可以開始工作的水平。
這取決於學習的人自己,但學好任何一門語言都至少需要一年的時間。但是要記住,一旦你"成為一名開發人員",你就永遠不會停止學習。
年限 | 知識水平 |
---|---|
1 年 | 一年的知識,你應該能夠建立簡單的應用程式,並且至少具有一些與你選擇的語言相關的流行技術和框架的經驗。 |
2 年 | 我認為至少需要 2 年的學習才能被認為是初級開發人員,能夠真正的負責一個專案的開發。 |
3 - 4 年 | 3 - 4 年的時間,你可以被認為是一個成熟的開發人員,或者稱為中級開發。 |
4 年或以上 | 這也取決於你自身,但我經常看到 4 年以上的開發者被稱為高階開發。 |
請記住,僅僅是投入你的時間並不會讓你成為開發人員。還要加上你投入的努力。有時擁有 2 年經驗的人可能比擁有 3 年經驗的人更好。這意味著我的表格僅用作與參考,或者作為你在不久的將來可能投入的時間的概念,去看到一些結果。
失敗
在某些事上做錯了,是很常見的事,無論是製作線上平臺還是AI,視訊還是遊戲或其他任何東西。
當我覺得我無法做任何事時,我總是感到疲憊,我陷入了"程式設計死區",總是會卡在同樣的錯誤上,有時甚至是好幾天。這讓我感到絕望。我不得不承認,這並不總是那麼容易,但是當你終於解決了他,便能體會到什麼是"山窮水復疑無路,柳暗花明又一村"。經歷這些起伏是在任何領域取得進步的基本過程,畢竟,勝敗乃兵家常事,你得學會坦然受之。
專注於一件事
成為一門語言的大師,好過成為所有領域的學徒,這會是一個好的起點。像是 DevOps 這樣的潮流很受歡迎,在一個職業中統一了很多領域,但我不建議初學者學習。如果你希望能夠完成常規團隊所做的一切,請便,但那需要大量的知識,意願和經驗才能做到這一點。
實踐
實踐可以讓你找到問題所在,這是程式設計的一個非常重要的特性。一旦開始程式設計,實踐也將提高你的技能。
根據我的經驗,CodeWars 是訓練和實踐的好地方。
CodeWars 為 Java, PHP, Python, Ruby, JavaScript, C#, Clojure, Go, SQL, Swift, TypeScript, C, C++等一系列不同的語言提供了無數的挑戰。
他是由我所熱衷的傳統東方風格的形象製作的,我很喜歡他們介紹的 Katas (個人訓練/挑戰) 和 Kumite (陪伴/挑戰他人) 的榮譽系統,他會隨著每個完成的Kata 或 Kumite 增加。你從 8kyu 一路前進到 1kyu,不就像是一個初入江湖的少年最終成為一個名滿江湖的高手一樣嗎。
CodeWars 有一個龐大的社群,你可以學到很多東西。
總而言之,萬事開頭難,不要氣餒。這些 Katas 不容易解決,需要你的知識和智慧。
沒必要重新發明輪子
在大多數情況下,沒有必要重新發明輪子。你能在網路上找到大多數解決方案,隨時可以使用。使用他人的解決方案,可以讓你專注於自己的工作。雖然從頭開始做所有事請是有益的,但是也讓你的願景變得模糊,並使你偏離原來的軌道。
試著閱讀別人的原始碼
即使每個人都有自己的編碼風格(命名,格式化等),你也應該去試著閱讀理解他人的原始碼。
當你進入辦公室或團隊的開發環境時,你必須與他人合作,你必須能夠理解他們寫的程式碼。團隊合作可以幫助你更好的維護和升級現有的程式碼,同時那會改變你自己的風格,而只有你改變了風格,才會導致你重新發明輪子。
在你學會跑之前先學會走
如果你剛接觸某些事物,那麼在嘗試這個事物的高階用法之前,請先建立一個紮實的基礎。
如果你試圖強制執行,可能CPU會直接爆炸(233我就是皮一下)。
為了之後的高樓大廈,請先打好地基。
成為社群的一員
成為社群的一部分是一種典型的人類特徵。我們喜歡整理和組織我們感興趣或有益的事物。如果你的城市舉行有關電腦科學或某種你感興趣的程式語言的聚會,那還等什麼呢!
無論你的知識水平如何,那不阻礙你和他人交流討論。你可能還會找到志同道合的其他人。我經常和朋友們交換書籍和課程,我們每個人都批量購買和分享資料,所以即使你預算很緊張,也不難用這種方式獲得有用的資料。
寫註釋文件是一件好事
這不是最有趣的事,但是對於你自己和你的團隊都是非常有益的。如果你寫了某個功能並且一段時間沒有使用過,你可能就會忘記他是如何工作的。這件事發生在我身上時,重新審視專案就會讓我很迷茫:'我在這裡做過什麼?'。
這會導致大量時間浪費在理解舊程式碼的功能上,但是隻需要寫一些簡單的註釋文件,這將節省所有人的時間。
血淚史讓我必須告訴你們,養成這個習慣,是非常非常有用的。
結語
說了這麼多,是時候結束了。我希望這篇部落格可以幫助任何踏上這條路的人,我希望我的個人經歷可以通過這種方式回報社群。希望你能從中獲取有用的資訊。
Good Luck!