ด้วยความที่อยากให้นักศึกษามีส่วนร่วมในการเรียนมากขึ้น เทอมนี้เลยพยายามเรียกนักศึกษาให้ช่วยตอบคำถาม หรือออกมาทำอะไรเล่นหน้าห้อง อย่างน้อยจะได้หลับกันน้อยลง หรือพยายามทำแบบฝึกหัดที่ให้ในห้องเรียนบ้าง แต่จะให้เลือกชื่อก็จำชื่อนักศึกษาทั้งหมดไม่ได้ แถมอาจจะเรียกบางคนซ้ำ หรือไม่ได้เรียกบางคนเลย เมื่อวานพอมีเวลาว่างอยู่บ้าง เลยนั่งเขียนโปรแกรม Java เล็กๆ ขึ้นมาหนึ่งตัว เอาไว้สำหรับสุ่มชื่อนักศึกษาในชั้นเรียน ตอนแรกก็กะจะทำเป็นโปรแกรมง่ายๆ คือแค่เปิดไฟล์อ่านชื่อนักศึกษามา แล้วก็แค่สุ่ม แต่ถ้าทำอย่างนั้นก็มีโอกาสที่บางคนจะโดนซ้ำ หรือสุ่มไม่ทั่วถึง
เพื่อเผื่อแผ่ให้ทุกคนถูกเรียกกันอย่างทั่วถึง เลยปรับการสุ่มนิดหน่อย โดยเก็บจำนวนครั้งที่นักศึกษาแต่ละคนถูกเรียกไว้ ถ้าโดนเรียกแล้วหนึ่งครั้ง ก็จะกำหนดโอกาสที่จะถูกสุ่มขึ้นมาอีกให้เป็น 1/2 ของเพื่อนที่ยังไม่เคยโดนเรียก ถ้าโดนสองครั้งก็จะลดไปอีกให้เหลือ 1/4 ของเพื่อนๆ คือให้เป็น 1/(2^n) เมื่อ n เป็นจำนวนครั้งที่ถูกเรียก เสร็จแล้วก็มานึกอีกว่าบางคนอาจจะโดนเรียกแล้วไม่อยู่ อย่ากระนั้นเลยจะต้องเก็บข้อมูลไว้หน่อยว่าคนนี้โดดเรียน เลยทำปุ่มให้กดได้ด้วยว่าโดดไปแล้วกี่ครั้ง (ไม่รู้เก็บไว้ทำไมเหมือนกัน)
สุดท้ายได้โปรแกรมออกมาหน้าตาแบบนี้

ถ้าใครสนใจลองโหลดไปเล่นได้ที่นี่ วิธีใช้ก็คือเตรียม text file ใส่ชื่อนักศึกษาบรรทัดละคน เขียน ID ก่อน แล้วค่อยตามด้วยชื่อ คั่นด้วย TAB อาจจะใส่จำนวนครั้งที่เรียกนักศึกษาไปแล้วด้วยก็ได้ คั่นด้วย TAB เหมือนกัน
ส่วนโค้ด ถ้าใครอยากได้ก็ขอมาล่ะกันครับ มันค่อนข้างเละเทะ ไม่อยากเผย อายครับ
ถ้ามีเวลาบ้าอีก ก็อาจจะเพิ่มฟีเจอร์อื่นๆ ไปด้วย
programming, teaching
programming, teaching
ช่วงนี้ได้อ่านหนังสือ “The Ruby Programming Language” ทำให้มีโอกาสได้รู้เทคนิค หรือฟีเจอร์ของภาษา Ruby หลายอย่าง แม้ว่าจะใช้ Ruby มาตั้งแต่สมัยอยู่ญี่ปุ่น แต่ยังไม่เคยมีโอกาสอ่านหนังสือจริงๆ จังๆ ส่วนใหญ่ก็ใช้ไปแบบงูๆ ปลาๆ เหตุผลเดียวที่ใช้ก็คือรู้สึกว่า syntax ค่อนข้างคงที่ไม่กำกวม แถมยังเป็น OOP ทำให้ง่ายต่อการทำงานบางอย่าง วันนี้เพิ่งอ่านเจอว่าเราสามารถเขียน method ที่รับอาร์กิวเมนต์จำนวนไม่คงที่ได้ โดยใช้วิธีการกำหนดพารามิเตอร์เพิ่มหนึ่งตัว นอกเหนือจากพารามิเตอร์ปกติ และให้ใส่เครื่องหมาย * ไว้ข้างหน้าพารามิเตอร์ตัวนั้น เช่น
def min(first, *rest)
min=first
rest.each {|x| min=x if x<min}
return min
end
method นี้จะหาค่าต่ำที่สุดของอาร์กิวเมนต์ทั้งหมดที่รับมา เช่น
โดย first เป็นพารามิเตอร์หลัก หมายความว่าจะต้องรับข้อมูลมาอย่างน้อยหนึ่งตัว ส่วน rest เป็นพารามิเตอร์สำหรับค่าอื่นๆ ที่เหลือ ในที่นี้เมื่ออ้างถึง rest จะเป็นอะเรย์เก็บค่าต่างๆ ที่ได้รับมา ดังนั้นจึงสามารถใช้ rest.each ในการอ้างถึงสมาชิกแต่ละตัว แล้วเปรียบเทียบหาค่าต่ำที่สุดได้
ลองดูฟีเจอร์นี้ของ Ruby แล้ว ก็รู้สึกว่าไม่ต่างจากรูปแบบลิสต์ [head|tail] ของ Prolog คือลิสต์ถูกแบ่งเป็นสองส่วน ได้แก่ ส่วนหัว กับส่วนที่เหลือ (ตรงนี้จะต่างจากภาษา C ที่ใช้วิธีกำหนดทั้งหมดไว้ในอะเรย์ แล้วระบุจำนวนอาร์กิวเมนต์มาให้) เลยอยากจะลองเขียน method reverse สำหรับสลับลำดับข้อมูลในลิสต์เรียงกลับจากลำดับเดิม โดยใช้วิธี recursive แบบ Prolog ดู
reverse([],[]).
reverse([H|T], R) :- reverse(T,TR), append(T,[H],R).
def reverse(first, *rest)
if rest.empty?
return [first]
else
return reverse(*rest) << first
end
end
ลองเทียบกันดูในแง่ความหมาย จะเห็นว่่าเหมือนกันเป๊ะๆ แถมยังใช้เครื่องหมายคล้ายๆ กันอีก จุดที่แตกต่างที่สุดก็เห็นจะอยู่ที่ลักษณะของ reverse ใน Ruby เป็นฟังก์ชันมีการส่งค่ากลับ ส่วน reverse ของ Prolog เป็น predicate แสดงความสัมพันธ์ระหว่าง list สองอัน
เป็นอันสิ้นสุดการทดลองของวันนี้แต่เพียงเท่านี้
programming
programming, prolog, ruby
วันก่อนเห็นบลอคของอาทเขียนเรื่องเกี่ยวกับ Netbeans 6.0 กับ Grails เลยลองไปนั่งอ่านดู Grails ก็เป็นกรอบสำหรับพัฒนาเว็บแอพพลิเคชันที่อิงมาจาก Ruby on Rails แต่ใช้ภาษา Groovy เป็นหลัก และทำงานบน Java Virtual Machine ลองอ่านหนังสือแนะนำการพัฒนาเว็บโดยใช้ Grails ดูแล้ว ก็ไม่ต่างจาก RoR หรือกรอบงานแบบเดียวกัน เช่น CakePHP แต่จุดเด่นของ Grails น่าจะอยู่ที่การใช้ JVM ให้สามารถใช้เครื่องมือ รวมทั้งไลบรารีต่างๆ ที่สร้างสำหรับ Java EE ได้เลย มีเครื่องมือให้ใช้เยอะพอดู น่าลองใช้ ที่ดูๆ อยู่เนื่องจากปี (การศึกษา) ที่แล้วพัฒนาระบบเก็บข้อมูลภายในสำหรับสถาบันฯ ด้วย CakePHP เว็บที่ทำขึ้นยังค่อนข้างสกปรกอยู่ ปีนี้อาจจะต้องปรับปรุงหรือพัฒนาเพิ่มเติม
ถ้าเปลี่ยนมาใช้ Grails แล้วสะดวกขึ้น หรือสามารถหาคนมาช่วยพัฒนาแทนได้ ไม่จำเป็นต้องทำเองทั้งหมด ก็น่าสนใจ ดูคร่าวๆ แล้ว เห็นว่า Grails มีโครงสร้างต่างๆ ที่ดีกว่า CakePHP เยอะ เพราะจุดขายของกรอบงานแบบนี้ คือ วิธีการที่เรียกว่า scaffolding ซึ่งทำให้สามารถสร้างเว็บเพื่อทำ CRUD (Create-Retrieve-Update-Delete) ได้ง่ายๆ แต่ก็เป็นปัญหาด้วยส่วนหนึ่ง เนื่องจากอาจจะไม่ได้ออกแบบมาให้ปรับแต่งได้ตามความต้องการของระบบ สุดท้ายเวลาต้องการอะไรเพิ่มเติมก็ต้องมาหาวิธีปรับแต่งเอง หรือเขียนเองทั้งหมด อย่าง RoR ก็ต้องมี StreamLine หรือ ActiveScaffold ออกมาเพื่อช่วยให้ทำงานได้ง่ายขึ้น ซึ่งส่วนนี้ดูเหมือนจะเป็นจุดเด่นของ Grails
อย่างไรก็ดี ปัญหาที่สำคัญของการใช้กรอบงานแบบนี้ คือ แนวความคิดในการพัฒนาโปรแกรมของนักพัฒนา ที่จะต้องก้าวข้ามเข้ามาอยู่ในกรอบ Object Oriented และ Model-View-Controller ผมรู้สึกว่านักศึกษาที่สอนอยู่ส่วนใหญ่ยังไม่สามารถข้ามมาได้ ส่วนใหญ่ยังติดอยู่กับ structured programming หวังว่าปีหน้าถ้าเปลี่ยนแนวคิดการพัฒนาโปรแกรมใหม่ ตั้งแต่วิชาแรกที่เริ่มเรียน เขาน่าจะเข้าใจได้ง่ายขึ้น
สุดท้ายจดลิงก์ไว้กันลืม
programming
grails, groovy, java, rails
วันนี้อ่านหนังสือใหม่ “Beautiful Code” ซึ่งเป็นหนังสือรวมบทความเกี่ยวกันการเขียนโปรแกรม โดยนักวิทยาศาสตร์ และนักพัฒนาโปรแกรมคอมพิวเตอร์ชั้นนำของโลก เลยไปเจอ quote โดนใจในตอนท้ายบทที่ 3
I believe that computer programming is a practical skill, and I agree with Pólya that we “acquire any practical skill by imitation and practice.” Programmers who long to write beautiful code should therefore read beautiful programs and imitate the techniques they learn as they write their own programs.
- Jon Bentley, “The Most Beautiful Code I Never Wrote” in “Beautiful Code”
เข้ากันสถานการณ์ที่กำลังสอนวิชาพื้นฐานให้กับนักศึกษาปีหนึ่งเลย ตอนนี้ก็พยายามย้ำเสมอๆ ว่า Programming เป็นทักษะ ที่ต้องอาศัยการฝึกฝน ไม่ใช่จำรูปแบบคำสั่งได้ แล้วจะเขียนได้ เพราะพยายามกระตุ้นให้คิดให้ทำโจทย์ในห้องเรียน แต่ก็ยังไม่ค่อยประสบความสำเร็จเท่าที่ควร สุดท้ายเลยกลายเป็นอธิบายวิธีทำโจทย์ หรือวิธีคิด วิธีเขียน อยู่ฝ่ายเดียว แต่มองอีกแง่หนึ่งก็อาจจะเป็นการเพิ่มประสบการณ์ให้นักศึกษาก็ได้ ถ้าได้ลองเอาวิธีที่สอนไป ไปคิด ไปลองเล่นเองบ้าง
programming, quote
programming
วันก่อนลองค้นไปค้นมา เจอ ActiveScaffold ซึ่งเป็น plugin สำหรับ Ruby on Rails ซึ่งสนับสนุน Ajax และสามารถปรับแต่งวิธีการแสดงผลต่างๆ ของ Scaffold ได้ง่ายๆ เลยกำลังคิดว่าจะเอามาใช้กับระบบที่กำลังทำอยู่
programming
rails, ruby
Recent Comments