Categories
Education

คณิตศาสตร์ในเด็กประถม

ช่วงหนึ่งเดือนกว่าๆ มานี้ ผมมีโอกาสไปสอนพิเศษ วิชาคณิตศาสตร์ให้กับเด็กประถมปลายในโรงเรียนแห่งหนึ่ง เด็กที่มาเรียนก็ได้รับการสอบคัดเลือกมาเรียน ระดับชั้นหนึ่งก็มีสักสิบกว่าคน เด็กที่นี่ก็เรียกได้ว่าเก่งทีเดียว เนื้อหาที่เรียนก็ไปไกลมากเมื่อเทียบกับสมัยที่ผมยังเด็กๆ อยู่ บางเรื่องผมเรียนตอนมัธยมต้น บางเรื่องผมเรียนตอนมัธยมปลาย แต่เด็กประถมสมัยนี้เรียนกันแล้ว !

หลังจากสอนมาระยะหนึ่ง ก็พอรู้มาบ้างว่าเด็กสมัยนี้เรียนไวจริงๆ แต่ไม่แน่ใจว่าเป็นเด็กเฉพาะกลุ่มหรือเปล่า เด็กในห้องส่วนใหญ่ติวพิเศษหลังเลิกเรียนหรือเสาร์อาทิตย์ บางคนเรียนพิเศษไปถึง ม.4 แล้ว

แต่เป็นที่น่าสังเกตุอยู่อย่างหนึ่ง คือ เด็กส่วนใหญ่สามารถทำโจทย์กันได้ แต่เวลาให้แสดงวิธีทำ หรือ วิธีคิด เด็กมักไม่แน่ใจ บางคนก็รู้ว่าโจทย์แบบนี้ต้องใช้สูตรอะไรแต่อธิบายไม่ได้  บางคนก็ใช้วิธีลัด ซึ่งเป็นการมองข้ามกระบวนการคิดอย่างเป็นขั้นเป็นตอนไป

ล่าสุดเรียนเกี่ยวกับรูปทรงเรขาคณิต ลองให้วาดรูปสามเหลี่ยม สี่เหลี่ยม เริ่มจากทำบนกระดานก่อน ดูแล้วก็ง่ายๆ สำหรับเด็กๆ แต่เพื่อเชื่อมโยงกับกระบวนการคิด ผมเลยถามว่า ถ้าจะบอกให้คอมพิวเตอร์วาดรูปนี้ละ โดยเริ่มจากจุดๆ หนึ่ง เด็กๆ เริ่มงง บางคนก็บอกเหมือนกับว่าคอมพิวเตอร์เป็นคนซะอย่างงั้น

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

เมื่อผมเริ่มถามชี้นำให้เด็กๆ ความคิดเห็นก็เริ่มออกมา เมื่อพวกเขาไม่ลดความพยายาม ในที่สุดก็ทำสำเร็จจนได้ บนใบหน้านั้นเต็มไปด้วยรอยยิ้ม ภาคภูมิใจ แต่แฝงความสงสัยในความฉลาดของคอมพิวเตอร์ ถ้าจะว่ากันจริงๆ ด้วยวิวัฒนาการปัจจุบันต้องบอกว่ามันไม่ฉลาดเอาซะเลย

ผมไม่แน่ใจนะว่าระบบติวเพื่อทำแต่ข้อสอบ มีผลต่อกระบวนการคิดของเด็กมากน้อยขนาดไหน ผมก็พยายามให้พวกเขาฝึกคิด คิดช้าๆอย่างเป็นขั้นตอน และที่สำคัญ ต้องสื่อสารออกมาให้ได้ว่าคิดอย่างไร คำตอบสุดท้ายอาจไม่สำคัญเท่ากับกระบวนการได้มาซึ่งคำตอบนั้น

Categories
Education Scratch

สอนความคิดสร้างสรรค์ให้เด็กด้วย Scratch

ความคิดสร้างสรรค์เป็นอย่างไร เราคงพอนึกกันออก แต่คำนิยามความคิดสร้างสรรค์นั้นยังไม่มีแน่ชัด แล้วความคิดสร้างสรรค์สามารถเรียนรู้กันได้หรือเปล่า ถ้าลองสำรวจดูจะสังเกตุได้ว่าความคิดสร้างสรรค์น่าจะมีอยู่สองแบบ คือ แบบที่ 1. ความคิดที่เกิดขึ้นมาเองแว๊บหนึ่งในสมอง เป็นความคิดใหม่ที่อาจยังไม่มีใครเคยคิดมาก่อน ความคิดแบบนี้เกิดได้ยากมาก บางครั้งมักเกิดจากโชค บางครั้งเกิดจากแรงบันดาลใจ

แบบที่ 2. คือความคิดที่เกิดจากประสบการณ์ การประยุกต์ปรับเปลึ่ยน สิ่งที่มีอยู่แล้ว วิธีคิดแบบนี้ต้องอาศัยความขยัน หมั่นสังเกตุลักษณะที่ใช้ร่วมกัน เชื่อมโยงประสบการณ์กับสิ่งใหม่ และคิดอย่างเป็นขั้นตอน ในงานโฆษณามักถูกมองว่าใช้ความคิดสร้างสรรค์ จากงานวิจัยพบว่าเกือบ 90 % ของงานที่ได้รางวัลชนะเลิศ เกิดจากการประยุกต์ใช้ 1 ใน 6 ของต้นแบบที่มีอยู่ก่อนแล้ว

อาจเป็นเรื่องยากที่จะสอนความคิดสร้างสรรค์ให้เด็ก แต่ใช่ว่าจะทำไม่ได้เลย เพียงแต่ความคิดสร้างสรรค์ต้องอาศัยเวลาเก็บเกี่ยวประสบการณ์ที่หลากหลาย และการได้หัดคิด หัดสังเกตุ ประยุกต์สิ่งที่เคยเรียนมาแล้วกับสิ่งใหม่ โดยเฉพาะการประยุกต์ข้ามบริบทที่ดูเหมือนไม่น่าจะเกี่ยวข้องกัน

แนวทางการสอนเด็กเกี่ยวกับความคิดสร้างสรรค์ จึงไม่ใช่การให้โจทย์แล้วเฉลยคำตอบ เพราะเราไม่เน้นที่คำตอบ แต่เน้นที่กระบวนการคิด ดังนั้นควรใช้วิธีการชี้นำ ถามให้เกิดความสงสัย ถามให้เกิดการเชื่อมโยง ถามเพื่อให้เกิดการทดลอง และสิ่งที่สำคัญ คือการเปิดโอกาสให้เด็กได้แสดงความคิดออกมา ถูกผิดไม่ใช่ประเด็นสำคัญ การแสดงออกทางความคิด เป็นกระบวนการตกตะกอนทางความคิด ทำให้เด็กได้เรียบเรียงสิ่งที่ได้เรียนรู้มาแล้ว ถ่ายทอดออกมาทางคำพูด หรือ สื่อชนิดอื่นๆ

การสอนเด็กให้เขียนโปรแกรมด้วย Scratch เป็นวิธีหนึ่งที่จะช่วยสร้างความคิดสร้างสรรค์ให้เด็ก ด้วยการฝึกคิดอย่างเป็นระบบ ฝึกการเชื่อมโยงผ่านโปรเจกที่หลากหลาย ฝึกเลือกใช้สื่อหลากหลายรูปแบบให้เหมาะสม เพื่อแสดงออกทางความคิดผ่านผลงานตัวเอง และได้ใช้เหตุและผล แลกเปลี่ยนความคิด วิเคราะห์ วิจารณ์ ผลงานตัวเองและของผู้อื่น

Categories
BYOB Programming

หลักการเขียนโปรแกรมใน BYOB ตอนที่ 2

ฟังก์ชัน square สามารถวาดรูปสี่เหลี่ยม 100 x 100 ได้ขนาดเดียวทุกคร้้งที่เรียกใช้ฟังก์ชันนี้ ซึ่งไม่ค่อยยืดหยุ่น ถ้าเราต้องการสี่เหลี่ยมขนาดอื่นละ ทำได้ไหม ตามหลักการแล้ว คือการทำ Generalization ให้กับฟังก์ชัน โดยการส่งผ่านข้อมูลให้กับฟังก์ชัน เพื่อให้ฟังก์ชั่นทำงานได้ยืดหยุ่นขึ้น ไม่เฉพาะเจาะจงอยู่กับการทำงานเพียงแบบเดียว (วาดรูปสี่เหลี่ยม 100 x 100) เช่น ถ้าต้องการวาดสี่เหลี่ยมขนาดอื่นๆ ทำได้ด้วยการให้ข้อมูลขนาด (size) ให้กับฟังก์ชัน square เพื่อให้ได้สี่เหลี่ยมตามขนาดที่ใส่เข้าไปในฟังก์ชัน square (size)

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

โดยสรุป ระดับของการทำ Generalization ให้กับฟังก์ชันต้องดูความเหมาะสม ฟังก์ชันที่ทำงานได้สารพัดอย่างย่อมมีความซับซ้อนตามไปด้วย

การใส่ข้อมูลให้กับฟังก์ชัน ทำให้หน้าตาของมัน (function interface) เปลี่ยนไป ฟังก์ชันด้านซ้ายคือ ฟังก์ชันวาดรูปสี่เหลี่ยมจัตุรัสได้หลายขนาด “square (size) steps” กับฟังก์ชันวาดรูปสี่เหลี่ยมผืนผ้าตามขนาดกว้าง x ยาว  “square (width) steps (height) steps” (ข้อมูลเข้าจะอยู่ในวงเล็บ) 2 ฟังก์ชันนี้มีหน้าตาไม่เหมือนกัน จำนวนข้อมูลเข้าไม่เท่ากัน การทำงานภายในฟังก์ชันก็ไม่เหมือนกัน แต่ยังมีหลักการทำงานคล้ายกันคือ วาดรูปสี่เหลี่ยม

โดยทั่วไป หน้าตาฟังก์ชันทำให้เรารู้คราวๆ ว่ามันสามารถทำอะไรได้บ้าง เริ่มจาก ชื่อของฟังก์ชัน square บ่งบอกว่าเกี่ยวกับสี่เหลี่ยมจัตุรัส เมื่อมีข้อมูล size พอเดาได้ว่าเกี่ยวกับขนาดหรือด้านของสี่เหลี่ยม ส่วน steps ไม่ใช่ข้อมูลเข้า เป็นเพียงข้อมูลเพิ่มเติม (ไม่มีก็ได้) บอกหน่วยของขนาด (ใช้ steps เพราะสี่เหลี่ยมเกิดจากการเดินของตัวละคร Alonzo) ส่วนอีกฟังก์ชันหนึ่ง ใช้ชื่อ square เหมือนกันแต่มีข้อมูลเข้าสองตัว width กับ height บอกขนาดกว้างกับยาวของสี่เหลี่ยมผืนผ้า (จริงๆ ควรใช้ชื่อ rectangle มากกว่า)

ข้อมูลเข้า เช่น size เรียกว่าพารามิเตอร์ (parameter) เมื่ออยู่ในฟังก์ชัน จะเป็นตัวแปรชนิดหนึ่ง ที่รู้จักเพียงภายในของฟังก์ชันนั้นๆ (local variable) ถึงแม้จะมีตัวแปรชื่อเหมือนกันภายนอกฟังก์ชัน ก็จะถือว่าเป็นตัวแปรคนละตัวกัน

เมื่อฟังก์ชันถูกเรียกใช้พร้อมกับข้อมูลเข้า เช่น ต้องการวาดสี่เหลี่ยมจัตุรัสขนาด 50 x 50 ก็ต้องเรียกใช้ฟังก์ชัน “square (50) steps” ตัวเลข 50 เรียกว่าอาร์กิวเมนต์ (argument) เป็นข้อมูลที่จะถูกส่งผ่านฟังก์ชัน เชื่อมเข้ากับตัวแปรพารามิเตอร์ size ภายในฟังก์ชัน square ซึ่งข้อมูลนี้ (50) สามารถนำไปใช้ต่อได้ภายในฟังก์ชัน square

หน้าตาของบล็อกหรือฟังก์ชัน อาจไม่เพียงพอต่อการนำมันไปใช้งาน บางคร้้งต้องอ่านข้อมูลเพิ่มเติม เช่น อ่านข้อมูลความช่วยเหลือ (help) หรืออ่านคู่มือการใช้งานฟังก์ชัน (API: application program interface) ซึ่งจะมีข้อมูลรายละเอียดการใช้งานในแต่ละฟังก์ชัน

Categories
Education Programming

เรียน JavaScript ผ่านเว็บ

สำหรับคนที่ต้องการเรียน JavaScript ผ่านเว็บไซต์ ขอแนะนำเว็บไซต์ Codecademy สอนเขียนโปรแกรมทีละขั้นตอน ด้วยคำสั่ง คำอธิบาย สั้นๆ ง่ายๆ โดยผู้เรียนเขียนโค้ดในเว็บได้เลย และ ถ้าสมัครเป็นสมาชิก ก็จะสามารถบันทึกข้อมูลการเรียนที่ผ่านมาได้ ไม่จำเป็นต้องเรียนรวดเดียว

ช่วงนี้ใช้ได้ฟรี แต่อนาคตอาจเสียเงิน ลองดูนะครับ

Categories
BYOB

หลักการเขียนโปรแกรมใน BYOB ตอนที่ 1

ความสามารถในการสร้างฟังก์ชัน หรือการสร้างบล็อกใหม่ขึ้นมาได้ใน BYOB เป็นการเพิ่มขีดความสามารถในการเขียนโปรแกรมให้กับ Scratch เนื่องจากฟังก์ชันถือเป็นเครื่องมือสำคัญ ในการเขียนโปรแกรม แต่ใช่ว่า Scratch จะทำอะไรเกี่ยวกับฟังก์ชันไม่ได้เลย ลองอ่าน ฟังก์ชันใน Scratch 1 และ 2

การสร้างฟังก์ชันเป็นการลดความซับซ้อน และซ่อนรายละเอียดของการทำงาน ให้อยู่ในรูปของชื่อฟังก์ชันแทน ในทางทฤษฎีเรียกกระบวนการนี้ว่า แอ็บสแทรกชัน (Abstraction)

การสร้างฟังก์ชัน หรือ การนิยามฟังก์ชัน เช่นฟังก์ชัน square เป็นการผูกชื่อของฟังก์ชัน (square) กับ ส่วนคำสั่งการทำงานของฟังก์ชัน (วาดรูปสี่เหลี่ยมขนาด 100 x 100)

เมื่อนิยามฟังก์ชัน square ขึ้นมาแล้ว ชื่อฟังก์ชันจะแทนแนวคิดที่อยู่เบื้องหลัง (การวาดรูปสี่เหลี่ยม) เมื่อใดที่ต้องการวาดรูปสี่เหลี่ยม ก็สามารถเรียกใช้งานฟังก์ชันผ่านการเรียกชื่อฟังก์ชัน square (function call) ส่วนการทำงานจริงจะอยู่ที่ตัวฟังก์ชัน (function body) ซึ่งมีคำสั่งต่างๆ ตั้งแต่จรดปากกา เดินเป็นรูปสี่เหลี่ยมพร้อมกับลากเส้นไปด้วย

เมื่อไรจำเป็นต้องสร้างฟังก์ชันขึ้นใช้เอง โดยปกติฟังก์ชันมักถูกคิดไว้ก่อนแล้ว ตอนออกแบบโปรแกรม อย่างไรก็ตาม เมื่อเขียนโปรแกรมไป อาจเกิดส่วนของโปรแกรมที่เหมือนกัน อยู่หลายแห่งในโปรแกรม ฟังก์ชันสามารถแทนที่ส่วนของโปรแกรมนั้นๆ เพื่อทำให้โปรแกรมสั้นลง อ่านง่ายขึ้น และดูแลรักษาได้อย่างมีประสิทธิภาพมากยิ่งขึ้น