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

อยากทำให้ใช้ได้
คุณสมบัติของโปรแกรมเมอร์ที่ดีคือเมื่อตั้งใจจะทำอะไรซักอย่างให้ใช้ได้แล้ว ต้องมีไฟในการขวนขวายทำให้สำเร็จ เช่น อยู่ดีๆอยากทำเว็บส่วนตัว หรือแอพมือถือ ทั้งที่ไม่เคยทำมาก่อนเลย ก็ไม่ต้องกลัวว่าไม่รู้วิธีทำ แต่ต้องเชื่อมั่นว่าเราจะหาวิธีทำให้ได้ เมื่อใจมันฮึดสู้แล้ว ความพยายามในการเรียนรู้ ลองผิดลองถูกหรือถึกทำเพื่อทำให้สำเร็จก็จะตามมา กระบวนการนี้หลายๆคนเรียกเล่นๆว่า “งม” เวลางมก็อาจจะหาบทความ, blog, tutorial, วีดีโอสอนหรือไปดู opensource ของคนอื่นที่เคยทำอะไรใกล้เคียงกัน แล้วก็ลองเขียน ลองแก้ไปเรื่อยๆ ยิ่งสมัยนี้นึกอะไรไม่ออกก็ google หรือถาม stackoverflow ได้ทันใจ ช่วยให้การงมไหลลื่นดียิ่งนัก
ในการทำโปรเจคเล่นๆลักษณะนี้ ก็ต้องค่อยเป็นค่อยไป ทุกคนเริ่มต้นจากศูนย์ทั้งนั้น จะคาดหวังว่าฝึกทำหนึ่งวันแล้วจะทำได้ดีเท่ากับคนที่ทำมาสิบปีก็เป็นไปได้ยาก ดังนั้นถ้าทำแล้วออกมาหน้าตาไม่สวยอย่างที่หวังหรือ code เละเทะมากก็อย่าเพิ่งท้อ ให้มองในแง่ดีว่ามันทำงานได้เสียก่อน ในการทำงานจริงๆ นี่จะเรียกว่าการสร้าง Minimum Viable Product หรือผลิตภัณฑ์ที่กระชับที่สุดที่ทำงานได้ เวลาลองทำก็อาจจะตั้งเป้าง่ายๆก่อน เช่น ถ้าทำเว็บส่วนตัวก็ขอแค่เอารูปตัวเองขึ้นไปแปะ กะใส่ตัวหนังสือปรับสีปรับฟอนต์ได้ก็พอใจแล้วกับขั้นแรก เป็นต้น
อยากทำให้ดีขึ้น
งานส่วนใหญ่ในชีวิตจริงจะเป็น iterative process คือทำให้มันใช้ได้ก่อน แล้วค่อยๆปรับปรุงให้ดีขึ้นเรื่อยๆ งานฝึกเล่นๆก็เช่นกัน การเรียนรู้ว่าทำให้ดีขึ้นได้อย่างไรนี่แหละที่จะทำให้เราเขียนเก่งขึ้น พอเขียนโปรแกรมใหม่ครั้งต่อไปจะได้รู้ว่าควรทำอย่างไรตั้งแต่ต้น เจอประจำว่าตัวเองเขียนโค้ดไว้โง่มาก ถ้าเขียนไว้ดีๆอีกแบบตั้งแต่แรกจะไม่ติดปัญหาที่เจออยู่ หรือเพิ่มเติมแก้ไขก็ง่าย หลายๆครั้งที่ทนความอนาถของตัวเองไม่ไหวแล้วรื้อโค้ดเขียนใหม่ เป็นเรื่องธรรมดา และส่วนหนึ่งของการเรียนรู้
ทีนี้การทำให้ดีขึ้นก็มีได้หลายมุม ทั้งสิ่งที่มองเห็น และสิ่งที่มองไม่เห็น
- ใช้งานได้ดีขึ้น (usability) — ต้องคิดถึงหัวอกคนใช้ให้มากขึ้นว่าเขาต้องการอะไร จะทำยังไงให้ทำสิ่งที่ต้องการได้สะดวกขึ้น บางครั้งนั่นอาจแปลว่าควรเพิ่ม feature ใหม่ แต่บางครั้งการลด feature ให้ user interface เรียบง่ายและชัดเจนขึ้น ก็ดีซะยิ่งกว่าเพิ่ม feature เสียอีก
- ประสิทธิภาพดีขึ้น (efficiency)— จากเดิม โปรแกรมอาจจะทำงานช้ามาก หรือเว็บโหลดชาตินึงกว่าจะขึ้น กดทีแทบแฮงค์ เราจะทำยังไงให้มันเร็วขึ้น
- ดูแลง่ายขึ้น (maintainability & reusability) — เวลาหัดเขียนใหม่ๆ โค้ดมักจะถูก copy สะเปะสะปะไปอยู่ในหลายๆที่ เวลาเจอบั๊กทีต้องตามแก้ จะทำยังไงให้ลดการ copy paste เหล่านี้ลง นอกจากนี้ชีวิตนึงโปรแกรมเมอร์ไม่ได้เขียนโปรแกรมเดียว จะทำยังไงให้ code เหล่านี้ถูกนำมาใช้ได้อีกง่ายขึ้นในอนาคตเมื่อมีงานใหม่เข้ามา
- ฯลฯ
ส่งท้าย
การตั้งเป้าในลักษณะนี้ก็เป็นมุมมองส่วนตัวของผมเอง เพราะนิสัยชอบเป็นผู้สร้าง และจะมีไฟเมื่อต้องสร้างอะไรสักอย่างให้ใช้ได้ แถมถ้าทำเสร็จแล้วอวดให้คนอื่นดูได้ก็รู้สึกดีนะ แต่ก็ไม่ได้แปลว่าการฝึกเขียนโปรแกรมต้องเริ่มต้นหรือจำกัดอยู่เพียงรูปแบบนี้เท่านั้น
ในสมัยนี้ทางเลือกการฝึกเขียนโปรแกรมก็มีเยอะขึ้น อีกรูปแบบหนึ่งที่นิยมก็คือพวกที่ทำให้การแก้โจทย์เป็นเหมือนเกม ไม่ว่าจะเป็น Codejam, Topcoder, Codefight หรือของไทยก็มี Codecube พวกนี้ก็สนุกไปอีกแบบครับ เหมือนเล่นเกม puzzle ไปเรื่อยๆ บางทีผมก็เข้าไปทำสนุกๆเหมือนกัน ข้อดีคือมันชัดเจนว่าต้องทำอะไร แทบไม่ต้องเสียเวลาเซ็ตเครื่องให้รันโปรแกรมได้ มีคำถามให้มาตรงหน้า แล้วก็พยายามแก้ พวกนี้จะให้โอกาสคุณฝึกโจทย์ยากๆ ปัญหาที่ต้องขบเยอะๆ ในขณะที่การฝึกแบบทำโปรเจคจะไม่ค่อยได้เจอ เพราะคุณต้องเป็นคนกำหนดโจทย์เอง ข้อดีที่แตกต่างไปของโปรเจคก็คือให้ฝึกมองภาพกว้างๆว่ามีส่วนประกอบอะไรบ้างที่จะทำให้ชิ้นงานสำเร็จได้ และเหมือนได้ซ้อมทำงานจริง
สุดท้ายแล้ว จะฝึกวิธีไหนก็ได้แหละครับ หากเริ่มที่ใจรักอยากจะฝึกแล้วแบ่งเวลา อาจจะวันละชม. หรือยังไงก็ได้ เอาที่สบายใจเลย พอทำแล้วสนุกก็จะเพิ่มเวลาให้มันเองโดยไม่รู้ตัว จริงๆแล้วผมมีปัญหาที่กลับกันคือชอบใช้เวลาหน้าคอมมากไปจนไม่ได้ทำอย่างอื่นซะด้วยซ้ำ