לדלג לתוכן

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

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

עקרונות עיצוב

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

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

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

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

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

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

סגנונות ארכיטקטורה

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

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

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

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

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

תקשורת בין רכיבים

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

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

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

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

אמינות וסקייל

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

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

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

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

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

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

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

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

הצטרפו לקהילה בדיסקורד