fbpx
บล็อก 29 มิถุนายน 2021

Technical Excellence: สร้างมาตรฐานพัฒนาซอฟต์แวร์แบบ Agile

ในยุคที่ความสนใจและความต้องการของคนเปลี่ยนแปลงไปอย่างรวดเร็ว จะทำอย่างไรให้การพัฒนาซอฟต์แวร์และผลิตภัณฑ์ มีความรวดเร็วและมีประสิทธิภาพ ไม่ใช้เวลานานจนเกินไป ที่กว่าจะเปิดตัวผลิตภัณฑ์ได้ เทรนด์ในตลาดก็เปลี่ยนไปแล้ว 

จากสถานการณ์ดังกล่าว ทำให้เมื่อไม่กี่ปีที่ผ่านมา Agile Methodology จึงกลายเป็นแนวคิดที่หลายแห่งนำมาใช้ เพื่อพัฒนาผลิตภัณฑ์ให้เกิดขึ้นอย่างรวดเร็วและปรับเปลี่ยนได้ตามความต้องการที่เปลี่ยนไป โดยหลักการคร่าวๆ คือเป็นการแบ่งงานชิ้นใหญ่ออกเป็นชิ้นย่อยๆ เพื่อให้ส่งมอบงานตามกรอบเวลาสั้นๆ (Sprint) แทนการพัฒนาให้เสร็จทีเดียวแล้วค่อยส่งมอบ (Waterfall)

แต่แนวคิดย่อมต้องมาคู่กับแนวทางปฏิบัติเพื่อให้การทำงานมีประสิทธิภาพ 

Technical Excellence คือแนวทางปฏิบัติตามแนวคิด Agile เพื่อพัฒนาซอฟต์แวร์ให้มีคุณภาพมากที่สุด และวางกระบวนการพัฒนาที่เป็นมาตรฐานเดียวกัน เพื่อลดข้อจำกัดในการทำงานของทีมให้เหลือน้อยลงที่สุด 

ทำไม Technical Excellence ถึงจำเป็น? 

โดยทั่วไปแล้ว นักพัฒนาแต่ละคนมักจะมีแนวทางการเขียน Code ที่แตกต่างกัน เมื่อหลายคนต้องมาทำโปรเจกต์ร่วมกัน การไม่ได้กำหนดมาตรฐานการเขียน Code ให้เป็นรูปแบบเดียวกัน จึงอาจก่อให้เกิดปัญหาเรื่องคุณภาพ Code เช่น สปาเก็ตตี้โค้ด (Spaghetti Code) ซึ่งหมายถึง code ที่เขียนขึ้นแบบไม่มีตรรกะ ไม่มีหลักเกณฑ์ ไม่มีระเบียบ กลายเป็น Code ที่ยาวเหยียดพันกันยุ่งเหยิงเหมือนเส้นสปาเก็ตตี้ในชาม ทำให้ไม่สามารถแยกส่วนการทำงานออกจากกันได้ กลายเป็นปัญหาเมื่อคนอื่นต้องรับช่วงไปทำต่อ การตรวจสอบ Code ทำได้ยาก และยังแก้ไขได้ยากเมื่อเกิดความผิดพลาดขึ้น 

การผลักดันให้เกิด Technical Excellence สามารถเข้าไปแก้ปัญหานี้ได้ด้วยการเข้าไปช่วยพัฒนาใน 3 ด้าน 

1. เทคนิคที่ใช้ในการพัฒนาซอฟต์แวร์ โดยหลักๆ แล้วประกอบด้วยแนวทางปฏิบัติ 2 ส่วน 

– Test-Driven Development (TDD) 

กระบวนการพัฒนาซอฟต์แวร์ที่เขียนโปรแกรมเพื่อทดสอบว่าจะเกิดปัญหาขึ้นหรือไม่ (Test case) ก่อนจะเริ่มเขียน Code จริง โดย TDD สามารถลดความผิดพลาด ตรวจสอบความผิดปกติพบตั้งแต่ในช่วงเขียน code และทำให้ Code มีคุณภาพดีขึ้น 

– SOLID Principles

หลักการ 5 ข้อในการพัฒนาซอฟต์แวร์ให้มีความยืดหยุ่นและง่ายต่อการปรับปรุงดูแล โดยมีเป้าหมายสร้าง Clean Code ที่อ่านง่ายและเข้าใจง่าย และจะช่วยให้เราสามารถเขียนโค้ดได้แบบมืออาชีพมากขึ้น

2. ทักษะเชิงเทคนิคของนักพัฒนาแต่ละคน 

แนวทางแบบ Technical Excellence กระตุ้นให้นักพัฒนาเกิดการเรียนรู้และต้องพัฒนาทักษะอย่างต่อเนื่อง จากการที่ต้องรีวิวและปรับปรุงซอฟต์แวร์อย่างต่อเนื่อง ขณะที่ออกแบบซอฟต์แวร์ที่ดีจำเป็นต้องศึกษาหาความรู้ใหม่ๆ อยู่เสมอตามเทคโนโลยีที่เปลี่ยนไป และต้องทำความเข้าใจเรื่องการใช้เครื่องมือต่างๆ ภาษาการเขียน code ปัจจัยอื่นๆ ในการสร้างซอฟต์แวร์ขึ้นมา

3. แนวทางการทำงานร่วมกันเป็นทีม  

นอกจากในแง่การพัฒนาทักษะของนักพัฒนาแต่ละคนแล้ว Technical Excellence ยังช่วยให้การทำงานภายในทีมเป็นระบบระเบียบยิ่งขึ้น โดยเฉพาะการวางมาตรฐานการเขียน Code และการเพิ่มประสิทธิภาพการทดสอบ (Testing) ด้วยการผลักดันให้เกิด Automated Testing ที่ต้องมีการทำงานร่วมกันระหว่างทีมพัฒนาและทีมทดสอบ เมื่อเกิดการทำงานอย่างเป็นระบบจะช่วยลดความผิดพลาดและเพิ่มความราบรื่นในการพัฒนาและส่งมอบซอฟต์แวร์ 

Technical Excellence ต้องเริ่มอย่างไร 

ขั้นตอนการผลักดันให้เกิด Technical Excellence อาจสรุปได้เป็น 3 ขั้นตอนหลักๆ 

1. Assessment: ประเมินวิธีการทำงานของทีมในปัจจุบัน โดยในองค์กรที่ทำงานหลายโปรเจกต์พร้อมกัน แนวทางการทำงานของแต่ละทีมย่อมมีความแตกต่างกันไป ทั้งจากความต้องการของลูกค้าที่ส่งผลให้การออกแบบกระบวนการต่างๆ ไม่เหมือนกัน และตัวของนักพัฒนาแต่ละคนที่มีวิธีการทำงานในแบบของตัวเอง 

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

  • ค้นหาว่าการทำงานส่วนไหนที่มีปัญหาต้องปรับปรุง และส่วนไหนที่ดีอยู่แล้ว ตั้งแต่การเก็บรวบรวมความต้องการของลูกค้า (requirement) การทดสอบ (testing) และการส่งมอบงานให้ลูกค้า 
  • ลิสต์สิ่งที่สามารถนำ Technical Excellence เข้าไปช่วยปรับปรุงการทำงาน 

2. Set standard: กำหนดมาตรฐานและวิธีการในการทำงานหลังดำเนินการประเมินวิธีการทำงานของทีมแล้ว โดยเริ่มจากการหาจุดที่เหมือนกันเพื่อสร้างแนวทางเบื้องต้นร่วมกันก่อน แล้วค่อยๆ ปรับเปลี่ยนการทำงานแต่ละส่วนให้มีประสิทธิภาพมากขึ้น 

สำหรับทีม Digital Excellence & Delivery ของบริษัท บลูบิค กรุ๊ป จำกัด (มหาชน) การสร้าง Technical Excellence ครอบคลุมใน 4 ส่วนด้านหลัก 

  • Coding: แบ่งเป็น 2 ส่วนหลักๆ คือ 
    • รีวิว จัดลำดับความสำคัญ และจัดการ Legacy code ซึ่งโดยทั่วไปแล้วหมายถึง code ที่ได้รับการสืบทอดมาจากโปรแกรมเมอร์คนก่อนๆ และไม่ได้มีการเขียน test หรือทำการทดสอบ code นั้นๆ  
    • กำหนดมาตรฐานการเขียน code เพื่อสร้าง clean code ซึ่งหมายถึง code ที่อ่านง่าย เข้าใจง่าย นำไปใช้งานต่อได้ง่ายในโปรเจกต์อื่นๆ เพื่อให้แก้ไขง่ายเวลาเกิดปัญหา และลดความผิดพลาดที่อาจเกิดขึ้น โดยอ้างอิงตามมาตรฐานที่ตกลงกันภายในทีม
  • Testing: ลดการทำ Manual testing และหันไปทำ Automated testing มากยิ่งขึ้น ทั้งเพื่อลดระยะเวลาการพัฒนาและลดต้นทุน โดยการใช้เทคนิคต่างๆ เช่น ลดการทดสอบที่ซ้ำซ้อนลง ตัดทอนการทดสอบที่ไม่ได้ช่วยเพิ่มความรวดเร็วในการทำงาน และการดำเนินการทดสอบอย่างสม่ำเสมอเพื่อลดภาระในการดูแลระบบ (test-maintenance load) 
  • UX/UI: เน้นการออกแบบที่เข้าใจง่ายและสร้างประสบการณ์ที่ดีที่สุดให้ทุกฝ่ายที่เกี่ยวข้อง ไม่ว่าจะเป็นลูกค้า ผู้ใช้งาน หรือพนักงาน ซึ่งถือเป็นการสร้าง Total Experience ที่คำนึงถึงหลายด้าน เช่น customer experience (CX), employee experience (EX) และ user experience (UX) เพื่อแก้ไขปัญหาให้ธุรกิจได้จริง 
  • DevOps: รวมทีม Developer กับลูกค้า (Operator) เพื่อให้การพัฒนา code และนำ code ไปใช้งานจริงทั้งการ deploy code และ product release  ดำเนินการได้อย่างรวดเร็ว โดยใช้กระบวนการทำงานแบบ CI/CD (Continuous Integration, Continuous Delivery) ซึ่งเป็นขั้นตอนตั้งแต่การ Plan -> Code -> Build -> Test -> Release -> Deploy -> Operate -> Monitor หรือบางทีเรียกสั้นๆ ว่า Pipeline
Diagram

Description automatically generated

3. Coaching: ให้คำแนะนำในการเอา Technical Excellence ไปใช้จริง ไม่ว่าจะเป็น

  • มี Specialist ในด้านต่างๆ เพื่อให้คำปรึกษากับทีม เช่น QA, testing, dev เพื่อช่วยให้คำแนะนำเฉพาะด้านอย่างรวดเร็ว 
  • จัดตั้งทีม Mentor เพื่อจับคู่ทำงานกับโปรแกรมเมอร์เข้าใหม่ หรือตั้งเป็น Mentor ประจำโปรเจกต์กรณีที่ทำงานหลายโปรเจกต์พร้อมกัน  
  • จัด knowledge sharing และการเทรนนิ่งให้ความรู้เกี่ยวกับเทคนิคต่างๆ เช่น Coding techniques ในภาษาต่างๆ หรือ Testing techniques อย่าง Acceptance Tests Driven Development (ATDD) , การสร้าง Test Stub/Driver รวมถึงการจัดหาและส่งเสริมให้เข้าแข่งกิจกรรมต่างๆ เช่น coding/algorithm challenge, hackathon
  • จัดให้มีการแข่งขันในการออกแบบผลิตภัณฑ์ และจัดทำผลิตภัณฑ์ต้นแบบ (prototyping) เพื่อเพิ่มพูนและฝึกฝนฝีมือ 

ประโยชน์ของ Technical Excellence

  • เพิ่มประสิทธิภาพและความรวดเร็วในการพัฒนาซอฟต์แวร์ 
    Technical Excellence มุ่งสร้างแนวทางปฏิบัติที่ใช้เป็นมาตรฐานในการทำงาน ตั้งแต่การสร้างมาตรฐานการเขียน code ที่ทำให้ code เข้าใจง่าย รีวิวง่าย และนำไปใช้ต่อได้ง่าย ไปจนถึงการพัฒนาการ Testing ซึ่งทำให้ระยะเวลาในออกและปรับปรุงผลิตภัณฑ์รวดเร็วขึ้น 
  • ต่อยอดสู่การสร้างโปรเจกต์หรือผลิตภัณฑ์ใหม่ๆ ที่ใช้งานได้จริง 
    นอกจากวางมาตรฐานการทำงานแล้ว Technical Excellence ยังเป็นการส่งต่อมาตรฐานที่ดีไปสู่การทำงานในโปรเจกต์ถัดไป ควบคู่ไปกับการพัฒนาแนวทางการทำงานอย่างต่อเนื่อง 
  • สร้างวัฒนธรรมการเรียนรู้และพัฒนาตัวเอง 
    การผลักดัน Technical Excellence เกิดขึ้นผ่านการแบ่งปันความรู้และประสบการณ์ต่างๆ ร่วมกันภายในทีม ซึ่งต่อยอดไปสู่การสร้างสังคมการเรียนรู้ ไม่ว่าจะเป็นการ guild หรือ community เพื่อรวบรวมกลุ่มที่มีความสนใจเรื่องเดียวกัน รวมถึง Code clinic ซึ่งเป็นพื้นที่ให้นักพัฒนาเข้ามาขอคำแนะนำและทำงานร่วมกัน เป็นต้น   

ขอบคุณข้อมูลจาก  Less Work, Tangly, Cdn2 hubspot และ Ben-morris