ฉันจะอัปเดต codebase ขนาดใหญ่เพื่อให้ได้ตามมาตรฐานคุณภาพที่เฉพาะเจาะจงได้อย่างไร


10

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

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

ก่อน:

  • ใหญ่: มากกว่า 1MLOC
  • มรดก: ไม่มีการทดสอบอัตโนมัติ
  • คุณภาพไม่ดี: ความซับซ้อนสูงข้อต่อสูงข้อบกพร่องที่หลบหนีได้สูง

หลังจาก

  • การทดสอบอัตโนมัติ
  • ปรับปรุง / บำรุงรักษาง่ายขึ้น
  • คุณภาพสูง: ความซับซ้อนที่ลดลง, โค้ดแยกส่วน, ข้อบกพร่องเล็ก ๆ น้อย ๆ ที่หลบหนี

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

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




7
อุตสาหกรรมการเงินทั้งหมดหรือไม่ ส่วนใหญ่มันทำงานบนรหัส FORTRAN อายุ 40 ปี ซึ่งแตกต่างจาก Netscape พวกเขาไม่สามารถโยนมันออกมาและเขียนใหม่ตั้งแต่ต้นได้ดังนั้นจึงค่อยๆปรับปรุงตลอดเวลานี้
MattDavey

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

2
สวัสดี @mikelong ฉันได้แก้ไขคำถามของคุณแล้วลองเปิดใหม่อีกครั้ง คำถามดั้งเดิมของคุณขอรายการตัวอย่างซึ่งถือว่าเป็น "ไม่สร้างสรรค์" ตามมาตรฐาน StackExchange อย่าลังเลที่จะแก้ไขเพิ่มเติมเพื่อเพิ่มรายละเอียดเกี่ยวกับความหมายของคำว่า "คุณภาพสูง" หรืออัปเดตข้อความหากฉันทำผิด :)
Rachel

คำตอบ:


8

หนังสืออย่างhttp://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 น่าจะเป็นพยานได้มากพอที่จะทราบว่าฐานรหัสคุณภาพที่มีคุณภาพต่ำเป็นมรดกตกทอดในอุตสาหกรรม

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

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

หมายเหตุ: ฉันต้องการที่จะทำให้ความคิดเห็นนี้ แต่มันยาวเกินไป ฉันเข้าใจว่าไม่ได้ตอบคำถามอย่างเต็มที่

แก้ไข: C ++ 11 & ความมีชีวิตในระยะยาวของ GCC ถูกตั้งคำถาม - หากนักพัฒนา refactor GCC และทำให้มันมีเครื่องมือเป็น LLVM / เสียงดังกราวมากขึ้นมันอาจเป็นตัวอย่างที่ดี การสนทนาตั้งข้อสังเกตว่าเอกสารบางอย่างไม่ดีในบางสถานที่ผลักดันกำแพงกั้นรายการสำหรับนักพัฒนาใหม่ที่สูงขึ้น


4

เมื่อวันที่ 3 กุมภาพันธ์ 2013 Michael Meeks หนึ่งในนักพัฒนา LibreOffice กำลังพูดคุยกันในอีกสองสามวันชื่อ"LibreOffice: การทำความสะอาดและนำรหัสฐานขนาดใหญ่กลับมาใช้ใหม่ ." ดูเหมือนว่าสิ่งที่คุณต้องการ: การอภิปรายของสิ่งที่พวกเขาได้ทำเพื่อ "ความเข้าใจที่แย่รหัสฐานขนาดมหึมาแสดงความคิดเห็นอย่างกว้างขวางในภาษาเยอรมันโดยไม่มีการทดสอบหน่วยโครงสร้างพื้นฐานแบบพันกันและยี่สิบห้า ปีของหนี้ทางเทคนิคที่ยังไม่ได้ชำระ "และปรับปรุงให้ทันสมัย

งานนำเสนอสามารถสตรีมออนไลน์และ (ฉันคิดว่า) การบันทึกจะพร้อมใช้งานในบางวันที่ในอนาคต


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

@Rachel - ถ้าฉันสามารถชมการถ่ายทอดฉันจะทำเช่นนั้นแน่นอน ขอบคุณ
Josh Kelley

4

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

ครั้งแรกเป็นแอปพลิเคชั่นที่เชื่อหรือไม่ว่ามีสถาปัตยกรรมพื้นฐานที่ทำให้ใช้งานได้กับเครื่องพิมพ์ดอทเมทริกซ์เท่านั้น เมื่อ บริษัท ของฉันไม่สามารถหาผู้ขายเพื่อส่งมอบริบบิ้นได้พวกเขามอบหมายให้ฉันทำงานกับเครื่องพิมพ์เลเซอร์

ครั้งที่สองคือการโยกย้ายสคริปต์ทดสอบอัตโนมัติหลายร้อยสคริปต์จาก C ไป Java ส่วนหนึ่งเป็นเพราะเราต้องการความสามารถในการข้ามแพลตฟอร์มที่ดีขึ้นและอีกส่วนหนึ่งเนื่องจากเป็นการยากที่จะจ้างนักพัฒนา C ใหม่

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

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

สมมติว่าคุณมี 60,000 ไฟล์ของโค้ดที่มีความสัมพันธ์สูง คุณต้องการเริ่มวางมันภายใต้การทดสอบหน่วย แต่การพึ่งพาทำให้มันเป็นไปไม่ได้ คุณจะแก้ไขได้อย่างไร คุณแยกหนึ่งไฟล์ คุณเพิ่มการทดสอบอัตโนมัติ คุณกลับไปที่พื้นที่มั่นคงก่อนที่จะไปต่อ ทำซ้ำ 59,999 ครั้ง

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

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


1

จากประสบการณ์ส่วนตัวที่ทำงานกับฐานรหัสหลายล้านบรรทัดฉันได้พบกลยุทธ์บางอย่างที่ดูเหมือนจะใช้ได้

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

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

อีกพื้นที่ที่ฉันใช้เวลาไปมากคือการทดสอบรหัสฐานที่มีอยู่ มีกลยุทธ์หลายอย่างที่นี่และทั้งหมดมีข้อดี แต่ไม่มีใครแก้ปัญหาได้อย่างสมบูรณ์

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