הרעיון של תכנון מערכות גמישות – חלק ראשון

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

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

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

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

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

כך גם הגישה של actor model שבה אנחנו מקבלים משהו שיודע לשלח בקשות ולקבל תשובות, אך זה לא חייב להיות אותו החלק.

גישה נוספת אשר מפשטת מאוד פיתוח, אך קשה יותר לתכנון נקראת micro services.
הרעיון הוא די פשוט ואנחנו מכירים אותו למעשה מעולם היוניקס: יש משהו קטן שיודע לעשות פעולה אחת ורק אותה, ולהחזיר אותה הלאה.
למשל מכירים את הפקודה cat? היא יודעת להציג פלט מתוך "קובץ" – בברירת המחדל ל sdout.
אם נשלב אותה עם sort למשל, נוכל עכשיו לסדר שורות לפי סדר מסויים שנבחר. אם נשלב עוד תוכנה בשם uniq, עכשיו נעיף כל מה שחוזר על עצמו, ונקנח בפקודה tr, אשר תתרגם לנו סוף שורה לפסיק, ועכשיו נשים את הכל בקובץ חדש, והנה יצרנו מערכת יחסית מסובכת המשתמשת בפעולות מאוד מאוד פשוטות.

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

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

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

בנוסף, אני מגלה בזמן התכנון כי אני לא בטוח ששפת ג'אווה לצורך העניין מסוגלת לספק לי מענה נורמאלי לmicro-service בעוד ששפות כדוגמת go, פיתון ורובי דווקא כן מסוגלות. הסיבה לכך היא די פשוטה – מורכבות של מערכת או שפה משפיעים על מה שניתן להשיג ובאיכות של מה שניתן לקבל.
שפת ג'אווה מורכב יותר, וקשה לקבל ממנה פשטות. למשל הקוד הזה בג'אווה, נראה כך ב jRuby. הספרייה היא של ג'אווה, הסביבה היא של ג'אווה, אבל הקוד ברובי ממוקד יותר מטרה, בעוד שג'אווה דורשת ממני הרבה עודפים שבלעדיהם אני לא מסוגל להגיע למטרה.

בחלק הבא, אכנס קצת יותר בצורה טכנית וקצת פחות תיאורטית.

5 מחשבות על “הרעיון של תכנון מערכות גמישות – חלק ראשון

  1. kzamir

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

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

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

    1. ik_5 מאת

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

      אדם שלא מכיר למשל רובי, יכול לפתח מערכת פשוטה בשבוע, בעוד שאדם שמכיר את ++C יקח לו חודש לאותה המערכת.

  2. kzamir

    כן, אני מסכים שכלי טוב מתאים יותר מכלי לא טוב. אבל האם כלי לא טוב יכול להפוך לטוב רק משום שיש לו הרבה משתמשים ?

    javascript היא שפה שלפי דעתי האישית אינה טובה (רובי ופיתון הרבה יותר נוחות לי) , אבל היום היא שפת ברירת המחדל שלי. מגלל של javascript היו הרבה משתמשים, היו מי שהשקיעו ופיתחו מנועים מהירים יותר (node, iojs, gjs), שהפכו אותה לשמישה יותר, וכפועל יוצא מכמות המשתמשים יש ל javascript הרבה ספריות מוכנות ותמיכה ברשת, ראה את כמות החבילות ב npm.

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

    1. ik_5 מאת

      אחת הבעיות שיש לי עם node (ומתחריו) הוא שהם מבוססים v8.
      על פניו אולי זה לא נשמע בעייתי, אבל גוגל למשל עברו למנוע בשם blink בשביל רינדור html.
      זה אומר שמחר v8 יכול לגמרי להשתנות או להיזנח ואז אין לי מושג מה ילד יום מהפרויקטים האלו. זה לא כזה פשוט כמו "בואו ניקח את המנוע הלאה".

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

      1. kzamir

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

        בנוגע ל c++ , ולדעתי גם java , הן שפות לא נוחות. אבל יש מקרים שהן הפתרון היחיד האפשרי. מעבדים קטנים בד"כ באים רק עם מהדר ל c ו c++ , ואין לך אפשרות אחרת. ממש לא מזמן כתבתי למעבד קטן ( 18Mhz עם 32k ) שכתבו לו ב c פרשן ל lua ואז באמת השתמשתי ב lua במקום ב c, וזה מאוד כיף🙂

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s