Architecture Decision Record

Active theme: Light

← דוגמאות לרשומות החלטה

רשומת החלטה ארכיטקטונית: מסגרת אפליקציות ווב, הכול כלול, פול סטאק, למוצר סטארטאפ

מטרה עיקרית:
לבנות יישום ווב ללקוחות משלמים שיוכלו להתחבר, להעלות קבצים, לעבד נתונים ולצפות בדוחות, עם מיקוד בפיתוח אג'ילי, פונקציונליות פול סטאק ותאימות חזקה לכלי בינה מלאכותית ולמידת מכונה (AI/ML), במיוחד מחברות Project Jupyter.

הקשר ודרישות:

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

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

  3. תאימות לכלי AI/ML (עדיפות גבוהה): היכולת להשתלב בקלות עם כלי ניתוח נתונים כמו מחברות Jupyter ואקוסיסטם מדע הנתונים של Python (NumPy, Pandas, TensorFlow וכדומה) חיונית. זה יאפשר עיבוד נתונים ודיווח יעילים.

  4. קריטריונים בעדיפות נמוכה:

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

מסגרות שנבדקו:

  1. Django (Python)
  2. Ruby on Rails (Ruby)
  3. Phoenix (Elixir)
  4. Loco (Rust)

1. Django (Python)

סקירה:
Django היא מסגרת ווב ברמה גבוהה ל-Python שמקדמת פיתוח מהיר ועיצוב נקי ופרגמטי. היא ידועה בפילוסופיית "הכול כלול" (batteries included) שלה, כלומר היא כוללת יכולות רבות כמו אימות, ניתוב, ORM וטיפול בטפסים מהקופסה.

חוזקות:

  • פול סטאק: Django היא מסגרת פול סטאק מקיפה שיכולה לטפל הן בצרכי צד שרת והן בצרכי צד לקוח עם יכולות משולבות (למשל מנוע תבניות, ממשק ניהול).
  • פיתוח אג'ילי: המבנה והמוסכמות המוגדרים היטב של Django מאפשרים פיתוח מהיר והסתגלות, שחשובים בסביבת סטארטאפ. המסגרת מגיעה עם תיעוד מצוין ואקוסיסטם עשיר של חבילות צד שלישי, שמאיץ את הפיתוח.
  • שילוב AI/ML: האקוסיסטם של Python אין שני לו בכל הנוגע למדע נתונים ולמידת מכונה. Django, בהיותה מבוססת Python, משתלבת בצורה חלקה עם כלים כמו מחברות Jupyter, ‏Pandas, ‏NumPy, ‏TensorFlow ו-scikit-learn.
  • קהילה ואקוסיסטם: ל-Django קהילה נרחבת, תיעוד חזק ומגוון רחב של תוספים והרחבות, שמזרזים משמעותית את הפיתוח ואת איתור הבעיות.

חולשות:

  • מהירות זמן ריצה: Python נוטה להיות איטית יותר בהשוואה לשפות כמו Rust או Elixir. עם זאת, במקרה השימוש הזה, שבו ביצועים אינם הדאגה העיקרית, זה אולי לא שובר עסקה.
  • יכולת הרחבה: אף ש-Django ניתנת להרחבה במידה רבה, ייתכנו אתגרים בקנה מידה גבוה מאוד בלי אופטימיזציה קפדנית (למשל בטיפול בבקשות מקבילות רבות). עם זאת, עדיין אפשר להרחיב את Django ביעילות באמצעות איזון עומסים וטכניקות מטמון.

פסיקה:
Django מתיישבת היטב עם הדרישות לפיתוח אג'ילי, תמיכה בפול סטאק ותאימות ל-AI/ML. השילוב שלה עם Python מציע גישה חלקה לכלי מדע הנתונים ולספריות הנחוצים ליישום.


2. Ruby on Rails (Ruby)

סקירה:
Ruby on Rails ‏(RoR) היא מסגרת יישומי ווב פול סטאק בשלה, הידועה בגישת מוסכמה על פני הגדרה (convention-over-configuration), שמאפשרת פיתוח מהיר.

חוזקות:

  • פול סטאק: RoR מגיעה עם כלים מובנים לפיתוח הן בצד שרת והן בצד לקוח (למשל views, תבניות, scaffolding), וספריית ה-gems העשירה שלה מאפשרת מימוש מהיר של יכולות שונות.
  • פיתוח אג'ילי: Ruby on Rails ידועה במיוחד במחזורי האיטרציה המהירים שלה, שהם יתרון לסטארטאפים שמבקשים לבצע איטרציות מהירות על יכולות. RoR תומכת בפיתוח מונחה בדיקות (TDD) ויש לה אקוסיסטם מבוסס לזרימות עבודה אג'יליות.
  • קהילה ואקוסיסטם: ל-RoR קהילה חזקה ומבוססת ומגוון רחב של gems שיכולים להאיץ את הפיתוח.
  • קלות שימוש: ל-Rails תחביר ידידותי מאוד למפתחים והיא ידועה בכך שהיא הופכת משימות כמו הגירות מסד נתונים, ארכיטקטורת model-view-controller‏ (MVC) וטיפול בנתיבים למהירות ופשוטות.

חולשות:

  • ביצועים: ל-Ruby נוטים להיות ביצועי זמן ריצה איטיים יותר בהשוואה ל-Python או ל-Elixir. אף של-RoR אפשר להרחיב עם התשתית הנכונה, הביצועים של Ruby עלולים להפוך לצוואר בקבוק ליישומים שדורשים עיבוד כבד בזמן אמת או תעבורה מקבילה גבוהה.
  • שילוב AI/ML: אף של-Ruby יש כמה ספריות למידת מכונה, היא אינה מאומצת בהרחבה בקהילת ה-AI/ML כמו Python. השילוב עם כלים כמו מחברות Jupyter אינו חלק כל כך, מה שהופך את Python לבחירה חזקה יותר ליישומים עתירי נתונים.

פסיקה:
בעוד ש-Ruby on Rails מצטיינת בפיתוח אג'ילי וביצירת אבות-טיפוס מהירה, היא נופלת בתאימות ל-AI/ML בהשוואה ל-Python‏ (Django). היא בחירה ברת קיימא לסטארטאפים שמעדיפים איטרציה מהירה על פני שילוב עמוק של ניתוח נתונים.


3. Phoenix (Elixir)

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

חוזקות:

  • יכולת הרחבה וביצועים: Phoenix מבריקה ביכולת הרחבה ובטיפול במקביליות גבוהה. היא בנויה על מכונת Erlang הווירטואלית, שיכולה לתמוך באלפי (ואפילו מיליוני) חיבורים מקבילים, מה שהופך אותה למועמדת חזקה ליישומים שדורשים עיבוד נתונים בזמן אמת או תעבורה בנפח גבוה.
  • פול סטאק: Phoenix כוללת את כל מה שצריך כדי לבנות הן את צד השרת והן את צד הלקוח של יישום. היא תומכת ב-live views לעדכוני ממשק משתמש אינטראקטיביים וכוללת מנוע תבניות.
  • פיתוח אג'ילי: Phoenix מודולרית מאוד, ומאפשרת איטרציה מהירה על יכולות. היא מתאימה היטב לסטארטאפים שצריכים לנוע במהירות.
  • תאימות ל-AI/ML: אף של-Elixir יש ספריות למידת מכונה מתפתחות, היא אינה נתמכת בהרחבה למשימות AI/ML כמו Python. השילוב עם כלים כמו מחברות Jupyter ידרוש פתרונות עוקפים, מפני שהאקוסיסטם של Elixir למדע נתונים אינו בשל כמו של Python.

חולשות:

  • אקוסיסטם AI/ML: Elixir אינה השפה העיקרית בשימוש במדע נתונים או בלמידת מכונה, והאקוסיסטם אינו בשל כמו של Python. לכן השילוב עם כלים כמו מחברות Jupyter או ספריות AI פופולריות (TensorFlow, PyTorch) יהיה מסורבל.
  • עקומת למידה: אם הצוות אינו מכיר תכנות פונקציונלי ו-Elixir, ייתכן שתהיה עקומת למידה תלולה יותר.

פסיקה:
Phoenix היא בחירה מצוינת אם יכולת הרחבה ומקביליות הן דאגה עיקרית. עם זאת, בהינתן העדיפות לתאימות ל-AI/ML, ייתכן ש-Phoenix אינה ההתאמה הטובה ביותר בשל האקוסיסטם המוגבל של Elixir בתחום הזה.


4. Loco (Rust)

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

חוזקות:

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

חולשות:

  • פיתוח פול סטאק: Loco, אף שהיא מבטיחה, אינה בשלה כמו המסגרות האחרות בכל הנוגע לאספקת פתרון פול סטאק שלם. היא מתאימה יותר לפיתוח צד שרת, והאקוסיסטם של צד לקוח סביב Rust עדיין מתפתח.
  • פיתוח אג'ילי: פיתוח עם Rust יכול להיות איטי יותר בהשוואה לשפות ברמה גבוהה יותר כמו Python או Ruby בשל אופייה ברמה נמוכה יותר ועקומת למידה תלולה יותר.
  • אקוסיסטם AI/ML: ל-Rust אין אותו אקוסיסטם נרחב ל-AI/ML כמו ל-Python. אף שיש ספריות גדלות ב-Rust למחשוב נומרי, הן בשלות הרבה פחות מההצעות של Python, כמו מחברות Jupyter או מסגרות למידת מכונה.

פסיקה:
אף ש-Rust והמסגרת Loco שלה מציעות ביצועים יוצאי דופן, היעדר תמיכה בפול סטאק, יתרונות הפיתוח האג'ילי ואקוסיסטם ה-AI/ML הופכים אותה לפחות אידיאלית למקרה השימוש הספציפי הזה. היא מתאימה יותר ליישומים קריטיים לביצועים מאשר לפיתוח ווב מהיר עם כלי מדע נתונים משולבים.


סיכום

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

  • יכולות פול סטאק: Django היא מסגרת פול סטאק שמשלבת פיתוח צד שרת וצד לקוח.
  • פיתוח אג'ילי: המסגרת מתאימה היטב ליצירת אבות-טיפוס ולאיטרציה מהירות, שחיוניות בסביבת סטארטאפ.
  • תאימות ל-AI/ML: Python היא השפה המובילה ב-AI/ML, והתאימות של Django לספריות כמו מחברות Jupyter מבטיחה שילוב חלק לניתוח ולעיבוד נתונים.
  • קהילה ואקוסיסטם: תמיכת הקהילה החזקה של Django ואקוסיסטם הספריות הנרחב שלה מספקים כלים רבים להאצת הפיתוח.

אף ש-Ruby on Rails היא גם מתמודדת חזקה בפיתוח אג'ילי, התמיכה המוגבלת שלה ב-AI/ML הופכת אותה לפחות אידיאלית למקרה השימוש הספציפי הזה. Phoenix (Elixir) ו-Loco (Rust), אף שהן מצוינות ליכולת הרחבה ולביצועים, נופלות בשילוב AI/ML ובפיתוח פול סטאק. לכן Django היא המסגרת המומלצת לפרויקט הזה.