Table of Contents
קביעת השלב לסקירה מוצלחת
מערכות תוכנה בפרויקטים הנדסיים גדולים באופן טבעי לצבור חוב טכני לאורך זמן: לוגיקה משוכפלת, כיתות מונוליטיות, תלות סבוכה ודפוסי עיצוב מיושנים.סקירה מספקת היא התהליך הרשמי, מובנה של זיהוי והסרת חוב כזה תוך שמירה על התנהגות חיצונית.בניגוד לסקירה קוד שבדקת נכונות או סגנון, בדיקה חוזרת מתמקדת בשיפורים מבניים.
עם זאת, מתן ביקורות בבסיסי קוד גדולים הם קשה לשמצה. נפח הקוד, החיבוריות של מודולים, ואת הסיכון של הצגת רגרסציות דורש גישה מכוונת. מאמר זה מספק הדפסה מקיפה עבור ביצוע ביקורת מוצלחת משביע רצון - מן ההכנה וההערכה לביצוע והמשך - החל מפרקטיקה בשימוש בסביבות הנדסיות בקנה מידה גבוה.
שלב 1: הכנה אסטרטגית
Rushing לתוך ביקורת משביע רצון ללא תכנון מוביל מאמץ מבוזבז ובורך.הכנות מבטיחה את הסקירה להישאר ממוקדת, מדידה, בטוח.
Define Scope and Objectives
פרויקטים גדולים לא ניתן לספק מחדש ב גורף אחד.ברור מי מודולים, רכיבים או תת-מערכות שהסקירה תכסה. השתמש בקריטריונים אובייקטיביים כגון:
- (FLT:0) נקודות חמות מניתוח סטטי: FLT:1 כלים כמו SonarQube, CodeClimate, או NDepend קבצים עם מורכבות גבוהה, שיטות ארוכות, או כיתות גדולות.
- (FLT:0 שינוי תדירות: המחשה: 1 מודולים שינוי לרוב (הקבוע על ידי Git לבצע היסטוריה) הם מועמדים ראשוניים כי שיפור אותם מפחית חיכוכים לעבודה מתמשכת.
- (ב) ,0) ,מרכיבי בקבוק: ההרחבה: נתונים של פרופ'ור 1 יכולים להצביע על אזורים שבהם שינויים אדריכליים יגרמו לשיפורים מהירים.
מסמך התוצאות הספציפיות: למשל, להפחית את המורכבות המחזורית של שירות מורשת X ב-20%, לחסל 90% קוד כפול במודול חיוב, או להחליף תצורה קשיחה עם דפוס הזרקת התלות.
להרכיב את הקבוצה הנכונה
סקירה מספקת דורשת נקודות מבט לכלי-תפקוד:
- (ב) ,0) מומחים למניעה (FLT:1) אשר מבינים את דרישות ההיגיון העסקי והתחום.
- (ב) ,0) מפתחים של ספקור 1FLT (ב) עם ידע עמוק של האדריכלות וההיסטוריה שלה - הם יכולים לחזות את ההשפעות של הזרם.
- (ב) ,0) מהנדסי אוטומציה מבחן (FLT:1) כדי להבטיח כי קיימות התאמות בדיקות חזקות וחדשניות יכולות להיווצר.
גודל הקבוצה האידיאלי הוא שלושה עד חמישה אנשים.קבוצות גדולות יותר מובילות לניתוח שיתוק.להבטיח שכל החברים מקבלים מסמך קצר וקוד תחת ביקורת של לפחות 48 שעות מראש.
אמנות ג'ר
לאסוף את כל החומרים לפני הפגישה:
- קוד המקור הנוכחי (עם היסטוריה של גרסאות).
- יחידת הנוכחית, שילוב וסוויטות מבחן מקצה לקצה.
- דיאגרמות אדריכלות (מוגדרות או מורשת - זיהוי פערים).
- מדריך קולינג ומדריך סגנון המשמש את הפרויקט.
- כל ניסיונות קודמים או נקודות כאב ידועות מעוקבים.
לאחר שדוחקת את הסקירה מ"מקום זה הקובץ?" או "האם מותר לנו לקרוא מחדש ממשקי API ציבוריים?"
שלב 2: תהליך הסקירה - זיהוי וניתוח ריחות קוד
הליבה של הסקירה היא זיהוי שיטתי של ריחות קוד והערכה של חומרתם.סעיף זה מתרחב על הסימון המקורי עם דוגמאות וטכניקות קונקרטיות.
ריחות קוד משותף בפרויקטים גדולים
לכל ריח יש אסטרטגיה של דחיפות ייחודית.תפקידו של הסקירה הוא לתעד את אלה שגורמים לנזק הגדול ביותר.
קוד מסובך
לעתים קרובות הניצחון הקל ביותר.חפש בלוקים זהים או ליד זהים בכל שיטות, שיעורים או קבצים.בפרויקטים גדולים, שכפול לעתים קרובות נובע מ העתקה של העתקה על פני מיקרו-שירותים.למצת את ההיגיון המשותף לספרייה משותפת או לכיתת בסיס.
שיטות ארוכות וכיתות אלוהים
שיטה ארוכה יותר מ-20-30 שורות היא לעתים קרובות עושה יותר מדי.Break It לתוך שיטות קטנות, חד פעמיות. "מעמד גואד" שיודע יותר מדי על המערכת (למשל, תזמורת של 5000 קו) צריך להיות מחולק לאובייקטים שיתופיים. השתמש ב"מחלקה" של מרטין Fowler" או "מודול" דפוסים.
ניתוח ירי ושינויים צוללים
ניתוח ירי: שינוי יחיד דורש שינוי קוד בקבצים שונים רבים.שינוי צולל: אחד מהשינויים מעמדיים מסיבות מרובות.שנים מצביעים על מודולריות גרועה.הזיזו אחריות הקשורה למודולים קוהרסיביים ולאלה שאינם קשורים.
כיתות חלופיות עם טבלאות שונות
שני שיעורים שעושים את אותו הדבר, אבל חושפים אפיקים שונים.אחד אותם מאחורי ממשק משותף או מחלקה מופשטת.זה מקטין את ההיגיון הממצבי בקוראים.
היררכיה גדולה
עצי ירושה עמוקים (למשל, 10 רמות עמוק) להגדיל את המורכבות ואת השבריריות. ההרכב Favor על הירושה.הסקירה המחודשת צריכה לזהות היכן שיעורי הבסיס הפכו לנפיחות עם התנהגויות ברירת מחדל לא קשורות.
הערכה להשפעה: כמה רחוק הפילופל הולך?
לפני שתחליטו לשנות, להעריך את רדיוס הפיצוץ.טכניקות כוללות:
- (FLT:0) ניתוח גרפי של גרף גרף:FLT:1 שימוש בכלים כמו nתלוי, גריז, או תכונות IDE כדי לדמיין קוראנים ומתקשרים.
- (FLT:0) ניתוח קריאה סטטי: 1FLT 1 grep או מנתחים ספציפיים שפה (למשל, pylint עבור Python, reSharper עבור C#) כדי לרשום את כל הפניות.
- (ב) סיקור מבחן האינטגרציה: 0 (בלטינית:0) אם אין מבחן מכסה את נתיב השימוש, הסיכון של פירוק הנתיב הזה גבוה.
- דגלי FLT:0 (FLT:1 אם הקוד עומד מאחורי דגל לא פעיל, ההשפעה על התנהגות הייצור היא אפס במהלך רולט - אבל הדגל עשוי להיות מופעל מאוחר יותר.
עבור כל מועמד המארגן מחדש, להקצות רמת סיכון (נמוכה, בינונית, גבוהה) המבוססת על מספר התלויים החיצוניים ונוכחות בדיקות רגרסיה אוטומטיות.שינויים בסיכון נמוך יכולים להיעשות מיד; אלה בסיכון גבוה דורשים תוכנית רב-שלב עם דגלים תכונה וגלגל הדרגתי.
שלב 3: תכנון וביצוע אסטרטגיות
ברגע שריחות והשפעות מקטלוגים, הצוות מעצב רצף של שינויים קטנים, בלתי הפיכים.המפתח הוא להימנע מטקס "מפץ גדול" המציג ארכיטקטורה חדשה מאפס – זהו הגורם הנפוץ ביותר לשיפוץ הכישלונות.
טכניקות לשימוש
בחרו את הטכניקה שמתאימה לריח ולרמת הנוחות של הצוות:
- (ב) ⁇ :0) שיטת ה-Extract: 1FLT: 1 להפוך את בלוק קוד קו תחתון לשיטת הנקראת.
- (ב) ,0) שם משתנה / מתודו: ⁇ 1 (הופנה מהדף 1) פשוט אך חזק. השתמש ב- IDE עם תמיכה מספקת כדי להבטיח את כל הטלפונים.
- (ב) ⁇ :0) ⁇ / Push Down:FLT:1 להזיז שדות או שיטות בין סופר-class ו subclass כדי להפחית את השכפול או להפיץ אחריות.
- (FLT:0) תנאי החלפת עם Polymorphism:cioFLT:1) פיזור / אם-else שרשראות באמצעות משלוח תת-סוג.זה שינוי כבד; דורש כיסוי בדיקה טוב קודם.
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) כאשר יש שיטה בעלת פרמטרים רבים הקשורים, לצרף אותם לסוג חדש בשם.
מבחן כיסוי: רשת הבטיחות
מתן ללא בדיקות הוא כמו ניתוח ללא ציוד ניטור לפני שינוי קו אחד, הבדיקה חייבת לאשר כי:
- חבילת בדיקות יחידה קיימת עבור המודול, עם כיסוי של לפחות 80% סניף עבור החלקים להיות משביע רצון.
- בדיקות אינטגרציה מכסות חוזים חיצוניים מרכזיים ותופעות לוואי (למשל, מסד נתונים כותב, תשובות API).
- חבילת הבדיקה יכולה לפעול באופן מקומי על ידי המהנדס בתוך שתי דקות (אם יותר זמן, תוכנית אימות מבוסס CI).
אם כיסוי הבדיקה אינו מספיק, הצעד הראשון של הפרויקט המנציח הוא לכתוב בדיקות לאפיין את ההתנהגות הנוכחית.זה "מבחן כריזמת" כרוך הפעלת הקוד עם קלטות אופייניות ולכידת פלטים, ולאחר מכן לטעון את הפלטים במבחנים.
שינויים מהותיים: הדרך הבטוחה היחידה
פרויקטים הנדסיים גדולים מסתמכים לעתים קרובות על פריסה רציפה.הספק חייב להישבר לבקשות משיכה (PRs) שכל אחד קטן מספיק כדי להיבדק במהירות ולהיגר בקלות.
- לגעת רק באחריות אחת.
- כולל עדכוני בדיקה או תוספות.
- לרוץ בסייבר ללא מבחנים קיימים.
- להיות מלווה בסקירה קוד (שונה מהסקירה המחודשת) להתמקד בתיקון.
השתמש בתבנית "Figler" לשינויים גדולים: בהדרגה להחליף רכיבים ישנים עם חדשים תוך מחיקה של התנועה.זה רלוונטי במיוחד עבור ארכיטקטורות מיקרו-שירות.לדוגמה, לחלץ שיטה מ- ServiceA, ולאחר מכן להציג שירות חדש, ולאחר מכן לפרוש הקוד הישן.
Best Practices for the Refactoring Review Meeting
הסקירה עצמה צריכה להיות סדנה שיתופית, לא הרצאה.כולו מספיק זמן (2-3 שעות למודול יחיד) ולהבטיח כי המנחה ממשיך לדון על המסלול.
השתמש ב-Colle Checklist
דיסטריוט רשימה הכוללת:
- האם התוספת המוצעת או מפחיתה ריח אחד או יותר מזוהים?
- האם לא ראינו שהתנהגות חיצונית לא משתנה?
- האם הפשטות החדשות הן קוהרנטיות ונקראות בבירור?
- האם יש שיפור משמעותי (למשל, קווי הפחתה של קוד, צמצום מורכבות)?
- האם חבילת הבדיקה עדיין מספיקה?האם כדאי להוסיף בדיקות למקרי קצה שנחשף במהלך אישור?
עידוד שיתוף פעולה
רוטט המציג כל סעיף קוד. Pair Review (שני סוקרים בצד) לעתים קרובות תופס בעיות עדינות מהר יותר.אם הצוות מרוחק, השתמש במסך משותף עם עריכת חיים ונוטאקר כדי לתעד החלטות.
עדיפות על ידי Business Impact
לא כל הריחות של הקוד שווים.דרג אותם:
- (ב) [ה]הפסק: [ה] כמה זמן הריח הזה מוסיף לכל שינוי עתידי? – שגרת אימות משוכפלת ביותר שכל נקודת קצה של API חדשה חייבת לשכפל היא יעד פרטי.
- (הופנה מהדף LT:0Technicalחוב:>FLTOVA:1 המאמץ הנוסף הנדרש כדי לשנות את הקוד הזה כאשר הוא משתנה בשעות בשבוע או לקידוד.
- (ב) ⁇ :0.10.10.10.10.03) האם הריח בסופו של דבר גורם לתקרית ייצור?דוגמה: לוגיקה מותנית שגרמה לשני זרמים.
העדיפות הזו מבטיחה שהצוות עובד על מה שחשוב ביותר.
בדיקה אוטומטית וביקורת פוסט-מספק
העבודה של הסקירה אינה מבוצעת עד שהקוד עובר שעריו אוטומטיים בסביבות ייצור.
המונחים: tubeline Additions
לאחר מתן אישור, לעדכן את CI כדי לאכוף שערי איכות חדשים:
- סף מורכבות: נכשלים בבנייה אם המורכבות המחזורית עולה על ערך מסוים בכל שיטה.
- סף דוהמה: נכשלים אם יותר מ-3% מהקווים משוכפלים מהפרויקט.
- כיסוי מבחן: לפחות 70% כיסוי קו על קוד חדש או שונה.
כללים אלה מונעים הפחתה של ריחות בבקשות למשיכת מזון בעתיד.
עקבו אחרי Metrics
עקבו אחרי:
- בניית זמן: שיפור צריך להפחית את זמן האיסוף או את המבחן.
- שימוש בזיכרון ובעקביות: לצורך שיפור הקשור לביצועים, השתמש במעקב בייצור (למשל, Prometheus, Datadog) עם לוחות נתונים המשווים שבועיים לפני שבועיים לאחר מכן.
- שינוי שיעור הכשל: אם ההחזר היה מסוכן, תדירות אירוע צג בחודש הבא.
מלכודות נפוצות וכיצד להימנע מהם
גם עם תהליך מוצק, ביצוע ביקורות יכול להשתבש.
סקופ ccep
הסקירה מתחילה למקד ריחות קטנים, אך מתרחבת במהירות לטקס אדריכלות מלא (FLT:0Mitigation:0Mitigation: FLT:1 לאכוף כי כל שינוי גדול מ-300 שורות או נוגע ליותר מ-10 קבצים יש לאשר על ידי הסקירה המחודשת לפני יישום.
Over-Engineering
הכירו את דפוסי העיצוב שעדיין לא נדרשים.נמנעו מלהפוך את הקוד ל"הוכחה לחיקוי" לתרחישים שלעולם לא יתרחשו.FLT:0Mitigation:03:1) ליישם את העיקרון "אתה לא צריך את זה" (YAGNI): רק לשנות את מה שגורם לכאב או יגרום לכאב בשלושה ה ⁇ הבאים.
לא עדכון
לאחר מתן אישור, תיעוד יכול להיות מיושן.FLT:0Mitigation: FLT:1 לכלול עדכוני תיעוד באותו יחסי ציבור, גם אם מדובר רק בהערה בקוד או בתרשים אדריכלות מעודכן.
אימוץ דרישות לא מצחיקות
לפעמים שיפור יכולת הקריאה אך מחמיר את הביצועים (למשל, הצגת שיטות קטנות רבות הנותנותנות מעל פני השטח):0Mitigation: ⁇ FLT:1 תמיד להפעיל פרופיל על הקוד המאורגן ולהשוות לקו הבסיס.
משאבים חיצוניים ללמידה עמוקה יותר
כדי לשלוט בסקירות, מחקר מבוסס הפניות:
- (ב) שיפור העיצוב של קוד קיים – מרטין פיולרבייט 1LT – קטלוג מוחלט של שינוי דפוסים עם מכניקה.
- (ב) ,0) מסמך SonarQube Documentation: כיצד להגדיר זיהוי קוד אוטומטי בצנרת CI.
- קוד מורשת (FLT:0) - The Efficient Approachph1 - ספר מעשי לעבודה עם קוד שחסר בדיקות.
מסקנה
סקירה מוצלחת של פרויקט הנדסי גדול פחות על הקוד עצמו ויותר על התהליך: הכנה ממושמעת, זיהוי שיטתי של ריחות, ניתוח השפעה זהירה, ביצוע מצטבר, ואכיפה אוטומטית. על ידי מעקב אחר הגישה המובנית המפורטת כאן - צמצום היקף, תוך פיזור הצוות הנכון, באמצעות אסטרטגיות מתאימות, ושמירה על כוח הפרויקט - יכול לחסל חובות טכניים ללא יציבות ייצור בסיכון, הוא עדיין בקנה מידה גדול, כמו גם על בסיס קבוע, ומשתנה, כמו גם על פני שנים.