ผลิตภัณฑ์แต่ละชิ้นมีวิวัฒนาการในแบบของตัวเอง แม้แต่ทีมงานที่มีประสบการณ์ก็ยังไม่สามารถคาดเดาการเปลี่ยนแปลงในวงจรชีวิตของผลิตภัณฑ์ได้ คุณลักษณะที่เรียบง่ายสามารถถ่ายโอนไปยังเวิร์กโฟลว์ที่มีเงื่อนไขมากมายได้ สถานการณ์เสริมที่พัฒนาอย่างรวดเร็วบางสถานการณ์อาจกลายเป็นสถานการณ์ที่ใช้มากที่สุด แม้แต่ความนิยมของผลิตภัณฑ์ก็อาจทำให้เกิดปัญหาประสิทธิภาพที่ไม่คาดคิดได้ และเป็นเรื่องปกติอย่างยิ่งที่จะปรับซอฟต์แวร์ให้เหมาะกับความต้องการของตลาด วิธีเดียวที่จะมีผลิตภัณฑ์ที่เชื่อถือได้และคาดเดาได้คือการจัดสรรเวลาสำหรับการแก้ไขหนี้ทางเทคนิคและจัดเตรียมกระบวนการรีแฟกเตอร์ที่เหมาะสม
ควรระบุคำจำกัดความของคำศัพท์บางคำในบทความนี้ หนี้ทางเทคนิคหรือหนี้ทางเทคโนโลยีคือการประนีประนอมที่สะสมในฐานโค้ด ซึ่งอาจเกิดขึ้นระหว่างการพัฒนาอย่างรวดเร็วหรือความผันผวนอื่นๆ กระบวนการรีแฟกเตอร์เกี่ยวข้องกับการปรับปรุงผลิตภัณฑ์โดยทั่วไป อาจเกี่ยวข้องกับกิจกรรมที่เกี่ยวข้องกับประสิทธิภาพ โครงสร้างโค้ดที่ดีขึ้น และความเรียบง่ายของโซลูชัน อย่างไรก็ตาม บางครั้งแนวคิดทั้งสองนี้อาจใกล้เคียงกันมาก ตัวอย่างเช่น ฟีเจอร์บางอย่างที่เต็มไปด้วยหนี้ทางเทคโนโลยีอาจต้องมีการรีแฟกเตอร์โมดูลทั้งหมดอย่างเหมาะสมเพื่อแก้ไขปัญหานี้ในครั้งเดียวและตลอดไปด้วยแนวคิดใหม่และการใช้งานใหม่
และนี่คือเคล็ดลับ โดยทั่วไป นักพัฒนาซอฟต์แวร์ที่ดีมักจะมีไอเดียมากมายสำหรับการปรับปรุงผลิตภัณฑ์ "โอเค เราสามารถปรับแต่งบางอย่างในระหว่างฟีเจอร์นี้ได้" "โอ้ นั่นไม่สำคัญมากนัก แต่คงจะดีถ้าแก้ไขสิ่งนี้ในโมดูลเสริมนี้" อย่างไรก็ตาม การให้สมาชิกในทีมของคุณมีโอกาสปรับปรุงฐานโค้ดถือเป็นสิ่งสำคัญ เนื่องจากจะช่วยสร้างทีมที่มีส่วนร่วมอย่างแท้จริง อย่างไรก็ตาม ในบทความนี้ ฉันต้องการเปิดเผยกระบวนการรีแฟกเตอร์จากมุมมองของผู้จัดการ ตัวอย่างข้างต้นมีปัญหาหนึ่งประการ นั่นคือ อาจไม่ชัดเจนสำหรับทีมทั้งหมด ยกเว้นนักพัฒนา ในขณะที่ QA และผู้จัดการมีแผนที่จะเผยแพร่ซอฟต์แวร์ที่เหมาะสมและเสถียรตามกำหนดเวลา การปรับปรุงที่ซ่อนอยู่บางอย่างอาจทำให้เกิดการพลิกผันที่ไม่คาดคิดและการทดสอบซ้ำอย่างกังวลในระหว่างการเผยแพร่ หรือแม้แต่จุดบกพร่องใหม่ในการผลิต หากผ่านขั้นตอนการถดถอย การเปลี่ยนแปลงที่ไม่ได้บันทึกไว้บางส่วนไม่ถูกสังเกตเห็น ดังนั้น การปรับปรุงโค้ดจึงมีความจำเป็น แต่ควรจัดการได้
โซลูชันนั้นซับซ้อน Agile เป็นเพื่อนที่ดีที่สุดของเรา เนื่องจากหลักการและพิธีกรรมทั่วไปของวิธีการพัฒนา Agile ครอบคลุมจุดที่มีปัญหา คุณจำเป็นต้อง:
การดูแลเอาใจใส่ หมายถึง การสื่อสารระหว่างสมาชิกในทีมก่อนการทำซ้ำ โดยมุ่งเป้าไปที่การกำหนดขอบเขตของการทำซ้ำ การระบุข้อกำหนด การแยกย่อยงาน การประเมินความพยายาม และการจัดลำดับความสำคัญของรายการงานในอนาคต กระบวนการวางแผนเชื่อมโยงกับขอบเขตของการทำซ้ำที่เกิดขึ้น งานที่ดูแลเอาใจใส่อาจไม่รวมอยู่ในกระบวนการทำซ้ำทั้งหมด
มาเจาะลึกในแต่ละหัวข้อกัน
วิธีที่ง่ายที่สุดสำหรับนักพัฒนาซอฟต์แวร์ทุกคนในการสร้างแบ็กล็อกหนี้เทคโนโลยีคือการใช้แท็ก "สิ่งที่ต้องทำ" ในโค้ดต้นฉบับ ในภายหลัง คุณสามารถค้นหาฐานโค้ด ปรับปรุงบางอย่าง และส่งคำขอการดึงเพื่อขออนุมัติ แต่แค่นั้นไม่เพียงพอ เพราะไม่ได้ช่วยให้สมาชิกในทีมวางแผนอย่างเหมาะสมและมั่นใจในขอบเขตการเผยแพร่
ทางเลือกที่ดีกว่าการใช้ "สิ่งที่ต้องทำ" คือการกำหนดกระบวนการในการสร้างงานสำหรับการเปลี่ยนแปลงในอนาคต หากนักพัฒนาพบจุดที่อาจเกิดปัญหาหรือมีแนวคิดในการปรับปรุงฐานโค้ด พวกเขาควรสร้างรายการงานในระบบตั๋ว (Jira, Azure DevOps หรือระบบใดก็ตามที่ทีมใช้) การขอให้วิศวกรให้คำอธิบายโดยละเอียดเกี่ยวกับแนวคิดของพวกเขาแก่สมาชิกในทีมทุกคนถือเป็นเรื่องเกินจำเป็น แต่คำอธิบายควรชัดเจนเพียงพอเพื่อให้หัวหน้าทีมเข้าใจจุดสำคัญและขอบเขตของการเปลี่ยนแปลง ซึ่งครอบคลุมถึงขั้นตอนแรก นั่นคือ วิธีที่เราสามารถสร้างรายการงานที่อาจเกิดขึ้นและให้คำอธิบายในระดับสูงเกี่ยวกับการเปลี่ยนแปลงในอนาคต
ขั้นตอนที่สองคือการทำให้ทุกคนเข้าใจได้ งานนี้อาจได้รับการจัดการโดยหัวหน้าทีมพัฒนา ผู้จัดการฝ่ายเผยแพร่ หรือผู้จัดการผลิตภัณฑ์ ขึ้นอยู่กับคุณสมบัติ ผลลัพธ์ควรมีรายละเอียดดังต่อไปนี้:
หากรายการงานมีคำตอบสำหรับคำถามเหล่านี้ทั้งหมด ก็จะช่วยลดปัญหาที่อาจเกิดขึ้นในอนาคตได้ อย่างไรก็ตาม การมีงานค้างอยู่เพียงอย่างเดียวไม่เพียงพอสำหรับการรีแฟกเตอร์ที่จัดการได้ คุณจำเป็นต้องวางแผนการเปลี่ยนแปลงที่เป็นไปได้ และการเปลี่ยนแปลงเหล่านี้ควรเป็นส่วนหนึ่งของกระบวนการของคุณอย่างต่อเนื่อง แน่นอนว่าคุณจะต้องเผชิญกับแรงกดดันจากคุณลักษณะทางธุรกิจและความต้องการของตลาด ซึ่งมีความอยากที่จะละเว้นงานด้านเทคนิคสูง แต่หากขาดการบำรุงรักษาที่เหมาะสม คุณจะต้องเผชิญกับปัญหาที่ใหญ่กว่าในอนาคต
คำแนะนำสำหรับกระบวนการแบ็คล็อกทางเทคนิคคือ:
ในการทำซ้ำแต่ละครั้ง ทีมงานจะต้องสำรองเวลาไว้สำหรับการปรับปรุงเทคโนโลยี
หากมีแนวคิดในการปรับปรุงใดๆ ควรจัดทำเป็นรายการงานอย่างเป็นทางการพร้อมคำอธิบายที่เหมาะสม
รายการงานควรมีส่วนร่วมในกระบวนการดูแลและได้รับการหารือโดยทีมทั้งหมดจนกว่าจะระบุผลประโยชน์และความเสี่ยงทั้งหมดและรวบรวมการประมาณการจากสมาชิกในทีมทั้งหมด
รายการงานจะต้องได้รับการวางแผนในรูปแบบการวนซ้ำแบบ Agile ตามการประมาณการของพวกเขา
ทีมงานควรรับทราบปริมาณหนี้เทคโนโลยีที่อาจเกิดขึ้นในแต่ละรอบ เวลาสำรองอาจเพิ่มขึ้นได้หากจำเป็น แต่ไม่ควรน้อยกว่าจำนวนปกติ ซึ่งจะช่วยกระตุ้นให้วิศวกรสร้างงานใหม่ในงานที่ค้างอยู่และจัดลำดับความสำคัญ ทุกคนรู้ดีว่าข้อเสนอแนะของพวกเขาสามารถนำไปปฏิบัติได้ และงานค้างอยู่จะลดน้อยลงในสักวันหนึ่ง ไม่ใช่เติบโตจนกลายเป็นรายการงานที่น่าหดหู่ใจ
บางครั้งงานด้านหนี้เทคโนโลยีอาจถูกเปิดเผยระหว่างการหารือและการประเมิน ในขณะที่ทีมต้องเผชิญกับอุปสรรคที่ไม่คาดคิดซึ่งทำให้การสร้างผลงานนั้นเชื่อถือได้และยืดหยุ่นน้อยลง ตัวอย่างเช่น คุณอาจตระหนักได้ว่ามีฟีเจอร์ที่คล้ายกัน และการสร้างฟีเจอร์ใหม่เอี่ยมจะทำให้ฐานโค้ดแย่ลง แต่ฟีเจอร์เหล่านั้นไม่มีฟังก์ชันการทำงานทางธุรกิจที่จำเป็นในฟีเจอร์ใหม่ และจะดีกว่าหากสร้างบริการรวมที่เชื่อมต่อฟีเจอร์ที่คล้ายกันทั้งหมดเพื่อลดความซับซ้อนในการบำรุงรักษาในอนาคต อย่างไรก็ตาม การเปลี่ยนแปลงนี้อาจส่งผลกระทบและทำให้ฟีเจอร์เก่าไม่เสถียร และนั่นคือจุดที่ความท้าทายอยู่ บางทีอาจมีวิธีในการพัฒนาฟีเจอร์ใหม่ด้วยต้นทุนต่ำและมองข้ามจุดบกพร่อง หรือบางทีตอนนี้อาจเป็นโอกาสที่ดีที่สุดในการสร้างบริการรวมในขณะที่มีฟีเจอร์ที่คล้ายกันเพียงไม่กี่อย่าง สิ่งที่สำคัญที่สุดคือการสร้างกระบวนการที่ช่วยให้สมาชิกในทีมตัดสินใจโดยอิงจากข้อเท็จจริงที่เปิดเผยและการประมาณการที่ดูแลอย่างเหมาะสม สิ่งสำคัญคือต้องมีระบบที่ป้องกันสถานการณ์ที่การตัดสินใจดังกล่าวควรนำมาใช้ในช่วงการนำไปใช้ในแบ็กล็อกที่ยืนยันแล้ว
หากขั้นตอนการทำซ้ำของคุณทำงานได้ดี การเปิดเผยช่วงเวลาดังกล่าวจะเกิดขึ้นโดยอัตโนมัติผ่านกระบวนการดูแลและวางแผนที่เหมาะสม มีกฎและขั้นตอนพื้นฐานบางประการที่สามารถปกป้องทีมจากอุปสรรคที่ไม่คาดคิดในกรณีส่วนใหญ่:
รายการที่ค้างอยู่ซึ่งมีปัญหาสามารถแยกย่อยเป็นงานแยกกันและวางแผนตามลำดับความสำคัญ การตัดสินใจเกี่ยวกับกลยุทธ์การใช้งานอาจขึ้นอยู่กับผู้จัดการฝ่ายเผยแพร่ตามความเสี่ยงและกำหนดเวลา แต่แนวทางนี้ช่วยในการบันทึกการตัดสินใจทั้งหมด แม้ว่างานหนี้เทคโนโลยีจะถูกเลื่อนออกไป แต่ก็ยังคงถูกเพิ่มเข้าไปในรายการค้างอยู่ ในภายหลัง งานเหล่านี้ควรได้รับการตรวจสอบและกำหนดตารางงาน กระบวนการนี้จะแก้ไขสถานการณ์ที่ความคิดที่ดีและจำเป็นบางอย่างถูกลืมไปในระหว่างการทำซ้ำที่วุ่นวาย
แม้ว่าจะมีหนี้เทคโนโลยีค้างชำระและมีกระบวนการดูแลและวางแผนที่ดี แต่ก็ยังอาจพบอุปสรรคที่ไม่คาดคิดและใช้เวลานานในการพัฒนาได้ ผลิตภัณฑ์ซอฟต์แวร์อาจมีความซับซ้อน โดยเฉพาะผลิตภัณฑ์เก่าหรือมีฟังก์ชันมากมาย
การใช้แนวทางปฏิบัติแบบ Agile จะช่วยรวบรวมข้อมูลได้ตั้งแต่เนิ่นๆ และตัดสินใจได้อย่างเหมาะสม วิธีแก้ปัญหาที่ง่ายที่สุดวิธีหนึ่งคือการประชุมรายวัน
หากวิศวกรประสบปัญหาใดๆ ควรแจ้งให้พวกเขาทราบในระหว่างการประชุมและหารือในภายหลัง อุปสรรคแต่ละอย่างล้วนมีลักษณะเฉพาะและอาจใช้เวลาต่างกัน ไม่สำคัญว่าการเปลี่ยนแปลงจะถูกนำไปใช้ในรอบปัจจุบันหรือไม่ แทนที่จะเป็นฟีเจอร์ "ดีที่จะมี" หรือต้องแก้ไขขอบเขตของรอบการทำซ้ำทั้งหมด ปัญหาควรได้รับการสร้างเป็นงานหนี้เทคโนโลยีทั่วไปในระบบการติดตาม แยกย่อยและอธิบายเหมือนกับงานอื่นๆ ที่คล้ายคลึงกันในบทความก่อนหน้า ความสม่ำเสมอคือกุญแจสำคัญ และทีมงานต้องรู้วิธีจัดการกับสถานการณ์เหล่านี้
วิธีการเหล่านี้อาจดูเหมือนเป็นวิธีการเพิ่มเติมในการใช้เวลาของทีมทั้งหมดกับระบบราชการที่ไร้ประโยชน์ และอาจเป็นเช่นนั้นได้หากการไม่มีกฎเกณฑ์ที่เข้มงวดและชัดเจนไม่ได้สร้างความยากลำบากให้กับทุกคน ไม่เป็นไรที่จะไม่ปฏิบัติตามคำแนะนำเหล่านี้ในโครงการระยะสั้นหรือในระยะผลิตภัณฑ์ที่มีคุณค่าขั้นต่ำ (MVP) อย่างไรก็ตาม การทำงานด้านการผลิตที่มีความรับผิดชอบด้านคุณภาพและผลิตภัณฑ์ขนาดใหญ่จำเป็นต้องมีระบบกระบวนการภายในที่กำหนดไว้อย่างชัดเจน มาดูข้อโต้แย้งที่พบบ่อยที่สุดกัน
และนั่นเป็นเรื่องจริง การอธิบายงานของคุณเป็นภาษาธรรมชาติบางครั้งอาจยากกว่าการแก้ไขโค้ด แต่มีวิธีแก้ปัญหาบางประการดังต่อไปนี้:
บางที แต่ขึ้นอยู่กับคำอธิบาย ลำดับความสำคัญอยู่ที่คำอธิบายว่าอะไรอาจผิดพลาดและฟังก์ชันใดที่อาจไม่เสถียร อย่างไรก็ตาม การเขียนเกี่ยวกับผลกระทบของการเปลี่ยนแปลงนั้นมีประโยชน์ เพราะจะช่วยระบุความเป็นไปได้และสถานการณ์เพิ่มเติมได้ นอกจากนี้ แม้แต่แนวคิดเชิงเทคนิคขั้นสูงสุดก็สามารถอธิบายเป็นประโยคธรรมดาโดยใช้ภาษาธรรมชาติได้ หากทำไม่ได้ แสดงว่าอาจมีบางอย่างผิดพลาดกับแนวคิดนั้นเอง ซึ่งอาจมีความเสี่ยงได้ ควรพิจารณาข้อเสนอทั้งหมดใหม่
เพียงเขียนบางอย่างเช่น:
“วิธีการ “XXX” ใช้ RAM มากเกินไปในการเรียกแต่ละครั้ง การสร้างแคชเพิ่มเติมสำหรับวิธีการนี้จะช่วยลดการใช้ RAM และเพิ่มความเร็วให้กับ API ทั้งหมด วิธีการนี้ใช้ข้อมูลที่เปลี่ยนแปลงไม่บ่อยนัก เพียงแค่ลบแคชออกเมื่อรีสตาร์ทก็เพียงพอแล้ว การเปลี่ยนแปลงนั้นปลอดภัย แต่อาจส่งผลกระทบต่อคุณสมบัติต่อไปนี้: XXX, XXX, XXX…”
ในบางกรณี วิธีนี้เพียงพอแล้ว แต่ในบางกรณี ข้อเสนอแนะนี้อาจกระตุ้นให้เกิดการหารือ เนื่องจากวิศวกรอาจลืมฟังก์ชันเก่าๆ บางอย่างที่ยังใช้งานอยู่ ซึ่งแคชนี้อาจก่อให้เกิดปัญหาได้ ในระหว่างขั้นตอนการดูแล แนวคิดดังกล่าวจะได้รับการแก้ไข และทีมงานจะหาทางประนีประนอมกัน
ความเสถียรและความน่าเชื่อถือดีกว่าการปรับปรุงเวลาการทำงานของฟีเจอร์บางอย่างเพียงไม่กี่เปอร์เซ็นต์ ไม่มีใครผิดหวังหากพลาดการเพิ่มประสิทธิภาพที่เป็นไปได้ แต่การทำให้ชื่อเสียงของผลิตภัณฑ์เสียหายนั้นเป็นเรื่องง่าย
แนวคิดคือการปรับปรุงกระบวนการและช่วยประเมินความเสี่ยง วิศวกรควรมีโอกาสดูแลฐานโค้ดและปรับปรุงบางอย่าง สำหรับสิ่งที่มีขนาดเล็กและไม่ทำให้ผลิตภัณฑ์ทั้งหมดไม่เสถียร สามารถสร้างรายการงานรวมที่สามารถดำเนินการให้เสร็จสิ้นได้ในระหว่างการวนซ้ำ งานเหล่านี้ยังคงต้องได้รับการตรวจสอบเป็นคำขอแบบดึง แต่ไม่จำเป็นต้องประกาศให้ทีมทราบอย่างเป็นทางการ
การปรับปรุงผลิตภัณฑ์อย่างต่อเนื่องถือเป็นสิ่งสำคัญสำหรับธุรกิจและช่วยรักษาคุณภาพโดยรวม หากคุณเก็บหนี้ทางเทคนิคและแนวคิดใหม่ๆ ไว้บนชั้นวาง คุณจะต้องติดอยู่กับผลิตภัณฑ์ที่ล้าสมัยและในไม่ช้าก็ประสบปัญหาในการหาวิศวกรผู้เชี่ยวชาญเพื่อดูแลผลิตภัณฑ์ดังกล่าว
ในทางกลับกัน งานเหล่านี้แข่งขันกับฟีเจอร์ทางธุรกิจและแนวคิดอื่นๆ ที่สามารถขับเคลื่อนธุรกิจไปสู่ขอบเขตใหม่ คำแนะนำเหล่านี้เกี่ยวกับงานด้านเทคนิคที่ค้างอยู่สามารถช่วยเปิดเผยและประเมินความสำคัญของงานเหล่านี้ได้ ไม่เพียงแต่สำหรับสมาชิกในทีมเท่านั้น แต่ยังรวมถึงผู้มีส่วนได้ส่วนเสียด้วย คำแนะนำเหล่านี้ช่วยนำเสนอแนวคิดเหล่านี้ในภาษาธรรมชาติและรักษาและปกป้องเวลาสำหรับการนำไปปฏิบัติ แม้ว่าจะก่อให้เกิดภาระให้กับวิศวกรด้วยการดำเนินการเพิ่มเติม แต่ในท้ายที่สุดก็ช่วยให้ทีมทั้งหมดส่งมอบผลิตภัณฑ์ที่มีคุณภาพสูงและเชื่อถือได้ และความรับผิดชอบของผู้จัดการคือการเลือกเครื่องมือหรือแนวทางปฏิบัติที่เหมาะสมเพื่อรักษาขั้นตอนนี้ไว้