זה הפוסט הראשון שלי והחלטתי שהוא יהיה בעברית ובנושא אולי קצת פחות סקסי - ניהול פרוייקטים (אני יודע שהכותרת היא "סיפור ספגטי" - סבלנות ). אני אשתדל לשלב גם גם רעיונות שינסו להפוך את הנושא ליותר מסוקס.
אני לא יודע לכמה מכם יצא לעבוד בפרוייקטים עם הרבה שנות אדם (וגם בני אדם), אבל אני עובד בפרוייקט כזה כבר יחסית הרבה זמן ויש לי כמה תובנות שקשורות בכל מיני אספקטים - ניהוליים וארכיטקטוניים.
נתחיל בניהול. אני לא אשתמש במילים כגון Agile, MSF, וכד' לכל אחד מהם יש המון קטגורים וסנגורים ברחבי המרחב הוירטואלי, אלא אתייחס לכל מיני בעיות כלליות (שנפתרו בוריאציה של מטודולוגיה ניהול כזאת או אחרת).
הבעיה הראשונה - איפיון לא חד משמעי. כולנו קיבלנו במייל את התמונה שהלקוח רואה בחזון שלו דבר אחד, איש המכירות מוכר לא דבר אחר, המאפיין מגדיר את מה שמגדיר והמפתח עושה בכלל משהו אחר (לטוב או לרע). הבעיה בזה שהלקוח או המאפיין (שנניח שמייצג אותו נאמנה ומכיר את המערכת לעומקה) מעורבים בשלב מאוחר יחסית, אחרי שהQA עברו על הUC/מודול כבר עשרות פעמים ומצאו את רוב הבאגים (בתקווה, כמובן) והמתפחים תיקנו אותם (כאן שוב התקווה מתבקשת). ואז מתחיל ספור הספגטי שאני כ"כ שונא (הכוונה כפי שכותרת הבלוג מציינת - קוד ספגטי). מתחילים פאטצ'ים, שנויים וכל מיני קומבינות שמביאות את איכות התוצר לא לאותה רמה אלמלא היו מפתחים את הUC בהבנה מלאה (כולל הרקע הלא בהכרח פונקציונאלי של אותו המסך), כלומר TOP TO BOTTOM. מתחילים בUI - מייצרים MOCUPים שהלקוח (או אדם מטעמו) יקבל תחושה של איך התוצר הסופי יראה ומה יכולתיו. רב המצבים שבהם הלקוח התכוון לא' וקיבל ב' ימנעו בשיטת עבודה זו. השיטה גם מכוונת לכך שהשלב הבא יהיה כתיבת תסריטי בדיקה אוטומטייים. אחרי הDD, שאר הקוד כבר פחות או יותר יכתוב את עצמו.
נעבור לארכיטקטורה, גם כאן אני לא אתשמש במלים כגון SOA, SaS, Messaging ושות'
הבעיה השניה - תשתיות חסרות או ירושה קצרה מידי. בפרוייקט הנוכחי שאני נמצא בו, הושקע הרבה זמן ומאמץ בתשתיות שמספקות את רוב צרכי המערכת וזה מצויין אבל אפשר גם יותר טוב. רובינו מפתחים בN-TIER או לכל הפחות מפרידים את הקוד לASSEMBLYים. לדעתי חייבת להיות לכל שכבה שאחראית על סוג עבודה ספציפי (כגון: BL, DAL וכד') מחלקה בסיסית (גם אם היא ריקה) שכולם יורשים ממנה. במידה ובעתיד צריך לספק מימוש או יכולת לכל המחלקות באותה רמה יוסיפו אותה בהמחלקה שכולם יורשים. אני יודע שאני לא ממציא שום גלגל ואני בטח שלא החמישי מGoF אבל לא מעט פעמים הדברים הפשוטים נשכחים בשלב הראשון והחל מאותו הרגע כל שינוי, במיוחד בפרוייקט מרובה בני אדם (שלכול אחד מהם הרבה UC באחריותם) ידחה (לפעמים בצדק ולפעמים לא) בגלל שלא אוהבים לגעת במה שעובד(מכאן אנחנו חוזרים שוב לנושא הספגטי).
נושא אחר הוא צריכה של שירותים או שימוש במשאבים. יש המון מאמרים של איך להשתמש ומה לכתוב, לדעתי התשתית צריכה לנהל דברים כאלה, כולל השחרור משאבים. התשתית, בעיניי, צריכה להשתדל כמה שיותר למנוע טעויות של מתכנתים, כמה שיש פחות מקום לכל מיני טעויות ככה התוצר שנקבל יהיה יותר יציב ולא ימציאו את הגלגל בכל פעם (דוגמה יפה לזה ניתן לראות בCAB (שיט ברח לי BUZZWORD) במנגנון בקשת שירותים עבור הCLIENT).
הבעיה השלישית - הבעיה הזאת שייכת מבחינתי לבעיה השניה אבל בשביל להדגיש את החשיבות אני הפרדתי אותה. כמה פעמים יצא לכם לכתוב קוד שעושה פעולות CRUD(אולי משתמש בEnterprise Library או בתשתית שאתה כתבתם) ? כמה פעמים יצא לכם לכתוב רכיבים שמציגים ועורכים מידע מיישות / דאטאסט ? לא מעט נכון ? הבכן בפרוייקטים מרובי שנות אדם (שמרבים לבזבז חלק ניכר מהשנים האלה על יצירה של רכיבים כאלה בדיוק ובדיקתם) כדאי לשקול יצירה אוטמטית של קוד.
הכלים כבר קיימים עוד מdotNet 1.0 וכיום רק משתכללים יותר ויותר (גם מסתכים אבל זה סיפור אחר). הכלי הכי פשוט בעיניי הוא CodeSmith (עבור מפתחי asp.net השימוש יהיה מאוד מוכר ופשוט). הבעיה איתו שהוא תומך ביצירה של קוד בלי יכולות של עדכון במקרה והיה שינוי בתבנית. בעיה ? אולי בdotNet 1.x כיום יש לנו partial class ולכן אנחנו יכולים פשוט להוסיף קוד בpartial class במקום אחר ולא לגעת בקוד המיוצר, כך שבמקרה של תיקון/שכלול תבנית, הקוד של התבנית הישנה פשוט יוחלף.
הכלים היותר חדשים הינם DSLTools וGAT. לא יצא לי להכנס לעומקם אבל ממה שראיתי היכולות הנפלאות שהם מוסיפים מומרים בסיבוכיות די גדולה ורמת מומחיות די גבוהה שתידרש מאנשי הפיתוח שיפתחו תשתית אלו (כן מבחינתי אלא תשתיות !). אבל אני מאמין שהם יכנסו לMainstream בשנים הקרובות.
היתרונות יהיו קיצור זמן פיתוח, reuse לתבנית קוד עובדת, יצירת test cases אוטומטיים הבודקים את הקוד שנוצר בצורה אוטומטית, חסכון בזמן של QA. בגדול מקבלים מוצר יותר יציב בפחות זמן.
אלו הבעיות העיקריות בעייני שגורמות לכל תופעות של קוד לא יציב, יכולת תחזוקה לקויה של קוד וכמובן קוד ספגטי. מקווה שנהניתם לקרא כמו שאני נהנתי לכתוב (עשיתי הגהה 3 פעמים; מקווה שלא שמתם לב שאני דיסלק :-) ).
אשמח לתגובות והערות !