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

เริ่มต้นจากเรื่องสำคัญของ Technical Excellence

ผมชอบคำพูดจาก Jim Highsmith ที่ว่า

In Agile project, 

Technical Excellence is measured by 
both capacity to deliver customer value today
and create an adaptable product for tomorrow.

คำถาม คือ เราใส่ใจเรื่องนี้ในระบบงานเราหรือไม่ ?
ทั้งในแง่ของคน ทีม รวมไปถึงวินัยและ skill
ทั้งในแง่ของ Architecture
ทั้งในแง่ของ code

จาก Agile Principle ข้อที่ 9 คือ

Continuous attention to Technical Excellence 
and good design enhance agility.

คำถาม คือ เราใส่ใจหรือไม่ ?
ถ้าตอบว่า ใส่ใจแต่ไม่ทำ นั่นคือ ไม่ใส่ใจ !!

จาก Less.Works พูดถึง Technical Excellence ว่า

Organizational Agility is constrained by Technical Agility

ดังนั้นคำว่า Agility หรือ True Flexibility จะเกิดขึ้นได้
เมื่อเราสามารถเปลี่ยนแปลง product หรือระบบงานได้ง่าย เร็ว และยึดหยุ่น

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

หนึ่งในวิธีการแก้ไขคือ
การนำแนวปฏิบัติที่ดีในการพัฒนา software มาใช้งาน
หรือเอาเข้ามาแก้ไขปัญหาที่เราพบเจออยู่
เพื่อเพิ่มเรื่องของคุณภาพ
รวมไปถึงการเปลี่ยนแปลงที่ง่ายและรวดเร็วขึ้น
ดังนั้นในทีมส่งมอบ software/product จำเป็นต้องเรียนรู้ ลงทุนด้านนี้อย่างสม่ำเสมอ

แต่ก่อนอื่นนั้น ไม่ว่าจะนำ framework หรือ process อะไรมาใช้ในการพัฒนา software

ควรต้องแนะนำ ทำความเข้าใจเกี่ยวกับแนวปฏิบัติต่าง ๆ ของการพัฒนา software ด้วย
โดยเฉพาะเหล่าแนวทางตาม Agile ยิ่งต้องรู้และเข้าใจ (What and Why)
ส่วนทำอย่างไร (How) มันคืออีกเรื่อง
มิเช่นนั้น ระบบงานที่ได้ก็จะเลอะเทอะอีกแล้วครับท่าน !!!

คำถามคือแล้ว Technical Excellence หรือพวกแนวปฏิบัติในการพัฒนา software ที่ดีมีอะไรบ้าง ?

จาก Less.Works นั้นได้สรุปไว้ได้ดี ซึ่งส่วนใหญ่จะมาจาก Extreme Programming 
ซึ่งผมแนะนำให้ลองไปศึกษาดูก่อนว่ามีอะไรบ้าง 
มันคืออะไร มีประโยชน์อย่างไรบ้าง แสดงดังรูป



https://less.works/less/technical-excellence/index.html

น่าจะเป็นอีกหนึ่งวิธีการทำให้ระบบงานที่เราดูแล Agility มากยิ่งขึ้น

รวมทั้งลดปัญหาหรือพวก Technical Debt เช่น

  • Ignorance เกิดจากไม่เข้าใจการทำงานทั้งหมดของระบบ
  • Complex requirement ทำให้เกิดการพัฒนาระบบที่ซับซ้อนเกินเหตุ แทนที่การสร้างระบบเพื่อลดความซับว้อนกลับเพิ่มซะอย่างงั้น
  • Over engineering ทำให้พัฒนาระบบหรือเขียน code มากจนเกินความจำเป็น มันเปลือง
  • Undone work มีงานที่ควรทำแต่ไม่ทำเพียบ เช่น เราว่าจะเขียน Automated test นะ แต่มันทำให้เราช้า ดังนั้นเอาไว้ก่อน
  • Good code but wrong place อันนี้ทำให้เกิด code ที่ไม่จำเป็น มันดีนะ แต่ผิดที่ผิดทาง
  • Quick and dirty ทำเร็ว ๆ ให้รีบเสร็จ แล้วเดี๋ยวค่อยกลับมาแก้ไข ส่วนใหญ่ก็ไม่กลับมาแก้ไข (Later is never)

สุดท้ายแล้วมันดีนะ แต่ … มีการสนทนาหนึ่งที่น่าสนใจคือ

Tech Lead พูดว่า
ในการที่จะพัฒนาส่วนนี้ด้วยวิธีการที่ถูกต้อง
น่าจะต้องใช้เวลาในการพัฒนาประมาณ 2 รอบการทำงานนะ
แต่ถ้าใช้วิธีการแบบอื่นเพื่อให้เสร็จ น่าจะใช้เวลาสัก 2 วัน
และสิ่งที่เกิดขึ้นคือ ทีมพัฒนาต้องทำงานทั้งวันทั้งคืน 
ส่วน code ก็จะแย่มาก ๆ ไม่มีชุดการทดสอบนะ
และอาจจะส่งผลกระทบต่อการส่งมอบงานในอนาคตหรือ feature อื่น ๆ ด้วย

Business หรือ Product Owner จะได้ยินว่าอะไร ?
คำตอบคือ เราสามารถทำ feature นี้ได้ใน 2 วันหรอ !!

สิ่งที่ทำต่อจากนี้คืออะไร
เราทำให้มันผ่านไปวัน ๆ 
หรือจะทำให้มันดี เพื่ออนาคต