Skellar Dev Log #3: 邏輯視覺化

更新於 發佈於 閱讀時間約 8 分鐘

最佳的學習環境


我釋出最初版的 PR 式實境學習流程後,最多人回饋的點就是:對初學者來說門檻太高。

的確,Coding 領域本身相對困難,用了擬真的環境只有提升學習的真實性,並沒有降低學習門檻。就算加入了遊戲化要素也只是提升使用者的興趣,並沒有讓他變簡單。

One shoe doesn't fit all。初學和進階需要的學習完全不同。因此我重新定義了學習路徑:

  1. 初學:低門檻,用明確易懂的視覺、圖像化和生活連結來讓使用者踏入 Coding 領域
  2. 進階:擬真場景,用原本的 mission 式的題目去讓使用者模擬真實商務場景的 contribute 流程。

Skellar Code - Starters


我將這兩階段分成不同的學習模式:

  1. Skellar Code - Starters:用豐富直觀的視覺化和簡單的任務,了解程式語言基本運作原理
  2. Skellar Code - Contributors:用真實的專案場景,完成真實需求,並通過 PR 驗證
raw-image

我參考了幾種不一樣的初學者 coding 學習平台

  1. Brilliant.org
  2. Scratch
  3. freeCodeCamp
  4. Codecademy
  5. Khan Academy
  6. Udacity
  7. Tynker
  8. CodeMonkey

我發現「視覺化」是降低們檻的關鍵,而他們主要聚焦在這幾種視覺化:

視覺化 Logic Flow

如 Scratch 本身,必要,但當 components 變多,反而讓整段「程式」過於龐大而難懂,維護起來也複雜。

Solution: VSCode Debugger。既然要逐行顯示執行順序和流程,那麼直接讓執行過程和 Debugger 結合可以說是完美方案:直觀、擴充性好、減少開發成本。

視覺化 Values & Data Manipulation

許多初學者對變數操作感到困惑,例如:

a = 3 之後為什麼可以再宣告 a = 5

a + 3 為什麼不會改變變數,要用 a += 3

稍微複雜一點的程式就會因為「中間值」看不到而陷入 Debug 地獄。

Solution: Data and Expression Visualizer(DEV)。

在 DEV 裡,apple_count = 3 會顯示一個箱子,裡面放 3 個蘋果;當運算子執行時則呈現動畫。這比傳統的變數樹狀結構直觀得多。

VSCode Extension 的製作與瓶頸


VSCode Extension 的開發是由官方的 TypeScript yo package 製作的,為了呈現 DEV webview 介面,獨立出了一個 Vite + ReactJS 的專案來開發 webview 內容。

當使用特定 Command 時,extension 會透過幾個不同的資料來源來渲染圖像化的執行過程

Debugger Adapter Protocol (DAP)


VSCode Debugger 提供了一個跨語言的斷點資料結構,讓 extension 可以拿到執行環境、現在有哪些變數、變數值等資料。

但透過 DAP 拿到的資料只有當下的 snapshot,想要知道現在是不是在一個 for loop iteration 或 if else block 中是不夠的,因此我們還需要一個資料來源

Abstract Syntax Tree (AST)


AST 能靜態解析程式結構,例如:

  • 哪些區塊是迴圈
  • 哪些是條件判斷
  • 哪些是函式呼叫
raw-image

將 AST 與 DAP 的 snapshot 合併,就能同時看到「程式架構」與「執行狀態」。這讓 DEV 得以動畫化還原整個流程。

目前我可以標示「在一個 for loop 中」,但還缺「第幾次迭代」的 pointer。如果 iterable 沒有重複值,可以直接比對 target 值在 iterable 的 index。但當 iterable 含有重複元素時,單靠 DAP + AST 還是無法精準定位。

這時候,就需要 更底層的手段:Instrumentation。

Instrumentation


監控植入,是在程式開始前, inject 一段針對程式碼的執行過程監控的追蹤程式

raw-image

透過 DAP 的 session.customRequest('evaluate') 功能,我們可以在執行 user 執行前 inject 追蹤程式碼

為了實現 for loop 中的迭代次數,我們從 injection 中加入了一段 tracing,只要當前的 instruction 是 FOR_ITER,我們就找出該行的 loop listloop var,並把 counter + 1,並將這個變數 expose 到 global。

# structure: __daps_progress[list_name][var_name] = index
__daps_progress: Dict[str, Dict[str, Any]] = {}

def trace_function(frame, event, arg):
# we still return the tracer to continue tracing in nested frames
if event == "line":
try:
filename = frame.f_code.co_filename
lineno = frame.f_lineno
source_line = linecache.getline(filename, lineno).rstrip()
print(f"Tracing line {lineno}: {source_line}", flush=True)
except Exception:
return trace_function

if _is_for_line(source_line):
...
__daps_progress[loop_list][loop_var]['index'] += 1

再從 extension 中用 DAP 的 customRequest('variables') 來取得這個值,最後顯示 pointer 在 list 相應的位置上

raw-image

結語


這個 extension 初期雖然只適用於 python,但只要支援上述三種解析追蹤行為的程式語言,未來都可以擴充,不過現階段我只會專注於實現 python 的功能。

能透過 VSCode Extension 完成的事比想像中的更多,這次 PoC 無疑是有史以來最大的強心針,下一步可以整合 Skellar 平台自身的道具功能,提供提示限時 AI tutor 等功能。


Starscribers Discord Server: https://discord.gg/KURmknGA

Skellar Open Beta: https://skellar.rn-ws.com/

留言
avatar-img
留言分享你的想法!
avatar-img
Corix RID的沙龍
3會員
3內容數
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
因為 AI 領域的技術不斷地迭代更新,無法避免的是需要一直去追新的技術 並且需要在一個有限的時間學會,或是實作應用導入到專案之中。 那我覺得在學習新技術可通過以下步驟: 1. 找一個讀得懂的教學資源 現在網路上的教學資源很多,或是書籍的資源也很豐富, 同時也有像是 chatgpt 的 AI
Thumbnail
因為 AI 領域的技術不斷地迭代更新,無法避免的是需要一直去追新的技術 並且需要在一個有限的時間學會,或是實作應用導入到專案之中。 那我覺得在學習新技術可通過以下步驟: 1. 找一個讀得懂的教學資源 現在網路上的教學資源很多,或是書籍的資源也很豐富, 同時也有像是 chatgpt 的 AI
Thumbnail
這篇內容,將透過實戰教學,來講解「滑鼠點方塊」的程式碼。包括如何測試遊戲、座標系統、自訂參數和內建參數、if else、and、遊戲的邏輯設計、程式碼解析。
Thumbnail
這篇內容,將透過實戰教學,來講解「滑鼠點方塊」的程式碼。包括如何測試遊戲、座標系統、自訂參數和內建參數、if else、and、遊戲的邏輯設計、程式碼解析。
Thumbnail
學習「彩虹數字」,必須明白「實務經驗」比「理論」更重要!「練習」可以獲得「實務經驗」,藉以補強「理論」的不足。然而,多數人領悟不到「練習」到底是在練習什麼?我這十年以來,都是在練習「解決問題」啊!如果學習彩虹數字不能用於解決現實生活所致的困惑,我絕不會耗費這麼多時間去做研究。
Thumbnail
學習「彩虹數字」,必須明白「實務經驗」比「理論」更重要!「練習」可以獲得「實務經驗」,藉以補強「理論」的不足。然而,多數人領悟不到「練習」到底是在練習什麼?我這十年以來,都是在練習「解決問題」啊!如果學習彩虹數字不能用於解決現實生活所致的困惑,我絕不會耗費這麼多時間去做研究。
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
這是什麼大問題嗎?這樣就寫一篇文章,會不會太混了! 會! 其實蠻混的! 哈哈哈! 1.英文不好,乾脆用中文。就用微軟 Copilot 設計工具 的網址在此。好啦!
Thumbnail
這是什麼大問題嗎?這樣就寫一篇文章,會不會太混了! 會! 其實蠻混的! 哈哈哈! 1.英文不好,乾脆用中文。就用微軟 Copilot 設計工具 的網址在此。好啦!
Thumbnail
作者分享選修課程「遊戲式學習設計」的期末報告,挑一篇相關論文來進行分析。該論文研究了遊戲式學習工具對於提高德語口語練習成效的影響,並附上詳細的桌遊設計過程。文章最後提到了遊戲化的概念,並推薦了一本有關遊戲化的書籍以及一支TED演講影片。
Thumbnail
作者分享選修課程「遊戲式學習設計」的期末報告,挑一篇相關論文來進行分析。該論文研究了遊戲式學習工具對於提高德語口語練習成效的影響,並附上詳細的桌遊設計過程。文章最後提到了遊戲化的概念,並推薦了一本有關遊戲化的書籍以及一支TED演講影片。
Thumbnail
由於不是這方面的專業,所以一切靠爬文嘗試,我的學習之路不見得正確,就記錄一下自我學習的過程。若有高手見文願指點一二,實屬我之榮幸。
Thumbnail
由於不是這方面的專業,所以一切靠爬文嘗試,我的學習之路不見得正確,就記錄一下自我學習的過程。若有高手見文願指點一二,實屬我之榮幸。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News