ฉันควรทำอย่างไรในฐานะผู้ตรวจสอบเมื่อรหัส“ ต้องเป็น” ไม่ดี?


18

ฉันทำงานในโครงการที่ได้รับการออกแบบมาอย่างไม่เหมาะสมและมีการวางระบบเกินจริงซึ่งมีการแนะนำการตรวจสอบรหัสบังคับเมื่อไม่กี่เดือนที่ผ่านมา

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

ฉันจะปฏิบัติตนอย่างไรเกี่ยวกับรีวิวนี้? มีวิธีที่ฉันจะรักษาความซื่อสัตย์และยังคงสร้างสรรค์?

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


1
นักพัฒนาได้ทำเอกสารทำไมถึงทำเช่นนี้และอาจเขียนปัญหาสำหรับปัญหาหลักในตัวติดตามปัญหา
Luc Franken

น้อยและไม่มี
Red

4
องค์กรของคุณมีความกระหายที่จะทำอะไรบางอย่างเกี่ยวกับหนี้ทางเทคนิคหรือไม่?
Robert Harvey

5
หากรหัสไม่ผิดพิจารณาสภาพแวดล้อมฉันจะไม่โจมตีรหัส ส่วนใหญ่ตั้งแต่คุณเขียนคุณไม่เห็นการปรับปรุงที่เป็นไปได้จริงในขณะนี้ มันจะสร้างความขัดแย้งโดยไม่มีโอกาสที่จะปรับปรุง สิ่งที่ฉันจะทำคือสอนให้เอกสารดีขึ้นเป็นขั้นตอนแรก ขั้นตอนที่สองสร้างขั้นตอนเพื่อให้พวกเขาเขียนปัญหาที่ชัดเจน นั่นจะส่งผลให้มี 2 สิ่ง: เอกสารเกี่ยวกับปัญหาเพื่อให้เอกสารฉบับต่อไปสามารถทำงานได้เร็วขึ้น และนอกจากนั้นคุณจะได้รับรายการปัญหาที่เป็นรูปธรรมเพื่อแก้ไข ฉันชอบ GitHub ที่กล่าวถึงเพราะคุณเห็นจำนวนครั้งที่มันติดแท็กอีกครั้ง
Luc Franken

คำตอบ:


25

ง่าย:

1. บันทึกหนี้สินทางเทคนิคของคุณ

คุณได้ระบุรหัสที่ใช้งานได้ แต่มีปัญหาทางเทคนิคบางประการ นี้เป็นหนี้ทางเทคนิค เช่นเดียวกับหนี้ประเภทอื่น ๆ มันเลวร้ายลงเมื่อเวลาผ่านไปหากไม่ได้รับการจัดการ

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

2. ชำระหนี้ของคุณอย่างค่อยเป็นค่อยไป

ปรับเปลี่ยนกระบวนการพัฒนาซอฟต์แวร์ของคุณเพื่อชำระคืนหนี้ทางเทคนิคเข้าบัญชี สิ่งนี้อาจเกี่ยวข้องกับการดำเนินการตามระยะเวลาการแข็งตัวหรือเพียงแค่แก้ไขรายการหนี้สินในช่วงเวลาปกติ (เช่น 2 รายการต่อสัปดาห์) ส่วนที่สำคัญเพื่อให้แน่ใจว่าคุณกำลังหักหนี้ของคุณได้เร็วกว่าการรับหนี้ (หนี้แม้แต่หนี้ทางเทคนิคมีความสนใจ)

เมื่อคุณมาถึงจุดที่คุณไม่ได้มีการขาดดุลทางเทคนิคอีกต่อไปคุณจะไปยังฐานข้อมูลที่มีสุขภาพดีขึ้น :)


5

ในฐานะที่เป็นบันทึกด้าน: ค้นหางานใหม่ อันนี้คงไม่ดีไปกว่านี้แล้ว

เป้าหมายของรหัสที่คุณกำลังตรวจสอบคือ:

  • เพื่อจัดส่งฟีเจอร์ซึ่งควรทำงานตามข้อกำหนด

  • เพื่อลดการเติบโตของหนี้ทางเทคนิค

เป้าหมายแรกจะได้รับการตรวจสอบโดยการตรวจสอบว่าหน่วยการรวมระบบและการทดสอบการทำงานอยู่ที่นี่ว่าพวกเขามีความเกี่ยวข้องและพวกเขาครอบคลุมทุกสถานการณ์ที่จะต้องมีการทดสอบ คุณต้องตรวจสอบความเชื่อที่ผู้เขียนต้นฉบับอาจมีเกี่ยวกับภาษาการเขียนโปรแกรมซึ่งอาจนำไปสู่ข้อบกพร่องที่ละเอียดอ่อนหรือรหัสที่อ้างว่าทำสิ่งที่แตกต่างจากสิ่งที่มันทำจริง

เป้าหมายที่สองคือคำถามที่คุณมุ่งเน้น ในอีกด้านหนึ่งรหัสใหม่ไม่คาดว่าจะเพิ่มหนี้ทางเทคนิค ในทางตรงกันข้ามขอบเขตของการตรวจสอบเป็นรหัสตัวเอง แต่ในบริบทของ codebase ทั้งหมด ในฐานะผู้วิจารณ์คุณสามารถคาดหวังได้สองวิธีจากผู้เขียนต้นฉบับ

  • รหัสภายนอกไม่ใช่ความผิดของฉัน ฉันเพิ่งใช้คุณสมบัติและไม่สนใจ codebase ทั้งหมด

    ในมุมมองนี้รหัสจะคัดลอกข้อบกพร่องของ codebase และเพิ่มหนี้ทางเทคนิคอย่างหลีกเลี่ยงไม่ได้: รหัสที่แย่กว่านั้นแย่กว่าเสมอ

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

  • การเขียนรหัสใหม่เป็นโอกาสที่จะสร้างมรดกหนึ่งขึ้นมาใหม่

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

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

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

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

เพื่อนร่วมงานของคุณกำลังใช้งานฟีเจอร์อื่นและรู้สึกประหลาดใจอย่างมากกับการขาด ORM ที่จะทำให้ขนาดสมบูรณ์แบบ ดังนั้นเขาจึงเริ่มใช้ ORM

ไม่ว่าคุณหรือเพื่อนร่วมงานของคุณจะไม่สามารถผ่านบรรทัดหลายแสนบรรทัดเพื่อใช้ประโยชน์จาก MVC หรือกรอบการบันทึกหรือ ORM ได้ทุกที่ ที่จริงแล้วมันต้องใช้เวลาหลายเดือนในการทำงาน: ลองนึกภาพแนะนำ MVC; ใช้เวลานานเท่าไหร่ หรือสิ่งที่เกี่ยวกับ ORM ในสถานการณ์ที่แบบสอบถาม SQL ถูกสร้างขึ้นอย่างโกลาหลผ่านการต่อข้อมูล (พร้อมตำแหน่งสำหรับการฉีด SQL) ในโค้ดที่ไม่มีใครสามารถเข้าใจได้

คุณคิดว่าคุณทำได้ดีมาก แต่ตอนนี้ผู้พัฒนาใหม่ที่เข้าร่วมโครงการต้องเผชิญกับความซับซ้อนมากกว่าเดิม:

  • วิธีการดั้งเดิมในการรักษาคำขอ

  • วิธี MVC

  • กลไกการบันทึกเก่า

  • กรอบการบันทึก

  • การเข้าถึงฐานข้อมูลโดยตรงด้วยคำสั่ง SQL ที่สร้างขึ้นทันที

  • ORM

ในโครงการหนึ่งที่ฉันทำงานอยู่มีเฟรมเวิร์กการบันทึกสี่รายการ (!) ที่ใช้ควบคู่กัน (บวกกับการบันทึกด้วยตนเอง) เหตุผลก็คือทุกครั้งที่มีคนต้องการบันทึกสิ่งที่ไม่มีวิธีการทั่วไปที่จะทำดังนั้นแทนที่จะเรียนรู้กรอบใหม่ (ซึ่งในทุกกรณีถูกใช้เพียง 5% ของ codebase) หนึ่งจะเพิ่มอีกหนึ่งเขา รู้อยู่แล้ว ลองนึกภาพความยุ่งเหยิง

วิธีที่ดีกว่าคือการปรับโครงสร้างโค้ดเบสทีละขั้นตอน การทำตัวอย่างของการบันทึกอีกครั้งการเปลี่ยนโครงสร้างจะประกอบด้วยขั้นตอนเล็ก ๆ ต่อไปนี้:

  • ค้นหาสถานที่ทั้งหมดที่มีการบันทึกแบบดั้งเดิม (เช่นเมื่อเข้าถึงไฟล์บันทึกโดยตรง) และตรวจสอบให้แน่ใจว่าพวกเขาทั้งหมดเรียกวิธีการเดียวกัน

  • ย้ายรหัสนี้ไปยังไลบรารีเฉพาะถ้ามี ฉันไม่ต้องการตรรกะการจัดเก็บบันทึกในชั้นเรียนรถเข็น

  • ปรับเปลี่ยนอินเตอร์เฟสของวิธีการบันทึกหากจำเป็น ตัวอย่างเช่นเราสามารถเพิ่มระดับที่ระบุว่าข้อความนั้นไม่เป็นทางการหรือเป็นคำเตือนหรือข้อผิดพลาด

  • ใช้วิธีการปรับโครงสร้างใหม่ในคุณสมบัติใหม่

  • โอนย้ายไปยังเฟรมเวิร์กการบันทึก: โค้ดที่ได้รับผลกระทบเท่านั้นคือโค้ดภายในไลบรารีเฉพาะ


1
คำตอบที่ดีจนถึงย่อหน้าสุดท้าย ไม่ว่าคุณจะตั้งใจหรือไม่ก็ตามคุณกำลังบอกเป็นนัยว่าไม่ควรใช้แนวทางปฏิบัติที่ดีสำหรับรหัสใหม่ -1
RubberDuck

2
@RubberDuck: มันไม่เกี่ยวกับหลักปฏิบัติที่ดีมันเป็นเรื่องเกี่ยวกับการเขียนรหัสอย่างสิ้นเชิงแตกต่างจาก codebase ที่เหลืออยู่ ฉันเป็นนักพัฒนาซอฟต์แวร์ตัวนั้นและฉันได้เห็นผลที่ตามมาจากสิ่งที่ฉันทำ: การมีโค้ดที่ดีกว่าอย่างมากในหมู่โค้ดที่ไม่ดีจะทำให้สิ่งเลวร้ายลงเท่านั้น สิ่งที่ทำให้ดีขึ้นคือการปรับปรุง codebase ผ่านขั้นตอน refactoring เล็ก ๆ ฉันจะเพิ่มตัวอย่างในคำตอบของฉันในไม่กี่นาที
Arseni Mourzenko

ฉันจะทำ DV อีกครั้งหากทำได้ การแก้ไขทำให้แย่ลง การมีสี่วิธีที่แตกต่างกันในการทำบางสิ่งด้วยวิธีใหม่นั้นไม่ดี แต่เป็นความผิดของคนที่เพิ่มเฟรมเวิร์กการบันทึกที่สอง มันไม่ได้เลวร้ายในตัวของมันเองที่จะลากเส้นในทรายและมีโค้ดที่สะอาดติดกับโค้ดที่เน่าเสีย
RubberDuck

@RubberDuck: มันไม่เกี่ยวกับการเพิ่มเฟรมเวิร์กการบันทึกที่สองแต่เป็นเฟรมแรก คนที่เพิ่มเฟรมเวิร์กการบันทึกที่สองทำเพียงเพราะเฟรมแรกนั้นใช้กับฟีเจอร์ขนาดเล็กเพียงอันเดียว ถ้า codebase ถูก refactored ตามที่ฉันแนะนำสิ่งนี้จะไม่เกิดขึ้น
Arseni Mourzenko

ฉันคิดว่าคุณและฉันเห็นด้วย แต่คำตอบของคุณอ่านในวิธีที่ทำให้การพัฒนาดีขึ้น ฉันไม่สามารถขึ้นเครื่องได้
RubberDuck

3

หากคุณกำลังทำบทวิจารณ์โค้ดซึ่งเป็นส่วนหนึ่งของกระบวนการพัฒนาของคุณ จากนั้นคุณต้องตั้งค่ากฎที่คุณ 'ตัดสิน' รหัสที่คุณกำลังตรวจสอบ

สิ่งนี้ควรเป็น 'นิยามของการทำ' ของคุณและอาจเป็นแนวทางแบบเอกสารสถาปัตยกรรมสำหรับการวิเคราะห์เบสโค้ดหรือการวิเคราะห์แบบคงที่การตรวจสอบข้อกำหนดทางกฎหมายสิ่งที่ บริษัท ตัดสินใจก็คือข้อกำหนดสำหรับ 'คุณภาพของรหัส'

เมื่อคุณได้รับการตรวจสอบรหัสสถานที่กลายเป็นเรื่องของหลักสูตรมีการติดตามคู่มือสไตล์หรือไม่เรามีเปอร์เซ็นต์การครอบคลุมการทดสอบที่จำเป็น ฯลฯ

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


3

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

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

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


2

ในสถานที่ที่ฉันทำการตรวจสอบโค้ดฉันจะยอมรับและตกลงการส่งรหัสถ้ามันมาพร้อมกับความมุ่งมั่นที่จะทำ (อย่างน้อย) การปรับโครงสร้างบางส่วน อาจเป็นได้ว่าเป็นข้อผิดพลาดที่ยื่นเป็นเรื่องราวหรือสัญญาว่าจะส่งการตรวจสอบอีกครั้งด้วย (บาง) การปรับโครงสร้างเสร็จแล้ว

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.