ต่อเนื่องจากบทความเก่าที่ว่าด้วยเรื่องของ Change สาเหตุหนึ่งที่ผมกล่าวถึงในนั้นก็คือบางครั้งการทำ Requirement Analysis และ Software Design ที่ไม่ครอบคลุมจะมีผลทำให้เกิด Change ตามขึ้นมาได้ (มากบ้าง น้อยบ้าง) นี่คือที่มาของบทความนี้ครับ … มันคงดีถ้าเรามี Requirement Analysis และ Software Design ที่มีประสิทธิภาพมากกว่าเดิม
เช่นเคยครับ เราลองมาดูกันว่าทำไมสิ่งที่ทำอยู่ตอนนี้มันไม่ดีหละ? ถ้าเพื่อนๆเจอเหตุการณ์ประมาณนี้ก็ไม่ต้องแปลกใจครับ เรื่องปกติ
- ไม่มีเวลาพอที่จะทำ Analysis และ Design … ไม่แปลก เวลาเขียนโค๊ดก็แทบจะไม่มีอยู่แล้ว
- คุยแล้วก็ไม่ค่อยละเอียดเท่าไร … ก็ไม่รู้ว่าต้องใส่ใจเรื่องอะไรบ้างนี้ บางทีตอนนั้นก็นึกไม่ออกด้วย
- บางครั้งคิดได้แล้วนะ แต่ก็ลืม … ไม่มีเวลามานั่งทำ Design Document เล่มใหญ่ๆหรอก
แล้วก็มาถึงวิธีแก้ไขในความคิดผม จะผิดจะถูกก็แล้วแต่วิจารณญาณของเพื่อนๆครับ
เรื่องของเวลา
เราจะสร้างเวลาขึ้นมาได้อย่างไร? ยกตัวอย่างง่ายๆว่า ถ้าเรานั่งอยู่ในห้องประชุม 3 ชั่วโมงพร้อมกัน 10 คน คำนวณแล้วว่าเรามีเวลาทำงานกี่ชั่วโมง? ตอบ … 3 ชั่วโมงครับ เพราะคนทั้ง 10 คนต้องทำงานอย่างเดียวกันพร้อมกัน นั่นคือนั่งในห้องประชุม เปลี่ยนใหม่ ถ้าเรานั่งอยู่ในห้องประชุมที่หนึ่ง 3 ชั่วโมงกับคน 5 คน แล้วห้องประชุมที่สองอีก 3 ชั่วโมงกับคนอีก 5 คน คำนวณแล้วว่าเรามีเวลาทำงานกี่ชั่วโมง? ตอบ … 6 ชั่วโมงครับ เพราะว่าเราทำงานพร้อมกันไปได้สองกลุ่มนั่นเอง … นี่แหละครับ วิธีการสร้างเวลาหรือใช้เวลาให้มีประสิทธิภาพมากกว่าเดิม
ทำไมผมถึงแนะนำแบบนี้? จำกฎ 80/20 ได้มั้ยครับ? “มีคนแค่ 20 % ในห้องประชุมที่มีส่วนร่วมอย่างจริงจัง (ฟัง พูด อ่าน เขียน) … ที่เหลือ 80% เข้ามาทำไม?!!” การประชุมเป็นเรื่องที่กินเวลามากเลยถ้าบริหารจัดการไม่ดีซึ่งการทำ Requirement Analysis และ Software Design ก็เป็นรูปแบบหนึ่งของการประชุม (ไม่ว่าจะเป็นทางการหรือไม่เป็นทางการ) ดังนั้นแบ่งกลุ่มซะครับ เลือกเฉพาะคนที่จำเป็นต้องรู้ จำเป็นต้องทำ จำเป็นต้องตอบคำถามจริงๆในการคุยเรื่องนี้ ที่เหลือก็ปล่อยเค้าไปตั้งกลุ่มพูดคุย Requirement อื่นๆครับ การจะทำแบบนี้ได้ตั้งอยู่ด้วยพื้นฐานสองข้อที่ต้องยอมรับ
- ทุกคนไม่จำเป็นต้องรู้ในรายละเอียดทุกเรื่อง และ
- ต้องแบ่งงานให้เล็กลงในระดับที่เหมาะสม … ถ้าโอเคหละก็ลองใช้วิธีนี้ได้ครับ
เรื่องของมุมมอง
ส่วนตัวมองว่ามันหมดยุคที่แบ่งแยกงานระหว่าง Developer กับ Tester ขาดออกจากกันแล้วนะครับ ประเภทที่ว่าฉันมีหน้า Design + Code + Unit Test ไปเธอไม่ต้องมายุ่ง เจ้าตัว Tester ก็ไม่สนเรื่องอื่น นั่งรอรับของมาทำ System Test อย่างเดียวมันล้าสมัยไปแล้วอะครับ ทำไมหนะหรอ? ก็เพราะว่ามันพิสูจน์มาแล้วว่า Developer ไม่ใช่พระเจ้าที่จะ Design หรือ Code อะไรแล้วถูกต้องหมด เห็นออกจะบ่อยที่ Developer บอกกับ Tester หลังเจอบั๊กว่า “อ่าว เออ ต้องมีแบบนี้ด้วยหรอ ไม่ได้คิดไว้เลยอะ โทษทีๆ” … แล้วก็ต้องเสียเวลาแก้กันอีก ในมุมกลับกัน มีหลายครั้งที่ Tester ไม่ได้เทสบางส่วนแล้วมันก็กลายเป็นบั๊กที่หลุดไปถึงลูกค้า และ Tester ก็มาบอกเหมือนกันว่า “อ่าว เออ ต้องเทสแบบนี้ด้วยหรอ ไม่ได้คิดไว้เลยอะ โทษทีๆ” ฮ่าๆ
ทางทีดีเราควรเปิดโอกาสให้ทุกคนที่มีส่วนร่วมกับงานตรงนี้ได้มีสิทธิมีเสียงในการแสดงความคิดเห็นตั้งแต่ต้น นั่นก็คือให้โอกาสเค้าร่วมทำ Requirement Analysis และ Software Design ด้วยกันเลย การรวมกลุ่มตรงนี้จะประกอบไปด้วย Developer + Tester + Product Manager (หรือตัวแทนลูกค้าที่ตอบคำถามในเรื่อง Requirement ได้) + Domain Expert (ผู้เชี่ยวชาญด้านต่างๆ เช่น Database Expert, Security Expert หรือ Network Expert) ด้วยหลักการหนึ่งข้อคือ “ทุกคนในกลุ่มต้องมีหน้าที่ของตัวเอง” ต้องไม่มีใครที่เข้ามานั่งจ๊อง ฟังเฉยๆ ไม่พูด ไม่จด ไม่ออกความเห็น … แบบนี้ห้ามครับเพราะมันเสียเวลาเค้าเปล่าๆ ทำแบบนี้จะเป็นการเปิดมุมมองใหม่สำหรับ Requirement Analysis และ Software Design เมื่อประกอบกับการที่เรามีหลักการในการพูดคุย (แนะนำ Operational Concept) แล้วด้วย ผลที่ได้น่าจะดีขึ้นครับ

อีกหนึ่งแนวคิดที่ผมมีคือแทนที่เราที่เป็นผู้เชี่ยวชาญกับงานอยู่แล้วจะเป็นคนนำการ Analysis และ Design ทั้งหมด ลองเปลี่ยนเป็นแบบนี้ครับ … ปล่อยให้น้องๆเค้าไปทำงานกันเองแล้วค่อยนำกลับมาเสนอ ส่วนเราก็ทำหน้าที่เป็นผู้ให้ความคิดเห็นครับ ประโยชน์ที่ผมเห็นสองอย่างคือ
- เด็กสมัยนี้เก่งนะ มุมมองกว้างกว่าเราด้วยในบางเรื่อง เช่น Technology การให้โอกาสเค้าจะเป็นการแก้ปัญหามุมมองที่ตีบตันของตัวเราเองได้ครับ
- เป็นการพัฒนาทักษะและความสามารถให้น้องๆในทีมด้วย ทั้งเรื่องของ Technical Skill เรื่องของการทำงานเป็นทีม ฝึกการเป็นผู้นำ ฝึกการเป็นผู้ตาม และอีกมากมาย
เรื่องของเอกสาร
เรื่องนี้พูดเท่าไรก็ไม่จบเนอะ ฮ่าๆ … ปัญหาอยู่ที่ว่าความสมดุลอยู่ที่ไหน? ครั้นจะตะบี้ตะบันทำเอกสารเล่มหนาปึ้กก็เสียเวลาและไม่มีอะไรมารับประกันได้ว่าจะไม่มีอะไรเปลี่ยนแปลงภายหลัง ส่วนครั้นจะไม่ทำเลยก็จะมีปัญหาอีกว่า แล้วจะเอาอะไรเป็นตัวอ้างอิงเวลาทำงานกันหละ บางครั้งคนเราก็หลงๆลืมๆ พูดอย่างทำอีกอย่างก็บ่อยไปเนอะ ทางออกสำหรับเรื่องนี้มีอยู่ว่า …
ก่อนอื่นเราต้องบอกตัวเองว่า “เราจะทำเอกสารเท่าที่จำเป็นจริงๆ” แค่นั้นพอ มาดูกันว่าอะไรที่จำเป็นจริงๆบ้างหละ? เอกสารที่จำเป็นก็จะต่างกันไปสำหรับแต่ละ Project นะ ยกตัวอย่างง่ายๆก็เช่น
- Business View ซึ่งเป็นที่มาของ Workflow ที่คนทำงานควรจะต้องรู้ รวมถึงการเชื่อมโยงของงานส่วนนี้กับระบบโดยรวมทั้งหมด
- ตัวแทนของ State Diagram ที่จะบอกเราได้ว่าทางเข้า-ทางออกของการทำงานตรงนี้คืออะไร เช่น ก่อนจะสร้าง User ได้ต้องมีเงื่อนไขอะไรบ้าง ถ้าสร้าง User สำเร็จขั้นตอนต่อไปคืออะไร แล้วถ้าสร้างไม่สำเร็จจะทำยังไง ประมาณนี้
- ประเภทของ Input – Output ของแต่ละส่วน ซึ่งอาจจะเชื่อมโยงไปในเรื่องของการออกแบบ Database
- หน้าจอ User Interface คร่าวๆว่าจะมีกี่ Textbox จะเป็น Dropdown list หรือ Radio Button ประมาณนี้
- เรื่องอื่นๆ เช่น Security, Performance, และ Constraints ต่างๆที่ต้องคำนึงถึงด้วย
- Acceptance Criteria ที่ควรจะต้องมีสำหรับงานส่วนนี้
- อื่นๆ
แต่ต่อให้ทำแค่นี้ก็อาจจะเสียเวลาแปลงจากคำพูดและข้อตกลงในห้องประชุมมาเป็นเอกสารอยู่ดีแหละ ผมมีแนวคิดมาช่วยจัดการปัญหาตรงนี้นิดหน่อยครับ ด้วยความต้องการที่ว่า “มันน่าจะดีถ้าเราได้เอกสารออกมาทันทีหลังจากจบการประชุมเลยเนอะ” … ทำได้นะครับถ้าเรากำหนดไปเลยว่า Output ที่เราต้องการหลังจากจบการประชุมนอกเหนือจากข้อสรุปแล้วก็คือเอกสารตรงนี้แหละ โดยเรามอบหมายให้สมาชิกแต่ละคนที่เข้าประชุมรับผิดชอบเอกสารไปคนละแบบสองแบบ เช่น Developer 1 รับผิดชอบเขียน Workflow กับ UI รวมกับ Developer 2 เขียน State Diagram กับ Input/Output ส่วน Tester ก็รับ Acceptance Criteria ไป พยายามใช้บอร์ด กระดาษ ปากกา ดินสอ ขีดเขียนวาดรูปให้เยอะๆครับ เอาว่าให้อ่านแล้วเข้าใจกันได้ ถ่ายรูปแล้วเก็บไว้ … นี่ก็เป็น Design Document รูปแบบหนึ่งที่พอเพียงและใช้ได้จริง เราไม่ต้องไปเสียเวลาแปลงให้เป็น Word หรือ Visio ครับ
ยังไม่หมด ฮ่าๆ … ขั้นตอนสุดท้ายก็คือการบอกข้อมูลการ Design อย่างละเอียด (สุดๆ) ไว้ด้วยการ Comment Code ครับ ถ้าตรงนี้ทำได้ดีมันจะเป็น Design Document ที่มีประสิทธิภาพที่สุดเพราะว่าก็เห็นๆอยู่ว่า Code มันเขียนไว้แบบนี้แหละ อีกจุดหนึ่งที่สะท้อนให้เห็นถึง Design ก็คือ Acceptance Criteria หรือว่า Test Case ของเรานั่นเองครับ ถ้ามี Comment ไว้ด้วยก็จะดีมากเช่นกันครับ
เรื่องของ Change
ทั้งหมดทั้งมวลที่พยายามทำไม่ได้การันตีว่าจะทำให้ Change หายไป หรือแม้แต่น้อยลง เราต้องยอมรับในเรื่องนั้น เพียงแต่ว่ามันเป็นความพยายามที่จะปรับปรุงการทำงานเพื่อให้ได้มาซึ่งคุณภาพ ความสุข และการทำงานร่วมกันเป็นทีมครับ