非本科生,我想半路出家學寫程式,該如何開始?

coding

筆者開設的 JavaScript 程式設計新手村課程 和 Python Web 程式設計入門實戰上架囉!想自學程式的朋友可別錯過囉~

三年前我還是一個剛從台大政治系轉系到經濟系的社會科學院的學生(我求學過程有些曲折,大學前三年讀的是政治系,大四轉到經濟系後應屆推甄上資管所),我接觸的是霍布斯的《利維坦》,讀的是馬克思韋伯的《權威統治理論》,學的是如何在供給需求兩條線中取得平衡,探求人性背後的經濟動機(incentive)。不過這一切從我認真開始想學寫程式和夥伴一起打造解決生活問題的產品有了不同,我的世界開始充滿了Web前端後端、Android、iOS、作業系統、陣列、物件導向、API 這些過去似乎了解但卻又沒有深究的技術名詞,我從一個本該是穿西裝進入金融投資界或是政府部門服務的經濟系學生,一轉身變成了T-Shirt/格子衫加牛仔褲鎮日與科技技術、程式碼為伍的攻城獅。

過去一段時間,我從一個非本科生,到可以擁有將點子付諸實踐,參與數個產品和服務的開發能力。這段學習過程跌跌撞撞,繞了許多彎路且非常辛苦,雖然比起許多前輩大神、強者朋友們來說還看不見車尾燈,且網路上已有許多前輩們分享自己自學寫程式的經驗(POP創辦人Ben自學程式心路歷程我想離職,學寫程式!(上)我想離職,學寫程式(下)),但我仍希望透過文字的紀錄,讓其他非本科生想半路出家學寫程式的朋友,至少有個可以參考按圖索驥的方向,減少自行摸索的時間。

一、確認你的學習動機、設定個學習目標
過去兩年我非常幸運有機會在學校和我與夥伴們創辦的 HackNTU(台灣最大的推廣HackathonHacker&Maker動手實踐的校園非營利組織)教學,協助超過300多位像我一樣想半路出家學寫程式的同學們入門網頁程式設計,從中我近距離觀察了同學們最初會遇到的問題-學習動機和持續力不足。會有這個問題主要有幾點:

1.沒有明確的學習動機和目標
2.沒有學習夥伴彼此激勵
3.沒有適合的導師指導

後兩點容後討論,我們先討論學習動機的部份。其實學寫程式就和學很多才藝過程是類似的,比如說你為了追一個心儀的女生/男生所以有非常強烈的動機學好吉他或烏克麗麗,即便你之前是個音痴,為了愛情你也會想盡辦法突破學習瓶頸。所以確認自己的學習動機是半路出家學寫程式最重要的第一步,你可能是想要創業解決社會上的問題(如果想練習創業點子,這篇icook共同創辦人deduce文章可以參考)或是培養自己跨領域溝通和工作的能力、想藉由接案寫程式貼補家用甚至單純覺得玩技術是一種樂趣等,但千萬不要只因許多媒體持續鼓吹全民寫程式的風氣而為學寫程式而學寫程式。總之,先想一個小目標,可能是一個網頁版簡單記帳軟體、大學生二手交易平台都好。

二、選擇適合你的程式語言入門和工具
事實上,學寫程式是學習用電腦科學(Computer Science)的方式思考問題,最重要的是學習電腦科學背後運作的邏輯,並試圖解決生活中的問題。沒有最好的程式語言,只有針對你想解決的問題選擇適合的工具。如果你想架設網站,你可能需要學習基礎Web前端(HTML/CSS/JavaScript)或是Web後端技術和框架(Node.js/ExpressPython/DjangoPHP/LaravelRuby on Rails),抑或是你想開發行動App,你可能需要學習JavaAndroid)、Swift/Objective-CiOS)、HTML5,至於嵌入式系統或自動化機器人,開放式硬體(ArduinoRaspberry PiLinkIt™ ONE)、無人飛行器你可能會需要用到C/C++、Python、基本電子電路,甚至物理學的相關基礎知識,而虛擬實境和擴增實境(VR/AR)的內容製作通常需要學習C#來製作Unity跨平台應用。

若拿不定想學什麼程式語言入門(初學者選擇一種就好,因為基本邏輯都差不多,最忌諱什麼語言都想學),建議你可以先 Python 入手(若對網站開發有興趣的朋友則可以先從HTML/CSS/JavaScript入門,事實上現在我也推薦新手可以從 JavaScript 入門),Python簡潔的語法且應用範圍廣泛,可以幫你快速了解整個程式語言的大致邏輯和架構,許多國外學校基礎的程式課程也是以Python當做教學的工具(雖然目前國內大部分大專院校課程都會以C/C++為主要教學工具,但對於完全沒學過的新手來說門檻相對較高,挫折感會稍大些。根據我的學習和教學經驗,新手以提升成就感和啟發興趣出發,等累積到一定程度信心後就可以逐步學習較難的主題)。現在,網路上已有許多豐富的學習資源如:CodecademyUdacityCoursera都可以作為入門學習的途徑(更多線上學習資源),若你比較偏好先閱讀紙本書,這本也是不錯選擇:像電腦科學家一樣思考

另外,工欲善其事,必先利其器。學習電腦科學建議可以使用 Linux 或是 Mac 等 Unix-like 的作業系統,不僅可以加快開發效率,避免被各種坑炸傷(因為許多的早期電腦玩家或是Hacker主要都是使用Unix-like 的作業系統,且網路伺服器大多使用 Linux ,許多套件或是工具都只給這類作業系統使用),也讓環境設定更加便利。所以如果真心想往這個領域發展,建議買台 Mac,當作一種投資吧。

三、大量閱讀、參與課程、動手實作,把手弄髒並記錄心得
過去我也曾向家裡尋求協助(家人的鼓勵和支持有時也是重要的動力,這部份我很感謝我的家人,雖然他們還是對於我的跨領域很是擔心),花了些費用上過一般坊間和學校開的電腦應用課程,大部分的老師都很認真教學,但對我來說效果並不是非常理想。一方面是大多的老師都是技術背景,並非每位都有良好的表達能力和教學能力,且班上成員程度不一,老師也可能無法真正顧全所有同學,切合初學者的需求。另外一方面,自己動手練習的時間相對較少,許多文件又都是英文吸收速度較慢,自然學習效果就有限。不過上實體課程仍是一個不錯的學習方式,比較建議的方式是自己先購買相關入門書籍閱讀(天瓏書局是個好地方,我是VIP會員!)和跟著範例練習(實際動手練習是學寫程式最最重要的一環,把手弄髒,bug 是你的好朋友!)並使用線上課程先做預習,之後再選擇了解初學者學習歷程的老師所開的課程或參與工作坊(現在台灣有很多像是Rails GirlPyLadiesJS Girl等不錯的學習工作坊,各大專院校也有不錯的課程或社團)。對了,在練習的過程中別忘了將自己的練習心得記錄在部落格或是Github中,這些都是你未來求職工作、找實習可以用上的好武器!

四、組織、參與社群、練習問個好問題
學習技術的過程難免會有彈性疲乏或是遇到問題,此時若有一起學習的同好彼此打氣交流技術或是可以求助的前輩朋友就會非常有幫助(這是前面提到的夥伴和導師),另外,練習找尋網路上的資源是很重要的,也就是google的能力或是上 Stackoverflow(全球最大的技術討論區)問問題,但切記問問題有一定的禮貌,包括言簡意賅,盡量提供截圖和原始碼等,方便其他人理解你的問題。此外,組織或參與技術社群(在台灣大部分的資訊技術都有自己的社群,若沒有就自己組織一個吧,在裡面可以找到你的夥伴和導師)也是在學習程式語言蠻重要的一環,而一個程式語言的興衰往往又決定於社群的發展。鼓勵自己努力試著回答社群或是Stackoverflow上的問題並在Github上參與開放原始碼(Open Source)專案並參與實體技術論壇也是不錯的學習方式(不過建議參加聚會要適量,持續花時間充實自己相對重要)。

伍、函數、物件導向、框架、設計模式
當你完成一些小小的專案和線上互動學習課程,你一定對於基礎的程式語法和邏輯有了基本的認識。此時你應該不會再滿足於小小的應用,開始試著想挑戰大一點的問題或是應用程式或是重構你的原有程式。此時,你可能就需要學習物件導向(OOP)和框架(Framework)、自動化測試的知識了!透過了解物件導向、框架、設計模式(Design Pattern)、自動化測試的理論基礎,你可以設計出更低耦合、更具有重用性和可維護性的應用服務,讓你在跟其他工程師合作時更得心應手。

六、重新學習資料結構、演算法等基礎電腦科學知識
演算法和資料結構等基礎電腦科學知識掌握度的好壞,會直接影響這個工程師開發的程式的效能表現,事實上,程式語言最核心的部分就是演算法和資料結構(也是程式人的內功修為),但對於一般半路出家學寫程式的朋友來說,這些東西過於抽象,一開始就接觸肯定會有非常大的挫折感,所以比較建議是等你真正掌握了基礎的語法,透過真正做出一些應用成果,建立學習的小信心後再回來補齊它。另外,網路、作業系統、資料庫這些基礎電腦科學知識的熟悉,會讓你對於電腦背後的運作更加了解並可以進行進階的應用,建議花時間閱讀或上學校或線上相關課程學習基礎理論。

七、更進一步
一般資質的人全心投入努力個約一年的時間,雖然不太可能成為大神級的高手,但大概可以實作出大部分你想實踐的點子,且可以和技術人員一起工作。如果想更進一步學習的話,千萬記得學好英文!學好英文!學好英文!(因為很重要,所以講三遍)我必須很遺憾地說,目前電腦科學還是以西方世界為主流,所以學好英文是掌握技術脈動的基礎能力,現在簡體中文的資料更是比繁體中文多上太多了。另外,學習線性代數/機率統計(這幾乎是現在最夯的機器學習/人工智慧的基礎),學習設計、人機互動、使用者經驗、SEO/SEM、網路行銷、專案管理、正規表達式、資訊安全、敏捷式開發、電子商務、Growth Hacking等相關技能都是未來可以更進一步學習的方向。最後,持續分享資訊給社群也是很重要的。因為當你不再是新手村的新手時,你更有責任去分享你所學習到的經驗和資訊給其他的朋友。

以上是我到目前為止非本科生,半路出家學寫程式的心路歷程,我也還在持續學習中,希望會對有學程式需要的朋友有幫助。事實上看到自己開發的產品/服務能解決別人的問題,參與改變世界的機會,是件很開心的事情,這也是身為軟體工程師的驕傲!不過,科技技術不斷推陳出新,必須保持虛心學習和接受新事物的能力,才能持續保持對於技術的敏銳度,若是有任何新的想法或建議歡迎一起交流討論:)

筆者開設的 JavaScript 程式設計新手村課程 和 Python Web 程式設計入門實戰 上架囉!想自學程式的朋友可別錯過囉~

延伸閱讀:

1. 這是最壞的時代,也是最好的時代——來自台灣軟體工程師的熱血告白

2. 軟體人的心路歷程分享 

3. 我是這樣學會 Ruby on Rails:12 個星期打造 12 個網頁 APP

4. Android從不會到會 – 一位從餐飲業跳到資訊業的心路歷程

5. 從設計師到創業家:一個設計師自學 Coding 的創業路

6. 陳建隆:給資工系大學生的一堂課(一)

7. 如何找一份程式開發工作?(一)

(image by Donnie Ray Jones, cc license)

廣告

非本科生,我想半路出家學寫程式,該如何開始?” 有 12 則迴響

  1. 感謝您這篇文章給我一些方向,我也是商學院但畢業後就進銀行,利用下班時間才開始程式上的學習,
    原本很苦惱資料庫資料結構那些課程究竟是要先學好在學語言,還是先學語言在學習那些課程,只好先從自己有興趣的語言開始,但看完您的文章,給我很大的方向安全感!

  2. 看了你的文章,真的覺得電腦的世界真的博大精深。想請教你,因為有外國朋友建議我發展第二專長,而他建議在computer science上,將來有機會在國外好找工作。但我對電腦一竅不通,請問你有什麼建議嗎?謝謝你的用心

  3. 所以我已經入坑了聽其他人說先從C語言開始我去買了書 發現 完全是天書 想問 我因為工作關西 幾乎都在外面跑 所以想買一台筆電可以趁在外休閒時間多練習 可以推薦我買哪一種筆電嗎?? 別超過2位數 我都還能接受
    問一個非常非常新手的問題 Linux這個作業系統 是要自己去下載嗎?? 因為爬了一堆文以後發現 我比較喜歡 Linux 那些筆電適用 Linux 麻煩大大

    1. Hi David,

      不好意思遺漏您的訊息了。
      初學者建議可以先從 Python 或是 HTML/CSS/JavaScript 上手,C 對於一般初學者比較困難些。可以參考這個線上學習平台,很好玩的~https://www.codecademy.com

      若你是用 Windows 筆電的話,其實主要差別在於硬體規格,就選自己預算可以接受的就好,不同品牌基本上不會差太多。另外,Linux 是開放原始碼的作業系統,有蠻多的版本的,可以先用看看 ubuntu,下面有些參考連結~

      http://blog.xuite.net/yh96301/blog/58215008-Windows+7%E5%AE%89%E8%A3%9DUbuntu+11.10
      https://www.ubuntu-tw.org/

  4. 版主你好。我資管大一。學了一年老師只教c++的迴圈,教過的指令不超過10個。
    我認為老師是有這方面的專業知識,但不太會講解,每次只有高中就開始接觸程式的同學聽懂。
    雖然老師教很容易的東西,但我還是要花很久的時間去了解短短的幾行程式,可能我沒這方面的天賦(哈哈哈。
    老師明年會開始教java,所以我自己買了本java,但前面50頁我都看不懂了,想問問你們是怎麼自學的。

    我想在大三或大四的時候參加hackathon 之類的比賽去看看外面的世界。知道hackathon是要設計出一個apps,但對目前的我來說根本就是fairy tail。想請問參加hackathon的寫程式能力需要到哪裡。(我的畢業專題也是寫個apps)

    1. Hi Kidzz,

      目前學校一般都是教 C/C++/Java 為主,若是初學者建議可以從 HTML/CSS/JavaScript,Python 入手。可以試看看這個~https://www.codecademy.com

      Hackathon 重點是在於和一群夥伴腦力激盪好玩有趣的科技創作(軟硬體都有可能),不限於手機 App 開發喔! Hackathon 除了點子發想和快速原型實作實作能力外,重點還是要有熱情,參與的過程才是重點,也不必太擔心自己的能力問題。至於如何準備,我覺得就是平常可以多做專案或是接案,和志同道合朋友組成團隊或讀書會,幫家人、朋友寫程式解決他們身邊的問題,過程中就會累積解決問題的能力和作品,對你未來實習和就業都會有幫助。加油!

      原生手機 Android App 是用 Java / iOS 是用 Swift/Objective-C,此外也可以網頁技術(HTML/CSS/JavaScript)寫 App
      若你現在在學 Java 可以參考這本,順便學 Android App
      http://www.books.com.tw/products/0010681485

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s