איכות תוכנה – סוגי איכות (2)

המשך לפוסט ראשון בסידרה: איכות תוכנה – היכן מתחילים?

מחלקים איכות ל2 היבטים עיקריים:

(External Quality (EQ – איכות חיצונית, כל מה שמפריע ללקוח / משתמש. ניתן למדוד ע\"י מספר קריאות ה \"?!WTF\" בשנה שבוקעות מגרונם של לקוחות או משתמשים ברחבי העולם. לרוב הליקויים האלו יתבטאו בבאגים (דבר שהמוצר הבטיח אבל לא קיים) או שימושיות (usability).

(Internal Quality (IQ – איכות פנימית, איך המוצר נראה מבפנים למי שעובד עליו, מפתח אותו ומתחזק אותו. ניתן למדוד אותו ע\"פ מספר קריאות ה \"!?WTF\" של מפתחים ומנהלים בגוף הפיתוח, לרוב אנשים חדשים בארגון שעדיין לא הסתגלו למצב הקיים. מדובר בארכיטקטורה לא טובה, קוד מכוער ומסובך, פיצ\'פוצ\'ים רעים בקוד ובמועקה נפשית אמיתית בשעת ביצוע debug למערכת.

למרות שיש קשר בין EQ ו IQ, ייתכן EQ גבוה בעוד ה IQ אינו טוב.

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

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

מדוע איכות משתלמת
אפשר למצוא חומר רב בנושא, לכן אקצר:

  • איכות חיצונית רעה מרחיקה לקוחות, מקשה על מכירה חוזרת לאותו לקוח (לרוב אלו מכירות מאוד משתלמות) ומעסיקה את ה support.
  • איכות פנימית – עד רמה מסויימת מקצרת את זמני הפיתוח, התחזוקה, time to market ועוד. כלומר סה\"כ היא משתלמת כלכלית.
  • איכות פנימית מעל רמה מסויימת כבר אינה חוסכת אלא עולה יותר, אבל מאפשרת גמישות פיתוחית רבה התומכת בהשגת איכות חיצונית גבוהה. עבור מוצרים מסוימים או פונקציות מסוימות איכות ברמה כזו היא לא כלכלית.

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

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

איכות תוכנה – היכן מתחילים? (1)

פוסט זה הוא ראשון בשרשרת פוסטים על איכות תוכנה.

הקדמה

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

יום אחד נופל האסימון. לא שהיא חדשה, היא תמיד הייתה שם, אבל יש רגע שזה קורה. האיכות בק-ר-ש-י-ם.
  •     כמעט חצי מהזמן הפיתוח ברוטו הולך לתיקוני באגים, ותיקון באגים שנוצרו בזמן תיקון הבאגים.
  •     ישנם \"מקומות קדושים\" בקוד שבהם לא נוגעים, ואם ממש חייבים אז זה תוך כדי תפילה.
  •      \"אי אפשר\" או הערכת זמן פיתוח ארוכה בצורה מגוחכת הופכים לתשובה תדירה יותר ויותר לשאלה: \"כמה זמן יקח לפתח X?\".
אני אציין כאן שיש הבדל בין מערכות on-premise (שמתקינים אצל לקוח) ומערכות on-demand (שירות). מערכת האילוצים בפרוייקט on-demand מוביל לאיכות מובנה מוקדמת יותר. סיבה טובה להעדיף פיתוח on-demand, אפשר לומר.

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

[הסיפור יכול לתאר לפחות שתי חברות שהכרתי ואני מניח שבהתאמה כזו או אחרת יכול להתאים לחברה שלכם (בשלב מסוים בחייה)]

מה עכשיו? להיכן ממשיכים הלאה?
נתקלתי בדילמה דומה לאחרונה, עם קבוצת ראשי צוותים שהחליטו שהגיע הזמן לקחת דברים לידיים. הכיוון הראשוני שלהם היה ללכת לכיוון unit-tests ו TDD. כיוון ראוי בהחלט.

החבר\'ה שכרו רשיונות לסרטי הדרכה של Uncle Bob (סרטונים קצת מוטרפים, אבל עושים את העבודה), אפילו הזמינו מדבקות למחשבים וניגשו לעבודה.


הנושא היה יכול להיסגר אלמלא מנהלי הקבוצות של הארגון עצרו, העלו מחסומים ושאלות: תוך כמה זמן נראה תוצאות? האם משתמש הקצה ירגיש בשיפור האיכות? – כי זה מה שמטריד אותנו כרגע. כמה זמן אתם הולכים להשקיע? … כ\"כ הרבה?? אולי אפשר לשפר את הארכיטקטורה הבעייתית בכזו השקעה – לטפל בבעיה מהשורש? מה זה הרי יעזור שיהיו tests ויהיה refactoring וכמה פונקציות יהיו כתובות יפה יותר?! אנחנו צריכים למכור!


עכשיו התחילה הדילמה האמיתית: לפתוח בצעד מסובך של הטמעת Unit-Tests בחברה עם תמיכה רופפת של ההנהלה? מהם סיכויי ההצלחה?

Seeing what\'s next


בראיה ביקורתית לאחור ניתן לזהות שתי נושאים לשיפור, מנקודה זו:

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

הבהרה: אני באופו אישי אוהב מאוד unit-tests ומאמין, לאחר שעבדתי תקופה ב TDD, שזוהי אחת מההתפתחויות המרשימות בעולם התוכנה בשנים האחרונות. 
לאחר שראיתי את התנגדות המנהלים, ורק אז, התחלתי לשאול את עצמי שאלות: unit tests אינו כלי יעיל לשיפור (EQ (external Quality. מה כן? מה יכול לעבוד במסגרת הנתונה ולהתאים למפתחים ולמנהלים כדי כן לנצל את המומנטום ולשפר את האיכות אבל בצורה שתהיה פחות התנגדות?
בפוסטים הבאים ארצה להמשיך ולדבר על:

    • איכות פנימית (IQ) ואיכות חיצונית (EQ), מה ההבדל ולמה בעצם שווה לשלם עליהם? (חוץ מהעובדה החשובה שמתכנתים טובים ומקצועיים (כמונו) אוהבים אותם)
    • כלי העבודה – ברגע שהחלטנו שאיכות חשובה, אילו כלי עבודה מעשיים עומדים לרשותנו בביצוע העבודה?

    כיצד להניע תהליכים וכיצד התפתחה הפרשה הם שני דיונים מעניינים אחרים שאולי אשמור לעתיד.