הפוסט נכתב על ידי אבי תשובה מפתח Java ו-Javascript בחברת טיקל.
במהלך השנים בהן אני מפתח תוכנה, שזפו עיניי (או פיזזו אצבעותיי על פני) עשרות, אם לא מאות, טכנולוגיות, ספריות, ספריות תשתית, שפות, פרוטוקולים, סגנונות וארכיטקטורות. כמו כן, התיאבון, כמו גם הצורך המעשי, לכתוב תשתיות בעצמי כמעט תמיד היו בשטח, בין אם זכו למימוש (בד"כ כן) ובין אם לאו (בד”כ לא). רקע שכזה, מטבעו, גורם למפתח שבע-השנים לפתח "עין" לתשתיות. עין ביונית. עין ביקורתית כזו הצופה לנגד עיניה בתשתית לקויה בעליל, קופצת בטיקים עצבניים וחסרי סבלנות ובמקרה ההפוך – נפערת מהתפעלות לנוכח הברקה הנדסית נדירה.
לי יש שתי עיניים, ברוך השם, וברוב המקרים, המצב הוא שעין אחת קופצת ועין שניה, נפערת בהיסוס, אם בכלל.
יש גם היבט של טעם. בעוד שה"עין" הביונית דלעיל הגיבה לאיכות ההנדסית, היכולות והשלמות של התשתית/המערכת/קוד, קיים בכל זאת גם עניין של טעם: שתי תשתיות, השקולות מבחינת האפקטיביות והאיכות שלהן, יכולות להבדל בגישה שלהן לפתרון הבעיה. כאן בא ועולה העניין של טעמו של המפתח המשתמש בהן, והעדפותיו האישיות (שלו או של הקבוצה, כמובן). למשל, EXTJS היא ספריה רבת-יכולות, אבל השימוש בה ירתיע רבים, מכיוון שרוב העבודה עמה מסתכמת בבניה של קונפיגורציות לרכיבים מוכנים מראש. לעומתם, אחרים ימשכו לספריה זו, בדיוק מאותה סיבה.
עומק הכיסוי
אלמנטים חשובים נוספים שקשורים לטעם, הם הרוחב והעומק של הכיסוי של אותה ספריה/טכנולוגיה/תשתית. אלו מושגים שטרם ראיתי שמשתמשים בהם כותבים אחרים, אולם ברשותכם, אני מוצא אותם אינטואיטיביים ושימושיים. אסביר:
ברוחב, אני מתכוון למנעד התחומים הטכניים, דהיינו הפונקציונליות הרלוונטית, המכוסה. למשל, jquery מכסה די הרבה תחומים ופונקציונליות (הרלוונטים לJS בצד לקוח) – ניהול DOM, אנימציה, קריאות AJAX, ניהול אירועים וכו'. לכן, הייתי אומר, שהכיסוי שלו בהחלט איננו צר, אך גם לא מאוד רחב, בייחוד יחסית לעולם ה-html5 עם שלל התכונות שהוא מוסיף.
בעומק, כוונתי לכמה עמוק נכנסים לי לוורידים. או במילים אחרות, עד כמה מכתיבים לי תבניות שימוש. המושג המקביל באנגלית הוא עד כמה הכלי הוא opinionated. ושוב נחזור לדוגמה שכולנו מכירים – jquery. העומק שלו (או שלה? יש לו צליל של בחור, משום מה, למרות שהוא ספריה…) מאוד צנוע כי הוא ממש לא מכתיב לך שום תבנית שימוש, למעט שימוש ב-selectors.
פקטורים שקשורים יותר בטבעה ההנדסי של תשתית יהיו:
מיקוד: עד כמה התשתית/כלי ממוקדים בפתרון לבעיה ספציפית. למשל, requires.js מהווה ספרית תשתית שתפקידה הוא מאוד מסוים.
תכלית: מה כותבי התשתית מתכוונים שהיא תהיה עבור המפתח. Underscore למשל, מכוונים להיות הספריה לתכנות פונקציונלי קורקטי לJS. הם לא ייעדו אותה להיות ספריה למניפולציה של DOM וסביר להניח, שהם לא יהפכו אותה לכזו.
המרכיבים הנ"ל, יחד עם הפרמטרים המובנים מאליהם…רגע… אולי לא הכי מובנים מאליהם… מוטב ובכל זאת אומר כמה מילים על הפרמטרים האלה:
- איכות פונקציונלית
- איכות הקוד
- איכות הקהילה
אם כך, הפרמטרים המובנים מאליהם (עכשיו) והמרכיבים הנ"ל, הם הדברים המרכיבים התרשמות של מפתח מנוסה (וביקורתי להלאות, כמוני) מטכנולוגיה, ובייחוד מספרית תשתית.
בעוד שערכי מקסימום הם, מין הסתם, רצויים לגבי הפרמטרים האחרונים, בשאר האלמנטים, זה עניין של טעם והתאמה ספציפית למרחב הבעיה הרלוונטי.
עולם ממשק המשתמש הוובי עבר מעין תהפוכה בשנים האחרונות, כאשר מפתחי ממשק משתמש החלו להיות מתכנתים ולא רק מעצבים, שלפעמים תוקעים קצת קוד אקטיבי או אובייקט FLASH בתוך דפי HTML. התמזל מזלנו, והשפה הסטנדרטית (נדחיק לרגע את IE) היא JS, שאפשרה כניסה רכה יחסית לעולם התכנות האימפרטיבי, וזאת – מבלי לוותר על יכולות ומבלי לוותר יותר מידי על ביצועים (בייחוד בימנו).
למעשה, יחד עם סף כניסה נמוך, השפה החביבה הזו, למרות חסרונותיה הידועים (היותה untyped) חובקת בתוכה עולם גדול ורחב של אפשרויות הנדסיות מתוחכמות ורבות עוצמה. יש בה אפשרויות שאנשי Java היו מוכרים את סאן לאורקל עבורן (אה, כבר לא אקטואלי…); תכונות כגון: שילוב של תכנות פונקציונלי לכל דבר עם מודל אובייקטים, כתיבה טבעית של מבני נתונים מורכבים ויכולת ליצירה ואף שינוי דינמיים של אובייקטים, ועוד. עבורי, זה מרגיש כמו להיות ילד בחנות שמשלבת ממתקים עם צעצועים וגאדג'טים עם כרטיס אשראי בלתי מוגבל של הראיס של הכפר.
יותר מידי אנשים שולחים ידם לכתיבת ספריות ותשתיות
ברם, העקרונות המאפשרים לנצל היטב את כל העוצמה הזו, אינם מובנים לרוב רובם של המתכנתים בכללם, ועל אחת כמה וכמה – למי שעבר מגישה יותר עיצובית בבניה של ממשקי ווב, מבלי להשתפשף באינטנסיביות בתכנות פרופר של אפליקציות מסוגים שונים, משני צידי ה-API.
התוצאה הכללית היא, בין היתר, שכלים ותשתיות נוצרים על מנת לרתום את היכולות האלה בצורה מובנית, מעשית ונגישה גם למי שלא ממש משתוקק לעצור הכל ולעשות עכשיו דוקטורט עם סטאז' של שמונה שנים על תכנות פונקציונלי וdesign patterns.
עולם הקוד הפתוח, ובכלל, שופע באנשים ששולחים ידם בכתיבה של ספריות ותשתיות. חלק מהן מגיע לרמת בשלות המאפשרת שימוש ומתוכן חלק מפציעים-נחשפים לאורו של עולם ומאומצים על ידי אינדיבידואלים המחפשים מזור לבלבול המכאיב שהם חווים לנוכח המורכבות של פיתוח תוכנה שניתן להשתלט עליה (ולא להפך). כמו בכל דבר – אנשים רבים, כשכואב להם, פשוט ייקחו את הגלולה שמציעים להם, "זה יהיה יותר טוב מכלום, וחוצמזה, גם ב[השלם בעצמך] משתמשים בזה”. וכאן, ידידיי, אני אומר: תשתיות רבות אינן שוות את הזמן שתבזבז עליהן, ואף יזיקו יותר משיואילו – עדיף שתעשה את הדוקטורט שהזכרתי, או לפחות תמצא מישהו שיוליך אותך בסבך השיקולים ההנדסיים והאחרים ולא תשתמש בתשתיות האלה. (וזה נכון לא רק לגבי JS.)
ויש גם תשתיות ראויות
וכמובן – תשתיות ראויות – יש ויש. ישנן גם תשתיות שהיו סבירות בזמנן, כי הם בכל זאת שיפרו את מה שהיה אז, והיום הן מיושנות, כי תשתיות אחרות נותנות יותר או עושות את זה יותר טוב. ישנן תשתיות שהועילו או מועילות לפחות בהקניה של מבניות לקוד המפותח; סך הכל, מותר לא להבין ב-design patterns כל עוד אנו מספקים תוצר עובד וראוי. ישנן תשתיות שהמיקוד שלהן גבוה ובתחומן שלהן ערכן לא יסולא בפז. ישנן תשתיות שנותנות הרבה, אך למשימה שלך – הן לא רלוונטיות. ישנן תשתיות שלכשלעצמן חסרות מבחינת כיסוי פונקציונלי, אך, בשילוב עם תשתיות אחרות – תקבל חבילה של פתרון ראוי וטוב. ישנן תשתיות יומרניות, שטוענות להיות הפתרון האולטימטיבי, כמעט. חלקן רחוקות מזה וחלקן פחות רחוקות.
כיום, ישנן כמה ספריות תשתית ממוקדות, שלדעתי מצטיינות בתחומן. חלק מהן, הפך לפחות שימושי, לפחות עבור מי שכותב ב-ECMA5 ולעתים יתר הפונקציונליות שלהן מכוסה על ידי ספריות תשתית יותר מקיפות. לדוגמה, underscore – עבור מערכים, יש כבר את הפונקציונליות ב-JS החדשים יחסית ומי שמשתמש ב-angular מקבל גם את הפונקציונליות שקשורה ב-JSON. כלומר, הספרייה מצויינת, אך הופכת במצבים רבים למיותרת.
כמובן שישנן ספריות שתכליתן היא מאוד ספציפית, חלקן הן קטנות מספיק בשביל להיקרא פיסות-קוד ולא ספריות (למשל, חישובים כלשהם, או פרוטוקולי תקשורת) חלקן גדול למדי אבל עדיין תכליתי (ספרייה של גראפים למשל) אבל מבחינתי הן אינן ספריות תשתית אלא ספריות-עזר טהורות והשימוש בהן הוא בד”כ בלתי-תלוי בספריות התשתית שתבחרו. לפעמים דווקא ישנה תלות – דבר שצריך לקחת בחשבון; התלות יכולה להיות בעייתית ויכולה להיות דווקא מועילה, אם השילוב בתשתית שבחרת הוא חלק והרמוני.
מגה ספריות
AngularJS היא ספרית תשתית שהגיעה לדרגת סלב; ככה זה כשמשלבים איכות יחסית (ההדגשה מכוונת…) עם הגב של גוגל. בחודשים האחרונים יצא לי לעבוד באינטנסיביות רבה עם היצור הזה, ולמדתי להעריך אותו בצורה … הבה נאמר "מאוזנת". זו איננה תשתית מושלמת לדעתי, אך אני מתייחס לכך בסלחנות יתרה, מכיוון שזו תשתית צעירה. אגב – היא הגיעה די רחוק לגילה. ישנם כמה דברים יפים מאוד בתשתית וכמה דברים שגורמים לעין שלי לקפוץ ולגבות (או הגבה היחידה והארוכה שלי, לייתר דיוק) להתרומם.
זוהי ספריה שהעומק שלה גדול, כמו גם הרוחב. היא דעתנית. היא מעניקה מבנה. הוא לא מושלם – צריך להרחיב אותו בחכמה, על מנת לבנות אפליקציות "אמיתיות”. זוהי ספריה יומרנית. היא עוד צריכה להמשיך להבשיל כדי להרגיע לי את העין הקופצת. והיא תמשיך, כנראה, די מהר (הקהילה האקטיבית ביותר בתחום, הרבה מעבר לכל קהילה אחרת סביב תשתית JS כלשהי). כשעובדים איתה בהרמוניה, אבל יחד עם זאת, עם ראש פתוח לדברים שכביכול "שוברים" אותה טיפה, הקוד שלכם מגרגר בהנאה כמו חתול.
הדבר הטוב ביותר שבבסיס התשתית הזו, הוא עצם ההתייחסות ל-HTML כתבנית של angular: דהיינו, אנגולר קורא את ה-HTML המורחב ומעבד אותו (בזמן ריצה ובמהירות אדירה) וכך הופך את ה-markup למשהו משודרג עד מאוד (משודרג לפי טעמך וצרכיך). יש שם פתרון מסוג MVVM לשאלת הפרדת הרשויות, פתרון אלגנטי למדי, וה-data-binding אלגנטי יותר מכל פתרון אחר מסוג זה שראיתי בינתיים.
התשתית הזו כוללת גם אוסף קומפוננטות שמכסות את נושא התקשורת עם צד השרת בצורה נאה בהחלט, ופותרת את המתכנת מרוב רובו של העיסוק במניפולציה של ה-DOM. יש שם עוד כל מיני דברים טובים ושימושיים, שמייתרים צורך ברוב הספריות. יש גם כמה דברים תמוהים כמו תשתיות מיותרות ל-dependency injection ו-factories שבלעדי lazy loading וכו' הן שימושיות כמו סנדלי אצבע בקוטב (למעט הקניית מיבניות נכונה, למי שלא חזק מספיק בהנדסת תוכנה בעצמו) אבל אני מעריך שה-lazy loading ונגזרותיו ימומשו ואז תתגשם תועלת גם למי שלא זקוק למישהו שיכריח אותו להפריד בין service ל-control ול-model.
למעשה, שמעתי בעצמי את אדריכלי אנגולר בכבודם ובעצמם אומרים שהם עובדים על זה. ואם הם אומרים, מי ומה אני…
כותבי הספרייה חשבו מראש גם על נושא האוטומציה של בדיקות התוכנה, וכתבו את יצירתם כשנושא זה לנגד עיניהם – זוהי עוד נקודה חדשנית יחסית בעולם ה-JS, ומבורכת, כמובן.
בקרוב אעביר סדנה נוספת על אנגולר בטיקל, סדנה שתתחיל בצורה דידקטית ותקנה מיומנויות כתיבה בסיסיות ותסתיים בשטף כבד של אינפורמציה מרטיטה שקשורה לכתיבה מתקדמת של אפליקציות אמיתיות ותובעניות בסביבה זו.
קרדיט תמונה: Shutterstock.