יום ראשון, 28 בדצמבר 2008

מדוע לא בחרנו לפתח ב-Java או ב-.NET?

(ממליץ לקרוא לפני את הפוסט על רובי או רובי און ריילס (RoR), ואת הפוסט על שפת פיתוח ה-web הנפוצה ביותר)

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

אגב, בעיה ב-Java שנתקלתי בה בעבר, כיוון שכל ארגון בוחר לעבוד עם מודולים שונים, יש להוריד עד עשרות מודולים מהאינטרנט, בגירסאות מדוייקות, כדי שהסביבה שלי תתאים לסביבת הפיתוח של הפרויקט.
כלומר, מפתח חדש, לא רק צריך ללמוד ולהכיר את כל הסטנדרטיים שעובדים איתם בחברה, גם צריך לקנפרג את המחשב עם כל המודולים השונים. ב-RoR יש רק את הגירסה של RoR (כיום 2.2). זהו. ברגע שיש את RoR 2.2, לא צריך יותר מזה כלום.
הדבר נכון גם כאשר עושים Deployment לאפליקציה בשרתי ה-Production. ב-Rails אני צריך את הגירסה האחרונה ומכסימום להריץ פקודה אחת של gems, אשר מביאה לי את כל המודולים החיצוניים ובזה נגמר הסיפור (גם להוסיף או לעדכן את מבנה הטבלאות שיתאימו לגירסה האחרונה בפקודה אחת - סעיף 7 כאן).

.Net היא לא אופציית OpenSource, ושכזאת, לא נרצה לשלם הרבה $$$ עבור רשיונות כאשר נגדיל את חוות השרתים, ו-Scale (קרי, איך לגדול) זה אחד הדברים היותר חשובים כאשר מפתחים תוכנה כשירות, או פיתוח לווב בכלל. כתבתי על Scale ו-how to scale כאן. מלבד עלות הרשיונות לשרתים, והרשיונות עבור המפתחים (MSDN), הפיתוח ב-.Net הוא פחות מהיר מאשר PHP או RoR. זאת למרות שה-IDE של מייקרוסופט בהחלט מצויין. גם ב-.Net כמו ב-Java, אם לא עושים סטנדרטים מלכתחילה, אפשר תוך זמן קצר מאוד להגיע לקוד שקשה מאוד לתחזקו. כבר ניהלתי בעברי כמה פרויקטים שפותחו ב-.Net שהיה צריך לפתח אותם מהתחלה. לא בגלל שהפלטפורמה כל כך גרועה, אלא בגלל שהמפתחים היו חסרי ניסיון.
פרויקטים שמלכתחילה אם היו מפתחים ב-RoR היה לוקח הרבה פחות זמן, ועולה הרבה פחות כסף. לא בהכרח כי המפתחים ב-RoR יותר מוכשרים, אלא כי פשוט הסביבה לכשעצמה גורמת להם לעבוד עם סטנדרטים מאוד מתקדמים ומותאמים לפיתוח ווב. כפי שכבר כתבתי, אפשר לעבוד עם סטנדטיים אלו בשפות אחרות, זה פשוט לא ברירת המחדל! לכן קוד "ספגטי" תמצאו הרבה יותר בפלטפורמות שהן לא RoR.


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

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

בשלב זה בדרך כלל עולות שתי אופציות - או לשכתב חלקים מהאפליקציה ולא להשתמש ב-sessions בשרת בצורה כזו שתפריע, או לקנות רכיבי חומרה יקרים להחריד, שידאגו שכל משתמש תמיד יגיע לשרת שאיתו הוא התחיל (ואז הבעיה לא אמורה להיווצר). אגב, אנשי טסטים מנוסים (כגון יואל) מכירים כבר את הבדיקות שצריך לעשות לוודא שהשרת עדיין "זוכר אותי", למרות שיכול להיות שהחלפנו שרת בדרך.
ב-PHP, ו-(RoR (Ruby on Rails, אין כמעט בעיה שכזו, כיוון שבברירת המחדל לא משתמשים ב-session שנשמר בשרת.

אגב, אם יש לכם את הבעיה הזו אני ממליץ לכם להסתכל על פתרון מדהים שנקרא memcache. זהו פיתרון כללי איך לעשות Caching לזיכרון. בין אם זה זיכרון של שרתי ווב, או שרתי database. אומרים שבפייסבוק (שכתובה אמנם ב-PHP) משתמשים בפיתרון זה להפחית עומסים.

3 comments:

  1. לא מדוייק, קשה לי לחשוב על אפליקציה שלא משתמשת בעוד Gemים חוץ מריילס, ויש צורך לשמור על גירסא תקינה של כל gem בשרת ובעמדות פיתוח.
    יש לאמור שבגירסא 2 של ריילס, יש אפשרות לקנפג בתוך האפליקציה את דרישות הgemים שלה, ובזמן deploy היא אכן תבדוק ותתקין את הגרסאות החסרות אם בכלל.
    אחד הדברים השימושיים ביותר שראיתי
    השבמחק
  2. במה משתמשים בריילס במקום סשיין, איך בכול זאת נגשים למידע "בזכרון"?
    השבמחק
  3. הי אלעד, אתה צודק, אבל לזה התכוונתי: אחרי שאתה מתקין ריילס, אתה צריך פקודה אחת: rake gems:install ונגמר הסיפור. כמובן שהמפתח צריך בקובץ של ה-environment.rb לרשום את שם ה-gem, וגירסא (אם זה חשוב). אגב, לא מעט רכיבים חיצוניים כתובים בצורה של plugins ואז אין בעיה שיהיו כחלק מהאפליקציה.

    שמעון, זה לא שלא משתמשים ב-session בריילס, פשוט מאוד המידע בברירת המחדל של ריילס 2 ומעלה לא נמצא בזיכרון של השרת, אלא ב-cookies בצורה מוצפנת. באותו קובץ ה-environment.rb, אתה יכול להגדיר בדיוק איך לשמור את ה-session. שורה אחת של הגדרה ואתה יכול להגדיר אם זה ב-cookies, database, בזיכרון השרת, בקבצים, או אפילו בזיכרון שיכול להיות משותף לכמה שרתים (memchached).
    היופי האמיתי הוא שבתור מפתח זה לא מעניין אותך מדי. כי אם צריך לשנות את זה, זה שינוי של שורה אחת בקונפיגורציה. כאמור, בברירת המחדל (קרי ב-cookies) גם אם מתרחבים לכמה שרתים, עדיין האפליקציה תעבוד כמו שצריך.
    השבמחק