วันจันทร์ที่ 7 ธันวาคม พ.ศ. 2552

แนวคิดการสอนเขียนโปรแกรม

1. แนวคิดการสอนเขียนโปรแกรม
หลายครั้งที่ผมต้องเริ่มสอนเขียนโปรแกรม ให้นักเรียนกลุ่มใหม่ และก็ต้องบอกเล่า ด้วยประโยคเดิมทุกครั้งว่า "การเขียนโปรแกรม ทุกภาษานั้นเหมือนกัน" สิ่งที่แตกต่างกัน ของแต่ละภาษาคือ syntax แต่สิ่งที่เหมือนกันของทุกภาษาคือ การใช้ประสบการณ์จากภาษาหนึ่ง ไปใช้ในอีกภาษาหนึ่งได้ ด้วยการซึมซับ เรื่องของ Structure Programming จนเข้าใจ เพื่อควบคุมในสิ่งที่คล้าย ๆ กันคือ input, process และ output ซึ่งหมายความว่า ถ้าท่านเขียนโปรแกรมอะไร ในภาษาหนึ่งได้แล้ว การเขียนโปรแกรมแบบนั้น ในภาษาอื่นย่อมไม่ใช่เรื่องยากอีกต่อไป เพียงแต่ต้องศึกษาถึง syntax หรือ รูปแบบการเขียนของภาษาใหม่นั้นเพิ่มเติม แล้วนำประสบการณ์ที่เคยเขียน ไปสั่งให้ภาษาใหม่ทำงานตามต้องการ ผมจึงมักสนับสนุนให้นักเรียน ได้ศึกษาภาษาที่ไม่มีตัวช่วยมาก เพื่อให้เข้าใจในหลักการ และขั้นตอนการทำงาน อย่างละเอียดชัดเจน จากการทำงานของตัวแปรภาษาที่มีตัวช่วยน้อย ทำงานบน dos สามารถแปลเป็น exe และ นำไปใช้ได้โดยไม่ยุ่งยาก เช่น c, pascal, basic, fox... หรือ clipper เป็นต้น

2. ความหมายของ Structure Programming
การโปรแกรมแบบมีโครงสร้าง หรือ การโปรแกรมโครงสร้าง คือ การกำหนดขั้นตอนให้เครื่องคอมพิวเตอร์ทำงานโดยมีโครงสร้างการควบคุมพื้นฐาน 3 หลักการ ได้แก่ การทำงานแบบตามลำดับ(Sequence) การเลือกกระทำตามเงื่อนไข(Decision) และ การทำซ้ำ(Loop)
ตำราหลายเล่มจะขยายความออกไปว่า Decision แยกเป็น If และ Case ส่วน Loop แยกเป็น While และ Until ถ้าแยกให้ละเอียดก็อาจได้ถึง 5 หลักการ แต่ในที่นี้ขอนำเสนอไว้เพียง 3 หลักการ ดังนี้
2.1 การทำงานแบบตามลำดับ(Sequence) คือ การเขียนให้ทำงานจากบนลงล่าง เขียนคำสั่งเป็นบรรทัด และทำทีละบรรทัดจากบรรทัดบนสุดลงไปจนถึงบรรทัดล่างสุด สมมติให้มีการทำงาน 3 กระบวนการคือ อ่านข้อมูล คำนวณ และพิมพ์ จะเขียนเป็นผังงาน(Flowchart) ในแบบตามลำดับได้ตามภาพ
2.2 การเลือกกระทำตามเงื่อนไข(Decision) คือ การเขียนโปรแกรมเพื่อนำค่าไปเลือกกระทำ โดยปกติจะมีเหตุการณ์ให้ทำ 2 กระบวนการ คือเงื่อนไขเป็นจริงจะกระทำกระบวนการหนึ่ง และเป็นเท็จจะกระทำอีกกระบวนการหนึ่ง แต่ถ้าซับซ้อนมากขึ้น จะต้องใช้เงื่อนไขหลายชั้น เช่นการตัดเกรดนักศึกษา เป็นต้น ตัวอย่างผังงานนี้ จะแสดงผลการเลือกอย่างง่าย เพื่อกระทำกระบวนการเพียงกระบวนการเดียว
2.3 การทำซ้ำ(Repeation or Loop) คือ การทำกระบวนการหนึ่งหลายครั้ง โดยมีเงื่อนไขในการควบคุม หมายถึงการทำซ้ำเป็นหลักการที่ทำความเข้าใจได้ยากกว่า 2 รูปแบบแรก เพราะการเขียนโปรแกรมแต่ละภาษา จะไม่แสดงภาพอย่างชัดเจนเหมือนการเขียนผังงาน(Flowchart) ผู้เขียนโปรแกรมต้องจินตนาการ ถึงรูปแบบการทำงาน และใช้คำสั่งควบคุมด้วยตนเอง ตัวอย่างผังงานที่นำมาแสดงนี้เป็นการแสดงคำสั่งทำซ้ำ(do while) ซึ่งหมายถึงการทำซ้ำในขณะที่เป็นจริง และเลิกการทำซ้ำเมื่อเงื่อนไขเป็นเท็จ


3. การเริ่มต้นเขียนโปรแกรม
เริ่มต้นเขียนโปรแกรม เริ่มต้นตรงไหน : สำหรับผม เมื่อได้มาทำหน้าที่สอนหนังสือ โดยเฉพาะการเขียนโปรแกรมทุกภาษา ผมจะสอนให้นักศึกษาเขียนโปรแกรมควบคุมตัวเลข เช่นการพิมพ์ 1 ถึง 10 หรือ สูตรคูณ หรือปิรามิดของตัวเลข ที่ต้องฝึกใช้ Structure Programming ให้ชำนาญ และปัญหาก็เกิดขึ้นทุกครั้ง คือ "นักเรียนบ่นว่าไม่ชอบเขียน ไม่มีประโยชน์" หรือ "เขียนไม่ได้ ถึงเขียนได้ ก็ไม่รู้จะเขียนไปทำไม" แล้วผมก็ต้องกลับไปอธิบายอีกครั้งว่า การเริ่มต้นแบบนี้ "จะทำให้รู้จักควบคุมโปรแกรม ตามหลักการของโปรแกรมแบบมีโครงสร้างได้ชำนาญขึ้น รู้จักเรียนรู้ และแก้ปัญหาด้วยตนเอง รวมทั้งรู้จักแก้ไข Syntax พื้นฐานไม่ให้ผิดพลาด เมื่อสามารถเขียนโปรแกรมในระดับต่อ ๆ ไปได้"
    เริ่มต้นเขียนโปรแกรมทำอย่างไร (จากหนังสือ พื้นฐานเว็บมาสเตอร์บทที่ 17)
  1. เลือกภาษา สำหรับนักเรียน นักศึกษานั้นง่ายที่จะเลือก เพราะอาจารย์คอยชี้แนะ
  2. หาแหล่งข้อมูลอ้างอิงจากห้องสมุด ถ้าท่านไม่มีอะไรอยู่ในมือเลย คงนึกโครงสร้างภาษาไม่ออกเป็นแน่
  3. หาตัวแปลภาษา ทุกภาษาต้องมีตัวแปลภาษา มีหลายภาษาที่ถูกสร้างเป็น Free compiler ต้องหาดู
  4. เขียนโปรแกรมตัวแรกที่ง่าย เช่น พิมพ์เลข 5 เป็นต้น
  5. ศึกษาการทำซ้ำ และการเลือกตามเงื่อนไข เช่นพิมพ์สูตรคูณ หรือพิมพ์ 1 ถึง 10 เป็นต้น
  6. ติดต่อแฟ้มข้อมูล เพื่ออ่านมาแสดงผล หรือปรับปรุงข้อมูลได้
  7. เขียนเมนู เพื่อเลือกกระทำโปรแกรมตามตัวเลือก
  8. ทำรายงานจากการเชื่อมแฟ้มหลายแฟ้ม โดยกำหนดได้หลายตัวเลือก
  9. เขียนโปรแกรมเพิ่มข้อมูล เช่น ซื้อ ขาย ยืม คืน หรือโปรแกรมลงทะเบียนนักศึกษาแต่ละภาคเรียนเป็นต้น
  10. สร้างโปรแกรมขึ้นมาระบบหนึ่งให้สมบูรณ์ (ความสมบูรณ์
    4. การบ้านคือ บันไดสู่ประสบการณ์
    การบ้าน (Project) : การสั่งงานให้นักเรียนได้ทำ เป็นสิ่งที่สำคัญมาก ผมได้เรียนแบบอาจารย์ที่เคยสอนผมเสมอ คือ สั่งงานเกือบทุกชั่วโมงเรียน ยกเว้นเทศกาล หรือวันหยุดราชการ ที่เว้นให้นักเรียนได้พักบ้าง สำหรับ project จะต้องใช้หลักการที่สำคัญทั้งหมดที่ได้เรียนมา หรือที่ศึกษาค้นคว้าเพิ่มเติม ด้วยตนเอง และต้องใหญ่พอที่จะใช้เวลาทำทั้งสัปดาห์ไม่เสร็จ แต่จะต้องใช้เวลาทำอย่างต่อเนื่อง ตลอดทั้งภาคเรียน การยอมรับคำวิงวอนให้ลดงานของนักเรียนนั้น อาจทำได้ตามความเหมาะสม กับบทเรียนที่ได้สอนไป แต่ขนาดงานก็ไม่ควรน้อยกว่า การทำให้นักศึกษา ได้ฝึกฝน และใช้เวลาศึกษาด้วยตนเอง (Self learning) อย่างน้อย 1 สัปดาห์ เพื่อทำให้โครงงานสำเร็จลุล่วง และในบางวิชาของการเขียนโปรแกรม ควรมีโครงงานทั้งก่อนสอบกลางภาค และปลายภาค คือมี Project 2 ชิ้น ในวิชานั้น และที่สำคัญที่สำคัญที่สุดสำหรับหลักการสั่งงานของผมคือ งานชิ้นใหญ่จะต้องเป็นงานเดี่ยว เพื่อให้ทุกคนได้มีโอกาสทำด้วยตนเอง มีความภูมิใจในความสำเร็จ และเป็นผู้รับผิดชอบขั้นตอนทั้งหมดด้วยตนเอง ผมจะไม่มอบ project ชิ้นใหญ่เป็นงานกลุ่ม เพราะไม่ต้องการให้นักเรียนคนใดเลย พลาดขบวนการเรียนรู้ แม้แต่ขั้นตอนเดียว และอาจารย์จะต้องมีเวลาที่จะตอบข้อซักถามเสมอ เพราะบ่อยครั้งที่อาจจะสอนผิด สั่งงานผิด นักเรียนนั่งหลับ นักเรียนจดผิด หนังสืออ้างอิงเขียนผิด หรือแม้แต่การตรวจงานผิดของอาจารย์ ก็เป็นได้
    กรกฎาคม 2545 หลังจากผมสอนมาสิบปี พบว่าการมอบหมายงานให้นักศึกษาไปทำงานในคอมพิวเตอร์ที่บ้าน โดยให้ฝึกปฏิบัติด้วยตนเอง ประสบความล้มเหลวมาโดยตลอด เพราะมีนักศึกษาส่วนหนึ่ง ไม่มีคอมพิวเตอร์ ไม่สนใจที่จะเขียนโปรแกรม ไม่ต้องการที่จะคิด และยอมแพ้ ทุกครั้งที่ให้เขียนโปรแกรมง่าย ๆ ทั้ง ๆ ที่มีโปรแกรมยาก ๆ รออยู่อีกมากมาย แต่นักศึกษาทำไม่ได้ จึงนึกการให้งานแบบล่าสุดออกคือ การให้ลอกโปรแกรมด้วยมือ เช่น มีโปรแกรมง่าย ๆ หรือควรรู้อยู่ 15 โปรแกรม จึงมอบหมายให้ลอกลงกระดาษ 4 รอบ และให้เสร็จใน 1 สัปดาห์ ผลที่ได้คือนักศึกษาได้อ่านหนังสือ จดจำรูปแบบภาษาได้มากขึ้น งานที่ให้ลอกไม่ได้หยุดที่ 60 โปรแกรม แต่มากขึ้น หรือน้อยลงขึ้นกับความเข้าใจ และเนื้อหาที่สอน การทำให้นักศึกษา คิดเป็น และแก้ปัญหาโจทย์ได้ เป็นอีกปัญหาหนึ่งที่ต้องสอนในห้องปฏิบัติการ ส่วนการจำรูปแบบคำสั่งไม่ได้ แก้ไขได้ด้วยการสั่งให้ลอกโปรแกรมเท่านั้น ความคาดหวังของผู้สอนว่านักศึกษาจะตั้งใจเรียน แล้วกลับไปทำคอมพิวเตอร์ที่บ้าน โดยไม่ลอกเพื่อนเพียงอย่างเดียว ผมทำมา 10 ปี แต่ไม่ได้ผลเลย
    ก็คือการสนองทุกความต้องการของผู้ใช้)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น