การเรียนรู้การเขียนโปรแกรม
ในคอร์สนี้ ถึงผมจะพยายามออกแบบบทเรียนและเรียบเรียงเนื้อหาต่างๆ ให้เข้าใจง่ายเท่าที่พอจะทำได้แล้ว แต่ก็ปฏิเสธไม่ได้เลยว่า การเขียนโปรแกรมมันยากครับ
การเขียนโปรแกรมต้องอาศัยการฝึกฝนอย่างมาก
การเขียนโปรแกรมจนเชี่ยวชาญ ต้องอาศัยการฝึกฝนเยอะมาก ไม่ต่างจากการหัดเล่นดนตรีหรือวาดรูปครับ
หากคุณมีความขยันหมั่นเพียรในการศึกษาและฝึกฝน ก็จะช่วยให้คุณเขียนโปรแกรมชำนาญขึ้นได้อย่างรวดเร็วครับ
แต่ถ้าหากว่าคุณคล้ายๆ กับผม คือเป็นคนที่ไม่ขยัน แบบถ้าเรื่องไหนที่ไม่อินแล้ว มันรู้สึกเหนื่อยหน่ายที่จะต้องมาเรียนรู้และฝึกฝน ถ้าเป็นแบบนั้นแล้วล่ะก็ ผมขอแนะนำให้ลองหาเรื่องที่ทำให้เรารู้สึกอิน และรู้สึกหลงไหลไปกันมันครับ
หาเรื่องที่หลงไหล เพื่อให้ฝึกฝนได้โดยไม่เบื่อ
ผมขอยกตัวอย่างสมัยที่ผมเรียนเปียโนครับ
สมัยที่ผมเด็กๆ ทุกสัปดาห์หลังเลิกเรียน ผมจะไปเรียนเปียโนครับ
ช่วงแรกๆ ก็รู้สึกว่ามันสนุก ได้ลองเล่นอะไรใหม่ๆ และก็ได้ทักษะพื้นฐานต่างๆ ที่สำคัญครับ เช่น การเล่นให้ถูกตัวโน้ต หรือให้จังหวะถูกต้องมันเป็นยังไง
ผมก็เรียนมาเรื่อยๆ …แต่พอผ่านไปสักเล่มสองเล่ม ผมเริ่มรู้สึกว่า เราได้เล่นแค่เพลงที่อยู่หนังสือโน้ตเพลง ซึ่งก็มักจะมีแต่เพลงที่ค่อนข้างคลาสสิค ผมก็ไม่ค่อยอินกับมันเท่าไหร่ครับ พอถึงเวลาซ้อม ตั้งเป้าไว้ว่าจะซ้อมครึ่งชั่วโมง ระหว่างซ้อม ในหัวก็เริ่มรู้สึกว่า “เมื่อไหร่มันจะครบครึ่งชั่วโมงสักที” แล้วพอเรียนไปได้เทอมสองเทอม สุดท้ายผมก็เบื่อและก็ไม่ได้เรียนเปียโนต่อครับ
แต่มันก็มีบางเพลงที่ผมอยากเล่น ผมเลยลองกดคีย์แล้วฟังดูว่าโน้ตที่เล่นมันถูกไหม (หรือที่เขาเรียกกันว่าการแกะเพลง) แรกๆ กว่าจะเล่นเพลงนึงได้ ต้องแกะโน้ตทีละตัวเลยครับ ใช้เวลางมกับมันนานมาก แต่พอผมสามารถเล่นเพลงที่อยากเล่นได้แล้ว มันรู้สึกดีมากๆ ครับ ยิ่งเวลาได้เล่นดนตรีกับเพื่อนๆ ก็ยิ่งสนุก ยิ่งเพลินครับ จนรู้ตัวอีกทีเวลาก็ผ่านไปเป็นชั่วโมงๆ แล้ว ก็ดูเหมือนขยันซ้อมเนอะ ทั้งๆ ที่เป็นคนไม่ขยันเลย
ผมก็ทำแบบนี้มาเรื่อยๆ จนปัจจุบันผมสามารถเล่นคีย์บอร์ดได้ โดยการฟังเพลงแล้วเล่นตามครับ (หรือที่เรียกว่า “play by ear”) เวลาใครอยากให้ผมเล่นเพลงไหนที่ผมรู้จักอยู่แล้ว ถ้าไม่ใช่เพลงที่ซับซ้อนหรือเล่นยาก ผมก็สามารถเล่นแบบเบสิคๆ ได้ครับ โดยไม่ต้องใช้โน้ตเพลงหรือคอร์ดครับ และบางเพลงก็ไม่ต้องซ้อมมาก่อนด้วย
แต่เอาเข้าจริงๆ สกิลการเล่นเปียโนของผม ยังถือว่าห่วยกว่านักดนตรีมืออาชีพหลายอยู่ขั้นเลยครับ ผมเคยคุยกับมืออาชีพ หลายๆ คน แล้วก็พบความจริงว่า ความชอบอย่างเดียวมันไม่พอ ทุกคนต่างก็ต้องทุ่มเท หาเวลามาซ้อมไล่สเกลแต่ละคีย์ ศึกษาทฤษฎีดนตรี รวมถึงซ้อมเทคนิคต่างๆ ซ้ำแล้วซ้ำอีกจนชำนาญ[1] ผมก็ยังไม่ได้อินพอที่จะไปฝึกขนาดนั้น
ปัจจุบันก็เลยเล่นได้แบบ งูๆ ปลาๆ กดโน้ตถูกบ้างผิดบ้าง เล่นได้แค่บางคีย์ ถ้าคีย์ไหนที่ไม่คล่องก็ต้องใช้สูตรโกง แต่ก็รู้สึกว่าเราอยู่ในจุดที่เราสนุกกับมันและทำให้คนอื่นสนุกตามด้วยได้ครับ ซึ่งสำหรับผมก็คิดว่าโอเคแล้วแหละ
แรงบันดาลใจสำหรับการเขียนโค้ด
กลับมาที่เรื่องการเขียนโปรแกรมกันดีกว่าครับ จากที่ผมคุยกับเพื่อนๆ ผมพบว่าแต่ละคนมีเรื่องที่ทำให้อินกับการเขียนโปรแกรมต่างๆ กันไปครับ
สำหรับบางคน จุดเริ่มต้นของการเขียนโปรแกรมมาจากการเล่นเกมครับ บางคนก็เล่นเกมแบบ Minecraft พอเล่นมาถึงจุดนึงก็เริ่มอยาก Mod เกมครับ แรกๆ ก็อาจจะเอา Mod ที่คนอื่นทำไว้มาติดตั้ง แล้วจนถึงจุดนึงก็อยากทำ Mod เอง แล้วก็เริ่มศึกษา หรือบางคนก็ถึงขั้นอยากสร้างเกมเป็นของตัวเอง แล้วก็เริ่มศึกษาจากตรงนั้นครับ
สำหรับใครที่อยากสร้างเกม มีคอร์สฟรีชื่อ Code Your First Game ของ Chris DeLeon ก็ไปลองศึกษากันได้ครับ
บางคนอาจจะชอบด้านศิลปะ แล้วก็คิดว่าถ้าให้คอมพิวเตอร์วาดรูปให้ หรือเอาโค้ดมาใช้สร้างภาพเคลื่อนไหว ก็น่าจะสร้างรูปสวยๆ หรือกราฟิกที่มันเจ๋งๆ ได้ แล้วก็ศึกษาต่อจากตรงนั้นครับ
ซึ่งถ้าคุณชอบเรื่อง Creative Coding แล้วล่ะก็ คอร์ส Computer Programming ของ Khan Academy เริ่มจากการสอนภาษา JavaScript เหมือนกัน แต่ในคอร์สนั้น ใช้วิธี สอนให้วาดรูป และสร้างภาพเคลื่อนไหวด้วยโค้ดครับ
สำหรับบางคน อาจจะมีความเป็นนักประดิษฐ์ในตัว พอลองเขียนโปรแกรมแล้วเห็นสิ่งที่ตัวเองสร้างสามารถนำใช้งานได้จริง มีประโยชน์กับคนอื่น ก็เป็นไฟที่มาเติมพลังให้ได้พัฒนาทักษะการสร้างสรรค์โปรแกรมต่อไปครับ
โปรแกรมที่มีประโยชน์ ไม่จำเป็นต้องเป็นโปรแกรมที่เขียนยากหรือซับซ้อนเสมอไปครับ อย่างอันนี้เป็นโปรแกรมนาฬิกานับถอยหลังที่ผมเคยทำไว้ใช้เอง เน้นตัวอักษรใหญ่ๆ ใช้งานง่ายๆ โปรแกรมนี้เขียนโค้ด JavaScript แค่ประมาณ 40 บรรทัดเองครับ
อยากยกตัวอย่างให้ดูอีกโปรแกรมนึงครับ อย่างเวลาไปกินข้าวกับเพื่อนๆ แล้วต่างคนต่างสั่งอาหารคนละอย่างกัน พี่จาบอนก็ทำแอพนี้ขึ้นมาครับ เอาคำนวณว่าหารกันจ่ายยังไงให้แฟร์กับทุกคน
หรือแม้แต่เรื่องที่ไม่เกี่ยวกับโปรแกรมมิ่งหรือเทคโนโลยีเลยก็ตาม บางทีก็สามารถเอามาใช้เป็นโจทย์สำหรับเขียนโปรแกรมได้ครับ สมัยก่อนผมเคยเรียนภาษาญี่ปุ่น ต้องจำตัวอักษร Hiragana และ Katakana จำนวน 92 ตัว แรกๆ ผมฝึกโดยการคัดตัวอักษร แต่มันน่าเบื่อมากๆ ผมเลยลองเขียนโปรแกรมมาช่วยติวตัวเอง ซึ่งก็ช่วยได้เยอะครับ
Build your own projects!
สุดท้ายแล้วการเขียนโปรแกรมก็เป็นแค่เครื่องมือนึงที่เอาไว้ใช้แก้ปัญหาต่างๆ ครับ ดังนั้นการเขียนโปรแกรมโดยตัวมันเอง อาจจะไม่ใช่อะไรที่น่าสนใจเท่าไหร่ครับ
ผมจึงอยากเชียร์ให้เอาความรู้ต่างๆ ที่ได้จากคอร์สนี้ ไปลองสร้างโปรเจกต์ของตัวเองด้วย พอเป็นเรื่องที่คุณสนใจ คุณอาจจะอินกับมันมากขึ้น และมีไฟในการพัฒนาฝีมือมากขึ้นครับ
คอมมูนิตี้
อีกเรื่องนึงที่อาจจะช่วยให้เรามีกำลังใจ หรือมีแรงบันดาลใจที่จะฝึกเขียนโปรแกรม คือชุมชนของนักพัฒนาซอฟต์แวร์ครับ เราไม่ได้เดินบนทางสายนี้อยู่คนเดียว บางทีการมีเพื่อนร่วมทางที่ปรึกษากันได้ ก็จะช่วยให้เราได้เรียนรู้ไปด้วยกันครับ
ในเฟสบุ๊ค มีกลุ่ม สมาคมโปรแกรมเมอร์ไทย ที่มีคนมาถาม-ตอบกันเป็นประจำ มีคำถามทุกรูปแบบ ตั้งแต่คำถามเชิงเทคนิค เรื่องการเรียน จนถึงเรื่องการทำงานและเส้นทางอาชีพครับ
และวงการเทคโนโลยีในไทย มีอีเวนต์แบ่งปันความรู้จัดอยู่เรื่อยๆ ครับ หลายๆ อีเวนต์สามารถมาร่วมงานได้ฟรี โดยเฉพาะงาน meetup ที่เป็นงานให้คนที่สนใจเรื่องเดียวกันได้มาเจอกันครับ สามารถลองเข้าไปดูอีเวนต์ต่างๆ ที่ Thai Tech Calendar ได้
(ขอขายของอีกนิดนึง) มีกลุ่ม Creatorsgarten เป็นกลุ่มที่รวมตัวผู้คนที่ชอบสร้างของและชอบจัดอีเวนต์ต่างๆ ผมเองก็อยู่ในกลุ่มนี้ครับ เรามีการจัดอีเวนต์กันเรื่อยๆ สามารถติดตามอีเวนต์ต่างๆ ที่เราจะจัดได้ทางเพจเฟสบุ๊ก Creatorsgarten และดูคลิปวิดีโอ บันทึกเนื้อหาจากงานต่างๆ ได้ทางแชนแนล YouTube ครับ
การเรียนการเขียนโปรแกรมในระดับที่ง่ายขึ้น
เรื่องสุดท้ายที่อยากจะพูดถึงในบทนี้ คือ เราจะสามารถเรียนรู้ได้ดี ถ้าเกิดเนื้อหาในบทเรียน อยู่ใกล้ๆ กับระดับความเข้าใจของเราครับ
และการจะเขียนโปรแกรมเนี่ย ต้องใช้หลายทักษะพร้อมๆ กัน
- อย่างแรกคือเราต้องคิดและออกแบบชุดคำสั่ง ที่จะทำให้คอมพิวเตอร์สามารถแก้ปัญหาได้อย่างถูกต้อง — ซึ่งก็ต้องใช้ทักษะในการคิดเป็นขั้นเป็นตอน หรือที่เขาเรียกกันว่า “การคิดเชิงคำนวณ” หรือภาษาอังกฤษคือ “Computational thinking” ครับ
- แค่นั้นไม่พอ เราต้องเขียนโค้ดของเรา ให้ถูกต้องตามหลักของภาษา ต้องพิมพ์คำสั่งต่างๆ ให้ถูกต้องเป๊ะๆ — ซึ่งก็ต้องใช้ทักษะในทางภาษา ทั้งคำศัพท์ต่างๆ และหลักไวยากรณ์ครับ
สำหรับบางคนนี่ก็อาจจะไม่ใช่เรื่องยาก แต่ก็อาจจะมีบางคนที่รู้สึก overwhelmed หรือรู้สึกว่าสิ่งที่กำลังเรียนอยู่มันเกินระดับที่เราสามารถเข้าใจได้ ณ ตอนนี้
ซึ่งมันไม่ผิดอะไร ถ้าเกิดเราจะไปลองศึกษาวิชา ในเลเวลที่ง่ายกว่านี้ก่อน แล้วค่อยกลับมาศึกษาคอร์สนี้ทีหลังครับ
มีเว็บ code.org ที่สอนเรื่อง Computational thinking ผ่านภาษา Scratch ครับ
ภาษา Scratch เป็นภาษาโปรแกรมมิ่ง ที่ใช้การลากบล็อกต่างๆ มาต่อกันเพื่อสร้างโปรแกรม แทนการพิมพ์โค้ดครับ
ในเว็บ CodingThailand.org ก็ได้มีการรวบรวมหลักสูตรภาษา Scratch ต่างๆ แบ่งเป็นชั้นปี ตั้งแต่ ป.1 ถึง ป.6 ครับ โดยในแต่ละปีก็มีหลายๆ คอร์ส และในแต่ละคอร์สก็มีกิจกรรมต่างๆ เยอะมาก
ในแต่ละกิจกรรม ก็จะมีโจทย์ปัญหา และคำแนะนำให้ครับ — หน้าที่ของเรา คือเอาบล็อกต่างๆ ออกมาจากกล่องเครื่องมือ แล้วเอามาต่อกันเพื่อแก้ปัญหาตามที่โจทย์กำหนดครับ
ผมเองก็เพิ่งรู้ได้ไม่นานว่าเดี๋ยวนี้มันมีหลักสูตรพวกนี้ให้เรียนกันตั้งแต่ชั้นประถมศึกษาแล้ว — สมัยผมเนี่ย ไม่มีอะไรแบบนี้เลยครับ หลายๆ คนกว่าจะได้เริ่มเรียนเขียนโค้ด ก็ตอนเข้ามหาลัย โดยที่ไม่ได้ผ่านการปูพื้นฐานอะไรมาเลย ก็ต้องมาเริ่มจากศูนย์ จนเขียนโค้ดให้เป็น ภายในเวลาแค่เทอมเดียว แล้วพอทำไม่ได้ก็ท้อ หมดกำลังใจ บางคนก็เกลียดการเขียนโปรแกรมไปเลย
ก็นับว่าเป็นเรื่องที่ดีมากๆ ที่เดี๋ยวนี้มีหลักสูตรที่ช่วยปูพื้นฐาน ให้เราสามารถเข้าไปเรียนกันได้ฟรีแล้วครับ
นอกจากนี้ ภาษา Scratch ยังสามารถเอามาใช้สร้างเกมและแอปได้ด้วย
สุดท้ายแล้ว แต่ละคนก็อาจจะมีวิธีการเรียนรู้ในรูปแบบของตัวเองที่แตกต่างกันไปครับ ถ้าเราหาวิธีการเรียนรู้ที่เหมาะกับเราเจอ ก็น่าจะช่วยให้เราสามารถเรียนรู้ได้เร็วขึ้นและสนุกมากขึ้นครับ
และในโลกอินเทอร์เน็ต มีแหล่งเรียนรู้เกี่ยวกับการเขียนโปรแกรมเต็มไปหมดเลย อาจจะเรียนประกอบกับคอร์สนี้ก็ได้ หรือถ้าไม่ชอบรูปแบบการสอนของคอร์สนี้ ก็สามารถลองไปเรียนคอร์สอื่นๆ แทนได้ อย่างไรก็ตาม ผมอยากเชียร์ให้ทุกคนที่อ่านมาถึงตรงนี้ ได้ลองศึกษาการเขียนโปรแกรมดู ไม่ทางใด ก็ทางนึงครับ เพราะอย่างที่ผมเคยพูดครับ เขียนโปรแกรมเป็นแล้วโคตรเจ๋ง
โอเค ถ้าพร้อมแล้ว เรามาเริ่มเข้าสู่บทเรียนภาษา JavaScript กันเลยครับ
อาจจะเรียกการฝึกฝนแบบนี้ว่า “Deliberate practice” ↩︎