Table of Contents
תפקיד המימוש ב- Team Dynamics
שיתוף פעולה יעיל בצוותים הנדסיים תלוי במידה רבה בקוד ברור וקיים.אחד מהשיטות החשובות ביותר להשגת זה הוא (FLT:0refactoringFLT:1 ).ההההפצה כוללת בניית הקוד הקיים מבלי לשנות את התנהגותו החיצונית, מה שהופך אותו לקל יותר עבור חברי הצוות להבין ולעבוד עם.אבל שיפור הוא יותר מאשר פעילות טכנית - זוהי משמעת חברתית שיתופית באופן ישיר כיצד לתקשר, ביקורת של צוותים, ויצירה משותפת.
כאשר הקוד הוא כאוטי ומורכב, מפתחים מבזבזים אנרגיה נפשית מחלחלת לשמות מעורפלים, מפענחים מצבים מעונן עמוק, ומנוגדים לתופעות לוואי על פני מודולים.עומס קוגניטיבי זה מאט את כל אינטראקציה.חבר צוות כותב תכונה חדשה עשוי להסס לגעת בשיטה שברירית מחשש לשבור משהו.קוד ביקורות הופכות לוויכוחים מתוחים על כוונה ולא על תכנון לאורך זמן, חיכוך מוסרי ואמון מוסרי.
מתן תפנית כי דינמי.על ידי שיפור מתמיד של המבנה והקריאה של קוד, צוותים ליצור בסיס שבו שיתוף פעולה הופך טבעי. מחלקה או תפקוד טוב כמקור יחיד של אמת - שמו, הפרמטרים, והלוגיקה הפנימית בבירור לתקשר מה זה עושה. New joiners יכול לפתוח קובץ ומיד לתפוס את המטרה שלה. מהנדסים בכירים מבלים פחות זמן להסביר החלטות מורשת ועוד זמן על דפוסי מסחר וחילופים.
הקשר בין התחדשות ושיתוף פעולה נתמך על ידי מחקר בהנדסה תוכנה. מחקר מאוניברסיטת ציריך מצא כי מדדים איכותיים קוד כגון מורכבות מחזורית והפיכה תואמים עם יעילות צוות וקצבי פגם. קוד באיכות נמוכה מגביר את ההסתברות של באגים ומפחיתים את מהירות ההגשה.מספק שיפור ישיר של מדדים אלה, יצירת מחזור רוטט טוב יותר: פיתוח מהיר יותר זמן לשיתוף פעולה טוב יותר.
עקרונות הליבה של קוד אמין
לפני צלילה לטקטיקה, זה עוזר להבין את ה-FLT:0principles FLT:1 אשר מדריך יעיל של סיפוק.
אחריות אחת בכל רמה
עקרון האחריות הבודד (SRP) קובע כי מודול, מחלקה או פונקציה צריכים להיות סיבה אחת לשנות. במונחים מעשיים, זה אומר שכל חלק של קוד צריך לבודד מושג או משימה אחת. כאשר אתה שובר פונקציה 200 קו לתוך חמישה פונקציות קטנות יותר - כל אחד עם שם תיאורי - אתה מיד מקל על הקוד לקרוא, לבדוק, לדון במהלך ביקורות קוד.
"כל שוטה יכול לכתוב קוד מחשב יכול להבין." ~ מרטין פולריו
אמנות נמינג עקביות
(ב) , (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
כפלת Dplication
קוד מורכב הוא השורש של רשעים רבים.כאשר אותו היגיון מופיע במקומות מרובים, כל תיקון באג או שיפור יש לשכפל בכל עותק - מתכון לחוסר עקביות.מיצוי בלוקים משוכפלים לפונקציות משותפות או מודולים שימושיים.לא רק זה מפשט תחזוקה, אלא גם מבהיר הכוונה: פונקציה בשם FLT:6 הוא יותר מפורש מאשר העתקים של מחסומים קבור בתוך שיטה גדולה יותר.
אחריות על Inheritance
היררכיות בכיתה עמוקה יכולות להיות קשיחות וקשה להבנה.Preferקומפוזיציה - בניית אובייקטים מחלקים קטנים יותר, משתנים.זה מקל על החלפת התנהגויות ללא שינוי קוד קיים, אשר מתאים עם Open / Closed Principle. בעת סקירה של בקשה משיכה, עיצוב מורכב הוא קל יותר סיבה על שרשרת של שיטות הורים-ילד overrides.
טכניקות מותאמות
סיפוק אינו פעילות יחידה אלא ארגז כלים של שינויים מוכחים. הידיעה שתבניות אלה מסייעות למהנדסים לספק ביטחון ודיוק.
שיטת הפקה
כאשר שיטה ארוכה מדי או מכילה סעיף שניתן לתאר בשם ברור, להפיק את הקטע הזה לתוך השיטה שלו.זה מקטין מורכבות ומשפר את יכולת הקריאה.לדוגמה, שיטה שמדממת פריטים, חלה הנחות, וקיימת מסד נתונים ניתן לחלק לתוך FLT:8, FLT:9, ו-FLT:10 כל שיטה חדשה ניתן לבדוק בנפרד.
שם מקורי: Variable
שם מטעה גרוע יותר מאשר יישום רע.השם חופשי - IDE מודרניים מציעים שם בטוח מחדש על פני כל בסיס הקוד. פונקציה בשם FLT:11 אשר למעשה קובע תת-קרקעית? , כלומר זה ל-FLT:12 וליצור פונקציה חדשה לחישוב הסופי.
החלפת מספר Magic עם סמלים קבוע
מספרים מפוזרים ללא קשר (למשל, FLT:13) הם "מספרים אמגיים" להחליף אותם עם קבוע כמו FLT:14 זה הופך את הקוד להגדרה עצמית ומבסס את הערך לשינויים עתידיים.
המונחים: Conditional
תנאים מורכבים עם סעיפים מרובים ו / או יותר עשויים להיות קשים לעקוב אחר כל מצב לתפקוד בעל שם טוב: FLT:15 במקום FLT:16 טכניקה זו גם עושה תנאים הניתנים לבחינה.
אוסף Encapsulate
כאשר מחלקה חושפת רשימה פנימית או מילון ישירות, קוראנים יכולים לשנות את זה בדרכים שפורצות השחלות. מספק על ידי חשיפת השקפות לקריאה בלבד או הוספת שיטות מקבילות / Remove מתאימות.זה מגן על שלמות הנתונים והופך את הממשק המפורש.
(ב) בנוגע לטכניקות אלה, ראה מרטין פיולר:0 (הספק: שיפור העיצוב של קודמופי) 1 (ראה:2 Martin Fowler: Refactoring: Refactoring: The Design of the Existing CodeFLT:1).
צמצום ההשפעה של חיזוק
סיפוק יכול להרגיש כמו מרכז עלות אם רק מסתכלים על פלט גלם (קווי קוד השתנו, זמן בילה) כדי להצדיק ולעקוב אחר היתרונות שלה, הצוותים צריכים להתמקד על מדדים איכותיים התואמים עם שיתוף פעולה.
מורכבות קיקלומטית
מדד זה מודד את מספר הדרכים העצמאיות הליניאריות באמצעות פונקציה.מורכבות גבוהה פירושה יותר סניפים, בדיקות קשות יותר, ומאמץ נפשי יותר להבין. כלים כמו SonarQube, CodeClimate, או ESLint יכול לדגל שיטות עם מורכבות מעל סף (בדרך כלל 10-15). מתן ערך למורכבות נמוכה יותר משפר את יכולת הקריאה ישירות.
קוד צ'ורן
מדדי צ'ורן באיזו תדירות קובץ משתנה.המורכבות הגבוהה אך נמוכה?זה עשוי להצביע על מפרטים נמוכים. churn נמוך אך מורכבות גבוהה? אלה הם "נקודות חמות" שבו באגים עשויים להופיע כאשר הם נוגעים.מספק מקטין את הchurn באזורים מורכבים, מה שהופך את בסיס הקוד יציב יותר וצפוי יותר עבור כל הצוות.
מבחן כיסוי ומהירות מבחן
לעתים קרובות מספק קוד יותר במבחן.אם אתה מזין לוגיקה לפונקציות קטנות יותר, אתה יכול לכתוב בדיקות יחידה המבצעות מילימטריים במקום בדיקות אינטגרציה הדורשות מסד נתונים. A Suite אשר פועל במהירות מעודד מפתחים לרוץ אותו לעתים קרובות, לתפוס תוקפנות מוקדם.שיפור הכיסוי הבדיקה גם מגביר את האמון במהלך ביקורות קוד - ביקורתיים יכולים לסמוך על בדיקות כדי לאמת את המבחנים ולא לפשט את נתיבי ביצוע מבחינה מנטלית.
זמן לפתרון (MTTR) באג
קוד נקי יותר מוביל לפענוח מהיר יותר.מחקר של סטרי מצא כי מפתחים מבלים 42% מהזמן שלהם על תחזוקה ו debugging. Teams שמשקיעים בשיפוץ לעתים קרובות רואים ירידה ב- MTTR כי הקוד הוא יותר נוח וסיבות השורש קלות יותר לבודד.
שיפור הפחתת התפוקה לתוך זרימת העבודה
המימוש הוא יעיל ביותר כאשר הוא הופך לחלק רגיל של תהליך הפיתוח, לא "שלב נקי" נפרד.
Boy Rule הצופים
הצופים של אמריקה יש כלל: "תעזבו את המנקה מהממסד" החל את זה לקוד: בכל פעם שאתם נוגעים בקובץ, עשו שיפור קטן אחד.זה יכול להיות ניתוק משתנה מבלבל, תמצית שיטה, או הסרת תגובה מתה.במשך שבועות, המיקרו-מספקים אלה מצטברים לתוך בסיס קוד נקי בהרבה ללא קידוד ייעודי.
שיפור במהלך סקירות קוד
ביקורות קוד הן זמן אידיאלי להציע שיפורים מבניים במקום "התפקיד הזה ארוך מדי", מסביר (FLT:0)howcioFLT:1 כדי לפרק אותו: "המשך לחלץ את ההיגיון האימות לתוך שיטת עוזר.אני יכול לחלוק דפוס שבו השתמשנו במודול ההזמנות."
כרטיסים ייעודיים
לפעמים חלק מהקוד כל כך מסבך את זה במהלך תכונה תכונה יניחה את השינוי.במקרה זה, ליצור כרטיס חוב טכני נפרד.העד אותו לצד תכונות - צוותים מונים להקצות 20% מכל קידוד כדי תחזוקה.זהות כי איכות שווה ערך באותה מידה עם פונקציונליות חדשה.
כלים אוטומטיים ושילוב מתמשך
ליננים (ESLint, Pylint, RuboCop), מפורמטים (Prettier, Black, Gofmt), מנתחים סטטיים (SonarCloud, CodeClimate) צריכים לרוץ באופן אוטומטי על כל בקשה למשיכה.הם לתפוס הפרות של ועידות שם, מורכבות גבוהה, וקוד כפול לפני הביקורת האנושית מתחילה.זה משוחרר ביקורת להתמקד בעיצוב גבוה יותר ולוגיקה עסקית.
התנגדות מוגזמת לשיפוץ
גם עם כוונות טובות, הצוותים עלולים להתנגד לשיפוץ בגלל סיכונים, לחץ זמן או חוסר הבנה.
אין לנו זמן לרצות".
זהו החפץ הנפוץ ביותר.הנגד הוא זמן קלאסי - השקעה סחר חליפין: דילוג על סיפוק יוצר חוב טכני מאט את הפיתוח העתידי. A 2018 על ידי FLT:0ScienceDirectFLT:1 מצא כי צוותים עם רמות גבוהות יותר של חוב טכני בילה יותר 30% זמן יישום תכונות חדשות.
"הרצון יכול להביא באגים".
זהו דאגה בתוקף, אבל זה יכול להיות מופחת עם בדיקה יסודית.לפני מתן מחדש, להבטיח הקוד הקיים יש כיסוי מבחן טוב.אם זה לא, להוסיף בדיקות אפיון שלוכדות את ההתנהגות הנוכחית. ולאחר מכן לשנות באופן מצטבר, ולרוץ את הבדיקות לאחר כל שינוי קטן.מודרני IDEs גם לספק כלים אוטומטיים של שינוי (למשל, "שיטות הפעלה" ב-Intract") כי התנהגות שימור.
הקוד הנוכחי עובד – למה לשנות אותו?
תיקון אינו המדד היחיד.קוד ש"פועלים" אלא קשה להרחיב או להבין חיכוך לכל שינוי עתידי.הספק משפר את ה-FLT:0.0.0.designFLT:1 של הקוד, מה שהופך אותו יותר מתאים לדרישות חדשות.זה חשוב במיוחד בחברות סטארט-אפ או צוותי מוצר שמפצלים לעתים קרובות - קוד נקי הוא הביטוח הזול ביותר נגד אטה.
"אין לנו מדריך בסגנון משותף".
ללא סטנדרטים מוסכמים, כל שיפור מרגיש סובייקטיבי. להשקיע זמן כקבוצה כדי ליצור או לאמץ מדריך סגנון (למשל, מדריכי סגנון של גוגל, מוסכמות בינוניות עבור השפה שלך) לכפות אותו עם כלים אוטומטיים.
מחקר מקרה: כיצד שיפור בסיס קוד אמיתי
נחשב לפלטפורמת מסחר אלקטרוני בגודל בינוני שנבנה במשך ארבע שנים.צוות ההנדסה של 12 גדל מ 3 סופרים מקוריים.בסיס הקוד היה רווי בלוגיקה של העתקה עבור חישוב מס, שם לא עקבי (כמה קבצים המשמשים באקלקלאז, נחשים אחרים), ומעמד מונוליטי FLT:17 אשר טיפלו באימות, הנחה, משלוח והודעות דוא"ל -2,000 שורות.
ביקורות קוד היו לוקחות בממוצע 18 שעות כדי להשלים כי המבקרים נאלצו לבלות את השעה הראשונה רק להבין את ההקשר. שוכרים חדשים לקחו חודשיים כדי להיות פרודוקטיבי.לאחר באג ייצור כואב במיוחד שנגרם על ידי שם משתנה לא תקין, הצוות החליט להשקיע בשיפוץ.
הם התחילו בגישה של שלושה שלבים:
- (ב) לפני שגעתם בדבר, הם כתבו בדיקות אינטגרציה עבור הזרם הקריטי של 184 כדי להבטיח לא תוקפנות.
- (ב) [ה] ל[ה] ל[ה] [ה]] ל[ה] [ה] [ב]] [ה] ל[ה] ל[ה] ל], ל[ה], ל[ה], ולעבד [ה] [ב]
- [ה]ב"ה] [ה] [ה] [ה] [ה]] [ה'] [ה'] [ה'] [ה'] [ה']'[ה']'[ה']'[ה]'[ה']'[ה']'[ה']'[ה']'[ה']'[ה']']'[ה'[ה']']'[ה'[ה']']'[ה'[ה']'[ה'[ה'[ה'[ה']'[ה'[ה']']'[ה'[ה'[ה'[ה']']']']']']']'[ה'[ה'[ה'[ה']'[ה']']'[ה'[ה']']'[ה'[ה'[ה'[ה']']'[ה'[ה']'[ה'[ה'[ה'[ה']'[ה']']']'[ה'[ה'[ה'[ה'[
התוצאות היו דרמטיות.הזמן של בדיקת קוד ירד ל-6 שעות בממוצע.זמן הצפה להשכרה חדש ירד ל-3 שבועות.שיעור באגים ירד ב-40% ברבעון הבא.הצוות דיווח על שביעות רצון גבוהה יותר מכיוון שהם יכולים להבין כעת את הקוד של השני ללא דיונים ארוכים.
מקרה זה ממחיש כי התחדשות אינה מותרות - היא השקעה מעשית בשיתוף פעולה קבוצתי ומהירות ארוכת טווח.
מסקנה
מתן מחדש אינו ניקוי חד פעמי להתבצע לפני שחרור.זהו משמעת מתמשכת המחזקת את קוד הקראיות ושיתוף הפעולה צוות בו-זמנית. על ידי יישום עקרונות כמו אחריות יחידה, שם עקבי, ושכפול דו-פעמי, צוותים יוצרים בסיס קוד בטוח לשנות וקל לדון.לקבוע מחדש באופן קבוע הופך את ביקורות הקוד מוויכוחים מבוימים לתוך דיאלוגים קונסטרוקטיביים.
האסטרטגיות המתוארות כאן – מחוק הצופים הנער ועד למתן כרטיסים למילוי כרטיסים – מספקים מפת דרכים לכל צוות הנדסי שמחפש לשפר את זה.התחל קטן: בחרו קובץ אחד שאתם עומדים לשנות, ליישם את שם פשוט או שיטת תמצית, ולבחון כמה קל יותר זה להיות סיבה.שתף את החוויות שלכם ב-Resrerererererererererereatives. Over time, את ההשפעה המצטברת של שיפורים קטנים רבים לא רק את הקוד שלכם, אלא גם כמה קל יותר לעבוד יחד.
(ב) [ה]: [ה] [ה]], [ה]], [ה], [ה], [ה]]], [ה], [ה]]]ה'[ה']'[ה']'[ה']'[ה']'[ה']'[ה']']''''[ה']''''[ה'[ה']']'[ה'[ה']']'[ה'[ה']'[ה'[ה'[ה'[ה'[ה'[ה']']']'[ה'[ה'[ה'[ה']']']'[ה']']'[ה'[ה'[ה'[ה']']']']']'[ה'[ה']'[ה'[ה']'[ה'[ה']'[ה'[ה']']'[ה'[ה'[ה'[ה']'[ה']']'[ה'[ה'[ה'[ה'[ה