אני מעולם לא הבנתי את המושג הזה. לכאורה יש הבדל בין פיתוח בצד שרת לפיתוח בצד לקוח? מה ההבדל? זה מחשב וזה מחשב.
נגיד שיש הבדל בין פיתוח למערכת משולבת וזמן אמת, ובין פיתוח מערכת וובית. אבל אם אנחנו מפתחים לווב למה יש הבדל בין קוד שרץ בצד זה של חיבור ה-TCP והקוד שרץ בצד השני?
מה גם שהיום עם התמיכה המסחררת שיש ב-JS וקיומו של node ושאר המסגרות, קוד שנכתב לצד אחד יכול וצריך לעבור במהירות לצד השני.
מה שנוגע לספריות וה-FW שמתחדשים כל הזמן, זה קורה גם באותו "צד" של הסטאק. זה לא שייך ל"פול סטאק" במובנו המקובל שכאילו יש חלקים של שרת ולקוח ואמורים להתמחות באחד מהם. התוצאה של השינויים המהירים בתחום הזה היא שאי אפשר להתמקצע בספריות ו-FW, נקודה. אם מישהו בא ואומר שיש לו נסיון של 15 שנה ב-FW מסויים, שהוא בהכרח בן 15 שנה לפחות, זה לא יפעל דווקא לטובתו.
יש לי הרגשה די ברורה שההבדל לא מובן לך כי מעולם לא פיתחת לא את זה ולא את זה (ואולי לא שום דבר אחר). גם לאמא שלי זה הכל נשמע אותו דבר, רק שהיא עקרת בית בת 75.
מקצת מההבדלים:
- בצד קליינט יש צורך לפתח ממשק משתמש, יש צורך להכיר סביבות גרפיות וכלים שמאפשרים אינטראקציה עם משתמש. צריך להתממשק ל API של פלטפורמת הקליינט או של הדפדפן שאתה רץ בתוכו. בשרת אין את זה. השרת רץ על מערכת הפעלה אחת שהמתכנת צריך להכיר רק אותה בעוד שקליינט יכול להיות נייטיב (במגוון סביבות), או שיכול להיות וובי (במגוון דפדפנים), וצריך מתכנתים ורסטיליים או צוותים לפי פלטפורמה.
- בקליינט המעבד הוא כולו לרשותך, והוא חזק מאוד. אם האפליקציה לא כל כך יעילה, לא בטוח שמישהו ישים לב. השרת צריך לשרת מליוני בקשות בו זמנית, ולא, התשתית לא עושה לך את זה יותר קל. הקוד עדיין צריך להיות כתוב יעיל, הדוק, עם אלגוריתמים טובים, ועם מינימום של נעילות של משאבים קריטיים בין state של קליינטים שונים, על מנת שלא ליצור צווארי בקבוק.
- גרסת שרת היא על פי רוב אחת, מקסימום שתיים באמצע שדרוג או הוספת שרתים. אבל השרת צריך לתמוך אחורה במספר רב יותר גרסאות קליינט רבות וסותרות, עם API שעבר אבולוציה לאורך השנים ועם באגים שכל גרסא סוחבת. לא כל המשתמשים משדרגים לאחרונה ולא תמיד אפשר לכפות.
- מסד הנתונים של שרת צריך לטפל במיליארדי בקשות, בעוד שבקליינט אחדות פעילות ואולי מאות או אלפים שמורות היסטורית. זה משנה לגמרי את סט הכלים וההבנה הנדרשת בהם. בקליינט אם אתה צריך קצת אחסון תמיד אפשר לעשות משהו לא הכי יעיל (גם בשטח וגם ב CPU), כי מי ירגיש? הקליינטים חזקים. אבל בשרת כל שומן כזה הופך לצווארי בקבוק שמצריכים עוד ועוד שרתים (שעולים כסף) ואולי קורסים בסוף. לא ניתן להגדיל שרת SQL ללא גבול ואולי באיזשהו שלב עוברים ל no-sql שמצריך חשיבה מחודשת על כל מבנה ה DB, האינדקסים שלו, הטבלאות, והקשרים ביניהן על מנת לייעל.
- שיקולי אבטחה: שניהם חשוב שיהיו מוגנים, אבל אין דין פריצה לקליינט כפריצה לסרבר. רמה אחרת של הקשחה ואבטחה.
בקיצור: סקיילביליות, רלייביליות, ביצועים, אמינות בצד השרת
גמישות לסביבות ו UI נוח בצד הלקוח.
אפשר להגיד שמברג שמשמש אותי להחליף סוללה בעכבר שלי יכול לשמש גם להחליף חלק במנוע Boeing 737-MAX. אולי אפילו זה אותו מברג בדיוק. אבל המורכבות כמובן אינה זהה.
גילוי נאות:
בניגוד אליך, אני עבדתי כ 7 שנים בחברה שמפתחת אפליקציה פופולרית שבשימוש מאות מליוני משתמשים ברחבי העולם.
רוב העבודה שלי היתה בצד השרת ומיעוטה בצד הלקוח בשכבות שאינן UI.
בשרת השתמשנו ב Java ו- ++C. בצד ה Java השתמשנו בספריה אסינכרונית שהיתה לי קשה ללימוד והבנה בשם RX Java על מנת שלא יהיו נעילות של משאבים קריטיים. שים לב: הסביבה מאפשרת לך לכתוב קוד אסינכרוני, היא לא הופכת קוד רגיל לכזה, היה צורך לשכתב חלקים גדולים של המערכת כדי להשתמש.
בצד הלקוח היו לנו חמש פלטפורמות קליינט שונות, ולכל אחד צוות משל עצמה. כלומר לא רק שלא היה לנו full-stack, לא היה לנו אפילו מושג של צוות קליינט. היו חמישה צוותי קליינט שונים כל אחד עם התמחות אחרת.
וזהו.
עכשיו זו המציאות בעולם האמיתי, אתה יכול להגיד שבתוכנה שכתבת לאשתך להכין פסטה, צד השרת והלקוח דומים, וכנראה גם תהיה צודק. זה לא איך שזה עובד בפרוייקט אמיתי.