การวัดที่มีประโยชน์ในการจับภาพสำหรับซอร์สโค้ดคืออะไร
เช่นเมตริก(ปฏิบัติการ) เส้นของรหัสหรือความซับซ้อน Cyclomaticช่วยให้มีการประกันคุณภาพหรือพวกเขาเป็นประโยชน์โดยทั่วไปสำหรับกระบวนการพัฒนาซอฟต์แวร์?
การวัดที่มีประโยชน์ในการจับภาพสำหรับซอร์สโค้ดคืออะไร
เช่นเมตริก(ปฏิบัติการ) เส้นของรหัสหรือความซับซ้อน Cyclomaticช่วยให้มีการประกันคุณภาพหรือพวกเขาเป็นประโยชน์โดยทั่วไปสำหรับกระบวนการพัฒนาซอฟต์แวร์?
คำตอบ:
"การวัดประสิทธิภาพการผลิตซอฟต์แวร์ด้วยบรรทัดของรหัสเปรียบเสมือนการวัดความก้าวหน้าของเครื่องบินด้วยน้ำหนักที่เท่าไหร่" - Bill Gates
ดูโพสต์ของ Jeff ในหัวข้อ:
วิศวกรรมซอฟต์แวร์: ตายแล้วหรือ
โพสต์จาก Joel นั้นเก่า แต่ก็ดีเช่นกันที่เกี่ยวข้องกับการวัดซอฟต์แวร์และฉันขอแนะนำให้อ่าน: วิธีการจัดการ Econ 101
ประเด็นสำคัญสำหรับฉันคือสิ่งนี้การอ้างถึง Jeff: "การใช้เมตริกอย่างรับผิดชอบนั้นมีความสำคัญพอ ๆ กับการรวบรวมพวกมันตั้งแต่แรก"
สิ่งที่ทำให้ฉันสับสนเกี่ยวกับการวัดรหัสคือมันไม่ได้ทำมากขึ้น บริษัท ส่วนใหญ่รายงานประสิทธิภาพของพนักงานซัพพลายเออร์และระบบในสถานที่ แต่ดูเหมือนว่าไม่มีใครต้องการรายงานรหัส ฉันจะเห็นด้วยอย่างแน่นอนกับคำตอบที่ระบุว่ารหัสเพิ่มเติมคือความรับผิด แต่รหัสของคุณมีความสำคัญมากกว่า
Lines Of Code: ตามที่ 'ฉันได้กล่าวถึงนี่เป็นการวัดที่สำคัญและควรพิจารณาอย่างจริงจังที่สุด แต่ในแต่ละระดับ ฟังก์ชั่นคลาสไฟล์และอินเทอร์เฟซสามารถระบุรหัสทำทุกอย่างที่ยากต่อการบำรุงรักษาและค่าใช้จ่ายในระยะยาว เป็นการยากที่จะเปรียบเทียบจำนวนบรรทัดทั้งหมดของโค้ดกับสิ่งที่ระบบทำ อาจเป็นสิ่งที่ทำหลายอย่างและในกรณีนั้นจะมีรหัสหลายบรรทัด!
ความซับซ้อน: การวัดนี้เป็นการดีที่จะทำบนฐานโค้ดที่คุณไม่ได้ใช้งานและสามารถให้การบ่งชี้ที่ดีว่าพื้นที่ที่มีปัญหาอยู่ตรงไหน เรื่องราวเล็ก ๆ ที่มีประโยชน์ฉันวัดความซับซ้อนบนฐานรหัสของฉันเองและพื้นที่ที่มีความซับซ้อนสูงที่สุดคือพื้นที่ที่ฉันใช้เวลามากที่สุดเมื่อฉันต้องการเปลี่ยน การทำงานเพื่อลดความซับซ้อนส่งผลให้เวลาในการบำรุงรักษาลดลงอย่างมาก หากผู้บริหารมีการวัดเหล่านี้ในมือพวกเขาสามารถวางแผนการทำซ้ำซ้ำหรือออกแบบพื้นที่เฉพาะของระบบ
การทำสำเนารหัส: นี่เป็นการวัดที่สำคัญมากเท่าที่ฉันกังวล การทำสำเนารหัสเป็นสัญญาณที่ไม่ดีมากและอาจชี้ไปที่ปัญหาที่ลึกลงไปในระดับต่ำของการออกแบบระบบหรือนักพัฒนาที่กำลังคัดลอกการวางทำให้เกิดปัญหาใหญ่ในระยะยาวและระบบที่ไม่สามารถทำได้
กราฟการพึ่งพาการ ค้นหาการพึ่งพาที่ไม่ดีและการพึ่งพาแบบวนรอบเป็นการวัดที่สำคัญในโค้ด สิ่งนี้ชี้ไปที่การออกแบบระดับสูงที่ไม่ถูกต้องซึ่งจำเป็นต้องมีการแก้ไขเสมอ บางครั้งการพึ่งพากันหนึ่งครั้งสามารถดูดสิ่งอื่น ๆ ที่ไม่จำเป็นออกได้มากมายเพราะมีคนใช้ addNumber ในห้องสมุดอีเมลเพื่อทำการคำนวณทางการเงิน ทุกคนตกใจเมื่อห้องสมุดอีเมลเปลี่ยนไปและหยุดพักการเงิน หากทุกอย่างขึ้นอยู่กับสิ่งใดสิ่งหนึ่งก็สามารถชี้ไปที่ไลบรารีทำทุกอย่างที่ยากต่อการบำรุงรักษาและออกแบบมาไม่ดี
การวัดที่ดีจะบอกคุณเสมอว่าคุณสมบัติทุกอย่างของระบบมีขนาดเล็ก พึ่งพาน้อยลงซับซ้อนน้อยลงซ้ำซ้อนน้อยลง สิ่งนี้ชี้ไปที่ข้อต่อหลวมและการรวมตัวสูง
crap "source code metrics" นี้จะไม่ตายใช่หรือไม่
บรรทัดซอร์สของโค้ด (SLOC) เป็นเมทริกที่เก่าแก่ที่สุดง่ายที่สุดและพื้นฐานที่สุดที่มี
เดิม Halstead เสนอตัวชี้วัดทั้งกลุ่ม ผู้คนจำนวนมากมีโปรแกรมการวัดการเขียนที่สนุกสนานมากมายจนกว่าสปอยเลอร์สปอร์ตบางคนจะทำการศึกษาได้อย่างชัดเจนและแสดงให้เห็นว่าแต่ละเมตริก Halstead แต่ละอันมีความสัมพันธ์โดยตรงกับ SLOC
ณ จุดนั้นการวัดของ Halstead ถูกละทิ้งเนื่องจาก SLOC นั้นง่ายต่อการวัด
ตัวชี้วัดซอร์สโค้ดสำหรับการประกันคุณภาพมุ่งที่สองวัตถุประสงค์
ทั้งสองนำไปสู่การเขียนโค้ดง่ายที่สุดเท่าที่จะทำได้ หมายความว่า:
ตามความรู้ของฉันที่ดีที่สุดจำนวนข้อบกพร่องที่พบโดยตรงมีความสัมพันธ์กับบรรทัดของรหัส (อาจปั่น) ภาษาโมดูโลโปรแกรมเมอร์และโดเมน
ฉันไม่รู้เกี่ยวกับตัวชี้วัดอื่น ๆ ที่ตรงไปตรงมาและใช้งานได้ดีซึ่งสัมพันธ์กับข้อบกพร่อง
สิ่งหนึ่งที่ฉันต้องการทำคือเริ่มใช้หมายเลขสำหรับโครงการต่าง ๆ ที่ฉันใช้อยู่ - Test Coverage :: kLOC จากนั้นให้อภิปราย "คุณภาพการรับรู้" เพื่อดูว่ามีความสัมพันธ์กันหรือไม่
การวัดจะมีประโยชน์ก็ต่อเมื่อคุณรู้ว่าต้องทำอย่างไรกับคำตอบที่คุณได้รับ ในสาระสำคัญตัวชี้วัดซอฟต์แวร์เป็นเหมือนเครื่องวัดอุณหภูมิ ความจริงที่ว่าคุณวัดบางอย่างที่ 98.6 ° F ไม่ได้มีความหมายอะไรจนกว่าคุณจะรู้ว่าอุณหภูมิปกติคืออะไร อุณหภูมิดังกล่าวดีสำหรับอุณหภูมิของร่างกาย แต่ไม่ดีสำหรับไอศครีม
ตัวชี้วัดทั่วไปที่สามารถเป็นประโยชน์ ได้แก่ :
แนวโน้มการวัดสองครั้งแรก คุณกำลังค้นหาข้อบกพร่องเร็วกว่าที่คุณสามารถแก้ไขได้หรือไม่ ผลลัพธ์ที่เป็นไปได้สองประการ: บางทีเราต้องการทรัพยากรเพิ่มเติมในการแก้ไขข้อบกพร่องบางทีเราอาจต้องหยุดใช้คุณสมบัติใหม่จนกว่าเราจะทัน ภาพที่สองแสดงภาพว่าคุณใกล้จะทำอะไร ทีมเปรียวเรียกว่าแผนภูมิ "เบิร์น"
ความซับซ้อนของวัฏจักรเป็นตัวชี้วัดที่น่าสนใจ ที่แนวคิดพื้นฐานมันเป็นจำนวนของเส้นทางการดำเนินการที่ไม่ซ้ำกันในฟังก์ชั่น / วิธี ในสภาพแวดล้อมที่มีการทดสอบหน่วยหนักนี้สอดคล้องกับจำนวนการทดสอบที่จำเป็นในการตรวจสอบทุกเส้นทางการดำเนินการ อย่างไรก็ตามเพียงเพราะคุณมีวิธีการที่มีความซับซ้อน Cyclomatic 96 ไม่ได้หมายความว่ามันเป็นรหัส buggy - หรือว่าคุณต้องเขียน 96 การทดสอบเพื่อให้ความมั่นใจที่เหมาะสม ไม่ใช่เรื่องแปลกสำหรับรหัสที่สร้างขึ้น (ผ่าน WPF หรือตัวแยกวิเคราะห์) เพื่อสร้างสิ่งที่ซับซ้อนนี้ สามารถให้ข้อมูลคร่าวๆเกี่ยวกับระดับความพยายามที่จำเป็นในการดีบักเมธอด
บรรทัดล่าง
การวัดทุกครั้งที่คุณใช้จะต้องมีการกำหนดไว้ดังต่อไปนี้หรือไร้ประโยชน์:
ตัวชี้วัดที่คุณใช้อาจแตกต่างกันไปในแต่ละโครงการ คุณอาจมีการวัดเล็กน้อยที่คุณใช้ในโครงการต่าง ๆ แต่คำจำกัดความของ "ปกติ" จะแตกต่างกัน ตัวอย่างเช่นหากโครงการหนึ่งค้นพบเฉลี่ย 5 ข้อต่อสัปดาห์และโครงการใหม่กำลังค้นพบข้อบกพร่อง 10 ข้อต่อสัปดาห์นั่นไม่ได้หมายความว่ามีบางอย่างผิดปกติ อาจเป็นเพราะทีมทดสอบนั้นพิถีพิถันมากขึ้นในเวลานี้ นอกจากนี้คำจำกัดความของ "ปกติ" อาจเปลี่ยนไปตามอายุของโครงการ
ตัวชี้วัดเป็นเพียงเทอร์โมมิเตอร์สิ่งที่คุณทำกับมันขึ้นอยู่กับคุณ
รหัสที่มาเป็นความรับผิดชอบไม่ใช่สินทรัพย์ โดยที่ในใจการวัดบรรทัดของรหัสนั้นคล้ายคลึงกับการติดตามดอลลาร์ที่ใช้ไปในขณะที่สร้างบ้าน จำเป็นต้องทำถ้าคุณต้องการอยู่ภายใต้งบประมาณ แต่คุณไม่จำเป็นต้องคิดว่าการใช้จ่าย $ 1,000 ต่อวันนั้นดีกว่าการใช้จ่าย $ 50 ต่อวัน คุณต้องการที่จะรู้ว่าบ้านสร้างขึ้นด้วยเงินจำนวนเท่าใด มันเหมือนกับบรรทัดของรหัสในโครงการซอฟต์แวร์
กล่าวโดยสรุปไม่มีการวัดที่มีประโยชน์สำหรับซอร์สโค้ดเนื่องจากการวัดซอร์สโค้ดด้วยตัวมันเองนั้นไม่มีประโยชน์
เนื่องจากซอร์สโค้ดเป็นเพียงการรวมกันของลำดับการเลือกและการทำซ้ำ ถ้าฉันจะอธิบายชิ้นส่วนที่ดีที่สุดของซอฟต์แวร์ที่เราคาดหวังได้อย่างสมเหตุสมผลว่าจะผลิตมันจะเป็นดังนี้ ซอฟต์แวร์ที่มีรหัสครอบคลุมการทดสอบเกือบ 100% โดยใช้จำนวนบรรทัดน้อยที่สุดที่จำเป็นต่อการทำงานและยังยืดหยุ่นพอที่จะทนต่อการเปลี่ยนแปลง
เรื่องเล็ก ๆ น้อย ๆ เพื่อแสดงว่าเหตุใดการนับ KLOC จึงไร้ประโยชน์ (และเป็นอันตรายแม้แต่) ในการวัดประสิทธิภาพ
หลายปีที่ผ่านมาฉันทำงานในโครงการขนาดใหญ่ (มีคนมากกว่า 70 คนใน บริษัท ของเราอีก 30 คนเป็นลูกค้าของเรา) ซึ่งใช้ KLOC เป็นตัวชี้วัดประสิทธิภาพของทีมและบุคคล
สำหรับความพยายาม Y2K ของเรา (บอกคุณเมื่อนานมาแล้วว่าเป็น :)) เราทำการล้างข้อมูลส่วนใหญ่ของรหัสที่ทีมของฉันรับผิดชอบ เราลงเอยด้วยการเขียนโค้ดประมาณ 30,000 บรรทัดไม่ใช่งาน 3 เดือนที่แย่สำหรับ 5 คน นอกจากนี้เรายังได้ทิ้งโค้ดอีก 70,000 บรรทัดซึ่งเป็นงานที่ดีมากสำหรับการทำงาน 3 เดือนโดยเฉพาะเมื่อรวมกับโค้ดใหม่
ผลลัพธ์สุดท้ายสำหรับไตรมาส: -40.000 บรรทัดของรหัส ในระหว่างการตรวจสอบประสิทธิภาพตามไตรมาสเราได้รับการตำหนิอย่างเป็นทางการจาก บริษัท สำหรับความล้มเหลวในการปฏิบัติตามข้อกำหนดการผลิตของเราที่มีจำนวน 20,000 บรรทัดของรหัสที่ผลิตต่อไตรมาส (หลังจากทั้งหมดเครื่องมือได้แสดงให้เห็นว่า จะส่งผลให้เราทุกคนถูกระบุว่ามีประสิทธิภาพต่ำกว่าและไม่ผ่านการโปรโมตการฝึกอบรมการจ่ายเงินเพิ่มเป็นต้นและอื่น ๆ ไม่มีผู้จัดการโครงการและทีมงาน QA เข้ามาแทรกแซงและได้รับการตำหนิ
ไม่กี่เดือนต่อมา (สิ่งเหล่านี้ต้องใช้เวลา) เราได้รับแจ้งว่า บริษัท กำลังตรวจสอบมาตรฐานการผลิตของพวกเขาและจ้างทีมผู้เชี่ยวชาญเพื่อสร้างระบบใหม่โดยใช้การวิเคราะห์จุดทำงาน
ฉันประหลาดใจที่ไม่มีใครเอ่ยถึงคำแถลงความครอบคลุม / การตัดสินใจของหน่วยทดสอบ (เปอร์เซ็นต์ของรหัสที่ใช้โดยการทดสอบหน่วย)
การครอบคลุมโค้ดมีประโยชน์เมื่อคุณทราบว่าแอปพลิเคชั่นเปอร์เซ็นต์ใดที่ไม่ได้ล้มเหลวอย่างหายนะ ส่วนที่เหลือของประโยชน์ขึ้นอยู่กับคุณภาพของการทดสอบหน่วย
ยิ่งเล็กลงเท่าไหร่ก็ยิ่งดี นี่เป็นเครื่องมือเกี่ยวกับ SCM ไม่ใช่รหัสต่อรายการ แต่เป็นเมตริกที่วัดได้มาก ยิ่งเล็กลงเท่าไหร่ก็จะยิ่งง่ายขึ้นเท่านั้นที่จะเห็นการเปลี่ยนแปลงแต่ละอย่างในหน่วยอะตอม ง่ายกว่าที่จะยกเลิกการเปลี่ยนแปลงและพิน - พอยต์เมื่อสิ่งที่พัง
ตราบใดที่ไม่มีการคอมมิตทำลายบิลด์ ...
ตัวชี้วัดเหล่านี้ไม่ได้เป็นประโยชน์อย่างมากในแง่ของความคืบหน้า แต่สามารถใช้เพื่อให้ความคิดทั่วไปเกี่ยวกับสถานะของรหัส
ความซับซ้อน Cyclomatic ที่โดดเด่นฉันได้พบว่ามีประโยชน์ในแง่ของการแสดงภาพว่าฐานรหัสที่กำหนดเป็นโมดูล โดยทั่วไปคุณต้องการความซับซ้อนต่ำเนื่องจากหมายความว่าจำนวนแหล่งข้อมูลต่อโมดูลต่ำและมีหลายโมดูล
ฉันมักจะทำงานกับแพคเกจ C ++ ขนาดใหญ่และเมื่อมองหารหัสที่มีปัญหาควรปรับค่าCyclomatic ComplexityหรือFanIn / FanOut ที่น่ากลัวมักจะมีธงสีแดงที่น่าค้นหาอยู่ การแก้ไขปัญหาที่เกิดขึ้นมักจะนำไปสู่การปรับปรุงใน codebase ทั้งหมด
แน่นอนว่าตัวเลขเหล่านี้สามารถทำหน้าที่เป็นเพียงคำแนะนำในสิ่งที่ควรค่าแก่การดู การทำสิ่งนี้ให้เป็นเรื่องยากสำหรับการที่จะล้มเหลวในการสร้างหรือปฏิเสธการกระทำนั้นจะไร้สาระ
มีหลายสถานการณ์ในที่ทำงานของฉันที่ฉันใช้การวัดรหัส:
ในขณะที่เขียนรหัส
การใช้งานที่ใหญ่ที่สุดและสำคัญที่สุดในงานประจำวันของฉันคือในCheckstyleซึ่งเป็นเครื่องมือสำหรับนักพัฒนาจาวาที่ตรวจสอบตัวชี้วัดอย่างต่อเนื่อง (เหนือสิ่งอื่นใด) ของรหัสของฉันกับชุดของกฎที่เรากำหนดไว้ ปฏิบัติตามกฎเหล่านั้น ในขณะที่ฉันพัฒนารหัสมันจะบอกฉันตามเวลาจริงหากวิธีการของฉันกลายเป็นเวลานานไปสู่ความสลับซับซ้อนหรือเพื่อให้ฉันถอยกลับและคิดเกี่ยวกับการปรับโครงสร้างให้ดีขึ้น
นักพัฒนามีอิสระอย่างเต็มที่ที่จะทำลายกฎทั้งหมดเนื่องจากพวกเขาจะไม่นำไปใช้กับทุกสถานการณ์ "กฎ" มีไว้เพื่อกระตุ้นความคิดและพูดว่า "เฮ้นี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้หรือไม่?"
ระหว่างการตรวจสอบ QA / Code
สิ่งแรกที่ฉันทำโดยทั่วไปเมื่อทำการตรวจสอบรหัสคือการตรวจสอบความครอบคลุมรหัสของรหัสที่ฉันตรวจทานร่วมกับเครื่องมือครอบคลุมรหัสซึ่งเน้นว่าบรรทัดรหัสใดครอบคลุม นี่ทำให้ฉันมีความคิดทั่วไปว่ารหัสทดสอบนั้นละเอียดมากแค่ไหน ฉันไม่สนใจจริงๆถ้าความคุ้มครองนั้นอยู่ที่ 20% หรือ 100% ตราบใดที่รหัสที่สำคัญได้รับการทดสอบแล้ว ดังนั้นเปอร์เซ็นต์ที่ครอบคลุมค่อนข้างไม่มีความหมาย แต่ 0% แน่ใจว่าโดดเด่นเหมือนนิ้วหัวแม่มือเจ็บเป็นสิ่งที่ฉันต้องการดูอย่างระมัดระวัง
ฉันยังตรวจสอบว่าตัวชี้วัดที่ทีมงานเห็นด้วย 'เสีย' ถ้ามีเพื่อดูว่าฉันเห็นด้วยกับนักพัฒนาหรือไม่ว่าเป็นสิ่งที่ตกลงหรือถ้าฉันสามารถแนะนำวิธีปรับปรุง การมีตัวชี้วัดการพัฒนาเหล่านี้ได้รับความเห็นชอบในทีมงานของเราในการเขียนรหัสใหม่ทำให้การปรับปรุงรหัสของเราเป็นเรื่องใหญ่ เราเขียนวิธีการเสาหินน้อยลงและดีขึ้นมากในหลักการความรับผิดชอบเดียวในขณะนี้
การปรับปรุงแนวโน้มของรหัสดั้งเดิม เรามีรหัสดั้งเดิมมากมายที่เราต้องการปรับปรุง ตัวชี้วัด ณ เวลาใด ๆ นั้นไร้ประโยชน์ แต่สิ่งที่สำคัญสำหรับเราก็คือการครอบคลุมรหัสเมื่อเวลาผ่านไปและสิ่งต่าง ๆ เช่นความซับซ้อนและการมีเพศสัมพันธ์ลดลง ดังนั้นการวัดของเราจึงเชื่อมต่อกับเซิร์ฟเวอร์การรวมอย่างต่อเนื่องของเราทำให้เราสามารถตรวจสอบเมื่อเวลาผ่านไปเพื่อให้แน่ใจว่าเราอยู่ในเส้นทางที่ถูกต้อง
การจับกับฐานรหัสใหม่ เกี่ยวกับเวลาเดียวที่ฉันเคยใช้บรรทัดของตัวชี้วัดซอร์สโค้ดคือเมื่อดูที่ฐานรหัสที่ฉันไม่คุ้นเคย ช่วยให้ฉันสามารถวัดขนาดคร่าวๆของโครงการได้อย่างรวดเร็วเมื่อเทียบกับโครงการอื่น ๆ ที่ฉันเคยทำงานด้วย เมื่อใช้ตัวชี้วัดอื่น ๆ ฉันจะได้รับแนวคิดคร่าวๆเพิ่มเติมเกี่ยวกับคุณภาพของโครงการด้วย
สิ่งสำคัญคือการใช้ตัวชี้วัดเป็นจุดเริ่มต้นสำหรับแนวโน้มการอภิปรายหรือวิธีการข้างหน้าและไม่ให้จัดการกับตัวเลขที่แน่นอน แต่ฉันเชื่ออย่างยิ่งว่าพวกเขาสามารถช่วยคุณปรับปรุงรหัสที่ถูกต้องเมื่อใช้อย่างถูกต้อง
ถาม: เมตริกที่มีประโยชน์ในการจับภาพสำหรับซอร์สโค้ดคืออะไร
สำหรับธุรกิจ:
A: จำนวนชั่วโมงทำงาน
สำหรับหัวหน้าแผนกของ coder:
ตอบ: ไม่เป็นไร มาทำทุกอย่างกันเถอะ
สำหรับความภาคภูมิใจในตนเองของ coder:
A: จำนวน SLOC (ซอร์สโค้ดของโค้ด)
สำหรับแม่ของ coder:
ตอบ: กินม้วนฝรั่งเศสนุ่ม ๆ เหล่านี้และดื่มชา
ดำเนินการต่อในความคิดเห็นด้านล่าง ...
เตือนความจำ: รหัสทั้งหมดสามารถลดได้อย่างน้อย 1 คำสั่ง รหัสทั้งหมดมีข้อผิดพลาดอย่างน้อย 1 ข้อ ดังนั้นรหัสทั้งหมดสามารถลดลงเป็นคำสั่งเดียวซึ่งไม่ทำงาน หวังว่าจะช่วย!