周小涵
(四川大學計算機學院,成都610065)
基于總體統計信息的編程行為主要是對底層數據的上層描述,不直接反映代碼信息或者底層數據信息,但卻是底層信息的一種體現,主要表現在時間戳、編程時長、連續快照間的分鐘數等信息,在Vihavainen等人[1]的實驗中,每個學生在進行一個有截止日期的家庭作業,使用學生編程環境中的插件從學生的實際編程過程中收集快照中的編程時長、距離截止日期的時間、連續快照之間的分鐘數以及其他的編程行為的每周的中值、平均值、最小值、最大值和標準差來作為特征數據。利用B-Course[2]的非參數貝葉斯網絡工具來建模數據中要素之間的依賴關系,以及構建分類器,使用leave-one-out交叉驗證,這篇文章通過檢測學生編程中的一些時間數據等總體統計信息能比較準確地預測他們數學課程的結果。
基于代碼快照的編程行為使用的很多,它是指通過時間或者事件觸發記錄代碼內容,利用代碼快照來比較代碼內容的不同之處,主要可以分為粗粒度和細粒度兩種,其中粗粒度是以事件為觸發的,細粒度是以時間為觸發的。Vihavainen等人[1]使用學生編程環境中的插件從學生的實際編程過程中收集快照,使用連續快照之間的分鐘數、順序快照之間的編輯距離的每周的中值、平均值、最小值、最大值和標準差以及其他的特征來作為特征數據,其中編輯距離通過Bergel和Roach的Ukkonen算法的擴展算法[3]來計算。通過編程行為的數據預測她們數學課程的結果。Watson等人[4]使用BlueJ IDE的擴展從學生的實際編程過程中收集快照以及其他特征,使用WATWIN算法進行評分,定量描述學生常規編程行為方面的數據,該算法分為兩個階段,第一階段,為學生試圖編譯的每個文件構建連續對,并估計學生花在處理錯誤的時間量,使用日志編程行為來構建一組連續的編譯事件對,從而可以分析學生對不同錯誤的響應。在第二階段,通過根據事先已知的和本文自己的研究已經確定為表現較弱表現學生的表現來分配扣分來對每個配對進行評分。他們比較之前的研究,將編譯事件對進行了處理,剔除了兩次都正確的對和僅僅增加了注釋的對,糾正了連續的對在不同文件上產生解決錯誤時間的誤差,并通過移除所有的標識符將錯誤信息一般化。Blikstein[5]描述了一種自動化技術評估,分析和可視化學生學習計算機編程,在編程任務期間記錄了數百個學生代碼的快照,并采用不同的量化技術來提取學生的行為,并根據編程經驗對其進行分類。Vihavainen[6]正在調查學生在編程過程中的行為(例如,渴望開始研究剛剛發布的練習,遵循最佳編程實踐)會影響課程結果。只充分利用學生編程過程中使用快照自動收集的數據,而不會收集任何額外的背景信息。Spacco等人[7]構建了一個Eclipse插件來解決學生在學習編程技能時,只能提交項目接受嚴格的測試,卻缺少和教師之間的反饋。該插件有兩個主要功能。首先,它會在每次保存,添加或刪除文件時將中央CVS存儲庫中的學生項目的完整狀態捕獲即代碼快照。這產生了每個學生項目演變的細致歷史。其次,插件允許學生將他或她的項目提交給中央服務器。提交服務器自動編譯并對學生提交的作品進行有限測試,提供反饋信息,說明項目與實現項目的要求有多接近。他們的目的是為教師和研究人員提供關于學生學習和工作方式的更詳細信息,并提供反饋給學生,幫助他們專注于實現所分配的項目。
基于事件的編程行為可以分為兩大類,分別為按事件類型劃分和按事件間相關性劃分,其中按事件類型可以分為編譯事件和環境事件,環境事件即IDE環境中進行的操作,比如保存。按事件間相關性劃分可以分為基于時間的劃分和基于頻率的劃分。基于編程事件的編程行為多使用編譯事件作為特征提取的初始數據,編譯事件即為記錄編譯事件時間點附近的數據,像是Vihavainen等人[1]收集編譯時的編譯結果等數據。Jadud[8]引入了一種名為 Error Quotient(EQ)的算法,該算法通過學生兩次編譯的時間以及編譯的結果,分析學生程序設計過程中的連續狀態,并提供了學生能夠如何很好地解決任何遇到的語法錯誤的度量標準。Watson等人[4]使用BlueJ IDE的擴展從學生的實際編程過程中收集除了代碼快照數據外,還收集了編譯事件結果(編譯成功或失敗)、報告的錯誤消息及行號,將編譯事件的結果以時間戳為序,兩兩一組,按照兩個連續事件分別基于時間和頻率的相關性,使用WATWIN算法進行評分,基于直接記錄日志,定量描述學生常規編程行為方面的數據。Munson等人[9]分析了課內和課外的編程活動,記錄程序源、編譯器錯誤消息列表、文檔名稱、學生正在處理的作業、時間戳以及學生的ID,可以用作輔導弱勢學生在其過于落后之前對其表現早期的表現進行干預的基礎。
基于日志的編程行為可以記錄所有的日志文件信息,例如在Watson等人[4]的實驗中使用BlueJ IDE的擴展從學生的實際編程過程中收集除了代碼快照、編程事件、總體信息等數據外,他們還收集了報告的錯誤消息及行號這兩個基于日志的編程行為,使用WATWIN算法進行評分,基于直接記錄日志,定量描述學生常規編程行為方面的數據。他們對收集的錯誤信息進行處理,去掉了標識符來判斷學生是否一直在犯同一種錯誤,也得到了不錯的結果。Carter J[10]開發一個不依賴于距離自動確認和傳達開發人員難度的系統,其中他們針對日志的不同片段,計算每個片段中各類別命令占全部命令總數的百分比,并將這些百分比用作識別模式的特征,其中共有5類命令分別為:導航(用戶從一個文件切換到另一個文件)、編輯(用戶插入或刪除文本)、刪除(用戶刪除整個方法或類)、調試(用戶使用調試器顯式調試代碼)、焦點(用戶在IDE和其他打開的窗口之間切換)。
基于按鍵的編程行為顧名思義,就是編程人員在編程過程中敲擊鍵盤所產生的數據,一般是按鍵間的釋放時間、按鍵的駐留時間和使用特殊按鍵(例如,空格、回車、delete等按鍵)的頻率。Richard等人[11]通過記錄學生編程時擊鍵的類型和時間戳,來測試擊鍵速度和表現間是否存在相關性。按鍵的這種行為也被應用在除了編程行為外的其他領域,也有一定的參考價值,主要是用來做用戶情感狀態識別等方面,A.Kolakowska等人[12]介紹了在通過按鍵的動態分析來識別用戶情緒狀態和驗證用戶身份這一領域的一些研究,主要提取的特征為鍵間的釋放時間、按鍵的駐留時間、使用特殊按鍵的頻率,但是他們的研究在識別用戶情緒狀態方面的結果并不理想;Clayton等人[13]通過按鍵和用戶的情感信息,確定表現最好的情緒狀態模式。
基于鼠標的編程行為主要收集鼠標的跳躍活動、運動軌跡的x、y坐標,加速度等信息,主要有兩種應用,第一種是利用鼠標的在編程過程中的運動軌跡或點擊來分析編程過程;Green等人[14]通過檢測代碼編輯過程中的非線性行為來調查編程活動的策略方案。Blikstein[5]描述了一種自動化技術評估,分析和可視化學生學習計算機編程,在編程任務期間記錄了數百個學生代碼的快照,以及鼠標點擊這種非代碼事件總數,并采用不同的量化技術來提取學生的行為,并根據編程經驗對其進行分類。Gray等人[15]通過檢測鼠標的移動,引入了“改變事件”的概念來描述編碼過程中的這些關鍵時刻。他們認為,改變事件可以通過兩種不同的方式來實施:或者是對項目的局部小修改,或者是對項目目標結構的重大轉變。這項工作的重要性在于它清楚地確定了可能發生這種變化的情況。Estey等人[16]通過學生在學習工具中的交互行為預測學習艱難的學生,通過的交互行為為學生對一下按鈕——編譯代碼、運行代碼、提交解決方案、獲得提示以及提出問題的點擊,并且為了能更好地區分持續性和暫時性掙扎,她們進一步提出了一種測量編程行為變化的軌跡度量;第二種不是編程行為,但是同樣可以借鑒,利用鼠標反應時間和鼠標軌跡和加速度等特征進行欺騙檢查,Freeman等人[17]作者通過使用鼠標追蹤技術,記錄鼠標運動的x,y坐標,來測量人們的心里狀態。Zhang[18]等人通過利用鼠標反應時間和鼠標軌跡特征進行欺騙檢測。
如表1。

表1
現有的有關編程行為的研究大多集中在對于一到兩種的編程行為進行研究,很少有將多種編程行為進行結合研究的。從上文中可以看出,每一種編程行為都有著自己的優勢和劣勢,在今后的研究中,我們想將各個層次的編程行為進行結合,實現趨利避害的效果,使得利用編程行為的預測得到更加準確的結果。