גרסת הבטא של VS 11 מציעה שלל כלים חזקים וטובים לבדיקת קוד בצורה אוטומטית, אך במאמר זה בחרנו דווקא להתמקד בשיטה הישנה והטובה ויש שיגידו החזקה מכולן – סקירת קוד אנושית. גם בתחום זה VS 11 מציע לנו מספר כלים אשר יפשטו וייעלו את תהליך סקירת הקוד.
יום אחד אני בוודאי אכתוב את "שבעת ההרגלים של מתכנת אפקטיבי" (חיפוש קליל במנוע החיפוש האהוב עליכם בוודאי ימצא בקלות לפחות מאה כאלה) וברשימה שלי, במקום גבוה במיוחד, יהיה "תמיד – אבל תמיד – הראה את הקוד שלך לעוד מישהו לפני Check In". כשהייתי חלק מקבוצת הפיתוח של MSMQ במיקרוסופט חיפה, סקירת קוד הייתה חלק מה-DNA שלנו. סקירת הקוד לא התבצעה על ידי "מנהל" או "מתכנת בכיר" – כל חבר בצוות היה יכול לבצע סקירת קוד לכל חבר אחר, וכך כולם הכירו את הקוד של כולם, והרגשנו באמת כמו צוות. הרבה מאד ממה שאני יודע (וממה שכבר שכחתי...) על תכנות למדתי מתוך הערות שקיבלתי על הקוד שלי, ומתוך רעיונות שראיתי בקוד של אחרים.
Visual Studio (כבר בגרסת 2010, ועוד יותר ב-VS11) מציע שלל שיטות לבדוק את הקוד לפני הכנסתו לפרוייקט. - Build (כמובן עם טיפול מלא בכל השגיאות והאזהרות), Code Analysis, Unit Tests עם Code coverage . אני בטוח שכולכם משתמשים בכל הכלים האלה לבדוק את הקוד שלכם (ואם במקרה שכחתם עד עכשיו להשתמש באחד או שניים מהכלים הללו, אני לא אספר לאף אחד – אפשר להתחיל מהיום). עדיין, כמה מהבגים העקשניים ביותר, אלה שנוגעים בלוגיקה ובהתאמה לדרישות, ומתכננים להעיר אותכם באמצע הלילה כאשר המערכת כבר עובדת עם מליון לקוחות – לא יתגלו אלא על ידי עוד זוג עיניים שיסתכלו על הקוד, או פשוט בגלל שאתם בעצמכם תגלו אותם תוך כדי הסברת הקוד לעמית.
סקירת הקוד הטובה והאפקטיבית ביותר, לטעמי, היא עדיין זו שמתבצעת "בשיטה הישנה" – כלומר שני אנשים יושבים באותו חדר ואחד מסביר לשני מה עושה הקוד. ב-Visual Studio 2010 (וגם ב-VS11 כמובן) ניתן לאכוף מתן שם של Code Reviewer בזמן check in וכך לפחות להזכיר למתכנת שעוד מישהו צריך להסתכל על הקוד לפני הכנסתו. אם עוד לא אכפתם את המדיניות הזו בארגון שלכם – היום זה זמן מצויין להתחיל.
בכל זאת, צריך להכיר בכך שבעולם של היום יש הרבה צוותים וירטואליים שיושבים במקומות שונים ואזורי זמן שונים, וכמו כן פעמים רבות רוצים להראות את הקוד למספר אנשים שקשה לכנס ביחד. כדי לתמוך בתהליכים האלה נוספה ב-VS11 (כאשר הוא מחובר ל-TFS11 - Team Foundation Server 11) האופציה של Code Review. כך זה עובד:
נניח שקיבלתי משימה לכתוב פונקציה בשם IsPrime שבודקת האם מספר הוא ראשוני. כתבתי את הקוד הבא:
public class PrimesChecker
{
public static bool Isprime(uint numberToCheck)
{
for (var i = 2; i < numberToCheck; i++)
{
if (numberToCheck % i == 0) return false;
}
return true;
}
}
הקוד עובד כהלכה ואכן מחזיר תוצאות נכונות (יש לי כמובן סט של Unit tests שמאשר זאת) אבל המשתמשים טוענים שהפונקציה עובדת קצת לאט וביקשו ממני להכניס קצת שיפורי ביצועים.
חשבתי קצת והבנתי שלא באמת צריך לבדוק את כל המחלקים הפוטנציאליים – מספיק לבדוק פעם אחת אם המספר זוגי, ואחר כך מחלקים לא זוגיים. החלפתי את שורת ה"for" בשורות הבאות:
if (numberToCheck % 2 == 0) return false;
for (var i = 3; i < numberToCheck; i+=2)
לאחר שהרצתי את כל הבדיקות האוטומטיות, ולפני check in, אני רוצה לבקש מידידי ולאד אזרכין לבדוק את הקוד שלי. כיוון שוולאד עובד מהבית היום, אני שולח לו את הקוד לבדיקה בצורה הבאה:
- פתחתי את ה- Team Explorer. שימו לב שהוא השתנה משמעותית ב- VS 11.
ב-Team Explorer החדש יש לינק שנקרא My Work. שם Team Explorer ירכז את כל הפעולות שאני יכול לבצע בזמן הנוכחי (אם תרצו, זהו הפורטל של Team Explorer). לחצתי על My Work וקיבלתי:

כיוון שאני מעוניין לבקש סקירת קוד, אני מקיש (לא במפתיע...) על Request Review ובמסך שנפתח מבקש לשלוח את הקוד לולאד:

הערה: כדי שולאד יופיע ברשימה שלי, צריכה להיות לו הרשאה של Contributor . ניהול הרשאות ב-TFS11, כמו ב-TFS2010, אפשר לבצע באמצעות TFS Administration Tool http://tfsadmin.codeplex.com .
כשולאד יפתח VS11, הוא ייגש ל (ניחשתם נכון, My Work) ויראה:

ולאד יראה בקשת Code review ממני (שימו לב שלצורך התרגיל אני התחברתי כ-“Dummy”). הקשה כפולה על הבקשה תיתן את התוצאה הבאה:

שזו בעצם הבקשה המקורית ששלחתי עם ההערות.
בשלב זה ולאד יכול לקבל או לדחות את הבקשה, וגם להסתכל על השינויים שהכנסתי (אפילו לפני קבלת הבקשה). את השינויים אפשר לראות בכלי ה-Diff החדש של VS11 (לכל מי שממש מתגעגעים לכלי ה-Diff של VS2010 – הכינו את הממחטות, הוא איננו לתמיד). בכלי החדש ניתן לראות את השינויים Side By Side (כמו בכלי הישן), או Inline – באותו חלון, שזו גם ברירת המחדל ובה ולאד בחר.
שימו לב שVS11 מציג שינויים בצורה שנראית כמו הצגת קובץ. מעבר של עכבר (Hoover) על משתנים, פונקציות וקבועים תציג את שמם המלא כולל Namespace ותיעוד אם יש – בדיוק כמו בחלון עריכה של Visual Studio. יחד עם זאת, אין בחלון כזה אפשרות עריכה והוא מיועד לקריאה בלבד.

בשלב זה ולאד יכול לסמן כל קטע בקוד ובלחיצה על מקש ימני להוסיף הערות. כך ולאד שם לב כי לא צריך בעצם לבדוק חלוקה בכל הגורמים הפוטנציאליים עד למספר הנבדק – מספיק לבדוק עד לשורש. ולאד ישייך את ההערה ל-“numberToCheck” בשורה 23:

ולאד בחר "Add Comment" והוסיף את ההערה ב- Code Review pane:

לאחר מכן ולאד מוסיף הערה נוספת – הקוד שלי יחזיר false לגבי 2 – מה שמעיד שכנראה אני צריך לתקן גם את ה-Unit Tests שלי .
בשלב זה ולאד יכול ללחוץ "Finish" ולסיים את סקירת הקוד. בפעם הבאה שאני אכנס – נכון, ל-My Work – אראה את כל ההערות של כל הסוקרים ואוכל לתקן את הקוד שלי בהתאם.
יש לציין כי מי שמבצע סקירת קוד לא מתקן אותו – הוא רק מוסיף הערות, כאשר האחריות לתיקוני קוד נשארת אצל המפתח המקורי.
כל התכתובת – הבקשות שלי, התשובות של ולאד (ואולי גם סיבובים נוספים \ סוקרים נוספים) יישמר ב-TFS בצורה של אחד משני Work Items חדשים – Code Review Request ו- Code Review Response. אני יכול להכניס שאילתא ב- Team Explorer בכל זמן ולראות את ההתכתבות:
כך, במקרה שבאג בכל זאת מצא את דרכו לקוד (לא אצלכם, חלילה) ניתן יהיה לעקוב אחרי השינויים וסקירות הקוד ולראות מה נאמר, מה בוצע וממה התעלמנו.
לסיכום
Visual Studio מכיל כלים יעילים וטובים לבדיקה אוטומטית של הקוד – Build, Static Code Analysis, Unit Tests with code coverage – אבל גם לאחר שהפעלנו את כל אלה, עדיין אסור לוותר על בדיקת קוד אנושית לפני Check In. Visual Studio 11, בשילוב עם Team Foundation Server 11, מאפשר לנו לשלוח קוד לבדיקה אצל בודקים מרוחקים בצורה אפקטיבית וקלה, כאשר תיעוד מלא של כל שלבי העבודה נשמר ב-TFS.
מצאו את הבאגים כשהם קטנים.. ואל תתבישו להגיב ולשאול שאלות על פוסט זה.
הפוסט נכתב על ידי יואל ארנון, מהנדס תוכנה במיקרוסופט המסייע ללקוחות פרמייר - Premier Field Engineer. בעבר יואל היה יועץ עצמאי וחבר בצוות הפיתוח של MSMQ במיקרוסופט חיפה.
אתם מוזמנים להגיב ולשאול שאלות את יואל ושאר מומחי הקהילה בפורום העברי החדש של MSDN בנושא Visual Studio, TFS and ALM.