יום ראשון, 7 בפברואר 2010

מה משמעות השם Refactoring

הגדרה של Refactoring - מאת * וייס שי

קוד Refactoring זהו בעצם סט של טכניקות שנועדו לזהות את המבנה הקיים של הקוד ולשנות את המבנה הפנימי שלו על מנת לשפר את העיצוב הארכיטקטוני של הקוד מבלי לשנות את ההתנהגות הנראית לעין של התוצרים.

היום כאשר אנו פונים לכתוב תכנית/ קטע קוד/ אפליקציה יש לנו מספר דרכים רבות בהן נוכל לפנות על מנת לטפל במשימה שלפנינו. אנחנו בדרך כלל מתחילים בדרך מסוימת אבל ככל שאנו מתקדמים בפיתוח אנחנו נכנסים לפרטים יותר עמוקים ואז מתחילות השאלות האמיתיות: האם לבנות קלאס חדש או לרשת מאחד אחר, האם לשלוח את הפרמטרים הללו לפונקציה בצורה כזו או אחרת וכיוצא בזה.

כפועל יוצא מבחירת הדרך שבחרנו והשינויים הרבים הנדרשים תוך כדי הפיתוח אנו מגלים שהשינויים בקוד נעשים יותר ויותר קשים ליישום ודורשים משאבים רבים לצורך ביצוע הפעולות, מטרת ה Refactoring היא ללמד אותנו כיצד לשנות את הקוד לכתיבה יעילה כדי ששינוים בקוד הנדרשים יבוצעו במינימום זמן משאבים.

דוגמא ל Refactoring

מצב קיים:
בנינו אפליקציית web בשיטת השכבות (Data Access Layer, Business Layer, UI Layer, Common Layer ) באפליקציה זו קיימת פונקציה ב DAL שמקבלת 6 פרמטרים, לפונקצייה זו קורא ה UI דרך ה BL במספר רב של מקומות.

הבעיה:
כאשר מגיעה דרישה שהפונקציה ב DAL תקבל עוד פרמטר שביעי שיהיה אופציונאלי, משמעות של בקשה שכזו היא לעבור על כל הפונקציות בקוד הקוראות לפונקציה הרלוונטית ולבצע את השינוי.

פתרון:
בניית קלאס מידע שמכיל את כל הנתונים שאמורים לעבור לתוך הפונקציה, בכל קריאה לפונקציה יש להעביר את קלאס הנתונים כפרמטר אחד, בשלב זה כל הוספה הוא גריעה של פרמטר לפונקציה יכול להתבצע במהירות וקלות יחסית ללא צורך בשינוי קטעי קוד נרחבים.

תהליך ה Refactoring מורכב מ 3 שלבים פשוטים.
  • זיהוי הנקודות הפוטנציאליות שיכולות להוות בעיה בקוד (Code smell)
  • החלת טכניקת ה Refactoring הרלוונטית לאותה נקודה
  • בדיקה של הקוד והתוצאה של אותו קוד על מנת לוודא שלא שינינו את ההתנהגות החיצונית של הקוד.

הגדרה של Code smell:

Code smells זה הבנה שמשהו לא מריח טוב בקטע קוד ויש בעיה כלשהי בתכנון הארכיטקטוני של הקוד.
"קוד מסריח" יכול להיות משהו פשוט כגון Class גדול שמחולק Classes קטנים, פונקציה גדולה שמחולקת לפונקציות יותר קטנות ויכול להיות דברים יותר מורכבים כגון: איחוד שני classes תחת אותו Class והוצאת Interface או Abstract מתאים או התאמת הקוד לעבודה בתצורה של Design pattern מתאים.


* אודות שי וייס:
וייס שי , מהנדס תוכנה.
בשנים האחרונות מתמחה בהובלת ציוותי פיתוח בסטארטאפים וחברות פיננסיות.


בניית צוותי פיתוח טובים ויעילים – חלק ב

חלק ב - Best Practice 1-9 בבניית צוות פיתוח מעולה - מאת * וייס שי

(המשך של חלק א - מה זה בעצם צוות פיתוח מעולה ומה תפקידו של מוביל הצוות)

טיפ מספר 1 - התמקצעות טכנולוגית.
כאשר שואלים מרואיין בראיון עבודה מה הוא בעצם מחפש במקום עבודה אחת התשובות הכי פופולאריות היא "אתגר מקצועי וטכנולוגיות חדשות".
בימינו אנו ניתן לראות שהטכנולוגיה מתקדמת בקצב מהיר וקדימה, לפי בדיקה שנעשתה טכנולוגיה נעשית מיושנת כל שנתיים ולכן יש צורך להיות עם יד על הדופק הטכנולוגי כל הזמן. הדרכים לשמירה על דופק טכנולוגי לעובדים הן די פשוטות – לשלוח עובדים לימי עיון מקצועיים, העברת הרצאות ע"י העובדים לצוות בנושאים חדשים, שילוב טכנולוגיות חדשות במשימות הפיתוח. עובד אשר ירגיש שהוא מעודכן בטכנולוגיות החדשות באופן שותף יהיה עובד שמרוצה ממקום עבודתו שמרגיש שיש לו אתגר.

טיפ מספר 2 - לאט זה מהר.
כל מוביל צוות פיתוח רוצה שחברי הצוות שלו יכירו וישלטו בנושאים השונים (טכנולוגיות, צד עסקי, סביבות...) מצב שכזה לא יקרה מעצמו, על מוביל הצוות לדעת לפתח בצוות שלו את הידע והניסיון ע"י השקעה של זמן בעובד. בעת גישה למשימות יש לתת לעובד זמן ללמוד את הנושאים לבד ולא להאכיל את העובד עם כפית. ללמד את העובד כיצד להגיע לפתרון של הבעיות ולא את הפתרון עצמו, אומנם בטווח הזמן הקצר הדבר דורש הרבה יותר זמן ומאט את קצב המשימות אבל בטווח הרחוק פעולה שכזו שווה זהב, עובד שיודע לבד לפתור בעיות ולהתמצא במערכות השונות משפר את היעילות של העובד עצמו של ראש הצוות וכפועל יוצא של הצוות כולו.

טיפ מספר 3 – לדבר בגובה העיניים.
הרבה מובילי פיתוח הם בעצם מנהלים צעירים שקיבלו על כתפיהם אחריות ניהולית ומקצועית חדשה, אחריות זו גורמת לפעמים למובילים לחטוא בחטא היוהרה וגורמת למובילי הפיתוח להסתכל על העובדים שלהם כמישהו שנמצא תחתיו, שנחות ממנו שצריך לעשות מה שאומרים לו ושלא חייב לדעת את הכול. התנהגות שכזו גורמת לעובדים לא לחשוב מחוץ לקופסא ולעשות בדיוק מה שאומרים להם ומתי שאומרים להם – צוות פיתוח מעולה לא מתנהג ככה!. בתור מוביל צוות פיתוח עליך להסתכל לעובדים שלך בגובהה העיניים, כולנו בבסיס אותו דבר, לכולם יש את המשפחות שלהם, הבית שלהם וההבדל היחידי ביניכם הוא התפקיד תהיה בן אדם, אל תדבר בגסות ובהתנשאות, מותר לך להיות חבר של העובדים שלך אבל חשוב מאוד עליך לדעת להפריד בין הצד המקצועי והאישי – אתה יכול להיות חבר שלהם אבל שזה מגיע לצד המקצועי אם אתה מבקש משהו אז העובדים צריכים לדעת לקבל את הבקשה בלי בעיות.
* טיפ זה הינו טיפ הדורש אינטילגציה רגשית גבוהה כדי שתוכל לדעת לתמרן בין הצד החברי לצד המקצועי.

טיפ מספר 4 – התחלקות בקרדיט.
יש משפט שאומר "להצלחה אבות רבים אבל לכישלון יש רק אבא אחד" לצערי זו הגישה שנהוגה היום בארגונים שונים, לטעמי גישה זו מוטעית. מנהל טוב יודע להוריד את הקרדיט שהוא מקבל כלפי מטה, להציג לרמה שמעליו את העבודה הרבה שנעשתה על ידי הצוות שלו בגאווה. חוזק המנהל נמדד כחוזק הצוות והצלחה של העובד היא בעצם הצלחה של המנהל. בתור מוביל פיתוח עליך לתת לצוות שלך לדעת ולהרגיש שאתה מעריך את ההצלחות שלהם ושמי שמעליך בארגון גם מעריך את עבודת הצוות הדרכים לבצע פעולות שכאלה הן די פשוטות - ניתן להזכיר בישיבות הנהלה את עבודת הצוות, במידה והמנהל שלך אומר לך מילה טובה תבקש ממנו שיעביר את הדבר גם לצוות, במידה וקבלת מאחד מאנשי צוותך מייל תשובה לשאלה שנשאלת ע"י המנהל שלך תעשה העברה של המייל כדי שהמנהל שלך יראה ממי הגיע המייל במקור(אל תשכח לכתב את העובד).

טיפ מספר 5 – לקיחת אחריות.
אם נרצה ואם לא, בעולם של ציוותי הפיתוח תקלות קורות ויקרו. תמיד שמתגלה תקלה השאלה השנייה שנשאלת (לאחר האם זה טופל) היא מי אחראי על הבעיה. בתור מוביל צוות תמיד תיקח אחריות על מה שצוות הפיתוח שלך עשה. תשובה לשאלה מי אחראי על זה צריכה להיות שהבעיה היא באחריותך וטיפולך ואתה תעשה את סדר הבית הנדרש אצלך. אל תיתן למי שמעליך להתערב לך בצוות. הצוות שלך ילמד להעריך אותך הרבה יותר אם הוא יידע שאתה מגבה אותו ולכן יהיה מוכן לתת לך יותר מעצמו. מצד שני אל תהיה סלחן על תקלות כלפי הצוות שלך, במידה ותקלה קורת עליך לשבת עם האחראי על התקלה להסביר לו את החשיבות וההשלכות של התקלה לבצע תחקיר של הסיבות לעניין. תחקור בצורה של "מה כן" ולא "מה לא" ומה עלינו לעשות פעם הבאה כדי למנוע הישנות תקלה שכזו. חשוב – השקעת זמן בתחקורים אלו יחסכו לנו זמן בעתיד וישפרו את התפוקה של צוות הפיתוח.

טיפ מספר 6 – שיחות צוות/מחלקה.
קביעת ישיבות צוות במועדים קבועים ישפרו את איכות ההחלטות והביצועים של הצוות יגבשו את הצוות עצמו ויתרמו לתגבור השייכות של הצוות לארגון. ישנה מתודולוגיה שלמה על איך וכיצד יש לנהל ישיבות צוות, במאמר זה מובאת על קצה המזלג מספר טיפים לישיבות צוות ע"פ ניסיוני בתחום.
תדירות ישיבות הצוות צריכה להיות אחת לשבוע או אחת לשבועיים תלוי בגודל הצוות. שיחת הצוות אמורה להיות על נושאים ארגונים-מחלקתיים כגון יעדים ומטרות, נהלים חדשים של הארגון, פרויקטים עכשווי וכל נושא אחר הנוגע לרוב אנשי הצוות. בישיבות צוות ניתן גם לדון על נושאים שונים ולשאול שאלות.
אין לאלתר את תוכן הישיבה, כדי להימנע מאלתור יש להכין agenda או רשימת נושאים לישיבה. דרך קלה ליישום agenda מסודרת היא לפתוח קובץ על שולחן העבודה במהלך השבוע להוסיף אליו דברים לפי הזמן שהם קורים, מסמך זה יהווה את הבסיס לישיבת הצוות הבאה. agenda מוכנה וברורה תגרום לישיבה עניינית ואפקטיבית אפילו ניתן להגדיל ולשלוח מראש את agenda למשתתפים כל שיוכלו להיות מוכנים לישיבה מראש.
יש להימנע מישיבות ארוכות מדי המנקזות את האנרגיה מהמשתתפים וגורמים לאיבוד עניין ואיבוד הנקודה המרכזית אותה רצית להעביר. מה גם שזה יקר (6 משתתפים * 2 שעות = יום וחצי עבודה).
במהלך ישיבת הצוות תן במה לצוות לדבר על דברים שמפריעים לו בהתנהלות היומיומית, עקוב אחרי שאלות ונושאים שעולים ועבור עליהם בישיבה הבאה אפילו אם עדיין אין לך תשובות.
אל תהפוך את ישיבת הצוות לדיון טכני דבר שיגרום לאנשים אשר אינם קשורים לנושא זה לאבד עניין בדיון.

טיפ מספר 7 – שיחות אחד על אחד.
פגישות שבועיות של אחד עם אנשי הצוות ייתנו לך אפשרות להכיר ולכסות את הנושאים השונים גם ברמה המקצועית וגם ברמה האישית. במידה ויש יותר מ 6 אנשים בצוות כדאי לבצע את הפגישות הללו אחת לשבועיים.
פגישות של אחד על אחד יתנו לכם אפשרות לשפר את יחסי האמון עם אנשי הצוות ולהכיר את הנושאים הקשורים לכל אחד מאנשי הצוות בצורה מלאה. תן לעובד להתחיל את הדיון בנושאים החשובים לו. נסה להימנע בתחילת השיחה מלדון על משימות נוכחיות וסטאטוס של דברים, במידה ועובד ממאן לדבר ניתן לדובב אותו על ידי שאלות מפתח כגון

  • האם יש לך בעיות כלשהן בעבודה?
  • האם יש לך רעיונות לשיפור של דברים?
  • האם חסר לך משהו כגון ציוד, תוכנה, חומרה?
  • האם יש לך רעיונות שהיית רוצה לשתף או לקדם?

שיחות אחד על אחד הן קרקע אידיאלית לדיון בבעיות, מתן עצה, השכמה על פתרון לבעיה ובקשה של פתרון לבעיה. העבר לעובד את המשימה בצורה ברורה אבל הימנע מלתת לו את הפתרון בצורה ברורה, תן לעובד להגיע לבד לפתרון – הדבר חשוב מאוד להתפתחות הביטחון המקצועי של העובד. בצע מעקב על הנושאים העלו בכל שיחה ועבור עליהם בתחילת השיחה הבאה.

טיפ מספר 8 – חלוקת משימות
חלוקת משימות זה חלק מהותי בתפקידך כמוביל צוות פיתוח. בדרך כלל יש נטייה לחלק משימות על פי תחומי התמחות של עובדים, צורת עבודה זו היא לרוב נכונה אך יש בה בור לא קטן, מצב של חלוקת משימות על פי התמחויות יוצר עובדים אשר מומחים בנושא מסוים (שזה דבר טוב שלעצמו), אבל מצד שני אותם אנשים לא מכירים תחומים אחרים (שזה כבר לא כל כך טוב). תאר לך שבצוות שלך יש רק אדם אחד שמכיר מודול מסוים ואותו אדם חולה, אתה בבעיה, כי אינך יכול לתת תמיכה לנושא זה, בתור מוביל צוות אפקטיבי אינך יכול להרשות לעצמך מצב כזה, אתה תמיד צריך לדעת לתת מענה לכל הנושאים. הדרך לעמוד במטרה זו היא על ידי חלוקת ידע בין מספר אנשים. כדי שמספר אנשים יכירו את אותו נושא יש לבצע חלוקת משימות נכונה.
חלוקת משימות נכונה צריכה להתחיל ביחס של 20 – 80 בזמן עומס עד למצב אידיאלי של 50-50 בזמן שקט יחסית, הכוונה היא שבשעת עומס 20 אחוז מהמשימות שעובד מקבל על עצמו הן בתחומים שהוא איננו שולט בהם ודרך הטיפול במשימות הוא יכיר אותן. בתור מובילי צוות עליכם לקחת בחשבון שעובד אשר מטפל במשימה השייכת לתחום שהוא איננו מכיר לעומק יכולה לקחת עד פי שלוש זמן מעובד שמכיר את התחום, אבל חשוב לזכור לאט זה מהר, מחר שתצטרך תמיכה לנושא הזה יהיה לך עוד עובד שידע להתמודד עם הנושא ובמידה והיה לך עומס משימות על תחום מסוים לא תתקל במצב של "צוואר בקבוק" בגלל שיש רק עובד אחד שיכול לטפל בבעיה.

טיפ מספר 9 – אחריות על משימות.
טיפ זה לדעתי הוא אחד הטיפים היותר קשים מבחינת ניהולית – הוא דורש יכולות בין אישיות גבוהות. הרעיון שעומד מאחור טיפ זה הוא לגרום לעובד לקחת אחראיות על המשימות שלו ולהרגיש מחויב לתוצרים שלו. הדרך להגיע לשביל הזהב הזה כולל מספר נקודות שמה שעומד מאחוריהן הוא ש אל לך לפחד לדרוש מהעובדים שלך, תסמוך עליהם שהם מספיק חכמים להתמודד עם דברים שגם אתה מתמודד איתם:

  • דרוש מהעובד לקרוא את החומר ה אפיוני הנוגע למשימה שלו ולהכיר אותו.
  • דרוש מהעובד לתכנן את המשימה, שב איתו לאשר את התכנון ותציע נקודות לשיפור במידה שיש.
  • דרוש מהעובד שילמד ויכיר את הטכנולוגיה שבה הוא משתמש לפני שהוא.
  • דרוש מהעובד כתיבה נכונה ואיכותית ע"פ סטנדרטים גבוהים של קוד.
  • דרוש מהעובד לבצע בדיקות מקיפות של הפיתוח שלו ולוודא שלא ניזוקו מודולים אחרים כתוצאה מהפיתוח שהוא עשה.
  • דרוש מהעובד בסיום הפיתוח לעבוד מול הדרישה/אפיון ולוודא שהכול עובד ע"פ הדרישה/אפיון.
  • בצע סקר קוד מקיף למשימה ודרוש מהעובד לטפל בכל הנקודות שעלו בסדק קוד עד תום.

המשמעות של ביצוע הסעיפים הללו הוא זמן פיתוח רב יותר ומשימה שיכולה להסגר ב 3 ימים כנראה תיסגר ב 5 ימים, אבל – לאט זה מהר, במידה ותעבוד בצורה כזו התוצרים שתקבל מהעובד שלך הם:

  • העובד ירגיש מחויבות ואחריות אישית כלפי המשימה.
  • העובד יכיר את המשימה ברמה גבוהה מאוד גם בצג העסקי וגם בצד הטכנולוגי.
  • המשימה תבוצע באופן מלא ע"פ האפיון/הדרישה.
  • כמות הבאגים תהיה נמוכה מהרגיל.
  • הקוד יהיה רשום ברמה גבוהה, דבר שיגרור תחזוקה קלה ויכולות להתמודד עם שינוים ותוספות לפיתוח בצורה קלה מאוד.
  • העובד ירגיש סיפוק מהעבודה שלו בגלל שהוא אחראי על כל מכלול המשימה.

* אודות שי וייס:
וייס שי , מהנדס תוכנה.
בשנים האחרונות מתמחה בהובלת ציוותי פיתוח בסטארטאפים וחברות פיננסיות.

חלק א - בניית צוותי פיתוח טובים ויעילים

חלק א - מה זה בעצם צוות פיתוח מעולה ומה תפקידו של מוביל הצוות - מאת * וייס שי

מישהו חכם אמר פעם "צוות טוב זה לא דבר שנוצר במקרה, צוות טוב הוא תוצר לוואי של ניהול ומנהיגות נכונים" מה זה בעצם צוות פיתוח טוב, כאשר בא מנהל פיתוח ואומר הצוות הזה הוא צוות מעולה למה בעצם הוא מתכוון, האם מתכוון לאיכות האנשים, איכות העבודה, עמידה בלוחות זמנים? בעצם הגדרה של צוות פיתוח טוב זה מכלול הדברים הללו ואף יותר. צוות פיתוח טוב מורכב מהדברים הבאים:

  • רמה אנושית טובה
  • עמידה בלוחות זמנים
  • מקצועיות גבוהה של הצוות
  • לקיחת אחריות אישית של הצוות על המשימות השונות
  • יכולות עצמית להתמודד עם בעיות
  • תקשורת ושיתוף בין אנשי הצוות
  • נכונות לביצוע כל משימה
בניית צוות פיתוח טוב ויעיל זו עבודה קשה הדורשת ממוביל הצוות יכולות ניהול אפקטיבי.
מוביל צוות הפיתוח איננו עובד בתוך ואקום משלו, מוביל צוות הפיתוח הוא חלק ממכלול שלם של משימות, אירועים ותהליכים יומיומיים המהווים חלק מההתנהלות היומיומית של הארגון.

על מוביל צוות הפיתוח מוטלת המשימה של בניית צוות יעיל ואפקטיבי, אשר לוקח אחריות על המשימות השוטפות לקידום מטרות הארגון ומטרות הצוות. על מוביל הצוות להגדיר מטרות אלו תוך ראיית התמונה הכוללת של הארגון, הבנת סדרי העדיפויות של הארגון והעברת סדרי העדיפויות לצוות עצמו. מוביל הצוות מבטיח שצוותו יקבל עליו את המשימות השונות ואת האחראיות למשימות השונות תוך כדי הבנה של סדרי העדיפות העסקיות והדחיפות של המשימות השונות.

מוביל הצוות הפיתוח מניע ונותן מוטיבציה לצוות ע"י תמיכה במשימותיהם השונות, מוודא שהמשימות מתקדמות בכיוון הנכון ובקצב הנכון. מוביל צוות הפיתוח מוודא שאנשי צוותו לא נתקעים על משימות ובמקרה שכן דואג לשחררן מתקיעות אלו (לקיחת החלטה בוויכוח, תגבור משימה)

בתור מוביל צוות הפיתוח אתה תמיד צריך להיות עם היד על הדופק, אתה לא יכול להרשות לעצמך לנוח על זרי הדפנה הדבר הכי גרוע שיכול לקרות לצוות הפיתוח למנהלו זה להיכנס להתנהלות קבועה של דברים ולקיים סוג של "סטטוס-קוו" יומיומי. מוביל הצוות תמיד צריך לחוש את הצד העסקי של החברה שלו, להבין להיכן מנשבת הרוח ולדעת לנווט את הצוות שלו לכיוון הרוח נושבת. בנוסף לצד העסקי מוביל צוות הפיתוח צריך להיות עם היד על הדופק הטכנולוגי שמשתנה בקצב מהיר, להכיר טכנולוגיות חדשות, לדאוג שצוות הפיתוח יכיר את אותן טכנולוגיות חדשות ולחפש באופן קבוע דרכים לשפר וליעל את העבודה של הצוות.