פיתוח אפליקציות

קבל הצעת מחיר➘

השוואה של טכנולוגיות שרת – NODE.JS vs .NET vs JAVA vs PHP

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

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

הצורך בפיתוח שרת מעלה את השאלה: באיזו טכנולוגיה כדאי לבחור עבור השרת שלי? ישנן מספר רב של טכנולוגיות צד שרת מהן ניתן לבחור. במאמר זה אתייחס לטכנולוגיות הבאות: ASP.NET , NODE.JS, PHP, JAVA EE. אציין כי ישנן טכנולוגיות נוספות בהן ניתן לבחור, אך בחרתי להתייחס רק לטכנולוגיות בהן יש לי ניסיון פיתוח משמעותי.

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

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

מהירות פיתוח

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

תשובה: יתרונות עבור NET. ו – JAVA בקטגוריה זו הנה ריבוי הכלים האוטומטים אשר באים "ישר מן הקופסה" (כלומר יחד עם סביבת הפיתוח) או תוספים הניתנים להרכבה בקלות על גבי סביבות הפיתוח. עבור NET., סביבת הפיתוח האפקטיבית היחידה הנה Visual Studio. עבור JAVA סביבת הפיתוח המובילה כיום הנה NETBEANS (אם כי ישנן מספר רב של סביבות פיתוח אחרות כגון ECLIPSE וכו'). שתי סביבות פיתוח אלו מכילות סט נרחב של כלים המסייעים באוטמציה של קוד. משמעות קיום כלים אלו עבור תהליך הפיתוח הנה שכאשר אנו רוצים לקודד במהירות קטעי קוד אשר מבצעים פעולות בסיסיות אזי כלים אלו מאפשרים על ידי מספר לחיצות כפתור לייצר את קוד הבסיס המבצע פעולות אלו. על ידי כך ניתן לאפשר גם למתכנתים עם ידע בסיסי בלבד לפתח בקלות את הבסיס לקוד שלהם. במילים אחרות: במערכות הדורשות צד שרת פשוט יחסית ניתן לקצר את תהליך הפיתוח משמעותית כל ידי שימוש בכלים אלו. אך במקרים רבים בצד השרת מכיל לוגיקה עסקית סבוכה וספציפית לצורכי המערכת. עבור מקרים אלו קוד הבסיס הניתן לייצור על ידי כלים אוטומטיים מהווה חלק זניח בתהליך פיתוח המערכת (זאת מכיוון שעל הקוד להכיל לוגיקה מורכבת אשר איננה ניתנת לייצור על ידי אוטומציה). כאן תבחן יכולת הפיתוח האינדיבידואלית של המתכנת ושליטתו בסט הטכנולוגיות אשר ברשותו – ללא העדפה בין טכנולוגיה כזאת לאחרת.

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

clientserver11

 נוחות בביצוע שינויים והרחבות לקוד

אתגר חשוב בפניו ניצבת כל מערכת אשר פועלת לאורך זמן – רמת הנוחות והקלות בה ניתן להרחיב ולהוסיף למערכת יכולות חדשות, והיכולות לשנות בקלות לוגיקה קיימת. הבדל משמעותי בין שפות של טכנולוגיות NET. ו – JAVA, לבין שפות Scripting כמו PHPו – NODE.JS הין ששתי הראשונות הנן באופן כללי "נוקשות" יותר. אלו הן שפות מבוססות תכנות מובנה עצמים (Object Oriented Programming), ועקרונות התכנות שלהן כוללות מרכיבים מרכזיים מעקרונות התכנות ה-OOP כגון: ירושה, ממשקים, TYPE SAFETY ועוד.

שאלה: מה משמעות של הבדלים עקרוניים אלו עבור היכולות לבצע שינויים והרחבות לקוד בקלות?

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

לעומת זאת, במידה והצד השרת של מערכת מסוימת הנו מורכב והיקף העבודה מצריך עבודה של מספר צוות על מרכיבים שונים של קוד המערכת, הרי שעקרונות התכנות של שפות כמו #C ׁ(השפה עליה מבוססות מרבית שרתי ה-NET.) ו – JAVA מכתיבים כתיבה מודולרית תוך כדי הגדרה הדוקה יותר של ארכיטקטורת המערכת והאופן בה רכיבי המערכת השונים מתקשרים אחד עם השני. כך ניתן לאפשר עבודה במקביל של צוותים שונים על רכיבי מערכת שונים, תוך כדי הגדרה ברורה של השרותים אותם הם מספקים.

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

server-side

 עלויות נלוות

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

  1. רכישת רישיונות עבור סביבת הפיתוח – עבור NET. מספקת מייקרוסופט כיום גרסת קהילה חינמית (Communitiy Editionׁׂ) של Visual Studio אשר קרוב לוודאי תספיק עבור המפתח הממוצע, כאשר אין צורך לרכוש את גרסת ה-Entrpeise Edition היקרה. עבור Netbeans – Java הנה סביבת פיתוח מעולה חינמית.  עבור NODE.JS ו-PHP ישנן לא מעט סביבות פיתוח חינמיות, אם כי סביבת הפיתוח המועדפת עלי באופן אישי הנה Webstorm ו – PHPstorm של Jetbrains אשר כרוכות בדמי מנוי (אך אלו זניחים ביחס לעלויות רישיונות של מייקרוסופט).
  2. מערכת ההפעלה עליה יושבים השרתים – כאן נמצא חסרון משמעותי של מערכות מבוססות .NET: למרות שישנם פתרונות המאפשרים הרצת מערכת מבוססת .NET על שרתי LINUX (למשל: MONO)  הרי שהסביבה הטבעית למערכת זו הנה Windows. סך העלויות עבור רישיונות Windows משתנה בהתאם לסוג השרת אותו רוכשים ועלולות להיות משמעותיות מאוד.
  3. ישנם גורמים נוספים אשר עלולים להוסיף לעלויות צד השרת, כמו רכיבי תוכנה של צד שלישי וכו'. עבור כל רכיב תתכן עלות שונה בהתאם לסוג הטכנולוגיה הנבחר. באופן כללי עבור שרתי NODE. או שרתים מבוססי PHP ניתן למצוא מגוון של פתרונות צד שלישי חינמיים – זאת מכיוון ששפות אלו נועדו באופן טבעי עבור קהילת מפתחי "קוד פתוח" (Open Source)

לסיכום: במידה ותקציב הפיתוח הנו מוגבל ישנה עדיפות לשרתים מבוססי טכנולוגיות פתוחות כמו PHP ו – NODE.JS על פני שרתי NET.

עמידה בעומסים ותמיכה במערכות מרובות משתמשים

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

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

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