computer

自學程式是要學什麼? 4 個程式初學者要有的能力和心態

前言

近年來在國內外,最夯的全民運動應該是自學程式吧!不論是上班族或是還在學的學生,對於職業的選項,總會多一個選擇就是:轉職成軟體工程師。而開發網頁前端、網頁後端、iOS App、Android App、人工智慧、機器學習…..各種領域的軟體工程師都是大家想轉職的目標。

也因為如此,許多的培訓營、網路課程、講座,一直的開,一直的招募,甚至教育部也提出未來國中小的課程規劃要納入程式教育。

延伸閱讀

我自己也算是轉職的軟體工程師,大學時我的主修是統計,但最討厭的是程式相關的課程,作業和考試永遠是放空和低空飛過,唯一記得的大概只有程式語言的進入點是 main function 吧 🤣

研究所時,因為研究需要,花了一個多月認真自學程式,但也只懂的 variable, types, for-loop, function 和皮毛的 OOP,對於這些語法的觀念大概了解,但完全不知道該怎麼實際運用,要自己寫的時候仍然是拼拼湊湊,到處問人。那時的我,更加痛恨寫程式甚至到想休學的地步 是有多草莓

在學校時,心裡總想著:反正未來的工作不找跟寫程式相關的,我也是會有一片寬闊的天空。這想法沒有對錯,只是沒想到多年後的今天,我會以軟體工程師為工作,甚至開始寫軟體教學的部落格。

以下,我會以一個一路上自學程式,轉職成軟體工程師的角度,來探討自學程式是要學什麼?究竟該擁有怎樣的心態來自學程式比較好上手?

本文提到的轉職、學程式,主要以網頁前後端、手機 App、機器學習、資料分析、人工智慧….等,一般比較常見的轉職選項來探討。

寫程式就好比寫文章

在開始要探討學程式要學的到底是什麼之前,我想先用寫文章的例子來比喻:

寫程式寫文章
階段 1學習基礎型別 (int, string, bool, array, dict)學習注音
階段 2組成有結構的邏輯 (if-else, loops, function)學習國字或簡單的單字 (你、我、他、開心、生氣….等)
階段 3學習網頁、手機 App、人工智慧…等所需的背景知識學習成語、疑問句、肯定句
階段 4學習網頁、手機 App、人工智慧…等所需的套件或框架,然後開始寫程式。學習抒情文、論說文、詩的文體,然後開始寫文章。
寫程式就好比寫文章

階段 1

程式的基礎型別 (int, string, bool, array, dict)

對應於

ㄅ、ㄆ、ㄇ、ㄈ….等注音。

階段 2

使用基礎型別,搭配一些結構和邏輯的語句 (if -else, loops, function) 組成具有邏輯的程式。

對應於

認識各個國字的意思和簡單的單字。

階段 3

  • 要寫網頁的話,就暸解瀏覽器的運作方式
  • 要寫 iOS App 的話,就去暸解 iPhone 的運作方式
  • 要寫人工智慧的程式,就去暸解人工智慧背後的理論
  • ……依此類推

對應於

學了國字和簡單的單字,我們接著會使用國字來學成語、和組成各式各樣的疑問句、肯定句、否定句….等。

階段 4

  • 要寫網頁的話,就學習 Vue, React….等前端框架
  • 要寫 iOS App 的話,就學習 UIKit, CoreFoundation …. 等 Apple 開發出用來寫 iOS App 的框架。
  • 要寫人工智慧的程式,就學習 Tensorflow, Numpy …. 等常用人工智慧、資料分析的套件
  • ……依此類推

對應於

學了成語和各式各樣的句型後。

  • 要寫詩的話,就去了解詩的結構
  • 要寫抒情文的話,就去了解抒情文的文體結構。
  • ….依此類推

框架和套件也是用程式語言開發的,即使沒有用框架和套件,也可以把想要的結果做出來。

試著把框架和套件理解成汽車,開車只要15 分鐘就可以到達目的地,但沒開車的話可能要走 1 小時的路才會抵達目的地。但不論是開車和走路,都是可以到達目的地的方式。

而上述的階段 3階段4,雖然用一句話就帶過去,但才是真正挑戰的開始,也是職場上所要具備的能力!

總結來說,文章完成後,是給人讀的,閱讀的人可以暸解作者想要傳達的概念。而程式寫出來後,是給電腦讀的,電腦閱讀完後,會依照程式的內容做出相依的動作。

用寫文章來比喻學寫程式,是想表達學程式的過程也是一步一步的建構起來,先把基礎打穩,依照未來要走的方向,再往那個方向研究挖深下去。

4 個程式初學者要有的能力和心態

了解學程式語言和學工具的差別

自學程式時要了解學程式語言和學工具的差別
要了解學程式語言和學工具的差別

曾經遇過一些情況:

  1. 沒程式經驗的人說最近開始自學 Python 程式但卡關,看了一下問題發現是 Numpy 使用到一半卡關。 ==> 想學的是 Python 程式語言,結果學到了 Numpy 這套工具,以為 Numpy 也是 Python 程式語言。
  2. 沒程式經驗的人說想學網路爬蟲,結果卡關。看了一下問題,發現是從 BeautifulSoup 開始學習。==> Python 程式語言還不會,就急著去學 BeautifulSoup 這套工具

上述的情境都會讓程式初學者十分挫折,而原因就在於初學的時候把重點放錯。如同 “寫程式就好比較寫文章” 內提到的,不可能在什麼注音和國字都不認得,什麼句型都不懂的情況下,就拿起筆寫文章。同樣的,不可能在什麼程式語言都不懂,什麼程式思維都沒有的情況下,就開始使用工具來寫專案。

p.s. 在此的工具就是階段 4 提到的框架和套件。

再複習一下上述關於程式學習的流程

  1. 基礎型別 (int, string, bool, array, dict)
  2. 組成有結構的邏輯 (if-else, loops, function)
  3. 網頁、手機 App、人工智慧 …. 等所需的背景知識
  4. 寫出網頁、手機 App、人工智慧 …. 等所需的框架和套件

程式語言主要是階段1階段2要學習的部分,而工具主要是階段4 要學習的部分。

程式語言可以說是任何軟體開發的最基礎,也是別人帶不走、無法被取代的技術。所以在階段1階段2我才會類比為注音和國字,畢竟是一切的基礎啊。

相反的,工具是用來提升軟體開發的速度和流程的東西,使用情境不同,會有不同工具的選擇,不同時期也會流行不同的工具。

而對於工具要有的體認是:

  1. 不同的工具,是用來解決不一樣問題,沒有哪個工具是最好。
  2. 如果閱讀完工具的說明書後(框架或套件的說明文件),就可以使用大部分的功能,代表這個工具很容易掌握,沒有太大的研究價值,不必浪費太多時間在上面鑽研細節。
  3. 工具是隨時可替換的,可被取代的。
  4. 不使用工具,也是可以實現同樣的功能,但可能程式碼的行數會爆增。

舉例來說,在開發人工智慧的時候,可以選擇 TensorFlow, PyTorch, Keras 等深度學習框架,來實作深度學習的演算法。簡單的玩具專案可以使用 Keras 就好,實際要上線的產品可以考慮 TensorFlow 或 PyTorch。當然也可選擇不使用框架,自行實現所有演算法。

而在開發網頁前端時,可以選擇 Vue, React, Angular 來做前端框架。過去流行的是 Angular,近年來比較流行的是 Vue, React,如果是新開發的產品,可以選擇從 Vue, React 下手。當然也可選擇不使用前端框架,只靠 HTML, CSS, Javascript 來完成整個網頁前端。

在軟體開發的過程中,對於個人成長最重要的從來都不是會使用何種工具,把工具摸到多熟。相反的,熟悉程式的基礎概念和要踏入領域的背景知識,才是對於個人成長最重要,也最無法被取代的。

拆解問題的能力

自學程式時要有拆解問題的能力
拆解問題的能力

以下舉個實際的例子來講解什麼是拆解問題的能力。

假設 A 資料夾底下有很多 excel 檔案和子資料夾,每個子資料夾內又有很多 excel 檔案。需求為想要寫個程式,把所有 excel 檔內的第一列標題都複製並貼上到另一個全新的 excel 檔案內 ( results.xlsx )。

遇到這種問題時不要慌,把問題拆解,一步一步思考即可。首先思考要怎麼把大問題拆解成小問題,小問題可以是:

  1. 如何用程式開啟每個資料夾,以獲得每個資料夾內含有哪些子資料夾和哪些 excel 檔案?
  2. 如何用程式開啟 excel 檔案?
  3. 如何用程式取得 excel 檔案內第一列的內容?
  4. 如何用程式將資料寫入 excel 檔案,並存檔?

以上,我將一個大的問題拆解成了四個小的問題,分別去 Google 搜尋四個問題的解決方式,再像組裝一樣把找來的解答組成我們要的程式,這不就是一個解決方式嗎?

延伸閱讀

將一個龐大的問題拆解成小問題,再各個擊破,並將各個小問題的解答組合回原本的大問題。這種解決問題的行為模式養成習慣後,未來不論是遇到程式上的難題或是工作上和生活上的問題,將會習慣冷靜思考,分別對每個小問題尋找可用資源,而大問題自然就迎刃而解了。

培養程式化的思考

自學程式時要培養程式化的思考
培養程式化的思考

對人類來說,電腦最方便的就是用來加速重複性的步驟。

拆解問題的能力內提到,可以將大問題拆解成小問題,再各個擊破。而程式化的思考就是在大問題中找出重複性的步驟,並使用程式處理

以下用拆解問題的能力內的例子來講解什麼是程式化的思考。

假設 A 資料夾底下有很多 excel 檔案和子資料夾,每個子資料夾內又有很多 excel 檔案。需求為想要寫個程式,把所有 excel 檔內的第一列標題都複製並貼上到另一個全新的 excel 檔案內 ( results.xlsx )。

在這個問題中,重複性的步驟為

  1. 將每個 excel 開啟,複製第一列標題,並關閉。
  2. 將每個複製起來的第一列標題貼到 results.xlsx 內,存檔並關閉。

結合小問題的解答重複性的步驟,用程式來處理這個問題的文字步驟可以是:

  1. 找出所有 excel 檔案的路徑,存在陣列 (all_excel_paths) 內
  2. 寫一個函式 (extract_first_row_from_excel),傳入 excel 檔案的路徑,就可以回傳第一列的標題
  3. 寫一個函式 (save_to_excel),傳入陣列 (all_first_rows),會將陣列 (all_first_rows) 寫入到 results.xlsx 內並存檔。
  4. 使用迴圈,將陣列 (all_excel_paths) 內的每個 excel 檔案路徑分別丟入函式 (extract_first_row_from_excel) 內,得到第一個 excel 檔的第一列標題,並存入陣列 (all_first_rows) 內。接著將第二個 excel 檔案丟入函式(extract_first_row_from_excel) 內,得到第二個 excel 檔的第一列標題,再存入陣列 (all_first_rows) 內….依此類推。
  5. 將陣列 (all_first_rows) 丟入函式 (save_to_excel) 內存檔。

使用程式化的思考,遇到問題時會先習慣找看有沒有可以重複性的步驟,可用程式處理掉。習慣用這種角度來看問題,無形之中就會慢慢培養出對程式的靈敏度,是個非常好的練習方式。

懂的問為什麼

自學程式時要常懂的問為什麼
懂的問為什麼

電腦、程式語言、網際網路….等,經過近百年來的發展,因應各時期不同的需求,慢慢的演進成現在的樣子。

要記得,任何東西的發明都有他要解決的問題,不然大家都用最原始的方式就好了。舉個例子,人類用走路和游泳就可以到任何地方,為什麼還需要汽車和船呢?有了汽車和船,可以讓人們更快的到想要的目的地,節省時間。

同樣的,在程式的世界裡,每個東西的出現都是有他可以解決的問題 make your life easier. 學到任何東西時,請記得思考一下為什麼需要這個東西,沒有這個東西時的程式要怎麼寫,這個東西出現後解決了什麼問題。

舉例來說,為什麼會需要陣列 (array, list) ?

假設有某個陣列 name_array 裡面放著 3 個名字,分別是 mike, jenny, april。

name_array = ["mike", "jenny", "april"]

用 3 個字串來表示,也可以達到一樣的目的。

name_a = "mike"
name_b = "jenny"
name_c = "april"

但假如是要存放 1000 個名字呢?不可能宣告 1000 個字串,然後一次管理這 1000 個字串。最好的方式還是將 1000 個字串放在 1 個陣列內,然後一次管理這 1 個陣列就好。

以上程式碼看不懂沒關係,總而言之,任何東西的發明都是為了解決某些問題。學到任何東西時,請記得思考一下為什麼需要這個東西,沒有這個東西時的程式要怎麼寫,這個東西出現後解決了什麼問題。

常常問自己為什麼,會更加了解自己學進去了什麼東西,遇到各種狀況時也能更靈活運用所學!

結論

以上 4 點是期望程式初學者要有的能力和心態,也是在我真的轉職成軟體工程師,工作幾年後回頭來看,領悟出的道理。

有了這些能力和心態,我相信學習上會更加有效率,也更清楚自己在做什麼,學到的東西該如何使用,以及最重要的,該把學習的時間放在哪些重點上(畢竟轉職就是時間有限)

以上,有問題歡迎留言討論~ 謝謝大家

發佈留言