Blog

การตั้งค่า Assignment ใน Github Classroom

เกริ่นนำ

ปัญหาหลักในการตรวจแลปของวิชาการเขียนโปรแกรมคอมพิวเตอร์ คือ การเดินตรวจความถูกต้องของโค้ดโปรแกรมให้กับนักศึกษาแบบรายคน เป็นระยะเวลาทั้งหมด 3-5 ชั่วโมงต่อเนื่องกัน คิดดูว่าถ้าคุณต้องสอนนักศึกษาทั้งหมด 3 ห้อง โดยมีนักศึกษาเฉลี่ย 30 คนต่อห้อง เท่ากับว่าใน 1 วันคุณต้องเดินตรวจหน้าจอคอมพิวเตอร์ของนักศึกษาทั้งหมด 90 คนต่อวันเลยทีเดียว นี่ยังไม่นับว่า ใน 1 คนอาจมีการกลับไปแก้งานเดิมแล้วกลับมาส่งใหม่อีกครั้ง หรือ ร้องขอให้ตรวจสอบความถูกต้องของโค้ดโปรแกรมว่าเป็นไปตามทฤษฏีรึปล่าว


ดังนั้นการใช้โปรแกรมช่วยตรวจความถูกต้องของโค้ดโปรแกรมในเบื้องต้น จึงค่อยข้างที่จะเป็นประโยชน์ทั้งกับตัวผู้สอน และผู้เรียนด้วยเช่นกัน ผมจึงมองหาโปรแกรมหรือระบบที่มีความสามารถในการตรวจงานการเขียนโปรแกรมของนักศึกษาในลักษณะเช่นนี้ได้ ซึ่งได้ลองใช้งานไปหลายตัว (และสร้างระบบใช้งานเองด้วยเช่นกัน) แต่สุดท้ายไปเจอกับ Github Classroom ซึ่งตอบโจทย์ทุกอย่าง

วันนี้ผมเลยจะมาแนะนำการตั้งค่าให้ Github Classroom ให้สามารถตรวจงานการเขียนโปรแกรมของนักศึกษาหรือผู้ที่สนใจได้

สิ่งที่ต้องเตรียมก่อน

  • สิ่งที่คุณจะต้องทำ คือ การสร้าง Github Organization ก่อน เพื่อให้แยกกับ Github Profile เดิมของตนเอง (เนื้อหาจะได้ไม่ปนกัน)
  • สร้าง Repository Template ของโจทย์แต่ละข้อ
  • เข้าไปใน Github Classroom เพื่อสร้าง Classroom และ Assignment


การกำหนดค่าให้ Assigment

เมื่อสร้าง Assigment เรียบร้อยแล้ว ให้ตั้งค่าตามนี้


ต่อมา ส่วนนี้จะต้องทำการเลือก Repository Template ที่เราต้องการนำมาใช้เป็นโจทย์ ซึ่ง Template ที่ดีควรจะต้องมีดังนี้

  • ตั้งชื่อ Template ให้เป็น Lab นั้นๆ เพื่อความง่ายในการค้นหา
  • Setting ให้ Repository กลายเป็น Template
  • สร้าง Readme โดยให้ใส่โจทย์ปัญหาการเขียนโปรแกรมเข้าไปในนั้น (พร้อมตัวอย่าง Testcase ยิ่งดี)
  • จากนั้นในช่องนี้ ให้กดค้นหา Template ที่เราสร้างไว้

ส่วนถัดมา คือ การตั้งค่าการมองเห็น ซึ่งแนะนำให้ตั้งค่าแบบ private เพราะจะเป็นการตั้งค่าให้เฉพาะนักศึกษาคนนั้นเท่านั้นที่จะมองเห็นโจทย์ของตนเอง และจะมองไม่เห็นโค้ดของเพื่อนนักศึกษาคนอื่นที่เคยส่งโค้ดโปรแกรมข้อนี้มาแล้ว (เป็นการป้องกันการ Copy ได้ระดับหนึ่ง แม้ว่าจะไม่ใช่การป้องกันที่ดีที่สุดก็ตาม)

ต่อมา ส่วนนี้เป็นการเลือก IDE ซึ่งโดยทั่วไปในหลักสูตรวิศวกรรมคอมพิวเตอร์ หรือ วิทยาศาสตร์คอมพิวเตอร์ ส่วนใหญ่จะเลือกใช้ VS Code เพราะเป็น IDE ที่แต่ละบริษัทซอฟต์แวร์เลือกใช้กันมากที่สุด และขั้นตอนนี้ก็เช่นกัน หากเลือกผิดตั้งแต่แรกจะไม่สามารถกลับมาแก้ไขใหม่ได้ (ถ้าต้องการเลือกใหม่ ต้องลบ Assignment นี้ แล้วสร้างใหม่เท่านั้น)

ต่อมา คือส่วนของการตั้งค่า Testcase ซึ่งส่วนนี้หากขยันหน่อย ก็สามารถตั้ง Testcase หลายๆ อันได้ การตั้งค่าหลัก ให้กดปุ่ม +Add Test

การตั้งค่า Testcase ตามนี้

  • Test name : ตั้งชื่อ test case
  • Setup command : ส่วนนี้จะทำงานก่อนที่ระบบจะรันจริง ส่วนนี้ผมไม่ได้ใช้
  • Run command : ส่วนนี้คือส่วนสำคัญ วิชาที่ผมสอนเป็นภาษา C ดังนั้นผมขึ้นเขียนโค้ดการรัน ลักษณะนี้ เพื่อให้รันโค้ดโปรแกรมของนักศึกษา (โปรแกรมของนักศึกษา ต้องตั้งชื่อว่า student_program.c) เมื่อทำการ compile โค้ดของนักศึกษาเสร็จ ก็ให้รันโค้ดโปรแกรม เพื่อรอรับ Input เข้าไปในโปรแกรมของนักศึกษาได้เลย
  • Inputs : ส่วนนี้เมื่อโปรแรกมของนักศึกษาถูกรันขึ้นมาเรียบร้อยแล้ว ให้เรากรอก Input ที่เราอยากทดสอบโปรแกรมของนักศึกษา โดยโปรแกรมที่ผมทดสอบ คือ โปรแกรมใส่ตัวเลขเข้าไป แล้วโปรแกรมจะพิมพ์คำว่า Hello World ตามจำนวนบรรทัดที่กรอกมาฃ
  • Expected Output : ส่วนนี้คือผลลัพธ์ที่ถูกต้องที่เรากำหนดเอาไว้ ถ้า Inputs ที่เราใส่เข้าไปในทดสอบโค้ดของนักศึกษา มันพ่น Output ออกมา ก็จะถูกนำเอาผลลัพธ์ที่ได้มาเทียบเคียงกับ Expected Output นี้ หากตรงกัน ระบบก็จะทำการให้คะแนนความถูกต้องของโค้ดทันที
  • Comparison method : ส่วนนี้คือการตรวจสอบความเหมือนของ Output ถ้าเลือกแบบ Exact นั่นหมายความว่า Output ของนักศึกษากับของเรา จะต้องเหมือนกันเป๊ะๆ เท่านั้น (รวมพวกการเว้นวรรค การเว้นบรรทัดแบบเป๊ะๆๆๆๆ เท่านั้น) ซึ่งถ้าเลือกแบบนี้กว่านักศึกษาจะส่งงานผ่าน จะค่อนข้างใช้เวลามาก ดังนั้นจึงเลือกแบบ Included ที่เป็นการตรวจสอบคำถามให้ส่วนใหญ่ตรงกัน ก็ถือว่าผ่านได้แล้ว (มันจะตัดพวกการเว้นวรรคออกไป)
  • Timeout : จำนวนนาที ที่ทำการรันแล้วจะ kill process นี้ไป ปกติจะใส่ 1-3 นาที เพราะถ้าโปรแกรมรันนานกว่านี้ แสดงว่าโค้ดของนักศึกษาไม่มีประสิทธิภาพ หรือ มีการรันลูปที่มากจนเกินไป เพราะบางครั้งนักศึกษาก็เลือกที่จะทำโค้ดเสร็จแล้วเอามาส่งเลย (โดยที่ไม่ได้ทดลองรันในเครื่องตนเองก่อน)
  • Point : คะแนนในข้อนี้ โดยทั่วไปจะใส่ 1 คะแนนต่อ 1 testcase

การมอบหมายโจทย์ให้นักศึกษา

เมื่อเรากำหนด Assignment เสร็จแล้ว ระบบจะพาเรามายังหน้าสรุปภาพรวมของโจทย์ข้อนี้ จากรูป ถ้ามีคนส่งงานผ่านแล้ว จะขึ้นคำว่า Submitted สีเขียว และจะแสดงด้วยว่านักศึกษาคนนั้นส่งงานมาแล้วทั้งหมดกี่ commits และส่งล่าสุดเมื่อไหร่ หากต้องการนำคะแนนออกมาใช้งานเพื่อประมวลผลต่อให้กดปุ่ม Download ได้เลย

มีข้อพึงระวังคือ เมื่อทำการโหลดไฟล์ csv มา จะมีคะแนนการส่งงานอยู่ในนั้นเรียบร้อยแล้ว แต่จะไม่มีข้อมูลของนักศึกษาอยู่เลย มีเพียงแค่ github_username เท่านั้นที่พอจะเชื่อมโยงกับข้อมูลของนักศึกษาได้ ดังนั้นจึงควรทำการ mapping ข้อมูลรหัสนักศึกษากับ github_username ให้เรียบร้อยก่อนเริ่มต้นใช้งาน github classroom เช่น ทำแบบฟอร์มเก็บข้อมูลนักศึกษา พร้อมเก็บข้อมูล github_username ให้เรียบร้อยตั้งแต่แรก

สรุป

การกำหนดโจทย์สามารถทำได้หลายภาษา ทั้งภาษา C, Python, PHP, ฯลฯ แต่สิ่งสำคัญที่สุดในการทำ Auto Grading คือ การตั้งค่าคำตอบภายใน Testcase ให้ถูกต้องและสอดคล้องกับโจทย์ หากคุณตั้งค่าให้ระบบตรวจแบบ Included จะทำให้มีประสิทธิภาพในการตรวจมากที่สุด และตรวจได้ง่ายที่สุดเช่นกัน แต่หากคุณต้องการตั้งโจทย์ที่เน้นความถูกต้องจริงๆ และมี Expected Output ที่ไม่ซับซ้อนมาก แนะนำให้ใช้งานแบบ Exact จะทำได้คำตอบที่ตรงมากกว่า

บทความนี้มีประโยชน์หรือไม่? (35)
Share
Share Facbook Share Twitter
 

e-Profile RMUTL

เว็บไซต์สำหรับแสดงโปรไฟล์ ผลงาน และข้อมูลวิชาการของบุคลากร

มหาวิทยาลัยเทคโนโลยีราชมงคลล้านนา