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

เนื่องจากพบว่า ส่วนใหญ่แล้วเราจะลงมือทำทันที
ไม่ว่าเราจะเข้าใจปัญหาหรือไม่ก็ตาม
ไม่ว่าปัญหานั้นจะเล็กหรือใหญ่

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

ดังนั้นในฐานะนักพัฒนา software มาฝึกการแบ่งปัญหากันบ้าง

มาเริ่มกันเลย

ปล. สิ่งต่าง ๆ ที่จะแนะนำนี้
ต้องฝึกและลงมือทำอย่างเป็นประจำนะครับ

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

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

ขั้นตอนที่ 2 เขียนออกมามันเข้าใจยาก ลองวาดปัญหาออกมาเป็นภาพดีไหม
เป็นภาพง่าย ๆ เช่น flow, tree เป็นต้น
เพื่อทำให้เข้าใจได้ง่ายขึ้น
ช่วยทำให้เห็นปัญหาและปัญหาย่อย ๆ ต่าง ๆ ได้ง่ายขึ้น
แต่ถ้าเขียนแล้วจะไม่สามารถแบ่งกลุ่มของปัญหาได้
นั่นเป็นการบอกว่า เรายังไม่เข้าใจปัญหาดีพอ
ดังนั้นกลับไปขั้นตอนที่ 1 เลย

แต่ถ้าสามารถแบ่งกลุ่มของปัญหาได้แล้ว
ให้ทำการเลือกเพียง 1 ปัญหามาทำการแก้ไข

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

ซึ่งเป็น input ของการขับเครื่องการพัฒนาด้วยการทดสอบ
นั่นคือคุณต้องคิดเข้าใจ แบ่งปัญหา
จากนั้นลงมือแก้ไขปัญหาเล็ก ๆ ไปเรื่อย ๆ
โดยที่ยังเข้าใจในภาพรวมของปัญหาอยู่เสมอ

เมื่อแต่ละปัญหาถูกแก้ไขแล้ว
ผลรวมที่ได้จะแก้ไขปัญหาใหญ่เอง
วิธีการแบบนี้มันคุ้น ๆ เหมือน Divide and Conquer หรือไม่นะ
แสดงดังรูป

เมื่อลงมือแก้ไขปัญหานั้น สิ่งที่ต้องทำประกอบไปด้วย

  • เขียนปัญหาหรือคำถาม พร้อมทั้งคำตอบที่คาดหวัง
  • สร้างสมมุติฐานขึ้นมา ว่าจะแก้ไขอย่างไรได้บ้าง (Creative Thinking)
  • คาดการผลจากสมมุติฐานสิว่าจะได้อะไรออกมาบ้าง
  • ลงมือการทำและทดสอบตามสมมุติฐาน จากนั้นบันทึกผลจากการลงมือทำ (Test and Coding)
  • ทำซ้ำไปจนกว่าปัญหาหรือคำถามจะได้คำตอบที่ถูกต้อง

ในการลงมือทำและทดสอบ ก็ต้องมีรู้และเข้าใจในเครื่องมือด้วย

ทั้ง OS ที่ใช้
ทั้ง Keyboard ที่ใช้
ทั้ง Editor/IDE ที่ใช้
ทั้ง command line ที่ใช้
ทั้งภาษาโปรแกรมที่ใช้
ทั้ง framework และ library ที่ใช้
และอื่น ๆ ที่เกี่ยวข้องอีกมากมาย
ต้องใช้เครื่องมือเหล่านี้ให้เกิดประโยชน์สูงสุด
นั่นคือการเลือกเครื่องมือให้เหมาะสมกับงานนั่นเอง
แต่จะรู้ได้อย่างไร ?
ก็ต้องฝึกใช้หลาย ๆ ตัวไงละ
เพื่อทำให้รู้และเข้าใจความสามารถ ข้อจำกัดนั่นเอง

ขอให้สนุกกับการ coding ครับ