"The good students’ guide for the programming homework"
是的,前幾天答應要寫的這個指南終於寫了XD 雖然還有一份作業還沒改完,可是我實在是很想寫一下。
為什麼要寫這份指南?
因為當了助教之後,發現到學生會交上來的程式還真是千奇百怪… 你規定要 zip 他就偏偏要 rar,要 PDF 就給你 docx… blahblahblah 等等,而且這些還是症狀輕微的作品。有些學生的作品充滿了創意,比如說:根本編譯不過的程式也可以在文件中附上程式畫面… 所以,我決定要寫這篇指南。從助教的心態來分析各種收到的學生作業。你要想想,助教也是人,也不想改程式作業阿!(雖然我承認出作業的時候還挺開心的XD)
初階版
在初階版裡面的作業都是一些常見的錯誤,讓我分析給你聽助教的心聲… :P
規定 ooo 格式,你卻交了 xxx 格式
助教的心聲:「X的,開了一大堆作業在電腦裡面已經夠亂了。你還要我多開 Word ?!" 或是助教正在用 Linux 改各位作業的時候… "靠,你要我在 VM 裡面看 OOo 是要等多久阿?蝦密?格式還亂掉了!@#!$!@#」
這是問題最小的,不過也是最讓助教最頭痛的。通常我在出作業的時候,如果需要繳交文件,我就會要求學生使用 PDF 格式或是 TXT 格式。為什麼呢?因為這是讓你的文件在各種平台上都打得開的唯一辦法。通常很多這種課程的作業不外乎是要求學生在 Unix-like 環境上寫程式達成某些功能。因此助教收到後為了檢查勢必得打開 Unix-like OS 檢查,很多時候助教不是用 Windows 就是 Mac OS X。為了確定你的作業能在指定平台(比如說 Linux)上編譯/執行,就開了一台 Virtual Machine 來批改作業。結果這下可好,出現一個 Word 檔。我還得裝個 OpenOffice.org 這個大怪獸,說不定打開之後格式還會亂跑,電腦速度更慢。你要了解,助教也想休息,碰到這種狀況會很煩的…
指定使用 zip 壓縮,你卻用了 rar 壓縮
助教的心聲:「奇怪,這目錄怎麼沒檔案… 是檔案壞掉了嗎?」
為什麼這個要特別提出來講?因為通常助教們為了快點把程式改好,會撰寫一些簡單的 scripts 來把學生繳交的檔案快速分類、解壓縮、編譯。方便等下只要進入目錄跑一跑就可以評分。結果辛辛苦苦寫了半天就因為你這 rar 檔案趴了…像是下面這個範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/ruby dir = ARGV[0] Dir.glob("#{dir}/*.zip").each do |f| basename = File.basename(f, ".zip") system "mkdir #{dir}/#{basename}" system "unzip #{f} -d #{dir}/#{basename}" arr = Dir.glob("#{dir}/#{basename}/*") if arr.size == 1 && File.directory?(arr[0]) system "mv #{arr[0]}/* #{dir}/#{basename}/" system "rm -rfv #{arr[0]}" end end |
用這個範例可以快速的把作業解壓縮,然後(如果)你多包了一個目錄還會幫你把目錄的內容移出來。結果你搞了個 rar 檔案,解不開… 還得另外花時間幫你把檔案從原始資料夾copy出來,然後解壓縮。這個動作如果重複個十次保證你會發瘋…
進階版
所謂的進階版,就是錯誤更加的令人匪夷所思,非常有創意的狀況…
#include 沒有分號阿阿阿阿阿
這次改了一堆作業發現 很多人 犯了一樣的錯誤… 不知道為啥會傳染… (希望不是因為用抄的XD)
1 2 3 4 | #include<iostream> #include<xxx> ; #include<ooo> #include<orz> ; |
發現了嗎? #include 後面哪來的分號阿 Orz 請分清楚 #include 是 pre-processor 指令,不是 C/C++ 程式碼。所以是不需要加上分號的… 不過我還真的不知道這個習慣哪來的,我大一計概也沒看過同學這樣的…
程式完全不能編譯
這個也是相當另我覺得神奇的… 文件中跟我說你的程式可以編譯,但是我卻編譯不出來。通常這絕對不是因為用了什麼奇怪的函式庫,而是程式裡面有一大堆錯誤。拜託一下,寄給我之前請稍微測試過可以嗎 囧
原始碼副檔名不對
出這個錯誤的人稍微少了一些。這個的問題是,C/C++作業常常有人把 C code 存成 .cpp, C++ code 存成 .c。最厲害的還是存成 .txt 的。雖然內容不會因此不一樣,可是這表示出了你對你自己寫的程式也不太了解。而且最重要的是,我就不能用 make 編譯了… make 好方便的 :P
排版問題
助教的心聲(又來了XD):「天啊,這 code 到底是給誰看的…」
好,這個問題其實是很常見的問題。可是我特別提出來是因為實在很多人的程式碼都亂排版。雖然說 C/C++ 不像是 Python 強制要求 indentation。可是也麻煩一下,好歹你自己也要看這個 code 吧。尤其我的三次作業是要求同學對同一個專案持續改進。 Code 寫程式這樣你之後要怎麼改呢? 助教也很難知道你自己的努力到底有多少… 當然,另外一個著名的問題就是變數abc問題… 我就不多說了 :P
Tips & Tricks
說了這麼多問題,不如提供一些 Tips & Tricks 給大家吧。
基礎的程式絕對不要抄
很多人的程式喜歡用抄的,因為覺得很難。抄別人的就直接掰掰了,可是有人是參考課本的。在這邊我得說,參考課本的原始碼沒有問題,可是我還是強烈建議 不要 參考課本原始碼。原因很簡單,課本的程式碼通常都是很一般化的程式碼。以網路程式來說,課本的 code 就先分成 TCP, UDP 然後再呼叫自己底層又包裝一個 socket 函式去建立。這個作法看起來很不錯,可是對於初學者來說為了熟悉並使用課本的 code 得花上更多時間,更會造成迷惑。老實說,這種程式自己寫不到一百行就結束了。你還可以順便複習建立 socket 的流程準備期末考。你說,要用抄的還是自己寫呢? :P 最後,假設你真的想抄課本。聽我一個建議,自己打字!! 自己打才會對用過的函式跟參數有印象,直接 Copy & Paste 程式碼是絕對沒幫助的…
試試看 Makefile 吧?
Makefile 聽起來很難,不過絕對是出去工作的必備條件。
1 2 3 4 5 6 | all: server client server: server.cpp client: client.cpp g++ -lcrypto -o client client.cpp |
這是一個很簡單的 Makefile,簡單的編譯其實 Makefile 會自己搞定。所以 make 寫好 server.cpp 他就自己會去編譯,複雜一點的你可以把命令寫上。他就會乖乖的照做。最後用 all 包在一起,make all 你就可以重新編譯你的程式。對你來說測試方便,對助教來說批改作業也很方便。 :)
花點時間測試吧!
交作業前建議你花點時間測試,自己編譯看看。把你編譯的方式告訴助教,減低你們兩個之間的認知誤差。如果有用到什麼外部函式庫,更要記得寫在文件中。這樣的話對助教方便,也確保你的分數合乎你的預期。:P
不要用中文檔名
用中文檔名的話在 Mac OSX 跟 Linux 都很容易解壓錯誤變成亂碼。這樣還得多花時間幫你修正檔名才能看你的文件… 實在是會抓狂 :( 用英文的話就沒問題了 :P
英文拼字檢查
在程式碼中錯了就算了,檔名也錯實在有點囧… 像是 Server 很多人會寫成 Sever … 你知道打 make server 後,他跟我說不知道怎麼編譯 server (因為找不到 server.c or cpp XD) 實在是很挫折阿 Orz
內文盡量用 UTF-8 儲存
這個比較進階一點,但是很多時候你的作業是要在 Unix-like 環境上跑。最共通的多國語言環境就是 Unicode 環境,用 UTF-8 多數系統都可以正確處理你的純文字檔案。你如果偏偏用了 Big5(用 Windows 記事本預設值直接存檔的話…) 存,助教要看你的 README 檔案用 cat 還不行,還得叫 iconv 來幫忙一下。真的是很麻煩的…
結語
這次寫這篇文章只是想要發洩一下這次看到的奇怪現象 Orz 畢竟助教也跟你一樣很懶,你寫一份他得改上數十份。如果你的程式能夠好好交、好好作,對助教方便。對你自己分數也高。很多助教都很想當好人,給你高分。可是連程式都編譯不過你要他怎麼給你分數 XD 更何況在業界工作也一定都是這樣工作,早點熟悉通用且標準的作法沒有什麼不好。不是嗎? :)


evadne
2009 年 06 月 27 日 00:54:17
這封面 XDDDDD
itsZero
2009 年 06 月 27 日 00:54:42
就是樓上畫的!XD
slavery | Ouverture
2009 年 06 月 27 日 01:19:15
[...] See article at su.Zero. [...]
Zhusee
2009 年 06 月 27 日 01:22:38
封面跟內容都很推XD
t23
2009 年 07 月 03 日 00:49:17
XD 說得好!
su.Zero do { pp " » 「好學生的程式作業指南」的後續" }
2009 年 08 月 07 日 15:36:29
[...] 前一陣子也寫了一篇文章聊了一些從助教觀點來看學生程式作業的問題,沒想到也有人跟我有一樣的想法 XDDDD [...]