תאוריית החלון השבור – איך זה קשור לפיתוח תוכנה?

חלון שבור

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

מכירים את תאורית החלון השבור? לא? סבבה, בשביל זה אני כאן – בואו נדבר קצת.

הקדמה – תאוריית החלון השבור

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

אחד הניסויים המעניינים ביותר שהם ביצעו ועל שמו נקראת גם התיאוריה היה כזה:

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

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

בעקבות הניסוי החוקרים פיתחו את תאוריית החלון השבור, בואו ונבהיר אותה או לפחות ננסה.

בניין מגורים – חלון שבור

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

תיאורית החלון השבור - בניין מגורים

תיאורית החלון השבור - בניין מגורים

אני יודע מה אתם חושבים עכשיו (אני גם קורא מחשבות בזמני הפנוי)…

מה זה קשור לפיתוח תוכנה ואיך זה נוגע לי כמפתח בחיי היומיום?

כן, הכותרת שברה שיאי אורך :-)

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

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

קוד מקור לדוגמא

קוד מקור לדוגמא

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

אילוצים או תירוצים?

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

אבל אם נסתכל אחד לשני (ולעצמנו) בעיניים אנחנו בעצם יודעים שאלה תירוצים ולא סיבות.

מה אפשר לעשות?

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

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

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

לסיום, אני רוצה לצטט את Uncle Bob Martin (ברשותכם כמובן)

No matter who. No matter what. No matter when. Short term.Long term. Any term. Writing good code is ALWAYS faster than writing bad code.

Refactoring should never appear as a task on a schedule, Keeping code clean is just something you do all the time

כרגיל, אשמח לתגובות.

הטעויות הכי נפוצות (וגדולות) בפיתוח אפליקציות פלקס

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

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

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

1. שימוש בflex כדי לבנות אתרי אינטרנט או אפליקציות מדור ישן

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

אני זוכר, בתור ילד צעיר למדתי קראטה, with great power comes great responsibility, אמצו את זה כאשר אתם ניגשים לפתח אפליקציה. אם אין לכם אפליקציה שדורשת ויזואליות מסוימת, אנימציות, עבודה עם datasets גדולים וכו', עדיף שתשתמשו בטכנולוגיות אחרות כמו html, css ואפילו פלאש.

Flash this not that

Flash this not that

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

מקור התמונה The Flash Blog

2. האטת האפליקציה עד כדי זחילה על ידי שימוש ביותר מדי containers

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

השקף הזה מדבר על ריבוי containers. הרבה אנשים שמגיעים מhtml לתוך עולם הפלקס (וזה קורה המון) לא מבינים שcontainer  בפלקס הוא component בפני עצמו שיש מאחוריו עשרות (לעיתים מאות) חישובים של גודל, מיקום, מיקום ילדים, גודל ילדים. ועוד יותר גרוע מזה, ולידציות וinvalidations.

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

אפשר לראות כאן צילום מסך של תחקיר שעשו חברים בקהילה מאתר Inside RIA

צריכת זכרון כאשר יש יותר מדי Containers

צריכת זכרון כאשר יש יותר מדי Containers

ניקח דוגמה שפורסמה בזמנו בYahoo Developer Network (את המאמר המקורי אפשר למצוא כאן, אבל אני מתמצת את עיקרו שרלוונטי לנושא)

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

יותר מדי container באפליקצית flex

יותר מדי container באפליקצית flex

הדרך הראשונה

והקוד:

 <Application layout="absolute">

     <HBox width="100%">

         <Button label="Left"/>

         <Spacer width="100%"/>

         <Button label="Left"/>

     </HBox>

 </Application>
יותר מדי container באפליקצית flex

יותר מדי container באפליקצית flex

שימו לב שיש לנו כאן מספר containers, רובם מיותרים, סבב התיקונים הראשון ועכשיו האפליקציה שלנו נראית כך

הקוד שלנו נראה כך:

 <Application layout="horizontal">

     <Button label="Left"/>

     <Spacer width="100%"/>

     <Button label="Left"/>

 </Application>

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

מספר container נכון באפליקצית flex

מספר container נכון באפליקצית flex

הטיוב האחרון שלנו נראה כך:

והקוד נראה כך:

 <Application layout="absolute">

     <Button label="Left" left="5"/>

     <Button label="Left" right="5"/>

 </Application>

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

3. שימוש בXML

אחד היתרונות הכי גדולים בפלקס זה היכולת של הפריימוורק להתמודד עם XML אבל עדיין בטכנולוגיות של היום יש שיטות כול כך יותר טובות להעביר Data שכל מעבר כזה בין הClient לServer והפוך לוקח הרבה פחות זמן.

XML לא רק לוקח יותר זמן לפרסר אלא לוקח יותר זמן להעביר על הwire ויכול לעלות המון כסף של BandWidth.

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

את האפליקציה הזו אפשר למצוא כאן

דוגמאות לסוגי העברת מידע בין Client לServer

דוגמאות לסוגי העברת מידע בין Client לServer

4. שבירת מוסכמות והרגלי גלישה באינטרנט

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

עם פלקס אפשר להגיע לניווט רגיל לגמרי, אפשר לעשות Bookmark, אפשר להגיע לדף ספציפי עם כתובת ספציפית בלי ליצור SWF's נפרדים, אפשר הכול. כאשר אתן ניגשים לבנות את האפליקציה שלכם, שימו לב לזה, לעשות Deep Linking שיהיה אפשר להגיע לכול חלק מיידית, ללא ניווטים וקליקים מיותרים.

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

5. שימוש מוגזם באנימציות ומעברי עמודים

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

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

יודעים מה, כבר עשיתם את זה, תאפשרו למשתמש לכתוב את זה.

כנ"ל עם מוזיקה או Audio Effects.

6. לא לפתח סביבת פיתוח תומכת Craftsmanship או Agile או לא לפתח EcoSystem בכלל

זה נכון לכול טכנולוגיה, בין אם זה flex או אפילו Ruby on rails. לגשת ישירות לפיתוח מבלי להתחשב ולא להנהיג שיטות Tdd/Bdd, Unit Testing, Code Coverage וכו' זה פשוט לא אחראי, זה לא אחראי במיוחד באפליקציות פלקס מכיוון שכשלא עושים את זה, צריכים לבדוק את הכול דרך הUI, לחכות לקומפיילר שירנדר את האפליקציה בכול פעם, זה בזבוז זמן ומשאבים אדירים.

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

הנה כמה:

FlexUnit

FlexMonkey

תפתחו שיטות עבודה איכותיות שמעודדות בדיקות, מעודדות Craftsmanship, מעודדות Clean Code ואחריות מפתחים.

7. לא לעשות שימוש בBuild Machine ובContinuous Integration

היות ואפליקציות Flex עוברות קומפליציה, כלומר מקוד מקור לאפליקציה סגורה, קובץ SWF שיטת הpublish צריכה להיות כזו

תהליך פיתוח ומעבר נכון לProduction

תהליך פיתוח ומעבר נכון לProduction

מה זה אומר בעצם?

זה אומר במפתח עושה Commit לקוד שלו, לתוך מכונה יעודית, במקרה הזה עדיף לעשות שימוש בGIT כי אז הוא יכול לעשות local commits וpush רק כשהוא בטוח שיש אצלו הכול.
המפתח כמובן בודק את הקוד שלו, כך שקוד שנכנס למכונה הוא קוד שעבר בדיקות.
על המכונה הקוד עובד בדיקות נוספות, כדי לבדוק Integration של כול המפתחים, במידה וכול הבדיקות עוברות, הקוד מתקמפל לאפליקציה ועולה לאוויר (אם צריך)

יעיל נכון?

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

אני חושב שאלה הנקודות העיקריות שעולות לי לראש בשלב זה, אם יהיו דברים נוספים אוסיף אותם לפוסט.

כרגיל, אשמח לשמוע את דעתכם.

כיצד תהיו מקצוענים בפיתוח תוכנה? חלק 2

הפוסט הזה ממשיך את הפוסט הקודם בסדרה – כיצד תהיו מקצוענים בפיתוח תוכנה?

במהלך היום וקצת הזה מאז הפוסט הקודם אספתי עוד נקודות על הנקודות שכבר היו לי בעיקר בעזרתו האדיבה של חברי היקר @eladmeidar

מכונת זמן מישהו?

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

הרבה פעמים אני מגיע לחברות ואז אני שומע את המתכנתים אומרים: יכול להיות שאין לי את הגרסה החדשה? שלח לי אותה במייל… ואז אנחנו מגיעים שוב לנקודה של להיות שבויים בהמתנה (נקודה מהפוסט הקודם)

בין אם אתם משתמשים בSVN או בGIT, גם אם אתם משתמשים בשרת פנים חברתי או בGoogle Code זה בכלל לא משנה, אתם צריכים להכיר את הכלים לSource Control ולהשתמש בהם. לעשות Commit כשסיימתם וUpdate לפני שאתם מתחילים.

Patching

אם יש לכם "חייזר" (מפתח מחוץ לצוות) שבא לפתור בעיה ספציפית אל תהיו שבויים בלשלוח לו את הקוד התקול ושישלח לכם את הקוד המתוקן, תנו לו את הקוד ושיכתוב Patch, בינתיים אתם תעבדו על דברים אחרים וכשתקבלו את הPatch תכניסו אותו פנימה והכול דבש! :-)

תוודאו מה אתם צריכים לעשות ואז תוודאו שוב

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

לעיתים (די קרובות) אני מקבל תשובה בסגנון "תתחיל לעשות XYZ ואנחנו נעביר דרישות בהמשך".

תסרבו!

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

פעם קיבלתי מייל כזה מלקוח:

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

נאמן למקור נשבע לכם, שתי שורות שיכלו להתבטא ב20 דקות עבודה ובאותה קלות בדיוק ב20 שעות, אל תתביישו לשאול שאלות, גם אם הן נראות לכם שאלות טפשיות וברורות, תשאלו!

תשמרו את הלקוח שלכם מיודע

אם אתם שכירים הלקוח שלכם יכול להיות המנכ"ל של החברה והוא יכול להיות גם הלקוח הסופי, אם אתם פרילנסרים (כמוני) הלקוח שלכם הוא חברה או לקוח סופי אבל זה בכלל לא משנה.

מה הנקודה?

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

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

המנעו מזה! כמו מאש!

תיידעו את הלקוחות שלכם, אמרו להם את האמת בפנים, תיידעו במיילים.
עדיף שהלקוח ידע מוקדם מאשר מאוחר.

אם אתם פרילנסרים סעיפים אלה נוגעים אליכם.
אתם יוצאים למילואים? תודיעו!
יוצאים לחופש עם האישה לשבוע? תודיעו!
אתם חולים ליותר מיום אחד? תודיעו!

הבנתם? יופי :-)

שירות, שירות, שירות

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

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

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

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

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

תרשום תרשום…

לקוח מדבר אתכם? תהיו עם דף ועט זמינים.
לקוח שולח אליכם מייל עם באג – שלחו אותו למערכת הבאגים שלכם (פירוט בהמשך).

מכירים את המילה "שכחתי", תשכחו אותה :-)

תשתמשו בכלים שיעזרו לכם לזכור על מה דיברתם עם הלקוח, זה לא חייב להיות משהו היי-טקי, זה יכול להיות Low tech לגמרי ולהסתכם בדף ועט (שבסוף כול יום עוברים על מה שרשמנו וכותבים ליום הבא).

GTD – Getting Things Done!

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

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

כיצד תהיו מקצוענים בפיתוח תוכנה?

שלום לכולם,

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

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

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

טוב, נתחיל?

משמעת

נתחיל בכך שבעצם המון מתחיל במשמעת, אנחנו יכולים לדבר ימים ושבועות על עקרונות הOOP על מה זה SOLID או האם כדאי לכתוב בWebForms או ששווה כבר לעבור לMVC אבל האמת היא שלא שם זה מתחיל.

הכול מתחיל במשמעת.

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

זמנים קצרים

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

אל תהיו שבויים

מכירים את זה שאתם לא מתחילים פרויקט בגלל שחסר לכם משהו קטן שהלקוח צריך לספק?

הממ, שקרנים :-)

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

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

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

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

סגור? נמשיך :-)

תמנעו מצימוד

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

זה רע!

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

ארכיטקטורה מסובכת… אוי ואבוי

תמנעו מארכיטקטורה סבוכה, מסובכת, כזו שיש לה תיעוד מסובך ובלתי מובן.

אני מכיר חברות שכול כך סבוכות בתוך הארכיטקטורה הבלתי אפשרית שלהם שפשוט מפסיקות לשלב מוצר מסוים בגלל שהאנשים (בשיווק) כבר לא מאמינים בו.

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

שיפורים קטנים, קטנים אבל תמיד

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

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

שיפורים קטנים לאורך זמן יהוו שיפור גדול מאוד בסופו של דבר.

ממה להמנע? להמנע מאוד מלהגיד “אני אכתוב את זה טוב יותר אח”כ”, אתם לעולם לא תעשו את זה.

כתיבה מחדש – אוי ואבוי גדול מאוד

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

תדמיינו אותי בתור המנכ”ל שלכם, אני לעולם לא הייתי מאפשר את זה, לעולם!
זה מטומטם מבחינה תקציבית, תיאורטית, מעשית ועוד הרבה

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

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

אל תכתבו קוד רע

החוק הזה יגרום לכם ללכת ולא לרוץ, תמיד.

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

Uncle Bob נותן כאן בהרצאה שלו השוואה מדהימה שאני רוצה לקחת ממנו ולכתוב אותה כאן.

דמיינו שאתם חווים חוויה חוץ גופנית ועומדים מעל חדר ניתוח בו רופא עורך עליכם ניתוח לב פתוח.
איך הייתם מעדיפים שהרופא יעבוד?

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

כאן מסתיים החלק הראשון, המשך יבוא…

איך אומרים באנגלית Chew on it for a while…