王瑞文
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
在21世紀(jì),IT行業(yè)在全球經(jīng)濟(jì)中所占的比重變得越來(lái)越大,而編程能力也逐漸成為科研和工程領(lǐng)域的高端人才不可或缺的技能之一,而且越來(lái)越多的工作被程序所取代,社會(huì)對(duì)編程技能的需求以及編程的效用也不斷增加。在McKinsey全球研究院于2013年發(fā)布的《至2025年決定世界未來(lái)經(jīng)濟(jì)的12大顛覆技術(shù)》中,排名前六位的都是與編程密切相關(guān)的技術(shù),且大約占到了經(jīng)濟(jì)規(guī)模的90%[1]。但是,無(wú)論是剛接觸編程的學(xué)生還是專(zhuān)業(yè)的程序員,在編程中都不可避免地遇到各種困難,這些困難則會(huì)阻礙他們的學(xué)習(xí)或者開(kāi)發(fā)進(jìn)度。
在編程教學(xué)方面,如果能夠檢測(cè)到學(xué)生在編程中遇到的困難,并在恰當(dāng)?shù)臅r(shí)機(jī)由系統(tǒng)自動(dòng)地給予學(xué)生適宜的反饋,例如在內(nèi)容上提示學(xué)生應(yīng)當(dāng)如何改善代碼,或者在情緒上給予支持及鼓勵(lì),增強(qiáng)其學(xué)習(xí)動(dòng)機(jī)。另外,可以將自動(dòng)檢測(cè)得到的學(xué)生困難信息提供給教師,例如每個(gè)學(xué)生遇到困難的次數(shù)、經(jīng)常出現(xiàn)的困難類(lèi)型等。依據(jù)這些補(bǔ)充信息,教師可以進(jìn)一步了解各個(gè)學(xué)生的特點(diǎn),以及在不同知識(shí)點(diǎn)上的掌握程度,如此一來(lái),教師就可以針對(duì)性地為各個(gè)學(xué)生提供個(gè)性化的教育,做到因材施教。
在工業(yè)生產(chǎn)方面,專(zhuān)業(yè)程序員也常常面臨編程困難,這些困難如果得不到解決,則會(huì)明顯地限制開(kāi)發(fā)進(jìn)度,降低程序員的生產(chǎn)力。Herbsleb等人[2]發(fā)現(xiàn),如果團(tuán)隊(duì)成員均處于同一建筑物中,其生產(chǎn)力要高于成員分散于各地的團(tuán)隊(duì),其原因在于前者能夠使成員之間互相幫助更多。Herbsleb和Grinter[3]的一項(xiàng)早期研究指出了這一現(xiàn)象的原因之一:分散在不同地點(diǎn)的團(tuán)隊(duì)成員之間相對(duì)地會(huì)在詢問(wèn)幫助上感到更加不舒服,因?yàn)樗麄冎g的互動(dòng)比共處一地的團(tuán)隊(duì)少很多。而Teasley等人[4]的研究則進(jìn)一步證明了這一事實(shí)。他們發(fā)現(xiàn)處于同一個(gè)房間的團(tuán)隊(duì),其生產(chǎn)力要高于成員分散于不同房間的團(tuán)隊(duì)。這是因?yàn)楣蔡幱谕环块g的開(kāi)發(fā)者可以看到以及聽(tīng)到其他人在做什么,這使得他們可以在注意到某人遇到困難時(shí)為他提供幫助。這些研究共同表明——團(tuán)隊(duì)之間互相幫助越多,其困難就能越順利地得到解決,從而促進(jìn)團(tuán)隊(duì)生產(chǎn)力的提高。因此,自動(dòng)地檢測(cè)開(kāi)發(fā)者遇到的編程困難,并適時(shí)地提供恰當(dāng)?shù)睦щy上下文信息提供給團(tuán)隊(duì)中的其他開(kāi)發(fā)者,促進(jìn)他們之間的互助,可以提升團(tuán)隊(duì)生產(chǎn)力。
綜上所述,無(wú)論是從教育界的視角還是工業(yè)界的角度來(lái)看,檢測(cè)開(kāi)發(fā)者在編程中遇到的困難都具有很重要的意義。本文對(duì)已有文獻(xiàn)進(jìn)行了概括分析,對(duì)編程行為數(shù)據(jù)收集工具進(jìn)行了介紹,對(duì)已有工作進(jìn)行了概括與分類(lèi),總結(jié)了當(dāng)前編程困難檢測(cè)研究的進(jìn)展。
對(duì)于編程困難檢測(cè)而言,特征數(shù)據(jù)的收集至關(guān)重要。但是在對(duì)于開(kāi)發(fā)者行為數(shù)據(jù)的收集,能夠采集到什么編程語(yǔ)言的行為數(shù)據(jù),能夠采集到什么層次的哪些行為數(shù)據(jù),取決于所使用的IDE以及行為記錄工具。Ihantola等人[5]在他們對(duì)于教育數(shù)據(jù)挖掘的綜述中總結(jié)了多款可用于編程數(shù)據(jù)收集的工具,見(jiàn)表1前10行。
對(duì)于編程行為數(shù)據(jù)收集工具來(lái)說(shuō),其能收集的數(shù)據(jù)類(lèi)型越豐富越好。Yoon等人[6]開(kāi)發(fā)的FLUORITE1http://www.cs.cmu.edu/~fluorite/research.html可以記錄Eclipse下Java編程的多種事件級(jí)信息。他們宣稱(chēng)該工具可以記錄Eclipse代碼編輯器內(nèi)的全部低層次事件。FLUORITE分為兩個(gè)部分:其logger部分能夠記錄各種編程事件并保存到xml文件中;其analyzer部分可以用來(lái)檢測(cè)代碼編輯模式、對(duì)收集到的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和可視化。Fluortie記錄三種類(lèi)型的事件:
●命令(Command):直接由用戶動(dòng)作引發(fā)的事件,包括:輸入文本、移動(dòng)文本光標(biāo)、通過(guò)鍵盤(pán)或鼠標(biāo)選中文本、調(diào)試以及各種編輯器命令(如復(fù)制、粘貼、撤銷(xiāo))。
●文檔變化(Document Change):執(zhí)行任意命令導(dǎo)致文件變化時(shí)被記錄的事件。該類(lèi)型事件會(huì)記錄文檔變化的內(nèi)容、位置、時(shí)間等信息。
●注解(Annotation):這類(lèi)事件用于讓開(kāi)發(fā)者向調(diào)查人員提供注解。用戶可以點(diǎn)擊注解按鈕,然后在下圖所示彈出來(lái)的對(duì)話框中添加注解。
表1 已有的編程數(shù)據(jù)收集工具示例
Fluorite在記錄這些事件的同時(shí)還記錄了各個(gè)事件的內(nèi)容:如插入刪除的文本、文本光標(biāo)移動(dòng)時(shí)的位置、打開(kāi)的文件、事件的時(shí)間戳等。在Fluorite的基礎(chǔ)之上,Long等人[17]開(kāi)發(fā)了EclipseHelper這一困難檢測(cè)實(shí)驗(yàn)平臺(tái),它集成了實(shí)時(shí)困難檢測(cè)、標(biāo)記困難標(biāo)簽、可視化編程行為數(shù)據(jù)與預(yù)測(cè)結(jié)果等功能。
編程中的困難可以被定義為:開(kāi)發(fā)者(或觀察者)可以感知到的開(kāi)發(fā)速度低于正常[18]。
對(duì)于各種編程困難檢測(cè)研究,我們可以從各種不同的方面對(duì)其進(jìn)行分類(lèi)。依據(jù)算法是否能夠?qū)崟r(shí)地檢測(cè)編程困難,我們可以將它們分為在線(online)的方法以及離線(offline)的方法。依據(jù)算法是否需要使用額外的傳感器設(shè)備來(lái)捕捉編程時(shí)的數(shù)據(jù),我們可以將它們分為有傳感器(with sensor)的方法以及無(wú)傳感器(sensor free)的方法。
依據(jù)算法是否能夠在開(kāi)發(fā)者編程的過(guò)程中即時(shí)地檢測(cè)出困難,可以將編程困難檢測(cè)分為兩類(lèi):在線編程困難檢測(cè)以及離線編程困難檢測(cè)。
圖1 在線困難檢測(cè)流程
如果一個(gè)困難檢測(cè)器能夠在開(kāi)發(fā)過(guò)程中連續(xù)不斷采集開(kāi)發(fā)者信息的同時(shí),利用這些信息實(shí)時(shí)地檢測(cè)出開(kāi)發(fā)者是否遇到了困難,那么我們稱(chēng)這種檢測(cè)方法是在線的。在線編程困難檢測(cè)的一般流程如圖1所示。首先,程序需要在開(kāi)發(fā)者編程的同時(shí),持續(xù)地采集各種變成情境下的原始數(shù)據(jù)。然后將得到的這些原始數(shù)據(jù)進(jìn)行特征提取,將得到的特征作為訓(xùn)練好的困難檢測(cè)分類(lèi)器中,實(shí)時(shí)地判斷開(kāi)發(fā)者是否遇到了困難。如果開(kāi)發(fā)者遇到了困難,則可以從原始數(shù)據(jù)中提取新的特征來(lái)檢測(cè)更多困難上下文信息,如困難類(lèi)型。在線困難檢測(cè)中,通常使用開(kāi)發(fā)者的生理心理數(shù)據(jù)(如心率、肌電、腦電圖等)或行為數(shù)據(jù)以及一些代碼的統(tǒng)計(jì)數(shù)據(jù)作為數(shù)據(jù)源。在線困難檢測(cè)如Cater的研究[19],Cater手動(dòng)檢查了被試在遇到困難時(shí)的行為變化,總結(jié)出了五類(lèi)開(kāi)發(fā)者遇到困難時(shí)可能有明顯變化的行為:文件導(dǎo)航(打開(kāi)文件、切換文件等);編輯(文本插入、刪除);移除代碼(方法或類(lèi));調(diào)試;切入切出IDE(Integrated Development Environment,集成開(kāi)發(fā)環(huán)境)。依據(jù)這五類(lèi)行為的比率,Carter使用決策樹(shù)成功地在開(kāi)發(fā)者編程的同時(shí)檢測(cè)出了他們的困難。
如果一個(gè)困難檢測(cè)器需要在開(kāi)發(fā)者完成一次編程之后,才能收集到所需的所有數(shù)據(jù)或者才能開(kāi)始訓(xùn)練檢測(cè)器模型,不能做到實(shí)時(shí)地檢測(cè)困難。那么我們稱(chēng)這種檢測(cè)方法是離線的。在離線的困難檢測(cè)中,通常是對(duì)開(kāi)發(fā)者在編程過(guò)程的不同階段進(jìn)行分析。例如,Piech等人[20]利用學(xué)生在編程過(guò)程中的代碼快照對(duì)其開(kāi)發(fā)路徑進(jìn)行了建模,以此展示學(xué)生的進(jìn)度,并確定他們?cè)谀睦镉龅嚼щy。他們記錄學(xué)生每次編譯時(shí)的代碼快照,利用K-Mediods算法對(duì)來(lái)自不同學(xué)生的代碼快照進(jìn)行聚類(lèi),再使用隱馬爾可夫模型訓(xùn)練出一個(gè)有限狀態(tài)機(jī),如圖2所示。這一狀態(tài)機(jī)可以表示學(xué)生在編程時(shí)如何在各種高層狀態(tài)之中轉(zhuǎn)移。這些高層狀態(tài)代表著學(xué)生在編程時(shí)的不同里程碑階段。使用這一方法,可以在學(xué)生完成編程練習(xí)之后,建模他們的編程進(jìn)展過(guò)程,從而識(shí)別出學(xué)生在編程中何時(shí)遇到了困難。學(xué)生在編程過(guò)程中,可能在連續(xù)多個(gè)代碼快照中均停留在一個(gè)高層狀態(tài),這種狀態(tài)則被稱(chēng)為“下沉狀態(tài)”,它指示著學(xué)生可能遇到了嚴(yán)重的編程困難。
圖2
某一學(xué)生在開(kāi)發(fā)一個(gè)程序過(guò)程中狀態(tài)轉(zhuǎn)移的隱馬爾可夫模型。結(jié)點(diǎn)“codet”表示學(xué)生在時(shí)刻t的代碼快照,而結(jié)點(diǎn)“statet”表示的是學(xué)生在時(shí)刻t所處的高層狀態(tài)。N是該學(xué)生的代碼快照數(shù)量[20]。
依據(jù)算法在采集特征數(shù)據(jù)時(shí)是否需要使用額外的傳感器,可以將編程困難檢測(cè)分為兩類(lèi):有傳感器方法和無(wú)傳感器方法。這兩類(lèi)方法有各自的優(yōu)缺點(diǎn)。
有傳感器方法指在標(biāo)準(zhǔn)設(shè)備之外的傳感器來(lái)收集數(shù)據(jù)的方法。使用傳感器可以收集到更豐富的,更多類(lèi)型的數(shù)據(jù)。常見(jiàn)的傳感器數(shù)據(jù)包括:被試的心率、皮膚電導(dǎo)等生理特征、被試的面部照片(表情)、按鍵壓力、坐姿,等等。其中很多數(shù)據(jù)與困難相關(guān)。例如微表情[21]可以很好地揭示出一個(gè)人的情緒,而開(kāi)發(fā)者在遇到編程困難時(shí),常常伴隨著困惑、沮喪等情緒。Kapoor等人[22]使用多種傳感器來(lái)預(yù)測(cè)孩子何時(shí)感到沮喪。他們認(rèn)為:沮喪感與身體姿勢(shì),面部表情,施加于鼠標(biāo)的壓力和皮膚電導(dǎo)的變化相關(guān)。為了驗(yàn)證這一猜想,他們?cè)?4名中學(xué)生解決漢諾塔問(wèn)題的時(shí)候,從相機(jī)、姿勢(shì)座椅、壓力鼠標(biāo)和無(wú)線藍(lán)牙皮膚電導(dǎo)測(cè)試收集這些數(shù)據(jù)。在編程過(guò)程中,為了收集類(lèi)標(biāo)數(shù)據(jù),參與者需要點(diǎn)擊“我很沮喪”按鈕。當(dāng)參與者沒(méi)有點(diǎn)擊“我很沮喪”按鈕時(shí),他們被標(biāo)記為不沮喪。他們訓(xùn)練了幾種分類(lèi)算法來(lái)輸出模型,如支持向量機(jī)(Support Vector Machines,SVM)。他們的結(jié)果顯示SVM算法達(dá)到了70.83%的查準(zhǔn)率。Fritz等人[23]則使用了心理-生理傳感器收集了15位專(zhuān)業(yè)程序員在編碼時(shí)的數(shù)據(jù),包括眼動(dòng)儀、皮膚電活動(dòng)傳感器、腦電圖。他們使用這些數(shù)據(jù)來(lái)預(yù)測(cè)開(kāi)發(fā)者是否遇到了困難。對(duì)于訓(xùn)練集外的開(kāi)發(fā)者,其查準(zhǔn)率達(dá)到了64.99%,查全率達(dá)到了64.58%。對(duì)于訓(xùn)練集外的編程任務(wù),其查準(zhǔn)率達(dá)到了84.38%,查全率達(dá)到了69.79%。
雖然有傳感器方法可以搜集到更全面的特征信息,從而提升算法準(zhǔn)確度。但是它也存在明顯的弊端。首先,傳感器的布置就會(huì)造成額外的開(kāi)銷(xiāo),尤其是許多專(zhuān)用設(shè)備造價(jià)高昂使用復(fù)雜,導(dǎo)致方法難以普及。其次,使用傳感器可能會(huì)對(duì)被試造成干擾,并且會(huì)涉及到用戶的隱私。
無(wú)傳感器方法雖然收集的數(shù)據(jù)類(lèi)型不如有傳感器方法豐富,但是它不需要額外布置其他設(shè)備,比較易于普及。另外它也不會(huì)對(duì)開(kāi)發(fā)者造成過(guò)多的干擾。無(wú)傳感器方法通常使用開(kāi)發(fā)者在開(kāi)發(fā)時(shí)的行為日志、代碼快照等數(shù)據(jù)。行為日志可以體現(xiàn)出開(kāi)發(fā)者的行為模式。例如,Jadud等人[24]依據(jù)編程時(shí)的編譯事件信息,提出了錯(cuò)誤商(Error Quotient,EQ)這一概念。錯(cuò)誤商可以用于發(fā)現(xiàn)開(kāi)發(fā)者在什么時(shí)候遇到了語(yǔ)法上的困難,即難以解決編譯錯(cuò)誤。它是使用以下算法計(jì)算的:
給定編譯會(huì)話,e1到en:
(1)配對(duì)連續(xù)編譯(e1,e2),(e3,e4),(e5,e6),…,(en-1,en)
(2)對(duì)有編譯錯(cuò)誤的對(duì)賦予一個(gè)數(shù)值罰分。
①如果兩邊都有編譯錯(cuò)誤,則分配8的罰分。
②如果兩邊有相同的編譯錯(cuò)誤,則額外再加上3的罰分。
圖3 Kapoor工作[22]中的系統(tǒng)架構(gòu)
(3)將分配給每一對(duì)的分?jǐn)?shù)除以11(每對(duì)可能的最大值)
(4)將每對(duì)編譯的分?jǐn)?shù)相加
(5)將總分除以編譯對(duì)的總數(shù)n-1
他們通過(guò)反復(fù)試驗(yàn)來(lái)確定罰分的數(shù)值。完美的錯(cuò)誤商數(shù)為0.0,這意味著學(xué)生能夠修正語(yǔ)法錯(cuò)誤。相反,1.0的錯(cuò)誤商數(shù)意味著每次學(xué)生編譯代碼時(shí),編譯都以相同的語(yǔ)法錯(cuò)誤結(jié)束。另外他們還對(duì)比發(fā)現(xiàn)了EQ指標(biāo)和作業(yè)、考試的平均成績(jī)之間存在相關(guān)性。
也可以將傳感器數(shù)據(jù)與編程行為數(shù)據(jù)結(jié)合起來(lái)進(jìn)行編程困難檢測(cè)。Carter發(fā)現(xiàn)了他們?cè)嫉睦щy檢測(cè)方法[6]具有較高的假陰率,于是進(jìn)一步精練了行為特征集并加入傳感器特征[25]。Carter分別使用Microsoft Kinect Camera和Creative Interactive Gesture Camera來(lái)捕捉用戶的坐姿,判斷用戶是否前傾、后傾。他們發(fā)現(xiàn)在結(jié)合坐姿特征以及編程行為特征之后,可以明顯改進(jìn)檢測(cè)結(jié)果,降低假陰率。
編程困難檢測(cè)作為編程數(shù)據(jù)挖掘的一個(gè)分支,與教育界以及工業(yè)界密切相關(guān)。在檢測(cè)到用戶遇到困難之后,可以采取多種措施來(lái)輔助編程過(guò)程。對(duì)于學(xué)生,我們可以給予他一定情感支持來(lái)保持其學(xué)習(xí)動(dòng)機(jī)。對(duì)于專(zhuān)業(yè)開(kāi)發(fā)者,我們可以為他提供一定的代碼內(nèi)容上的支持,引導(dǎo)他解決困難。目前的各種編程困難檢測(cè)方法存在不足,如在用戶空閑時(shí)不能準(zhǔn)確地區(qū)分用戶是在思考編程還是去做與編程無(wú)關(guān)的事情;在檢測(cè)到困難后給予用戶的反饋不足等缺點(diǎn)。本文概述了編程困難檢測(cè)中的數(shù)據(jù)收集、通用流程、方法分類(lèi),希望可以促進(jìn)編程困難檢測(cè)研究的進(jìn)展。