Saturday, January 12, 2019

שייחנק הלקוח



English version

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

עד כאן לגבי למה אני חושב שזה לא נכון להשאיר ללקוח את המילה האחרונה באשר לאיכות המוצר שהוא מקבל, אבל אילו זה היה כל הסיפור, לא הייתי טורח לכתוב כאן. אחרי הכל, אנשים טועים באינטרנט כל הזמן. הבעיה היא שהגישה הזו עלולה להוביל מאוד בקלות להעתקת יעדים (אם מישהו מכיר תרגום טוב לgoal displacement, אשמח לשמוע על כך). הבנה פשטנית של העיקרון הזה דוחפת אותנו להתבונן על איכות נתפסת של המוצר ודורשת לא מעט להטוטנות פרשנית כדי להצדיק כל דבר שאיננו פיצ'ר חדש. למשל, אם נסתכל על שינויי תשתיות שמאפשרים לנו לגדול בהתאם לשוק - כרגע, המוצר שלנו מחזיק יופי ומסוגל להכפיל את גודלו בארכיטקטורה הנוכחית, אז אין טעם לשנות, נכון? תיאורטית, אפשר לזרוק עוד חומרה על הבעיה וזה יחזיק אותנו במשך חמש שנים נוספות. התרגיל הפרשני שנדרש הולך בערך ככה: "אם לא ניישר את זה עכשיו נצטרך לתקן את זה תחת לחץ, כשהלקוחות שלנו כבר מרגישים הרעה בשירות, והתיקון יהיה מורכב יותר כי בחמש השנים האלה נוסיף עוד יכולות שיתבססו על התשתיות הישנות, חוץ מזה פתרון בעיות יעסיק אותנו ולא נוכל לספק ללקוח תכולה בקצב דומה לזה של היום". טיעון רב שלבין כזה הוא לוגיקה מורכבת, ובעוד שאין לי ספק שכולנו חכמים ומסוגלים ללוגיקה כזו, ככל שנתרגל את האינסטינקטים שלנו לחשוב על ריצוי הלקוח קודם כל, נדמיין פחות תרחישים כאלה ויהיה לנו קשה יותר להצדיק פעולות צופות עתיד למול תחושות הבטן המבוססות שלנו. אני מאמין שרוב הצוותים היום לא בדיוק צריכים *עוד* משהו שידחף לכיוון פיצ'רים גלויים ללקוח על חשבון שיפוצים נדרשים. 
נכון - אם ממש מנסים, אפשר למצוא קשר בין כל פעולה חיובית במוצר לבין השפעה על הערך שמקבל הלקוח, אבל ההשפעה הזו יכולה להיות עקיפה ולהיות רק אחד הגורמים שמשפיעים על חוויית המשתמש.
תרגיל מחשבתי נוסף כדי להסביר על מה אני מתכוון - דמיינו שתי חברות שמייצרות מוצר דומה, מבוסס ענן. המוצרים עצמם נבדלים זה מזה רק בכמה פיצ'רים מינוריים שפונים לטעם האישי של כל משתמש. חברה א' מחזיקה עשרה מהנדסים מיומנים כדי להפעיל את המוצר והם מנהלים אותו בקפידה. חברה ב', מצד שני, בחרה לשכור עובדים בשכר נמוך משמעותית ובאותו מחיר היא שוכרת 100 אנשים להפעיל את המוצר. גם ההוצאות התפעוליות דומות - חברה א' משלמת על שירותי אחסון יקרים ואמינים מאוד, עם חומרה חזקה וארכיטקטורה שמסוגלת להתמודד עם כל מה שהאינטרנט זורק עליה, ואילו חברה ב' משתמשת בשירות זול יותר ושוכרת הרבה יותר חומרה זולה כדי להתמודד עם אותו עומס בהצלחה. בחברה ב' יש צוות ייעודי שמתמודד עם משברים ודואג להדביק במסקינגטייפ את כל החורים והתקלות כך שהלקוח לא רואה כלום. 
האם אפשר לומר שאיכות שני המוצרים שווה?לכאורה, אלו שתי אסטרטגיות שמובילות לאותו מקום. רק שחברה ב' מתעמרת באנשי Operations שלה ועושה להם חיים קשים. 
תגובה שקיבלתי לזה מיואל הייתה שאנשי Ops הם אחד מסוגי הלקוחות שלנו. 
על זה אני יכול לומר - לא, הם לא. 
עד עכשיו הטיעונים שלנו הניחו שיש זהות בין החברה שמספקת את המוצר לצוות שמפתח אותו. זה עובד רק כל עוד מתייחסים לכל מי שבתוך החברה כאל חלק מהמנגנון הזה. אם אנחנו מתחילים להסתכל על צוות פנימי כעל "לקוח" אנחנו משנים את הרזולוציה של הדיון שלנו ועוברים לדבר על צוות הפיתוח ולא על החברה כולה. 
זה מוביל אותי למשהו שחשוב לי מאוד להבהיר: לצוות פיתוח אין לקוחות. אין. אפילו לא אחד. יש לנו מעסיק ויש לנו עמיתים. השימוש בשפה של "לקוח" הוא דרך נהדרת להדגיש את העובדה שאנחנו מספקים שירות מסוג מסוים, אבל בכל הקשר אחר המינוח הזה יוצר עמימות ובלבול. "לקוח" זו מילה טעונה בהקשרים והתנהגויות, ואי אפשר להתייחס לעובדים פנימיים באותו אופן בו מתייחסים ללקוחות, אם כולם "לקוחות" המונח הזה מאבד משמעות. כשכירים אנחנו מקבלים משכורת כדי לקדם את האינטרסים של המעסיק שלנו. לא פחות ולא יותר.  לא יקצצו לי בשכר כי במשך יומיים בחודש המעסיק שלי בחר לנסות חבר צוות אחר והחוזה שחתום בין המעסיק לביני מגדיר התחייבויות שונות מאוד מאשר אלו שבין ספק שירות והלקוח שלו. ואם אני כשכיר פועל כדי לקדם את האינטרסים של המעסיק שלי, בואו נדבר עליהם לרגע - לחלק הארי של החברות יש מטרה אחת פשוטה וקלה למדידה - כסף. לחברה אכפת מהלקוח אך ורק בתור שק מזומנים מהלך - אם נשמור אותו מרוצה, אולי יותר מהכסף הזה יגיע אלינו. אז נכון, קשה מאוד ליצור מוצר רווחי שלא עונה על צורכי הלקוח, אבל המקרים הנדירים בהם הרווח (ארוך הטווח) של החברה עומד בסתירה עם טובת הלקוח, אני צריך לזכור מי משלם את המשכורת שלי ולבחור בצד של החברה. 

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

Eff the user



This idea has been running in my head for a while, and every so often I'll stumble upon a reminder to write something about it, and then have other things to occupy me. The most recent trigger was a talk by Joel Montvelisky in a local SIGiST conference where he spoke about the changing role of the testers. The subject is my objection to one of the modern testing principles.  I'll admit - I really like them. That is, with the exception of principle #5: "We believe that the customer is the only one capable to judge and evaluate the quality of our product".
I don't like this one a tiny single bit. I think it's a false statement and it drives wrong team behaviour and goal displacement. Worse, this idea seems to be ubiquitous in the industry, or at least wildly spread, as some of the variants of similar ideas out there show. I think that #5 is one of the most carefully worded expressions of this idea (as one cannot dismiss it with "a tester can't be a customer proxy\champion\advocate") So I'll stick with it when thinking through my disagreement. 
On the face of it, the principle is very solid - if we accept Jerry Weinberg's notion of quality being value to some person (and I like Bach's addendum to it), it only makes sense that the person who is getting the value is the best judge of it. 
Except when they aren't.
I am not claiming here that a product that is not used or bought by any of its target audience can claim to be "of high quality", but simply that there are cases where evaluating the quality of a product is something that the customer is not capable of doing. 
Imagine that you are getting an OS update to your phone. It improves memory management, fixes a security flaw and provides better logging in cases of a crash. Are you in any position to evaluate any of this? Would an average phone user be in such position? All of it brings value - better logging means faster debugging cycles and faster hotfix releases, a security update reduces the likelihood of the phone being hacked and the memory management improvement will mean you could run more applications in parallel and avoid lagging. But how do you even notice any of those? You don't see the crash reports (and there are other ways to improve response time), the security update is like an insurance - you only notice it if something bad happens, and  your phone has enough memory that you didn't notice any problem with the previous memory management scheme. In all of those examples, there are simply too many layers of indirection between the actual property and the perceivable result and the quality of the product, if assessed by the customer, must be assessed by a proxy measurement. In some cases, the customer might notice if you did a shitty job, but the distinction between "barely good enough" and "excellent" is not visible. 
Then there's the ambiguity about "who is the customer". Consider a bug fix that eliminates a scenario where the user is charged for only 3/4 of the actual use. By fixing it, we are taking "value" from the product's user, but adding value to the vendor. While such condition is extreme, there are more examples when one looks on B2B products - The full disk encryption scheme used by our IT department makes our computers freeze for a second every now and then, but provides the decision makers (who don't use their PC as intensely as other employees do) the peace of mind knowing that data could not be leaked by simply stealing a PC. Customer value? high. User value - not so much.

Now, to goal displacement and wrong team behaviour. A simplistic understanding of this principle drives a lot of focused into perceived quality and requires advanced logic-fu to justify any kind of improvement that isn't a new feature. Take for example an architecture improvement for enabling our product to scale to need. We can go with the current architecture for a year or so, and probably throw more hardware on it for the next five years, so, no real benefit to the user, let's not do that. The rule-fu required would be something along these lines:  "If we don't do it then we can probably patch the system for 5 years but it will gradually slow us down as we deal with issues as they appear, and will also be exposing customers to issues caused by this load. In addition, in five years time we'll have more components relying on the old architecture we want to replace, so the change will take longer and be more risky and complex". This sort of logic is not trivial and far from immediate, if we train our instincts to zero in on the customer satisfaction we'll have a tough time coming up with such scenarios, let alone justify such future-looking actions in face of a well trained gut-feeling. Most teams don't need another thing applying pressure and bias towards perceivable features. True, if we insist, everything we do has an ultimate impact on the customer, but sometimes the impact of good engineering practices is several times removed from the actual impact, and it will usually be only one of the factors affecting that specific property of customer value. Imagine two similar SaaS products, both have the same capabilities, a similar size of customers and are distinguishable only by minor features that might appeal more to someone's personal taste. One product is built by a team of 10 highly skilled engineers that are running a tight ship. The 2nd is maintained by 100 people who work frantically to keep things afloat. The cost of operation for the two products is similar - The top notch engineers are getting payed 10 times as the less skilled ones, and the robust hardware and hosting services used by the first team are as expensive as the cost of throwing cheaper hardware  to gap for design problems in the second team. The perceived quality is the same, both companies can scale at roughly the same pace with roughly the same resources - is the quality of the two products equal? They are supplying the same customer value in different means, only the 2nd team is making it really difficult for their operations team.
I got a response for similar claim from Joel who said "The operations team are your customers as well".
Well, no.
Up until this point in the text we equated the development team to the company. By claiming that someone internal (be it operations, marketing or product management) is also a customer we are shifting our focus to the development team.
Let me say it clearly: As development team we don't have customers. We have employers and colleagues. Calling them "customers" might be useful when trying to convey the message that we provide a service to our colleagues and employers, but is otherwise causing confusion.  As employees we are getting a salary to promote the interests of our employer and that's it. I won't get a lower salary because my employer is unhappy with my work this month, and the contract between us have different obligations than those between a service provider and a customer. If I'm working towards my employer's interests it is time to face the cynical truth - most companies care about the customer only in terms of financial gain and a customer is nothing more than a walking bag of cash. Sure, it's very difficult to have a profitable product that does not align well with the customer's needs but when the two values are in conflict, I should be choosing the (long term) monetary1 business value over customer satisfaction.

So, Short version: Perceivable quality is not quality and it's important to remember that the customer is a (very important) mean to achieve our goals, but not the goal itself.



1 Thanks to Brent Jensen for reminding me that business value could be more than simply monetary. It's a bit harder to measure, and I believe it makes the point even more relevant - this business value could be the company's reputation, business contacts or even its moral values, for those fortunate enough to work in a company that cares about those