跳至主要内容

26 篇文章 含有標籤「自學程式」

檢視所有標籤

NTU 台大 Web 網頁開發 Vibe Coding 課程學習重點筆記 01-01:Introduction to Web Programming

· 閱讀時間約 5 分鐘
NTU Web Programming Vibe Coding 系列筆記

這是 NTU 台大 Web 網頁開發 Vibe Coding 課程 學習筆記系列:

📚 第一階段:基礎概念

💡 查看完整系列 | 🎓 Vibe Coding 學習資源

在軟體工程與生成式人工智慧高度整合的時代,開發者的職責已從單純的代碼編寫者轉化為系統的協作指揮官。

名言金句

「一個好的主管需要懂得與屬下溝通,而與 AI 協作的關鍵,在於精確定義需求並理解技術背後的邏輯與架構。」

核心論點

這部影片的核心在於展示如何利用現代 AI 工具(如 Cursor)快速構建功能完整的網路服務,並以此作為切入點,探討開發者在 AI 浪潮下應具備的素養。透過實作一個待辦事項(To-do App)的過程,教學重點不再是語法的堆砌,而是如何將心中的產品意象透過精確的指令(Prompt)轉化為可執行的軟體架構。

教學過程強調了「開發環境重現性」的重要性。一個專業的網路服務不應只存在於開發者的本機端,而必須確保團隊成員或助教能在不同的環境下快速安裝並運行。這涉及到環境設定檔(如 .env)的正確處理,不僅是為了安全性以隱藏敏感的金鑰,更是為了確保軟體在不同部署階段的靈活性與穩定性。

最後,影片探討了 AI 工具在教學與實務中的定位。雖然 AI 具備「One-shot」生成代碼的驚人能力,但這並不代表開發者可以忽視基礎。理解 HTML、CSS 與 JavaScript 的運作機制,以及文件物件模型(DOM)如何動態改變網頁內容,才是確保在 AI 產生錯誤或遇到複雜規格時,開發者具備調整與優化系統的核心競爭力。

重點摘要

  1. 環境設定檔與安全性:在構建涉及第三方服務(如 GPT API)的服務時,應使用環境變數管理金鑰,嚴禁將敏感資訊直接寫入代碼或上傳至版本控制系統。
  2. 開發環境重現性:確保服務能讓團隊新成員快速重現與安裝,是衡量軟體工程品質的重要指標,也是課程評核的重點之一。
  3. Cursor 開發工具應用:詳細介紹了 Cursor 的界面功能,包含檔案瀏覽器、代碼編輯區、終端機,以及與 AI 溝通的聊天室。
  4. AI 模型選型與模式:分析了不同 AI 模型(如 Claude, GPT-4)在代碼生成上的表現,並介紹了 Max Mode 如何透過自我測試與思考來解決複雜程式問題。
  5. 指令工程與溝通:強調與 AI 溝通就像主管與屬下的溝通,單純的截圖或簡短指令往往不足以應對精細規格,需學會精確描述產品行為。
  6. 前後端基礎概念:快速概括網頁開發的三大支柱(HTML, CSS, JavaScript)及 DOM 的動態變更原理,作為 AI 輔助開發的知識基礎。
  7. 實戰練習與作業:透過個人網頁的撰寫作為初步練習,引導學生從簡單的靜態頁面過度到具備互動性的網路服務。
  8. 代碼生成的不可預測性:提醒 AI 背後是統計模型,具有隨機性與樂透性質,開發者需具備檢視與修正產出內容的能力。

行動方案

  1. 你應立即在開發環境中建立規範化的目錄架構,並配置一個範例環境檔(如 .env.example),確保所有敏感資訊皆已妥善隔離。
  2. 你需熟練操作 Cursor 的各項進階功能,特別是學習如何在 Auto Mode 與 Max Mode 之間切換,以因應不同難度的開發任務。
  3. 你應針對作業一的個人網頁需求,嘗試撰寫一份詳細的結構化指令,包含視覺設計要求與功能互動邏輯,並觀察 AI 產出的代碼是否符合預期。

問題反思

  1. 如果 AI 已經能完成大部分的底層開發,你認為具備理解代碼邏輯與 DOM 原理的開發者,在除錯階段具備什麼樣的優勢?
  2. 在追求開發速度的同時,你該如何平衡 AI 產出的代碼質量與系統的可維護性?

心得結論

本課程示範了 AI 時代下網頁開發的新常態:效率不再是手寫速度的競爭,而是溝通、架構理解與工具駕馭能力的綜合展現。透過將實務規範(如金鑰安全)與前沿工具(如 Cursor)結合,教學內容不僅傳授了技術,更傳遞了現代軟體工程師應有的職業態度。這是一場關於如何在高效率與扎實基礎之間尋找平衡點的深刻教育,也為後續深入學習網路服務架構奠定了堅實的心理與技術準備。

NTU Web Programming (2025.09) -- 01. Introduction to Web Programming (Part 1)

NTU 台大 Web 網頁開發 Vibe Coding 課程學習重點筆記 00:Course Introduction

· 閱讀時間約 6 分鐘

NTU 台大 Web 網頁開發 Vibe Coding 課程學習重點筆記

NTU Web Programming Vibe Coding 系列筆記

這是 NTU 台大 Web 網頁開發 Vibe Coding 課程 學習筆記系列:

📚 第一階段:基礎概念

💡 查看完整系列 | 🎓 Vibe Coding 學習資源

NTU 台大 Web 網頁開發 Vibe Coding 課程學習重點筆記

當人工智慧已經能在一分鐘內寫完你原本要花一週開發的程式碼,身為軟體工程師的你,下一步該如何定義自己的價值?

名言金句

「從想法到寫程式的這段過程已被 AI 取代,但從需求轉化為演算法的核心思考能力始終是開發者的護城河。」

NTU 台大 Web 網頁開發 Vibe Coding 課程學習重點筆記

核心論點

這門課程的重啟代表了軟體教育在生成式人工智慧浪潮下的範式轉移。過往網頁程式設計強調手把手編寫每一行程式碼,但在現代開發環境中,這樣的學習路徑已無法追上技術更迭的速度。教學的核心已從單純的語法記憶,轉向如何與 AI 協作,並在工具輔助下快速構建穩定且具備規模化的網路服務。

網路服務的開發遠比一般認知的網頁設計更為深奧。它不僅涉及視覺呈現的前端技術,更包含複雜的後端邏輯、資料庫架構以及伺服器端的運作機制。隨著前端技術發展至前所未有的高度,開發者必須建立完整的系統觀,理解軟體工程的生命週期,而不僅僅是處理零散的視覺元件或簡單的互動功能。

在自動化工具普及的時代,偵錯與問題解決的能力成為衡量專業度的關鍵指標。當 AI 產出的代碼出現錯誤或不符合需求時,開發者必須具備深厚的基礎知識來進行系統性的除錯。這意味著學習者需要掌握從邏輯推演、演算法設計到最後實踐的完整流程,確保技術工具是為解決問題服務,而非僅是盲目地複製與貼上代碼。

重點摘要

  1. 教學目標轉型:課程不再強調傳統的逐行手寫程式,而是引導學生進入 AI 協作模式,重點在於掌握 AI coding 的趨勢與精神,以因應未來軟體產業的技術變革。
  2. 開發環境的一致性:強調在類 Unix 系統下進行開發的重要性。要求使用 Windows 系統的學習者必須透過 WSL 建立 Linux 環境,確保開發工具與業界標準接軌,並減少環境配置不當導致的錯誤。
  3. 版本控制與流程規範:強制使用 Git 與 GitHub 進行代碼管理。這不僅是為了繳交作業,更是為了訓練學習者適應現代團隊協作的標準流程,包含建立規範化的目錄架構以利自動化管理。
  4. 課程資源與工具應用:提供學習者專業開發資源補助,鼓勵使用 GitHub Copilot 等先進工具,讓學員將精力集中在更高階的邏輯設計與系統架構思考上。
  5. 自主學習與淘汰機制:建立嚴格的學習評核與停修規範,強調在高強度的技術學習過程中,學習者必須展現出極強的自我管理與吸收能力,並對個人的學習進度負完全責任。
  6. 期末專題的實踐價值:要求學員組成團隊,從無到有構建一個具備實際用途的網路服務,並透過社群平台分享開發歷程,藉此累積實務經驗並建立個人專業品牌。
  7. 程式能力的重新定義:將程式能力拆解為構思、演算法設計、實踐與偵錯四個階段,明確指出前兩者與最後一者是人類開發者在 AI 時代必須守住的專業核心。

行動方案

  1. 你應立即在個人的電腦上建構完整的 Linux 開發環境。若你使用 Windows 作業系統,請務必安裝並熟練操作 WSL,這是確保開發流程符合業界標準的第一步。
  2. 你需建立一套結合 AI 輔助工具的工作流。在面對開發任務時,先嘗試由你定義問題架構與演算法邏輯,再引導 AI 產生基礎代碼,最後由你進行嚴格的測試與除錯。
  3. 你應該積極參與開發者社群與版本控制實踐。透過在 GitHub 上維護專案,並在社群中發表技術心得,將學習過程轉化為可被驗證的數位資產與專業實力。

問題反思

  1. 當 AI 能夠生成大部分的底層代碼時,你該如何調整你的學習權重,以確保自己具備引領 AI 解決複雜問題的系統設計能力?
  2. 在工具門檻大幅降低的背景下,一個優秀的網路服務與一個平庸的作品之間,本質上的差異將會體現在哪些維度?

心得結論

這部影片精準捕捉了當前軟體開發教育的轉折點。在技術紅利逐漸被工具抹平的年代,工程師的價值不再體現於對特定語法的熟稔度,而是體現於對問題本質的洞察與系統性思考的深度。課程透過嚴格的環境規範、工具引進與實戰專題,旨在將學習者從寫碼的勞動力轉化為具備創造力的系統架構者。這不僅是一門網頁設計課的開端,更是一次關於數位時代人才競爭力的深刻反思。

參考文件

NTU Web Programming (2025.09) -- 00. Course Introduction

NTU Web Programming 2025

使用 Cursor AI Editor 自學程式設計教學指南

· 閱讀時間約 5 分鐘

前言

在過去,自學程式設計往往需要依靠書籍、線上課程與不斷查詢文件。但隨著 AI 工具的發展,學習編程的方式有了根本性的改變。其中,Cursor AI Editor 作為一款內建 AI 協作的程式開發工具,正在迅速改變開發與學習的流程。

Cursor 是一款基於 Visual Studio Code(VSCode)打造的 AI 編輯器,結合了大型語言模型(如 GPT-4)的強大能力,提供自然語言詢問、程式碼補全、錯誤解釋、重構建議、即時除錯等功能。它不只是編輯器,更是學習者的私人助教。

本篇教學筆記將介紹 Cursor 的特色、安裝方式、學習策略與實際操作案例,幫助讀者高效且系統性地使用 Cursor 進行自學。


重點摘要

  • 什麼是 Cursor?

    • 基於 VSCode 打造的 AI 編輯器,內建 OpenAI 的 GPT 模型。
    • 主打「AI 內嵌互動」,能即時解釋、補全、建議與生成程式碼。
  • 為什麼用 Cursor 來自學程式?

    • 可以「邊寫邊問」:例如不懂 for 迴圈可以直接用自然語言提問。
    • 不需要來回切換 ChatGPT 網頁與 IDE。
    • 適合快速原型設計、除錯與重構練習。
    • 學習者可專注在理解邏輯與實作,不被語法阻礙。
  • 適合學習的語言

    • Python(入門首選)
    • JavaScript、TypeScript(網頁開發)
    • Go、Rust(系統程式)
    • HTML、CSS、React(前端設計)
  • 常見使用場景

    • 問語法與錯誤訊息
    • 撰寫函式與模組
    • 重構既有程式碼
    • 撰寫註解與單元測試
    • 撰寫教學與技術說明文件

安裝與啟用教學

Step 1:下載 Cursor

  • 前往官網:https://www.cursor.sh
  • 支援 macOS、Windows、Linux
  • 安裝後即為一個 VSCode-like 的獨立應用程式

Step 2:登入與模型設定

  • 使用 Google 或 GitHub 帳號登入
  • 免費帳號可使用 GPT-3.5
  • 若訂閱 Plus,可使用 GPT-4 Turbo,提升準確率與理解能力

Step 3:開啟專案或建立新檔案

  • 可直接開啟資料夾或單一檔案進行練習
  • 支援多種語言高亮與執行(視安裝套件而定)

實際學習範例

範例一:學習 Python 的 for 迴圈

操作步驟:

  1. 建立一個檔案 loop_example.py
  2. 輸入註解:
# 用 for 迴圈列出 1 到 10 的平方
  1. Cursor AI 自動補齊:
for i in range(1, 11):
print(i ** 2)
  1. 若不懂 range(1, 11),可選取並右鍵點選「Ask AI」,輸入:「這段 range 是什麼意思?」

  2. AI 回覆:

range(1, 11) 代表從 1 到 10(不含 11)的整數序列。


範例二:重構程式碼並學習函式封裝

原始碼:

print("Hello, Alice")
print("Hello, Bob")
print("Hello, Charlie")

操作:

  • 選取三行程式,點擊「Ask AI」→ Prompt:「將這段重構成一個函式並使用參數」

AI 回覆:

def greet(name):
print(f"Hello, {name}")

greet("Alice")
greet("Bob")
greet("Charlie")

你可以反向問 AI:「為什麼這樣寫比較好?」來進行設計思維學習。


範例三:查錯與除錯練習

錯誤程式碼:

for i in range(5)
print(i)

操作:

  • AI 會即時標出語法錯誤
  • 你可以點選錯誤紅線,詢問 AI「為什麼錯?」

AI 解釋:

缺少冒號,應改為 for i in range(5):

這能幫助初學者從錯誤中快速學習語法規則。


範例四:使用自然語言寫出完整函式

Prompt:

寫一個函式,輸入生日字串 "1990-05-20",回傳目前年齡(以今天為準)

AI 產生:

from datetime import datetime

def calculate_age(birthday_str):
birthday = datetime.strptime(birthday_str, "%Y-%m-%d")
today = datetime.today()
age = today.year - birthday.year - ((today.month, today.day) < (birthday.month, birthday.day))
return age

print(calculate_age("1990-05-20"))

你可以繼續問 AI:「請幫我加上類型註解與 docstring」。


自學策略建議

  • 從小功能練習開始:例如撰寫簡單計算器、字串反轉等
  • 每日一題 / 一功能:寫完後請 AI 幫忙檢查、重構
  • 主動問問題:任何看不懂的語法、邏輯、錯誤訊息都可以問 AI
  • 反覆重構與測試:藉由練習重構與單元測試培養良好工程習慣
  • 閱讀 AI 解釋:不要只複製貼上,理解 AI 為何這樣寫

總結

Cursor AI Editor 提供了一個嶄新的學習編程體驗,不需要離開編輯器、查 Stack Overflow 或切到 ChatGPT 頁面,就能獲得即時的回饋與教學。它讓程式碼本身成為教材,讓錯誤成為學習的入口,也讓初學者擁有如同一對一家教般的指導資源。

無論你是程式設計初學者、職涯轉職者,或是希望精進特定語言技巧的開發者,使用 Cursor 都能有效提升學習效率與成效。建議搭配一個實際專案(如 Todo App、API Server)作為學習主軸,在實作中成長,在 AI 引導下理解設計背後的邏輯。

參考文件

  1. 直覺式程式開發是什麼?

ChatGPT 自學程式設計:觀念、策略與實作練習介紹入門教學筆記

· 閱讀時間約 4 分鐘

前言

在資訊科技快速發展的時代,程式設計已成為現代人重要的素養之一。不論是為了轉職、創業、副業開發,還是單純提升邏輯思維與解決問題的能力,學習寫程式都是一項值得投資的技能。

然而,對初學者而言,最大的挑戰往往不是語法的難度,而是缺乏明確的學習路線與即時回饋。在這樣的情況下,ChatGPT 作為 AI 學習助手,能提供清晰的知識講解、逐步拆解邏輯、即時錯誤診斷與練習引導,大大提升了自學效率與信心。

本筆記整理了使用 ChatGPT 進行程式設計學習時的觀念、策略與實作練習方法,希望幫助初學者建立穩固的基礎與正確的學習路徑。

重點摘要(策略與觀念)

  1. 明確學習目標

    • 選定學習語言(如 Python, JavaScript)與應用目標(如網站開發、數據分析、App 開發)
  2. 建立學習流程:輸入+實作+反思

    • 使用 ChatGPT 學習語法與邏輯概念(Input)
    • 嘗試手寫程式並請 AI 協助 Debug(Practice)
    • 回顧錯誤原因與改法,加強理解(Reflection)
  3. 以問題導向學習(Problem-Driven Learning)

    • 先丟出問題給 ChatGPT,觀察如何解決,再嘗試自己實作
    • 例如:「如何用 Python 產生一份購物清單報表?」
  4. 善用 ChatGPT 作為「教練」而非「代工」

    • 避免單純複製貼上,要請 ChatGPT 解釋邏輯、逐步引導、釐清不懂的概念
  5. 模擬真實開發場景進行專題實作

    • 例如模擬一個 To-Do List 應用、API 串接應用、爬蟲專案等,請 ChatGPT 協助拆解需求與架構設計

ChatGPT 學習策略示範

策略一:從概念切入,請 AI 解釋底層邏輯

提問範例

請用 Python 說明變數與資料型別的差異,並舉實際應用範例

ChatGPT 回應重點摘要

  • 變數:用來儲存資料的名稱
  • 資料型別:資料的類型(整數、字串、布林等)
  • 實作範例:
name = "Alice"       # 字串 (str)
age = 30 # 整數 (int)
is_student = False # 布林 (bool)
height = 165.5 # 浮點數 (float)

策略二:進行逐步練習題,練邏輯思考與語法應用

提問範例

我想練習寫 if-else 判斷式,請出三題由簡入難的題目,並在我寫完後幫我檢查錯誤與優化建議

ChatGPT 回應可能為

題目一:請判斷一個數字是正數、負數或零 題目二:請判斷某年是否為閏年 題目三:根據使用者輸入的成績(0~100),輸出等第(如 A、B、C)

學生寫完程式碼後可貼上請 AI 檢查,ChatGPT 會指出邏輯問題、格式建議、寫法優化,例如:

score = int(input("請輸入成績:"))
if score >= 90:
print("A")
elif score >= 80:
print("B")
elif score >= 70:
print("C")
else:
print("D")

策略三:模擬專案開發並逐步請 AI 協助拆解需求與設計程式架構

專案題目:待辦事項清單(To-Do List)CLI 應用程式

ChatGPT 輔助設計流程

  1. 功能需求列出(使用者可以新增、刪除、顯示任務)
  2. 資料結構設計(使用 list 儲存任務)
  3. 撰寫基本操作函式(add_task(), remove_task(), show_tasks()
  4. 主選單邏輯與互動介面

實作初步程式碼

tasks = []

def add_task(task):
tasks.append(task)

def remove_task(index):
if 0 <= index < len(tasks):
tasks.pop(index)

def show_tasks():
for i, task in enumerate(tasks):
print(f"{i+1}. {task}")

while True:
print("\n1. 新增任務\n2. 移除任務\n3. 顯示任務\n4. 離開")
choice = input("請輸入選項:")

if choice == "1":
task = input("輸入任務內容:")
add_task(task)
elif choice == "2":
index = int(input("輸入任務編號:")) - 1
remove_task(index)
elif choice == "3":
show_tasks()
elif choice == "4":
break
else:
print("無效選項,請重新輸入")

延伸練習:資料儲存加上檔案輸出(使用 JSON 或 TXT)、加入完成/未完成狀態、排序等


總結:AI 是鏡子,也是橋樑

ChatGPT 並不是神奇的萬能程式魔法師,但它是一面鏡子,能幫助你檢視自己的邏輯與觀念;它是一座橋樑,讓你跨越學習上的卡關與挫敗。

重點從來不是 ChatGPT 替你「寫」了什麼,而是你透過它學會「怎麼思考、怎麼問問題、怎麼拆解需求、怎麼 debug」。

透過這樣的過程,你學到的不只是語法,而是解決問題的能力。這才是真正的程式設計思維,也是真正能走得長遠的自學之路。

參考文件

  1. 直覺式程式開發是什麼?

使用 ChatGPT 自學程式設計指南

· 閱讀時間約 5 分鐘

前言

在過去,學寫程式意味著需要投入大量時間閱讀厚重的教材、反覆摸索錯誤訊息的意義,甚至在 Stack Overflow 上尋求救援。而如今,透過 AI 工具的協助,例如 ChatGPT、GitHub Copilot、Cursor 等,初學者能更快速地理解語法、解決錯誤、模擬情境,提升學習效率。然而,AI 工具並不能替代你的思考,它是加速學習的助力,但不是學習的捷徑。

使用 ChatGPT 自學程式設計指南

在人工智慧快速發展的時代,學習寫程式不再是一條孤單、艱難的路。現在有了 ChatGPT 這樣的語言模型作為學習輔助工具,自學者不再需要花大量時間在搜尋資料、理解英文技術文檔或等待他人回答問題上。你可以隨時向 ChatGPT 發問、請它幫忙解釋觀念、修正錯誤,甚至請它幫你出練習題,進行模擬面試。只要方法得當,ChatGPT 可以成為你學習程式設計過程中最可靠的學伴。

本筆記將說明如何結合 ChatGPT 學習程式設計的策略,並透過一個 Python 小專案,實際示範學習流程。

為什麼選擇 ChatGPT 自學程式設計?

過去自學程式最困難的部分在於:

  1. 資源太多,不知從何下手
  2. 卡關時找不到人問問題
  3. 英文技術文件理解困難
  4. 缺乏練習與回饋機制

而 ChatGPT 正好可以解決這四點。你可以用自然語言提問,像對一位資深工程師學習,快速獲得解答、範例與練習題。


建議學習語言:Python

Python 是目前最推薦的入門語言,原因包括:

  • 語法簡單、可讀性高
  • 廣泛應用於網頁後端、資料分析、機器學習
  • 有豐富的學習資源與社群
  • ChatGPT 對 Python 的支援度最佳

ChatGPT 自學步驟建議

步驟一:建立學習計畫

你可以直接問 ChatGPT:「我是一個程式設計初學者,請幫我規劃一份 30 天的 Python 自學計畫,每天學習 1 小時。」

它會給你一份條列式進度表,包含觀念、實作與資源建議。

步驟二:每個主題搭配 ChatGPT 提問

舉例:你在學「變數與資料型別」,可以問:

  • 什麼是 Python 中的變數?
  • 請舉幾個整數、浮點數、字串的例子。
  • 有哪些常見的型別轉換方法?

ChatGPT 回答後,請自己動手寫一段練習程式確認理解。


小專案練習:待辦清單 CLI 程式

這是一個適合初學者練習的 Python 小專案,透過這個例子,你可以學到以下基礎概念:

  • 變數與資料型別
  • 陣列(列表)
  • 函式定義
  • 使用 while 迴圈與 if 條件判斷
  • 使用 input() 與 print()

專案目標

製作一個可以在命令列中操作的待辦清單程式,讓使用者可以新增、刪除與列出事項。

程式碼示範

todo_list = []

def show_menu():
print("\n--- 我的待辦清單 ---")
print("1. 新增事項")
print("2. 查看清單")
print("3. 刪除事項")
print("4. 離開")

while True:
show_menu()
choice = input("請輸入選項(1-4):")

if choice == "1":
item = input("請輸入待辦事項:")
todo_list.append(item)
print("已新增!")
elif choice == "2":
print("\n--- 待辦事項 ---")
if not todo_list:
print("清單是空的")
else:
for i, task in enumerate(todo_list):
print(f"{i + 1}. {task}")
elif choice == "3":
index = int(input("請輸入要刪除的編號:")) - 1
if 0 <= index < len(todo_list):
removed = todo_list.pop(index)
print(f"已刪除:{removed}")
else:
print("無效的編號")
elif choice == "4":
print("感謝使用,再見!")
break
else:
print("無效的輸入,請重新輸入 1-4")

這個小專案完整結合了輸入輸出、資料儲存、條件與迴圈控制結構,是一個理想的練習題目。


如何用 ChatGPT 擴充與優化

完成後你可以繼續問 ChatGPT:

  • 我要加上「儲存清單到檔案」功能該怎麼做?
  • 我要讓這個程式使用英文與中文雙語介面?
  • 請幫我用物件導向方式重構這段程式。

你會發現,透過這樣的對話過程,你正在一步步學會更進階的程式技巧與架構設計觀念。


自學關鍵原則

  1. 主動提問:卡住時請立即向 ChatGPT 提問,避免原地打轉。
  2. 多做小專案:觀念看過就忘,實作才記得住。
  3. 理解 AI 回答,而非只是複製貼上:每次用 ChatGPT 給你的程式碼時,都要確實理解它的邏輯。
  4. 刻意練習 + 反饋迴圈:請 ChatGPT 幫你批改程式、找出錯誤、提出改進建議。

總結

程式設計不再是一門只能靠天份與背景的技能。現在,只要你有好奇心與持續練習的動力,結合像 ChatGPT 這樣的 AI 工具,任何人都能成為開發者。

你可以從「請幫我寫一支輸出 Hello, World 的 Python 程式」這樣簡單的對話開始,到最後獨立完成一個個有用的小工具。這不僅是一條技能學習的道路,更是你建立邏輯思維、自信心與問題解決力的旅程。

現在就打開你的編輯器,開始寫第一行程式吧。如果你不知道該寫什麼,試著問 ChatGPT:「今天我可以練習什麼 Python 題目?」

參考文件

  1. 直覺式程式開發是什麼?

程式設計共學營學員回饋心得

· 閱讀時間約 2 分鐘

林同學:

"我覺得這個課程非常棒
內容非常豐富
助教也會積極回答問題❤️
非常喜歡這個課程,希望未來可以增加更多的課程😆
唯一的缺點可能是進度有點快了點就有一回課程,到後面幾乎快跟不上了,希望能放慢一點速度~"

洪同學:

學到甚多爬蟲知識可應用於工作上~謝謝

楊同學:

之前因為有轉職的念頭,所以找了很多資源,python部分網路其實也有參考udemy的部分,覺得你們的課程安排難易度蠻不錯的,覺得之後可以朝坊間一些課程設計出一個彈性的roadmap,讓大家知道未來如果想走向前後端,學習的路徑和課程怎麼規劃,再結合專題實例,讓大家可以整理出自己的作品。

李同學:

整個課程下來覺得自己進步非常多! 之前有參加過相關社團,但不像這個課程一樣那麼循序漸進,一步步由淺入深。很喜歡每週發布新作業任務的感覺,很像在闖關玩遊戲,把任務都做完也很有成就感。唯一一個建議是有些小地方(code)可以再寫的清楚一點,這樣比較可以省去額外查資料的時間! 期待你們之後開設其他進階課程!

潘同學:

謝謝這一系列的課程,讓我學習新知的同時又有複習到舊有的,而且還真正實際練習專案,非常感謝

黃同學:

"謝謝這次課程~
難度適中,讓初學的我感覺有具體成長又不被挫敗擊垮
也讓我從比較廣泛的角度了解整個電腦科學與程式概論,感覺有整體的概念,再看到
其他文章和課程也比較知道在藍圖的哪個位置"

林同學:

課程設計有條理,且內容難易適中,讓我在兩個月內就能對Python的基本概念有所理解。

林同學:

課程中學習到很多Python入門的知識,但有些課程中的範例較生硬(ex.質數),對於初學者來說有點難理解,但整體作為入門的學習覺得吸收良多!

汪同學:

課程簡單,適合入門選擇。期待後續進階課程。

李同學:

"""很喜歡你們這系列的課程!
實作導向的課程設計真的可以學得很快
希望之後可以多出一些新的課程!很期待"""

Matplotlib / Pandas 資料分析繪圖顯示中文字體入門教學

· 閱讀時間約 6 分鐘
  1. 前言
  2. 認識圖表專有名詞
  3. 解決中文字體空白方法
  4. 總結

前言

MatplotlibPandas 是兩個在資料科學專案中時常使用的兩個套件。Pandas 主要用於資料輸入輸出及資料分析操作,而 Matplotlib 主要是用來資料視覺化,呈現圖表使用,兩者可以單獨也可以搭配使用。在使用 Matplotlib 繪製圖表的中文使用者最常會遇到的問題就是中文字體在預設的 Matplotlib 顯示不出中文字體。接下來我們就透過範例程式一步步手把手帶領大家如何在 Matplotlib 顯示圖表的中文字體標籤和說明圖示(本文假設讀者對於 Python 程式語法、Pandas 和 Matplotlib 已有基本認識)。

認識圖表專有名詞

Matplotlib 中有一些專有名詞,若能掌握住將對我們接下來學習如何在 Matplotlib 使用中文字體會很有幫助。

(1) Figure: 代表整個面板 (2) Axes: 代表整個圖表 (3) Axis: 代表軸 (4) Legend: 代表圖示說明 (5) Label: 代表軸標頭 (6) Title: 代表圖表標頭

解決中文字體空白方法

解決中文字體空白或是顯示不出來的問題,主要解法有以下兩種:

  1. 在程式中引入支援中文的字體並於需要顯示的地方當作參數使用
  2. 透過本機端電腦參數設定和字體檔案放置到對應資料夾(可以不用每次在程式中指定字體,但第一次設定步驟較為繁瑣)

接下來本文會先透過一個範例優先介紹 在程式中引入支援中文的字體 這種作法。

範例程式

Step 1. 規劃目標並準備資料 目標:我們希望透過長條圖顯示桃園地區結婚對數,了解結婚分布狀況。

資料集使用政府開放資料中 108 年度桃園地區結婚對數資料集,我們下載 .csv 檔案後更改檔案名稱為: marriage.csv。檔案內容如下:

月份區域別,一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月
桃園區,305,202,240,177,272,221,184,109,222,251,223,268
中壢區,271,198,215,213,222,219,188,94,240,246,215,269
大溪區,54,46,40,37,64,58,38,20,47,74,46,48
楊梅區,103,69,91,71,95,99,81,41,89,115,98,121
蘆竹區,100,72,77,80,92,87,70,38,96,95,103,86
大園區,59,38,40,37,61,53,42,15,49,57,53,50
龜山區,100,64,80,75,86,85,82,46,102,92,80,91
八德區,138,98,114,104,133,122,108,57,108,121,105,130
龍潭區,75,52,67,78,72,49,74,26,76,69,73,83
平鎮區,151,97,110,115,144,132,127,55,115,138,138,150
新屋區,37,15,14,24,21,20,24,7,26,21,23,26
觀音區,45,21,38,31,43,32,29,14,45,31,32,40
復興區,11,4,8,5,6,8,6,5,8,6,7,4

Step 2. 載入資料

import pandas as pd

# 讀入資料集檔案
df = pd.read_csv('married.csv')

接著要取出我們想要顯示圖表的資料:

# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)

印出內容:

   月份區域別   一月
0 桃園區 305
1 中壢區 271
2 大溪區 54
3 楊梅區 103
4 蘆竹區 100
5 大園區 59
6 龜山區 100
7 八德區 138
8 龍潭區 75
9 平鎮區 151
10 新屋區 37
11 觀音區 45
12 復興區 11

並設定 dataframe index 為 月份區域別 當作 x 軸,因為原本 預設 index 為 0, 1, 2, ...

# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)

印出內容:

        一月
月份區域別
桃園區 305
中壢區 271
大溪區 54
楊梅區 103
蘆竹區 100
大園區 59
龜山區 100
八德區 138
龍潭區 75
平鎮區 151
新屋區 37
觀音區 45
復興區 11

Step 3. 繪製圖表 接著我們於程式最上方引入 matplotlib 套件並使用別名繪製長條圖:

import matplotlib.pyplot as plt


# kind 定義圖表類型。plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')

Step 4. 中文化 若使用自行設定字體若有中文字的地方都要給定字體才不會出現亂碼或空白(ex. title, label, legend 等),這邊我們使用 NotoSansCJK-Black(也可以自行選擇支援中文的字體)可以在 下載連結 下載使用並放入和程式同一個專案工作資料夾下。

# 使用 FontProperties 建立字體屬性物件
myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)

# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)

其中特別需要注意是 xlabel 需要一一取出設定字體:

# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)

Step 5. 呈現成果

# 顯示圖表
plt.show()

完整程式碼:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 讀入資料集檔案
df = pd.read_csv('married.csv')

# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)
# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)
# plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')

myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)

# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)

# 顯示圖表
plt.show()

執行結果:

總結

  1. 前言
  2. 認識圖表專有名詞
  3. 解決中文字體空白方法
  4. 總結

以上透過範例介紹圖表的專有名詞及講解如何設定支援中文字體的物件,並讓 matplotlib 圖表可以顯示中文字體。相信讀者跟著操作可以快速解決 matplotlib 不能顯示中文字體的惱人問題。若有討論或是問題歡迎留言和我們一起交流學習喔!

如何在終端機下使用 conda 指令管理虛擬環境

· 閱讀時間約 2 分鐘

Python 虛擬環境本質上是一個資料夾,讓我們可以根據不同專案去管理所需要的環境,安裝不同版本的套件避免衝突(例如:某專案需要套件的版本不同)。除了在 Anaconda 圖形化介面環境設定虛擬環境外,我們也可以使用 conda 指令管理虛擬環境。

指令操作

首先,打開 Terminal 終端機 / Anaconda Prompt,我們可以使用 conda 進行指令碼的操作,包括原本使用 GUI 圖形化操作的建立虛擬環境資料夾(工作環境)和安裝套件等操作,進而讓我們的專案獨立使用自己的空間(當然也可以不使用,直接共用 base 工作環境,這邊先記住可以因為不同專案開設不同的虛擬環境來隔離不同的套件安裝)。目前暫時不會用到,可以先記得有相關指令可以管理虛擬環境就好。

檢視目前 conda 的版本:

conda --version

查看 conda 指令的說明文件:

conda --help

建立新的工作環境且安裝自行指定的 Python 版本(ENVIRONMENT 為自行命名環境名稱,ex. demo_project):

conda create --name ENVIRONMENT python=3.6

切換至指定虛擬工作環境(ENVIRONMENT 為自行命名環境名稱。ex. demo_project):

conda activate ENVIRONMENT

離開虛擬工作環境回到 base 基礎工作環境:

conda deactivate

移除指定虛擬工作環境:

conda remove --name ENVIRONMENT --all

程式挑戰:全域變數和區域變數可視範圍 Variable Scope

· 閱讀時間約 3 分鐘

給定 C 語言程式如下,其中 s 被宣告為全域變數,給定值為 1。請問最後程式執行後輸出為何?

#include <stdio.h>


int s = 1; // 全域變數

void add(int a) {
int s = 6;
for (; a >= 0; a = a - 1) {
printf("%d, ", s);
s++;
printf("%d, ", s);
}
}

int main() {
printf("%d, ", s);
add(s);
printf("%d, ", s);
s = 9;
printf("%d", s);
return 0;
}

(A) 1, 6, 7, 7, 8, 8, 9 (B) 1, 6, 7, 7, 8, 1, 9 (C) 1, 6, 7, 8, 9, 9, 9 (D) 1, 6, 7, 7, 8, 9, 9

參考解答

答案為 (B) 1, 6, 7, 7, 8, 1, 9

本程式挑戰主要在測試同學對於「全域變數」(Global variable)、「區域變數」(Local variable)的生命週期和變數可視範圍(Scope)的理解。若是函數內沒有宣告變數卻使用該變數,則會往外看是否有同名變數,若有則使用該變數。在主程式外的宣告的變數為全域變數,程式內的跨函式都可以存取、修改該變數,若是在函式內宣告的變數或參數變數則為區域變數,區域變數存取修改權僅限於該函式內,函式結束即消失。

#include <stdio.h>

// 全域變數
int s = 1;

void add(int a) {
// 區域變數 s
int s = 6;
// 區域變數 a,值為 1
for (; a >= 0; a = a - 1) {
// 迴圈兩次,第一次印出 6,第二次印出 7
printf("%d, ", s);
// s = s + 1
s++;
// 迴圈兩次,第一次印出 7,第二次印出 8
printf("%d, ", s);
}
}

int main() {
// s 在主程式中找不到,所以為全域變數 s,值為 1
printf("%d, ", s);
// 複製傳入參數值為 1
add(s);
// 全域變數 s,值為 1
printf("%d, ", s);
// 更改全域變數 s,值為 9
s = 9;
printf("%d", s);
return 0;
}

我們可以透過觀察程式執行的過程來判斷(在 C 語言我們以主程式 main() 為執行區塊,由上往下執行):例如在 main() 函式內部 s = 9; 這行之前的 s 使用的是全域變數 1。因此傳入 add() 函式的 a 參數為 1。因此 for 迴圈會進行兩次後結束,印出 6, 7, 7, 8add 函式內的 s 為自己內部宣告的區域變數非外部的全域變數 1,所以不影響到全域變數 s

最後main() 函式內部使用到的 s 全域變數(前面沒有設定變數型別),被改成 9

s = 9

所以結果為:1, 6, 7, 7, 8, 1, 9

另外還有區塊變數(Block variable)是指宣告在某個陳述句區塊之中的變數,例如 while 迴圈或是 for 迴圈區塊內使用,區塊結束即消逝。

#include <stdio.h>

int main() {
int i = 101;

for (int i = 0; i < 10; i++) {
// 不受外面的 i 影響
printf("%d", i);
}
// 印出的是 101
printf("%d", i);
}

其結果為:0123456789101

參考文件

  1. Wiki C 語言
  2. csie ntnu

看懂 IT 術語:AI 人工智慧

· 閱讀時間約 2 分鐘

人工智慧(Artificial Intelligence)是一門綜合性學科(包含電腦科學、醫學、機器人學、腦神經科學、數學、統計學、經濟學、哲學等),主要研究方向為研究發展和人類類似或是超越人類智慧及能力的電腦系統。機器學習(Machine Learning)深度學習(Deep Learning)是目前人工智慧主要的實踐技術及研究。而巨量和多元的大數據(Big Data)資料則提供人工智慧很好的研究素材和原料,成本持續下降的運算硬體資源則提供人工智慧領域很好的背景支持(例如:雲端運算、GPU、TPU 等)。

若以製作料理的角度來看,大數據(Big Data)就是食材、機器學習(Machine Learning)就是烹飪方式,讓人大快朵頤的美味料理就是人工智慧(Artificial Intelligence)

圖片來源

人工智慧就是讓電腦系統能像人類一樣學習和思考,但是目前對於「智慧」難以有確切的定義,於是將人工智慧區分為「強人工智慧」(Strong AI)和「弱人工智慧」(Weak AI) 兩種不同的主張。「弱人工智慧」只能模擬人類的思維與行為表現,但缺乏真正的推理與解決問題的能力,也不具備有自主意識,並不具備人類的思考能力。目前市面上多數「人工智慧」產品或技術主要都是「弱人工智慧」。舉例來說,目前人工智慧在特定領域已經和人類相當甚至超越人類(例如:語音、影像辨識服務、遊戲競賽、棋藝對奕人工智慧等),這些就屬於弱人工智慧。

參考文件

  1. Wiki 人工智慧
  2. Wiki 機器學習

跨領域自學程式設計常見問題解析 FAQ

· 閱讀時間約 10 分鐘

隨著資訊科技的發展以及 108 年課綱列入程式設計和資訊科技能力素養相關科目,讓許多家長和學生,甚至是職場上班族開始思索是否要開始進修學習資訊技能以及自學程式設計,以免自己或小孩輸在人生的競技場中。過去一段時間我們 HappyCoder 自學程式設計學院社群輔導超過 3000 位學員跨領域學習程式設計,有許多學員和社群朋友提出許多關於跨領域自學程式設計的相關疑問。為了能讓更多的人可以對於跨領域自學程式設計有更清楚的認識,我們整理了以下常見自學程式設計相關的問題,希望能解決許多朋友心中的疑惑,也歡迎大家一起加入我們,一起交流討論,分享你的自學程式設計經驗。

關於跨領域自學程式設計你想知道的都在這裡了

問題一:自學程式設計是在學什麼?

在學習一項新的技能或是才藝時若能明確自己的目標和動機可以讓學習的路上更為順遂。所以事先釐清自己的動機、目的和需求才開始選擇合適的程式語言和工具以及合適的學習資源才是跨領域自學程式設計的第 0 步開始。一般而言跨領域非資工資管等資訊相關科系的學生自學程式主要有分三種方向和動機:

1. 希望轉換跑到轉職成為程式設計師和軟體工程師

事實上,程式設計師或是軟體工程師若是對於撰寫程式和解決問題很有熱忱的話,是一個十分令人羨慕的職業:因為可以將興趣和職業相結合,這是許多工作比較難有辦法達到的部分。

若是以希望轉換跑到轉職成為程式設計師和軟體工程師為目標的話,著重的主要就是求職相關技能的養成,包含對應職業的職能培養、履歷撰寫、面試技巧和軟體工程師素養的養成等。例如:Web 前端軟體工程師、Web 後端軟體工程師、Mobile 行動應用工程師、IC 設計演算法工程師、IoT 軟硬整合工程師/嵌入式系統開發、Blockchain 開發者、DevOps 開發運維以及資料科學家、資料工程師、資料分析師等分別有不同和共同的工作職能需要養成。但需要注意的是 IT 資訊科技產業技術和新知變化快速,要有願意持續刻意練習和克服困難的毅力、自學能力和熱情才能走的長久。

至於如何準備轉職面試、如何度過新手期,如何規劃軟體工程師的職涯發展,資淺工程師如何邁向資深工程師,這部份議題太大太廣,需要之後另外開主題來討論。

2. 磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力

這部份是我們 HappyCoder 自學程式設計學院致力於推廣的自學程式設計精神。學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。由於撰寫程式最重要的其實是需求分析和系統設計的部分,在這個階段透過問題的拆解、模式識別和歸納、抽象化以及問題的分析與演算法設計等都是很好用來培養解決問題、搜尋資料和團隊溝通協調合作的機會。換言之:學習程式設計並不等於學習運算思維,只是透過正確的方式學習程式設計是學習運算思維和解決問題的能力相對快且有效的方式之一

那學習運算思維和解決問題有什麼好處呢?事實上,生活中無處不需要運算思維(Computational Thinking)和解決問題的能力。舉凡規劃旅行計畫、分析投資策略、通勤路線規劃、購物選擇、工作商業邏輯分析等。而培養跨領域自學能力則是在各行各業面對自動化 AI 人工智慧等科技發展很重要的競爭力。

學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。而是在學習程式設計的過程中,磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力,成為更好的自己

3. 學習基礎程式設計用於解決自己專業領域或生活上重複繁瑣的工作

這時候主要是根據想解決的問題去學習和選擇適合的程式語言工具,用來解決生活上的問題。例如:學習 Python 網路爬蟲自動化爬取資料、學習使用 Pyhon 操作 Excel 減少重複性工作、製作小遊戲自娛娛人、開發聊天機器人自動回覆訊息提升工作效率等。

問題二:自學程式設計英文要不要很好?

初期不一定需要,但若具備良好的英文閱讀和理解能力,將讓自己在學習進階內容時可以更快理解內容。這個原因在於目前程式語言主流資訊和學習資源以英文為主,若是具備好的英文能力將有助於學習相關知識,尤其若是學習目標為轉職程式設計師和軟體工程師的話,這部份尤為重要。未來若是希望往資深工程師或是更高深的領域鑽研的話,英文閱讀和理解以及能夠在工作場合、論壇或是演講以英文書寫、口語表達自己的能力就非常重要。

問題三:自學程式設計數學要不要很好?

看目標需求而定。若是志在轉職程式設計師和軟體工程師的話,大部分情況下數學能力只要高中程度即可(前提是高中有好好學習)。若是希望轉職資料科學家或是機器學習專家等對於統計學、離散數學和線性代數等數學能力有更高的要求。所以簡而言之,大部分的情況下軟體工程師更重要的是理解能力、自學能力和邏輯和抽象化歸納能力,在特定領域或是研究機構數學能力相對要求比較高。

問題四:自學程式設計要學什麼程式語言?

端看你的需求決定需要學習哪一種程式語言。若是希望轉職軟體工程師或是程式設計師,可以先從 Web 開發入門,相對而需求量較多也比較容易讓跨領域自學的人進入。對於 Web 開發、前端基本需要學習 HTML/CSS 語法以及 JavaScript 程式語言(也可以使用 NodeJS 用於後端開發)。若是 Web 後端則可以選擇 Python、Ruby、PHP、Java 等。行動應用則是選擇 Android(Java/Kotlin)或是 iOS(Swift/Objetive-C)。若是有志於資料科學相關職涯發展的話 Python 是推薦入門的程式語言。若是對於嵌入式系統應用有興趣,C/C++ 就是首選程式語言。

若是你希望磨練運算思維(Computational Thinking)和解決問題的能力、學習基礎程式設計用於解決自己領域或生活上重複繁瑣的工作,選擇 Python 程式語言是很好的入門方式。

問題五:超過 30 歲自學程式設計轉職軟體工程師合適嗎?薪水待遇好嗎?

因人而異。不可諱言越年輕轉職成本越低,因為家累負擔小,機會成本低。隨著市場上軟體工程師的缺口增加,當然也有不乏更年長的朋友轉職成功,但年紀越大需要的是完善的規劃、毅力和執行力。一般會建議若是非本科生跨領域自學程式設計轉職軟體工程師或程式設計師可以和本身領域有相關,這樣一來你過去的經驗就是加分,尤其現在跨領域人才越來越被重視。舉例而言:若是你過去的背景在金融銀行相關,在現在純網銀和金融科技快速發展的情況,若能把握相關機會則是相對單一背景的競爭者更好的優勢。

至於待遇則是因人、產業、地點而異。程式設計師和軟體工程師是一個特別的職業,一個頂尖軟體工程師的生產力和一個平庸的軟體工程師可能會差異到 10 倍甚至更多,當然依照生產力的不同也會有不同的待遇(當然有時還是要看機運和個人品牌及人際網路的經營)。此外選擇在矽谷灣區等網路軟體產業蓬勃發展的地方,軟體工程師薪資待遇當然會比在其他地方好上許多。另外,以網路軟體研發工程師為主的公司,也會比工程師只是配角的公司好。

若是有志於從事軟體工程師的職業,就要有不斷學習新知的認知和熱情,才能在不斷更迭變化的技術圈中持續進步。

問題六:自學程式看書?還是上課好?還是考一個資工資管相關碩士?

因人而異。若是想先嘗試是否合適可以先選擇看書自學,接著可以參與一些線上或線下課程,但最重要的還是能參與一個有好的同儕可以彼此激勵分享經驗的學習環境和社群。當然,若能有導師協助帶領則可以讓自己少走許多冤枉路。

對於一些新創公司或小公司來說學歷可能不是很重要(但還是要看職位,若是資料科學家相關職位對於是否有相關學術經驗可能就蠻重要的),能夠馬上實戰的即戰力是最重要的。但對於一些規模較大的公司,不管是升遷或是入職時對於學歷要求還是比較看中(事實上,學歷的重點在於打入另外一個人際網路連結)。另外,若是希望在美國等海外工作,最大的問題其實是簽證問題。所以許多海外求職朋友會在海外再額外拿一個碩士學位,獲得相關簽證爭取留在當地工作的機會。

當然若是希望成為資深軟體工程師,不斷鑽研學習和補足電腦科學基礎理論是很重要的一環,此外,向上管理、溝通協調、領導統御、系統分析設計等能力更是重要的軟實力。

問題七:小孩想要學習程式,家長該如何協助?

先釐清為何要學習程式,並不用刻意的強求小朋友一定要學習程式語言,小孩重要的是陪伴和鼓勵以及探索自己的興趣。若是比較小的朋友會建議以磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力為主。若是國中小的學生可以先從不插電書籍或是桌遊學習程式設計邏輯思考和電腦科學概念,接下來可以透過 ScratchMicrobit 等簡易拖拉式程式語言工具著手,更進一步則可以導入 Python 進行簡單小遊戲或應用程式開發,培養興趣和成就感。

總結

  1. 問題一:自學程式設計是在學什麼?
  2. 問題二:自學程式設計英文要不要很好?
  3. 問題三:自學程式設計數學要不要很好?
  4. 問題四:自學程式設計要學什麼程式語言?
  5. 問題五:自學程式看書?還是上課好?還是考一個資工資管相關碩士?
  6. 問題六:超過 30 歲自學程式設計轉職軟體工程師合適嗎?薪水待遇好嗎?
  7. 問題七:小孩想要學習程式,家長該如何協助?

以上整理跨領域自學程式設計常見問題解析,在開始你的自學程式設計還是要先確認自己的目標和動機,才能走好接下來的每一步。

若是讀者們對於自學程式設計相關問題還有疑問的話,歡迎在下方留言,我們會陸續更新整理。若是覺得我們的文章寫的不錯,也歡迎給我們按讚分享鼓勵:)

歡迎在網路社群上訂閱追蹤我們,免費獲得自學程式設計教學、學習資源和課程資訊!

參考文件

  1. 自學程式設計學習資源懶人包
  2. 用 Python 自學程式設計:程式設計思維入門
  3. 想要自學程式?七個自學程式設計正確的觀念和心態

(Photo by Dlanor S on Unsplash)

新手村系列:Markdown 和 HTML 基礎語法教學

· 閱讀時間約 6 分鐘

Markdown 是一種輕量級的標記語言,最初為 John Gruber 所設計。Markdown 特色在於允許人們「使用易讀易寫的純文字格式編寫文件,然後轉換成有效的 HTML 文件」。簡而言之,Markdown 就是一種簡潔易懂的語法,讓我們可以專注在內容上,不用花時間思考外觀樣式,在透過轉換變成可以呈現在網頁上的 HTML 語法。目前在許多知名技術/開發者論壇或是開發者工具(例如:Github)、技術部落格工具都有支援 Markdown 語法。

什麼是 HTML?

在開始學習 Markdown 之前我們先來認識一下 HTML,畢竟 Markdown 最終還是要轉換成 HTML 這個網頁上內容結構的標準語法。HTML 中文稱作超文本標記語言(英文全名為 HyperText Markup Language,簡稱 HTML),是一種用於建立網頁的標準標記語言。

這樣講起來有點抽象,事實上我們每天在觀看瀏覽的網頁就是由一個個 HTML 所組成。所以我們可以透過瀏覽器的檢視原始碼功能去一窺目前網頁的 HTML 樣貌。

這邊我們使用 Google Chrome 瀏覽器當作範例,可以在畫面中點選右鍵 > 檢視原始碼(View Page Source):

就可以看到該網頁的 HTML 內容:

網頁來源:Wikipedia HTML 頁面

由於這個網頁已經有點複雜,因為它已經包含了 CSS 外觀樣式語法和 JavaScript 互動邏輯程式的部分,對於初學者來說比較難一眼理解。所以我們用一下範例來介紹 HTML 最基礎的部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>我是標題</h1>
<p>我是段落</p>
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png" alt="">
</body>
</html>

若是使用瀏覽器打開這個 HTML 網頁會呈現:

HTML 標籤語法每個標籤皆有其意義且大部分成對出現,標籤元素內可以設定屬性值。網頁元素主要放置於 <body></body> 中,<head></head> 內主要放置 meta data 設定檔案和放置引入的外觀樣式檔案、程式邏輯等。元素內可以透過設定屬性值(attribute)來宣告元素功能,以下 href="https://zh.wikipedia.org/zh-tw/Markdown" 代表點擊該連結會到該 wikipedia 網址。

<!-- href 是屬性,決定連結點擊後目的地 -->
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>

<!-- src 是屬性,決定載入圖片位置-->
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">

元素包裹內容在內,代表標題元素:

<h1>我是標題</h1>

Markdown 常見語法教學

一般 Markdwon 段落以空白行分隔。若是序列則內容需要內縮(一個 tab)。

標題

是一级標題
=======

# 一級標題
## 二级標題

其 HTML 元素為:

<h1>是一级標題</h1>
<h1>一級標題</h1>
<h2>二级標題</h2>

效果如下:

是一级標題

一級標題

二级標題

文字

_斜體_
**粗體**
`等寬字型Monospace`

其 HTML 元素為:

<em>斜體</em>
<strong>粗體</strong>
<code>等寬字型Monospace</code>

效果如下:

斜體 粗體 等寬字型Monospace

多行程式碼

其 HTML 元素為:

<pre>
<code>
<span>print('hello world')</span>
</code>
</pre>

效果如下:

print('hello world code :)')

水平線

---

其 HTML 元素為:

<hr>

效果如下:


無序列表

* 張三
* 李四
* 王二

其 HTML 元素為:

<ul>
<li>張三</li>
<li>李四</li>
<li>王二</li>
</ul>

效果如下:

  • 張三
  • 李四
  • 王二

有序列表

1. 不論
2. 三七
3. 二十一

有序列表,其 HTML 元素為:

<ol>
<li>不論</li>
<li>三七</li>
<li>二十一</li>
</ol>

效果如下:

  1. 不論
  2. 三七
  3. 二十一

巢狀有序列表

1. 不論
- 第一
- 第二
- 第三
2. 三七
1. 第一
2. 第二
3. 第三
3. 二十一

有序列表,其 HTML 元素為:

<ol>
<li>不論
<ul>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ul>
</li>
<li>三七
<ol>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ol>
</li>
<li>二十一</li>
</ol>

效果如下:

  1. 不論
    • 第一
    • 第二
    • 第三
  2. 三七
    1. 第一
    2. 第二
    3. 第三
  3. 二十一

超連結

[連結文字](連結網址)

其 HTML 元素為:

<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">連結文字</a>

效果如下:

連結文字

圖片

![文字屬性](Icon-pictures.png "文字標題")

其 HTML 元素為(少數沒有成對出現的元素標籤):

<img src="連結網址" alt="文字屬性" title="文字標題" />

效果如下:

圖片文字

注釋引用

> Markdown使用電郵用字元「>」來引用。

其 HTML 元素為:

<a href="連結網址">連結文字</a>

效果如下:

Markdown 使用電郵用字元「>」來引用。

表格

| Column 1 | Column 2 | Column 3 |
| -------- | -------- | -------- |
| Text | Text | Text |

其 HTML 元素為:

<table>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Text</td>
<td>Text</td>
<td>Text</td>
</tr>
</tbody>
</table>

效果如下:

Column 1Column 2Column 3
TextTextText

總結

以上簡單介紹了:

  1. 什麼是 HTML?
  2. Markdown 常見語法教學

以上介紹了 HTML 和 Markdown 基礎語法的教學,透過 Markdown 這一種簡潔易懂的語法,我們可以更專注在內容創作上。對於一個自學程式設計新手而言,培養撰寫文章的習慣(例如:建立自己的技術部落格)是很重要的環節,不但可以累計自己經歷也可以強化記憶並幫助到需要的人。若是需要完整語法介紹可以參考markdown.tw,當然,只要多加練習就可以慢慢掌握 Markdown 語法的訣竅,進而喜歡這種簡潔的書寫方式。

參考文件

  1. Github Basic writing and formatting syntax
  2. markdown.tw
  3. markdown wiki

想要自學程式?七個自學程式設計正確的觀念和心態

· 閱讀時間約 12 分鐘

想要自學程式?七個自學程式設計正確的觀念和心態

「軟體正在吃掉全世界。」(Software is eating the world.)

這是知名創投也是 Netscape 瀏覽器共同創辦人 Marc Andreessen 的名言。

隨著科技的快速發展,我們生活中已經離不開網路、手機等科技電子產品,而這些科技電子產品,背後往往有電腦軟體程式在運作(想想你每天使用的 Google、Facebook、LINE、Youtube 等應用程式)。也因為全世界的學校陸續開始將程式設計課程列入課綱之中,從一般白領上班族到有小孩的家長,不論是否是資訊相關科系畢業都開始學習程式語言和程式設計相關知識。深怕沒有擁有這項程式語言第二專長會被小孩所嫌棄或是錯過加薪升職的大好機會。

然而隨著網路、軟體技術的日新月異,初學者往往會迷失在豐富的學習資源和除錯 debug 的挫折當中,喪失了程式設計本身創作的樂趣。所以這邊我們要分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。

為什麼要學習程式設計?

我們為什麼要學習程式設計?相信這是許多家長和初學者內心的疑問。

事實上,程式設計是一種介於藝術與科學的腦力創作運動。學習程式設計正確心態是透過學習程式設計理解電腦科學運作的原理和動手用科技技術解決生活上的問題。

在學習程式設計過程中可以培養創造能力(對,你只要有一台電腦和網路就有機會創造出幾千幾萬人使用的軟體或網路服務),邏輯思考團隊合作自學能力解決問題的能力

撰寫程式可以讓你可以學習怎麼樣把一個複雜的問題切分成一個個小問題,在這個過程中不但可以訓練邏輯思考、解決問題的能力。隨著專案越來越大、技術越來越複雜,你可能會需要和其他專案成員合作去解決和學習你不懂的新技術,是一個很好培養自學能力和團隊合作能力的機會。當然在過程中可能會因為長期關注電腦螢幕而需要適時的休息和運動(但現代人即便不寫程式也是每天盯著螢幕了:P),這也是為什麼幼稚園和國中小的學童們會建議先從不插電學習程式設計的教材和桌遊開始學習程式設計和電腦科學的邏輯觀念。

確認目標和動機

最好學習程式設計的動機是因為想解透過科技解決生活上的問題(例如:想要寫一個記帳 App 給家人使用所以開始學習 Mobile App 開發,你可能需要學習 Android Java/Kotlin 或 iOS Swift/Objective-C)或是結合你現有的領域和電腦科學的應用。

若是你是因為想要轉職成為工程師/程式設計師,這又是另外一個話題。若是這樣,你可以針對你想要學習的領域列出需要學習知識去一一攻克(直接上求職網站把心儀的工作要求做成一個 checklist 清單)。例如:我希望轉職 Web 前端工程師,我需要具備基本的 HTML/CSS 語法和 JavaScript 程式語言的基礎或是我想轉職資料科學家,我需要具備 Python 或是 R 語言的基礎和理解機器學習和深度學習演算法等。

當具備正確的學習程式設計心態後,以終為始是學習程式設計最重要的一個環節,這是當你夜深人靜 debug 不出來時給自己最好的支持動力。事實上,程式語言只是一個創作的工具,你可以想像成設計師素描本和素描筆,雕刻大師的雕刻刀。幸運的是,程式設計只要一台電腦加上網路就可以開始。

選擇合適的程式語言和工具

若你是完全的初學者,我們會建議你從以下程式語言開始入手,再一步步針對你有興趣的領域繼續鑽研。

想要自學程式?七個自學程式設計正確的觀念和心態

  1. Scratch 若是你是國中小學的學員,你可以從 Scratch 開始。Scratch 是 MIT 麻省理工學院所開發的電腦程式平台,透過拖拉積木的方式可以讓使用者學習電腦程式的邏輯和概念,創造出多媒體或是遊戲應用,蠻適合低年齡層的學員使用。更重要的是 Scratch 本身是一個全世界的社群平台,你可以分享自己的作品也可以觀摩學習其他人的作品、認識新朋友,教學相長。

想要自學程式?七個自學程式設計正確的觀念和心態

  1. Python 若是成人或是想直接學習正式一點程式語言的學生,我們會推薦由 Python 入手。為什麼是 Python 呢?因為對於初學者來說 Python 是一個簡單易學但又功能強大的程式語言(Python 不僅可以編寫 Web 網站、桌面應用程式、開發遊戲更是機器學習/深度學習等資料科學應用的重要程式語言)。相較於其他 C/C++ 或是 Java 等程式語言,Python 相對而言較為簡潔且容易閱讀,此外不用經過編譯(compile)即可以執行程式也對於初學者較為友善。

想要自學程式?七個自學程式設計正確的觀念和心態

  1. JavaScript Java 和 JavaScript(簡稱 JS)和名字雖然很像但是卻是兩個不同的程式語言(可以說是熱狗和狗的差別),發展方向和應用層面也有所不同。隨著網際網路和瀏覽器引擎和 Node.js 的發展 JavaScript 的影響力有增無減。不再局限於瀏覽器的從早期的跑龍套到現在的獨挑大樑,現在不管是 Web 前後端、行動應用程式、桌面應用程式,甚至是深度學習等都可以使用 JavaScript 來開發。若是你想要開發有關 Web 相關的應用,更是必須學好 JavaScript,對於新手來說可以透過 Web 呈現和分享自己的作品是一個很有成就感的事情。但 JavaScript 技術變化很快,若是有有經驗的導師帶領可以少走許多冤枉路,且學習 JavaScript 通常需要搭配學習 HTML/CSS 語法。

想要自學程式?七個自學程式設計正確的觀念和心態

  1. Micro:bit Micro Bit(也叫做 BBC Micro Bit)是由 BBC 所推出的具備藍牙、光感測器、溫度感測、加速儀等感測器的微電路版,適合對於嵌入式系統和物聯網、創客應用有興趣的讀者。可以使用 Python、JavaScript、積木式等程式語言自己動手製作機器人或是溫度監控器等有趣應用!

看書/上課,動手做點東西

學習程式語言最好的方式就是買本你覺得合適入門書或是加入線上/線下課程後,開始動手做點東西。真正做出點什麼東西,去解決生活上的問題才是驗證你是否學會程式語言最重要的指標(就像是學英文一樣,你背誦了很多單字,但從沒開口說過或是無法和國際友人溝通,那即便是多益或是托福考的再高分那也不算是真正學會英文)。和幾個志同道合的朋友一起做專案、參與實習、接案或是參與開放原始碼專案(Open source project)都是一個很好的方式。

學寫程式就像是學習烏克麗麗或是吉他等才藝一樣需要動手練習才會學得好,總而言之就是:

動手做點東西 動手做點東西 動手做點東西

很重要所以講三遍!

想要自學程式?七個自學程式設計正確的觀念和心態

學會網路搜尋 Google 大法

一般在學習程式設計遇到困難時,最好的解法就是把錯誤訊息或是遇到的問題去 Google 搜尋一下,大部分情況下都可以在網路得到對應的解答。另外,Stack Overflow 程式設計問答網站Github 開源程式碼集散地 也是一個學習的好去處,沒事去逛逛,相信一定會有不少收穫。

想要自學程式?七個自學程式設計正確的觀念和心態

加入社群,尋找戰友

一個人寫 code 很孤獨,一群人寫 code 很幸福。在學習寫程式的過程是一條孤獨且漫長的道路,即便是經驗老道的老手也需要和不同領域的人請教,更何況是剛入門的新手。選擇一個友善的自學程式社群加入,可以讓你在學習程式語言的過程中更加順遂,而加入 HappyCoder 自學程式設計學院 相信是一個很好的選擇。

學會有禮貌的問問題並紀錄學習心得

當你卡關時你往往會希望尋求協助,但在尋求協助之前可以先自我評估所遇到的問題,可以讓你在問問題時可以更具體讓人明白也可以讓你在 Google 時可以找到合適關鍵字來搜尋(沒有人有義務一定要回答你的問題,幫助他人釐清問題是個好習慣)。

  1. 你想要做什麼?
  2. 你已經嘗試過什麼方法?
  3. 結果如何?

以上的問題最好回答可以具體一點。

例如說:

你想要做什麼?我想在要 Windows 環境下安裝 Python 環境 你已經嘗試過什麼方法?我已經在 Python 官方網站下載安裝完成 結果如何?但我在 cmd 終端機指令中輸入 Python 指令時出現沒有這個指令的錯誤

又例如說:

你想要做什麼?我想要在瀏覽器中跳出 comfirm 確認的提示框 你已經嘗試過什麼方法?我打好了 JavaScript 程式碼,也儲存了 結果如何?沒看到在瀏覽器成功執行,但在瀏覽器的開發者工具 console 顯示 Uncaught SyntaxError: Invalid or unexpected token 錯誤訊息

有些時候透過回答這三個問題,問題就自己迎刃而解了。

有些時候撰寫程式一段時間後腦袋會變鈍或是肩膀頸部緊繃。適當時候休息一下,起身運動或是喝口水和人交談一下,或許回頭再試試就會有靈感也說不一定。

另外,當你完成一個程式專案或是解掉某個 bug 時,記得可以撰寫成技術文章(若是有心要轉職程式設計領域的同學,經營自己的 Github 和部落格真的很重要),不但可以豐富自己的專業履歷也可以強化自己的記憶方便未來查找外,更重要的是也可以幫助到下一個跟你遇到同樣問題的人喔!

想要自學程式?七個自學程式設計正確的觀念和心態

尋找導師,持續學習

不管是在職場工作或是學習程式設計,有好的導師或是 role model 引導確實可以讓自己少走許多冤枉路和減少時間金錢的浪費。但一開始盡量不要找已經工作十年以上的工程師或是程式設計師(等到你要往架構師或是技術管理者邁進時再去找他們),對於新手來說,兩三年或三五年工作經驗的工程師和程式設計師剛好是個不會太有距離感,導師又能體會新手剛入門會遇到的挫折和煩惱,帶著誠懇和禮貌去尋找你身邊或是社群中願意帶你的導師。不過記得當你離開新手村後,若有機會也可以成為其他人的導師,取之於社群回饋於社群。

俗話說:師父領進門,修行在個人。若你有志於程式設計領域繼續鑽研,那就必須認知到 IT 行業是一個需要持續精進自我的領域。不管是技術還有如何設計產品、溝通協調、管理專案、撰寫簡潔漂亮的程式碼、設計架構等都需要持續地進修學習,唯有持續保持積極的學習態度和能力才是在這個領域持續保有競爭力的最佳保證。

總結

以上我們整理了多年來自學程式設計的經驗,我們也曾花過許多冤枉錢和時間。在這邊分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。

最後複習一下自學程式設計必備觀念和心態:

  1. 確認目標和動機
  2. 選擇合適的程式語言和工具
  3. 看書/上課,動手做點東西
  4. 學會網路搜尋 Google 大法
  5. 加入社群,尋找戰友
  6. 學會有禮貌的問問題並紀錄學習心得
  7. 尋找導師,持續學習

Happy Coding :)

第 02 期 Python 程式設計入門共學營 【業界資深工程師導師帶你練功】熱烈報名中

第 02 期 Python 程式設計入門共學營 【業界資深工程師導師帶你練功】熱烈報名中

由業界資深工程師導師帶你零基礎入門 Python 程式設計,我們為你去蕪存菁梳理出最重要的核心觀念和知識點,讓學員在有限的時間和金錢內用最有效率的方式學習,讓你的自學程式設計不再孤單無助!Co-Learning Camp 程式設計共學營是一種新型態跨領域線上學習方式(翻轉教育學習法),透過線上互動式程式練習、社群共學和專題導向式學習方式來學習程式設計,進而培養第二專長和跨領域自學能力,提升你的職場競爭力,成為更好的自己。

你也想累積專題作品實作經驗,建立基本程式設計應用能力嗎?你也想培養第二專長和跨領域自學能力,提升你的職場競爭力,成為更好的自己嗎?

第 02 期 Python 程式設計入門共學營【8 週 24 個程式冒險 | 業界資深工程師導師帶你練功】熱烈報名中,名額有限,額滿為止!

活動時間:2019/11/23 - 2020/01/16 馬上報名成為更好的自己:報名連結

參考文件

  1. 自學程式設計學習資源懶人包
  2. 用 Python 自學程式設計:程式設計思維入門

(image via negativespace.coyoda

電腦科學概論:演算法概要

· 閱讀時間約 6 分鐘

電腦科學概論:演算法入門概要

隨著資訊科技發展,演算法已經無所不在存在我們的生活當中。舉凡上網 google 搜尋資料、下載檔案的壓縮方法、檔案的加密傳輸等,都可以看到演算法運作的蹤跡。一般來說資料結構和演算法是程式設計最基本的內涵,所以有人說:程式設計 = 資料結構 + 演算法。那究竟什麼是演算法/算法呢?

咱們維基百科給了個非常需要慧根才能理解的解釋:

演算法(algorithm),在數學(算學)和電腦科學之中,為任何良定義的具體計算步驟的一個序列,常用於計算、資料處理和自動推理。精確而言,演算法是一個表示爲有限長,列表的有效方法。演算法應包含清晰定義的指令,用於計算函式。

我們把它翻譯成人話吧:

演算法是一個有輸入且有輸出的解決問題的步驟,它具有明確和有限步驟且有效的特性

舉例來說,我們今天要創作一道蔥花蛋或菜脯蛋,我的步驟會是把材料當做輸入:

  1. 放點油
  2. 打蛋
  3. 如果喜歡蔥花可以加入蔥花,如果喜歡菜脯可以加入菜脯(程式術語:if...else 條件判斷)
  4. 放入少許鹽巴
  5. 中火快炒,翻五次面(程式術語:for 迴圈)
  6. 當看到蛋面呈現金黃色時可以起鍋,結束料理(程式術語:while 迴圈)
  7. 好吃的蔥花蛋或菜脯蛋上桌

透過清楚明確的有限步驟,我們可以解決我們想解決的問題並產出我們要的輸出結果

演算法的定義

一般演算法嚴謹的條件必須符合:

  1. 輸入(Input):0 或多個輸入
  2. 輸出(Output):至少有一個回傳結果(有可能回傳 0 或是 null)
  3. 明確性(Definiteness):每一個指令步驟必須明確
  4. 有限性(Finiteness):在有限步驟後一定會結束不會進入無窮迴圈
  5. 有效性(Effectiveness):步驟清楚可行,能使用紙筆計算求解

舉個例子:

下面是一個 Python 判斷是否可以投票的演算法(假設可以投票為 18 歲),仔細看下面的算法雖然簡單但有輸入也有輸出,且有明確有限步驟,步驟可行

def check_can_vote(age):
if age >= 18:
return True
else:
return False

check_can_vote(20)

評估複雜度

事實上,解決一個問題不一定只有一種演算法。那我們怎麼評估演算法的好壞呢?一般來說會有兩種方式:時間複雜度和空間複雜度,比較常見的是使用時間複雜度

時間複雜度(Time Complexity)

想要評估一個演算法執行速度快慢,最直覺的方式是測量演算法計算的時間。但由於執行時間會受不同電腦/計算機機器硬體規格與實作方式影響,很難放諸四海皆準,因此學術上傾向於統計演算法步驟數目,當做時間複雜度可考量。

最常見的評估演算法好壞就是時間複雜度,時間複雜度是指運用概量(漸近分析 asymptotic analysis,例如:當 f(n) = n^2 + 3n 這個函數 n 很大時,3n 會比 n^2 小很多,可以忽略不計。當 n 趨近無限大時,f(n) 等價於 n^2)而非絕對時間(因為會牽涉到電腦/計算機環境變因,所以絕對時間不容易準確),通常我們使用 Big O notation 大 O 符號來表示時間複雜度。假設算法函式所需執行時間為 T(n) ,則我們將其時間複雜度表示為 O(f(n))f(n) 又稱為執行時間的成長率,是影響速度最大的變數。

首先我們先來看 O(1) 的例子,這個演算法執行的步驟是固定的,跟輸入的值無關:

# 不管 n 輸入為多少,這個程式永遠只會執行一次
def print_num(num):
print(num)

print_num(10)

下面這個例子就是 O(n) 的例子,時間複雜度跟輸入的次數有關,隨著 num 變大所需要跑 num 次,是線性時間的成長。這邊 f(n) 等於 n,所以 O(f(n)) 就是 O(n)

def sum_number(num):
total = 0
for n in num:
total += num
return total

sum_number(10)

O(nlog(n))

一般常見的時間複雜度如下圖表是: 電腦科學概論:演算法入門概要

空間複雜度

演算法的空間複雜度是指演算法所需要消耗的儲存記憶體資源。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示(asymptotic analysis)。

例如下面這個函式,不管程式跑了多少遍,都不會影響使用的變數數量,故該函式的空間複雜度為 O(1):

def sum_number(num):
total = 0
for n in num:
total += num
return total

sum_number(10)

但下面這個函式,會隨著丟進去的數字而影響變數的量,例如:

輸入為 n,就換產生 n 個變數空間需要儲存,故該函式空間複雜度為 O(n)

def sum_number(num):
total = []
for n in num:
total.append(num)

sum_number(10)

總結

以上簡單介紹了演算法入門教學。隨著資訊科技發展,演算法已經無所不在存在我們的生活當中。舉凡上網 google 搜尋資料、下載檔案的壓縮方法、檔案的加密傳輸等,都可以看到演算法運作的蹤跡,所以值得我們細細品味,接下來我們將介紹常見的經典演算法範例。

參考文件

  1. 台師大演算法筆記
  2. 演算法與資料結構
  3. 大O符號
  4. Algorithm Analysis
  5. All you need to know about “Big O Notation” to crack your next coding interview

image via pandorafmsfreecodecamp

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

· 閱讀時間約 5 分鐘

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

Excel 幾乎是所有職場工作者最常使用的 Office 軟體工具,小至同事間訂便當、飲料,大到進出貨訂單管理,應收應付賬款的財務報表等都有它的身影。在一般工作上,你可能常常需要在不同表單中複製貼上許多的欄位,或是從幾百個列表中挑選幾列依照某些條件來更新試算表內容等。事實上,這些工作很花時間,但實際上卻沒什麼技術含量。你是否曾想過但使用程式語言來加快你的工作效率,減輕瑣碎的重複性無聊工作但又不知道如何開始?

別擔心,這邊我們就要使用 Python 和 Openyxl 這個模組,讓讀者可以輕鬆使用 Python 來處理 Excel 試算表,解決工作上的繁瑣單調工作!

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

Excel 試算表名詞介紹

在正式開始使用 Python 程式來操作 Excel 試算表前我們先來了解 Excel 常見名詞。首先來談一下基本定義,一般而言 Excel 試算表文件稱作活頁簿(workbook),而活頁簿我們會存在 .xlsx 的副檔名檔案中(若是比較舊版的 Excel 有可能會有其他 .xls 等檔名)。在每個活頁簿可以有多個工作表(worksheet),一般就是我們工作填寫資料的區域,多個資料表使用 tab 來進行區隔,正在使用的資料表(active worksheet)稱為使用中工作表。每個工作表中直的是欄(column)從和橫的是列(row)。在指定的欄和列的區域是儲存格(cell),也就是我們輸入資料的地方。一格格儲存格的網格和內含的資料就組成一份工作表。

環境設定

在開始撰寫程式之前,我們先準備好開發環境(根據你的作業系統安裝 Anaconda Python3virtualenv 模組openyxl 模組),關於開發環境設定可以參考:Python Web Flask 實戰開發教學 - 簡介與環境建置,Windows 讀者開發環境可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

這邊我們使用 MacOS 環境搭配 jupyter notebook 做範例教學:

# 創建並移動到資料夾
$ mkdir pyexcel-example
$ cd pyexcel-example
$ jupyter notebook

開啟 jupyter notebook 後新增一個 Python3 Notebook

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

首先先安裝 openyxl 套件(在 jupyter 使用 $ !pip install <your-package> 安裝套件):

使用 shift + enter 可以執行指令

!pip install openpyxl

記得要先安裝 openpyxl 模組,若是沒安裝模組則會出現 ModuleNotFoundError: No module named 'openpyxl' 錯誤訊息。

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

讀取 Excel 檔案

  1. 使用 Openpyxl 開啟 Excel 檔案(可以從這邊下載範例 Excel 資料檔案),下載後檔名改為 sample.xlsx,並放到和 jupyter Notebook 同樣位置的資料夾下:

    from openpyxl import load_workbook

    wb = load_workbook('sample.xlsx')
    print(wb.sheetnames)

    執行後可以讀取活頁簿物件(類似讀取檔案)並印出這個範例檔案的工作表名稱:

    ['Sheet1']
  2. 從工作表中取得儲存格(取得 A1 儲存格資料)

    ws['A1'].value
  3. 從工作表中取得欄和列

    列出每一欄的值

    for row in ws.rows:
    for cell in row:
    print(cell.value)

    列出每一列的值

    for column in ws.columns:
    for cell in column:
    print(cell.value)

寫入 Excel 檔案

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

  1. 創建並儲存 Excel 檔案

    from openpyxl import Workbook

    # 創建一個空白活頁簿物件
    wb = Workbook()
  2. 建立工作表

    # 選取正在工作中的表單
    ws = wb.active
  3. 將值寫入儲存格內

    # 指定值給 A1 儲存格
    ws['A1'] = '我是儲存格'

    # 向下新增一列並連續插入值
    ws.append([1, 2, 3])
    ws.append([3, 2, 1])
  4. 儲存檔案

    # 儲存成 create_sample.xlsx 檔案
    wb.save('create_sample.xlsx')

Python 自動化程式設計:如何使用 Python 程式操作 Excel 試算表

總結

以上簡單介紹如何使用 Python 程式操作 Excel 試算表,透過 Python 可以讀取和寫入 Excel 檔案,相信只要能活用就能夠減少一般例行性的繁瑣工作。若需要更多 openpyxl 操作方式可以參考官方文件教學,我們下回見囉!

參考文件

  1. openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files

(image via matplotlib