มีโอกาสไปแบ่งปันเรื่องการพัฒนา software
ซึ่งพยายามแนะนำการพัฒนาที่ขับเคลื่อนด้วยการทดสอบ
หมายถึงการขับเคลื่อนด้วยความเข้าใจในปัญหาก่อนที่จะลงมือทำ
ปัญหาก็เช่นกัน มันใหญ่เกินที่จะแก้ไขเพียงครั้งเดียวหรือไม่
หรือต้องทำการแบ่งเป็นปัญหาเล็ก ๆ
แล้วค่อย ๆ จัดการทีละปัญหา
เนื่องจากพบว่า ส่วนใหญ่แล้วเราจะลงมือทำทันที
ไม่ว่าเราจะเข้าใจปัญหาหรือไม่ก็ตาม
ไม่ว่าปัญหานั้นจะเล็กหรือใหญ่
ผลจากการทำคือ ปัญหาทั้งนั้น
ซึ่งอาจจะส่งผลกระทบหลาย ๆ อย่าง
ทั้งการทำงานที่ไม่ถูกต้องตามความต้องการ
ทั้งเป็นการแก้ไขปัญหาเฉพาะหน้า ไม่แก้ไขที่ต้นเหตุ
ทั้งสิ้นเปลืองเวลา คน และค่าใช้จ่ายอย่างมาก
ดังนั้นในฐานะนักพัฒนา software มาฝึกการแบ่งปัญหากันบ้าง
มาเริ่มกันเลยปล. สิ่งต่าง ๆ ที่จะแนะนำนี้ ต้องฝึกและลงมือทำอย่างเป็นประจำนะครับก่อนที่จะแบ่งปัญหาใหญ่ ๆ ออกเป็นปัญหาเล็ก ๆ นั้น จำเป็นต้องเข้าใจภาพรวมของปัญหา ที่สำคัญรายละเอียดของปัญหาเราก็ต้องเข้าใจเช่นกัน แต่เราไม่สามารถทำสองเรื่องพร้อมกันได้ เพราะว่าความสามารถของคนเรามีจำกัด ดังนั้นเราจำเป็นต้องทำทีละอย่าง ดังนี้ ขั้นตอนที่ 1 ทำให้มั่นใจว่า เราเข้าใจปัญหาจริง ๆ แค่พูดออกมามันไม่เพียงพอ เพราะว่าต้องแสดงออกมาให้เห็นเป็นรูปธรรมที่จับต้องได้ เช่น เขียนออกมาในกระดาษ เขียนข้อจำกัดต่าง ๆ ที่เรารู้ เขียนในสิ่งที่เราไม่รู้ แต่น่าจะช่วยหรือมีประโยชน์ต่อการแก้ไขปัญหา ขั้นตอนที่ 2 เขียนออกมามันเข้าใจยาก ลองวาดปัญหาออกมาเป็นภาพดีไหม เป็นภาพง่าย ๆ เช่น flow, tree เป็นต้น เพื่อทำให้เข้าใจได้ง่ายขึ้น ช่วยทำให้เห็นปัญหาและปัญหาย่อย ๆ ต่าง ๆ ได้ง่ายขึ้น แต่ถ้าเขียนแล้วจะไม่สามารถแบ่งกลุ่มของปัญหาได้ นั่นเป็นการบอกว่า เรายังไม่เข้าใจปัญหาดีพอ ดังนั้นกลับไปขั้นตอนที่ 1 เลย แต่ถ้าสามารถแบ่งกลุ่มของปัญหาได้แล้ว ให้ทำการเลือกเพียง 1 ปัญหามาทำการแก้ไข ขั้นตอนที่ 3 ทำความเข้าใจกับปัญหาย่อยที่เลือกมา จากนั้นทำตามขั้นตอนที่ 2 เพื่อลงรายละเอียดของปัญหา เพื่อแบ่งปัญหาเป็นปัญหาย่อย ๆ อีก และจะหยุดทำเมื่อ ปัญหาย่อย ๆ นั้นมันชัดเจน หรือ ไม่จำเป็นต้องแบ่งอีกต่อไปแล้ว จากนั้นจึงลงมือแก้ไขปัญหาเล็ก ๆ นั้นไปเรื่อย ๆ
ซึ่งเป็น input ของการขับเครื่องการพัฒนาด้วยการทดสอบ นั่นคือคุณต้องคิดเข้าใจ แบ่งปัญหา จากนั้นลงมือแก้ไขปัญหาเล็ก ๆ ไปเรื่อย ๆ โดยที่ยังเข้าใจในภาพรวมของปัญหาอยู่เสมอเมื่อแต่ละปัญหาถูกแก้ไขแล้ว ผลรวมที่ได้จะแก้ไขปัญหาใหญ่เอง วิธีการแบบนี้มันคุ้น ๆ เหมือน Divide and Conquer หรือไม่นะ แสดงดังรูป
เมื่อลงมือแก้ไขปัญหานั้น สิ่งที่ต้องทำประกอบไปด้วย
- เขียนปัญหาหรือคำถาม พร้อมทั้งคำตอบที่คาดหวัง
- สร้างสมมุติฐานขึ้นมา ว่าจะแก้ไขอย่างไรได้บ้าง (Creative Thinking)
- คาดการผลจากสมมุติฐานสิว่าจะได้อะไรออกมาบ้าง
- ลงมือการทำและทดสอบตามสมมุติฐาน จากนั้นบันทึกผลจากการลงมือทำ (Test and Coding)
- ทำซ้ำไปจนกว่าปัญหาหรือคำถามจะได้คำตอบที่ถูกต้อง