עוד לפני הקוד

אמיר דותן

חשיבות התכנון ועיצוב הקוד - לקח אישי

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

הלקוח לא יודע כלום

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

להמשיך עבודה של מישהו אחר זה מ-א-ו-ד מסוכן

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

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

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

אי אפשר להתחיל את ה-איך לפני שמבינים את ה-מה

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

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

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

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

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

עיצוב הקוד - קריטי קריטי קריטי

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

חמישה שבועות של סיוט

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

לקחים אחרונים

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

פורסם לראשונה ב-"פלאש עברי".


 
    

שם:

    

דואר:

    

אתר:

    

כותרת:


zaki    בתאריך 6/14/2003 10:56:04 PM

צריך קשיחות עם לקוחות

כי הם תמיד צודקים...ברוך הבא למועדון...חוש ריח מתפתח עם הזמן ועם הפרוייקטים...7 פעמים יפול צדיק ויקום...חזק ואמץ
:-)

אמיר דותן  בתאריך 6/14/2003 11:40:24 PM

הלקוח תמיד צועק

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

וואלה  בתאריך 6/15/2003 12:21:52 AM

לא רק בעיצוב אתרים

הסימפטומים שתיארת רווחים גם בשיפוץ בתים,הקמת רשתות תקשורת,ועוד תחומים שעסקתי בהם.
הפכנו לאומה של חאפרים חפפניים שבעיתות מצוקה וגלי רווחה תמיד בוחרים לעשות דברים מהר- כי מהר כי כולם עושים מהר...
גילוי לב :
יש לא מעט גשרים בארץ שאני בתגובה אינסטקטיבית מרכין בקטנה את הראש כשאני חולף בנהיגה מתחתם.
לסיום משהו שמפוגג את המהירות -שווה
www.lev-ari.tk

רויטל  בתאריך 6/15/2003 9:04:04 AM

הזדהות מלאה

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

חנן כהן  בתאריך 6/15/2003 10:58:05 AM

הבעיה פתירה לחלוטין

שורש הבעיה הוא בתמחור העבודה ב FIX. אסור לעשות את זה.

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

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

(קל להגיד, אני יודע, אבל אין ברירה)

עצמאית  בתאריך 6/15/2003 6:38:41 PM

ח-ו-ז-ה-!

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

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

מצויין, רק שישלם!

שלומי אסף    בתאריך 6/17/2003 4:52:37 PM

עכשיו אני מבין על מה דיברת

אז בפורום- על אילו מאות שורות קוד אשר קרסת תחתיהן...

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

:)
:::שלומי:::

יעל  בתאריך 8/7/2003 3:21:53 PM

מוכר ולא חביב

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

מ.  בתאריך 8/20/2003 12:59:07 AM

אני לא מבין מה אתה מתבכיין

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

טוב, אולי המאמר לא טרם לי, אך אולי באמת יתרום לאחרים שחושבים שהם "מתכנתים".

aeyal  בתאריך 8/19/2004 12:49:16 PM

למ. היקר

על מה ולמה אתה כעוס?

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

תומר  בתאריך 11/27/2004 7:41:20 PM

ללא נושאמיגדל בבל

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

זיו  בתאריך 3/8/2005 10:56:14 PM

קרה גם לי

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

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

וכמו שאמרו חכמינו:
באג בדיזיין - זיין בדיבאג

משה  בתאריך 11/2/2005 5:50:39 PM

יש לך טעות בסיסית

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

 
    

שם:

    

דואר:

    

אתר:

    

כותרת:



 
 
 
 

 

 

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

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

--> --> --> --> --> --> -->