בפוסט קצר, שיכול להיות שרשור בטוויטר, אני רוצה לחדד את ההבדל בין ״תכנות״ ל״הנדסת תוכנה״.
אין כמובן הגדרה פורמאלית, ואם תחפשו באינטרנט תמצאו שלל הגדרות והבחנות – בהם הרבה אתרי יח״צ / מכללות – לא גורמים שעוסקים בעולם התוכן הזה לעומקו.
בקרב אנשי תוכנה ותיקים, נראה שיש איזו הסכמה מקובלת של המושגים שעוזרת לעשות הבחנה בין שתי דיסציפלינות דומות, אך עדיין שונות. בפוסט זה, אני רוצה להעלות את הדברים על הכתב, בכדי לחדד אותם לאלו שאצלם ההבחנה עוד מעורפלת.
כמובן שזו הגדרה שלי, וגם בקרב אנשי תוכנה ותיקים – תוכלו למצוא וריאציות לפה ולשם.
נושא
תכנות (ברמה גבוהה)
הנדסת-תוכנה (ברמה גבוהה)
אף אחד מהם
כתיבה שוטפת של קוד
כתיבת קוד מהירה – שמבצע את העבודה: תוך זמן קצר – הפיצ׳ר עובד.
כתיבת קוד סופר-ברור וקריא, שקל להיכנס אליו ולקרוא אותו.
כתיבת קוד סופר-מתוחכם המשתמש במגוון יכולות של שפת התכנות / ספריות. קוד שמעטים יכולים לכתוב – ומעטים יכולים להבין בקלות.
מקרי קצה
חשיבה על מקרי-קצה שעלולים לצוץ וטיפול בהם. ההבנה אילו מקרים לא מספיק חשובים לצורך העיסקי וניתן להתעלם בהם (למשל: המשתמש לא יוכל לבצע את הפעולה = מגבלה מתוך החלטה)
מקרי הקצה מטופלים באופן שקל להבין אותם: מהו מקרה הקצה, ומהי ההתנהגות. ארגון הקוד של מקרי-הקצה הוא מבנה שמקל על תחזוקת המערכת לאורך זמן״הידע מוטמע בצורה מסודרת בתוך הקוד״ ולא ״ידע מפוזר באקראיות ברחבי הקוד״.
התעלמות ממקרי הקצה, או טיפול ב 100% מהם. שתי הנקודות הללו לא-מיטביות.
שימוש בספריות צד שלישי
שימוש מושכל בספריות / שירותי צד-שלישי כאשר השימוש חוסך כמות משמעותית של פיתוח.
בחירת ספריות עם התאמה גבוהה לארכיטקטורת המערכת: מינימום חפיפה לקיים, מקסימום המשך של גישת המערכת לנושאים שונים (צורת תקשורת, שמירת נתונים, קונבנציות, אבטחה, וכו׳)
שימוש (לעתים מנומק) של ספריות צד-שלישי שלא בהכרח מקצרות בהרבה את זמן הפיתוח ולא בהכרח מתיישבות עם ארכיטקטורת המערכת.
איתור תקלות
מומחה באיתור תקלות במערכת, יודע היכן לחפש, איך לחשוף ביעילות עוד מידע – ולפתור מהר את הבעיה.
מתכנן את המערכת כך שתקלות יקרו פחות, ואם הן קורות – יהיה קל לאתר אותן, ולא יזדקקו ליכולות מיוחדות של איתור תקלות.
?
כתיבת בדיוק
כתיבת בדיקה שבודקת ביעילות נקודה מסוימת ומוכיחה: עובד או לא עובד.
כתיבת בדיקה קלה לתחזוקה (למשל: מיעוט בתלויות, או ב mocks). כתיבת בדיקה ברורה דיה להיות סוג של תיעוד מה היכולות וההתנהגות הצפויה מהמערכת.
?
מטאפורה
בישול ארוחה טובה
הרצת מסעדה רווחית
בשלן חובב, שעסוק בעשיית רושם – אבל לא ממש מצטיין בלב המלאכה.
תצורת עבודה אופטימלית
לבד. חברה קטנה שצריכה לזוז מהר. סט היכולות נדרש גם בחברה גדולה – אך הוא הופך למשני להנדסת תוכנה
ארגונים גדולים ובינוניים, הדורשים עבודה עמוקה-משותפת של גורמים רבים, ובמיוחד אם יש בהם מורכבות גדולה. היכן ששם המשחק הוא: ״לאפשר למערכת להמשיך ולנוע – בלי להיתקע״.
בעיקר ארגונים גדולים – שם חוסר-יעילות יכולה לפרוח.
כמה נקודות:
נוהגים לומר ש״הנדסת התוכנה מתחילה היכן שהתכנות נגמר״. לכאורה נשמע ש״הנדסת תוכנה״ היא הפרקטיקה ה״שווה״ / חשובה יותר. זה נכון, אבל חלקית: הנדסת תוכנה בלי יכולות תכנות טובות – לא שווה הרבה.
זה לא שאדם מסוים הוא מפתח או מהנדס תוכנה. הם לא Mutually exclusive (בלעדיים). תיאור מדויק יותר הוא שכל איש-תוכנה הוא במידה מסוימת מתכנת, ובמידה מסוימת מהנדס תוכנה.
משה אולי הוא 9/10 מתכנת, ו 3/10 מהנדס תוכנה.
רינת היא אולי 6/10 מתכנתת, ו 8/10 מהנדסת תוכנה.
כמובן שנרצה אנשים מעולים בשני התחומים – אבל זה לא תמיד מה שנקבל.
הצורך בהבנה הזו היא כדי להעריך ולהכווין עובדים. למשל: אם מישהו הוא מתכנת מעולה (אבל מהנדס תוכנה חלש) – כנראה שלא יהיה נכון למנות אותו למוביל טכני או ארכיטקט. מנהלים לפעמים מתבלבלים, שאם אדם הוא מתכנת מצוין – זה לא מעיד על יכולות הנדסת התוכנה שלו.
יתרה מכך, ״להטוטני קוד״ שמכירים את כל הטכנולוגיות החדשות, או כותבים קוד סופר-מתוחכם וחדשני, עשויים להיות במקביל לא מתכנתים טובים, ולא מהנדסים טובים. חשוב להבין את זה, ולהכווין אותם לערוץ פרודוקטיבי. לא להתרשם מהפונקציה המתוחכמת-גנרית-רקורסיבית-tailrec-פונקציונלית – שאף אחד לא מבין, וזה כנראה מצביע על זה שהיא פשוט לא טובה.
כמובן שארגונים גְּדֵלִים צריכים להיזהר מריבוי מפתחים שהם לא מהנדסים טובים. אפשר להתקדם במהירות בהתחלה – ואז לחוות נפילה גדולה שבה המערכת כ״כ סבוכה / נכתבה אופורטוניסטית / קשה לתחזוקה – שהארגון פשוט ״תקוע״ וההתקדמות הופכת למאוד אטית וכואבת.
בחוויה של סטארטאפ קטן, האלתור והשחרור המהיר של הפיצ׳ר – הוא הניצחון.
הרבה מאוד ניצחונות תכנותיים – הופכים לניצחון פירוס הנדסי (״עוד ניצחון כזה, ואבדנו״) במיוחד אם הדומיין העסקי הוא מורכב.
ההיפך הוא גם נכון: יש מהנדסי תוכנה שרק ירצו לעשות Refactoring ושיפורי תשתית ותחזוקה בלי סוף. אם לא תאזנו אותם – הם יכנסו ל Refactoring רקורסיבי בלי תנאי עצירה. (כלומר: אינסופי. שנה, שנתיים – והיד עוד נטויה).
לא תמיד קל להבחין מהי הדרך הטובה ביותר לעשות דברים.
יש לבחון כל הזמן את הדברים…
סיכום
אני מרגיש שאמרתי דיי את המובן מאליו, כך שאם הפוסט לא חידש לכם דבר – הכל בסדר.
אני משוכנע שיהיו גם לא מעט אנשים שההבחנה הזו תעשה להם סדר – והם יוכלו מעתה להיות רגישים יותר לשיח הכולל אמירות כגון ״זה תכנות טוב, אבל אין פה הנדסת תוכנה״.
כתיבת תוכנה היא לא רק כתיבה של עוד ועוד פונקציות, בדיקות, מירג׳וג׳, ושליחת הקוד לפרודקשיין. אחת לכמה זמן (ימים, שבועות – תלוי בסביבה הספציפית) יהיה חסם שיעצור אותנו מלהמשיך בהזרמת קוד לפרודקשיין. יש לנו בעיה. אולי החלטה שאנחנו מבינים שהיא משמעותית – וחשוב לבדוק אותה היטב. נקרא למצב הזה ״דילמה״, והוא מכנס בתוכו מגוון מצבים שדורשים התמודדות עם מורכבות, כזו שלא מאפשרת לנו (או אנחנו מבינים שמוטב שלא) להמשיך ו״להזרים עוד קוד״.
דוגמאות לדילמות:
בעיה טכנית שאין לה פתרון ברור. לא ידוע לכם מה אפשר ו/או מה נכון לעשות.
הכוונה שלי היא בעיקר בעת פיתוח יכולות חדשות למערכת, אך בהחלט יכול גם להיות באג / בעיית פרודקשיין, וכו׳.
בעיה טכנית מורכבת / בעלת השלכות חשובות. יש לכם פתרון – אבל אתם מבינים שעדיף שעוד אנשים יבקרו אותו לפני שאתם ממשיכים.
בעיה ארגונית – מישהו לא מספק משהו שאתם זקוקים לו, או לא מספק משהו טוב-מספיק.
עבור המקרים הללו, הארגון זקוק ל ״Staff Engineers״ (לשעבר: ״Senior Engineers״, הייתה אינפלציה), אותם אינדיבידואלים שיכולים לקחת נושא מורכב, טכנית ו/או ארגונית – לפרק אותו לגורמים, לפתור, ולסגור אותו היטב – כך שהארגון יוכל לחזור למצב ״הזרמת קוד״, הרצוי והנוח.
אם אתם מעוניינים לפתח מיומנויות ש ChatGPT לא יוכל להחליף בעתיד הקרוב, להתקדם למשרה של ״Staff Engineer״ בארגון שלכם, או שאתם כבר כאלו – אבל רוצים ללטש את המיומנות – זה הפוסט עבורכם.
מודל ההתקדמות-במורכבות של ליאפולד [1]
המודל הזה הוא דיי פשוט, ואפילו דיי אינטואיטיבי לכאורה – אבל הוא היכן שרבים ממהנדסי התוכנה כושלים ולא מצליחים לספק את מה שהארגון באמת זקוק לו. לפעמים אני צופה בתסכול של מהנדסים ״אבל פתרתי את הבעיה, למה לא מבינים את זה?״ (או של מנהלים: ״למה הוא לא עושה …״?). המודל הזה אמור להסביר את הפער.
הדילמה שלכם לא פשוטה (אחרת לא הייתם יוצאים מ״זרימה״). לא ברור אם כל אדם שתפנו אליו יבין אותה, ולא ברור אם אתם בעצמכם, בעצם, מבינים אותה עד הסוף. השלב הראשון הוא לזקק את הדילמה, ולענות על השאלה ״מהי בדיוק הדילמה?״:
לתאר אותה.
לחדד מה בדיוק יודעים.
לחדד מה עוד לא ברור / פתוח.
להסיר פרטים מיותרים / לא נחוצים.
למצוא דרך פשוטה להסביר לאחרים, שחסר להם הֶקְשֵׁר – מה שאתם כבר יודעים.
אני חושב שאצלי תהליך הזיקוק כבר דיי אוטמטי ומתרחש בדרך כלל בראש, בחצי דקה (״טוב… מה העניין?״ – אני שואל את עצמי) – אבל הוא בחלט קורה. במקרים יותר מורכבים אני אכתוב כמה נקודות על פתק (יש לי פתקיות בשולחן העבודה, ואני משתמש בהן כל יום), או אלך ליצור תרשים (משהו מהיר ב excalidraw). עוד אופציה היא להתחיל מסמך (Google Docs) – ולסכם את הדברים, לרוב בנקודות.
לכם אני ממליץ לראות מה עובד לכם. אם אתם לא רגילים לעשות תהליך מסודר של זיקוק – אני ממליץ להתחיל בכתיבה, ולצמצם השקעה (כתיבה במסמך) מתוך הוכחה שהתהליך הופך ליותר ויותר אוטמטי אצלכם.
אני מניח שנטייה הראשונית של רוב מי שיקרא את הטקסט הזה הוא לפטור את הנושא ולומר ״כן, אני מבין את הדילמות טוב… בואו נעבור הלאה״, ולהמשיך לחפש תובנות מרגשות יותר בהמשך הפוסט.
קשה לי להבהיר כמה התהליך הזה הוא חשוב ומשמעותי, ולמרות שהוא נשמע טכני או פעוט – הייתי ממליץ לכם בחום לקחת אותו ברצינות רבה, ולהתנסות ולראות שאתם מצליחים לזקק את העניין, כל עניין מורכב שאתם נתקלים בו – לסיכום קצר (״Elevator pitch״).
היכולת לתמצת נושא ולהעביר אותו בצורה יעילה לאחרים – היא נקודת מפתח ביעילות של פתרון דילמות. לא פעם, נדרש לא מעט אימון – עד שזה נעשה טבעי, ונעשה ברמה גבוהה.
צעד שני: איסוף נתונים משה רבינו לא ירד מהשמיים, על חמור חד-קרן – ויספק לכם פתרון לדילמה. חיכיתי הרבה פעמים – אך זה לא קרה. השלב הבא הוא לאסוף עוד נתונים. זה יכול להיות בקוד / חיפוש בגוגל / במערכות החברה, והרבה מאוד פעמים – זה מאנשים שעובדים אתכם בארגון.
(נ.ב. – מקצועי יותר לחפש בעצמכם מה שתוכלו למצוא בכמה דקות, ולא להטריד אנשים אחרים. אני מניח שאנחנו מעבר לזה).
חשוב להיות יסודיים וספקנים. שיח לדוגמה: ״אני: איך מתמודדים עם פוליסה מוקפאת בשלב ניתוח הסיכונים?״ , ״אדם אחר: פשוט תתעלם מהמצב שלה. לא עושים כלום״.
קיבלתי תשובה!
האם היא מספקת? האם היא רצינית? אם לא אחקור – כנראה שאאלץ לחזור לאותו אדם עוד חצי שעה ולהבין למה בדיוק זה כך? מה ההשלכות? איפה כבר עשו את זה?
נסו להיות יותר כמו עיתונאים חוקרים (בימים הטובים, בה הייתה עיתונות חוקרת, ולא מתלהמת), ופחות כמו מישהו שמבקש סיגריה או אש.
אתם יכולים לעשות בדיקה אחת יסודית, או בדיקה שטחית שתגרור עוד ועוד בדיקות. לרוב בדיקה יסודית אחת תפיק יותר עומק ותובנות – מסדרה של בדיקות קצרות ושטחיות.
צעד שלישי: הצלבת נתונים
דילמות מורכבות הן לא רק תהליך של איסוף ידע, אלא גם של הפרכת ידע. לא פעם אנשים טובים שרוצים לעזור – יתנו לנו מידע חסר או שגוי. בלי כוונה רעה, כמובן.
כאשר יש סתירה במידע שאנחנו אוספים ממקורות שונים (אנשים שונים, מסמכים, קוד וכו׳) – לא פעם אנשים נוטים להעריך שאדם הבכיר יותר /ותיק יותר הוא המקור האמין, ולהעדיף אותו על הסף (״מעולם לא פיטרו מתכנת כי הוא הקשיב למה שה VP אמר״?). זו טעות נפוצה. כל סתירה בנתונים היא פוטנציאל לידע חדש שעוד לא ברשותכם.
הגישה הנכונה היא להצליב מקור עם מקור. למשל, ללכת למפתח הוותיק ולשאול: ״אמרת ש…. אבל במסמך / בקוד / משה – נאמר ש…״. הרבה פעמים מתוך ההצלבות הללו נשיג מידע / עומק חדש על הנושא – שאחרת לא היינו מגיעים אליו.
כמטאפורה, נסו להתנהג כמו בלשים (סרטי בלשים, אתם רואים? הנה אחד טוב): לשאול שאלות קשות, להצליב את מה שהדמויות השונות ספרו לכם על הסיטואציה, למצוא סתירה – ולהבין מהן יותר.
כמובן שמתישהו צריך לעשות ניהול סיכונים ופה ושם להניח שמקורות מסוימים פחות אמינים. אני רואה כל יום אנשים נבונים שמפספסים תובנות חשובות כי הם מניחים שמקור מידע שסותר להם את הדברים – הוא טעות.
אני לא מכיר אתכם אישית, אבל סטטיסטית – אתם כנראה יכולים לעשות את השלב הזה טוב יותר.
—-
עד כה – בסך הכל חידדנו והבנו טוב יותר את הדילמה, ועדיין לא פתרנו אותה.
כמובן שכל הצעדים הם מחזוריים, ואנו עוברים עליהם שוב ושוב:
בשלב הצלבת הנתונים נלמד על מקורות מידע חדשים (כמו שקורה לבלשים) – ונלך אליהם ונתשאל אותם גם.
בירור של סתירות יעלה סתירות נוספות, כמו בלשים – חוזרים לתשאל שוב ושוב – עד שהעניין מובהר.
אחרי שאספנו נתונים והצלבנו אותם – שוב עלינו לזקק ולבאר את התובנות, כדי להמשיך איתם הלאה.
שלב שני: הצעת פתרון לדילמה
אחרי שאספנו מידע, הצלבנו אותו, וזיקקנו אותו – נרצה להתקדם לכיוון הפתרון. דילמות מורכבות דורשות הסכמה / אשרור רחב יותר מה אשר מתרחש בראשו של מהנדס יחיד.
עלינו להבין מי הפורום הנכון לקבל / להיות שותף להחלטה (אני מניח שזה כבר טבעי לנו, בכל זאת: Staff Engineer…) – ולהכין הצעת פתרון לאישור בפורום הזה.
צעד ראשון: גישוש
על הצעד הזה מדלגים בדילמות קלות יחסית – אך הוא נדרש יותר ככל שהדילמה מורכבת יותר.
אם נגיע עם הצעת פתרון לא מספיק מגובשת ובשלה אזי:
כנראה לא נצליח להגיע להחלטה ו/או לא החלטה מספיק טובה.
כנראה נבזבז זמן לאנשים שנכנס לדון בעניין – חוסר יעילות.
אנשי מפתח יעריכו אותנו פחות. ״למה שוב הוא קובע דיון על נושא לא בשל??״
שלב הגישוש הוא פיילוט. אם הפורום הנכון להחלטה כולל 6 אנשים, הגיוני לתפוס, נאמר, שניים מהאנשים הללו ולבדוק איתם את ההצעה שלנו – עוד לפני שמגיעים לפורום המלא.
ככל הנושא פחות ודאי / ברור – עדיף יותר פיילוטים. אם אנו נגשים לשני אנשים, נוכל לגשת אליהם אחד-אחד, מה שיאפשר לנו לבצע כמה תיקונים / שיפורים לפני שנגיע לאדם השני. הבדיקה כמובן יכולה להיות א-סינכרונית (מייל, סלאק) או בפגישה פנים מול פנים.
״כלל ה 51%״ (מתחום הניהול) אומר שלדיון חשוב יש להגיע כאשר רוב המשתתפים בו (51%) מסכימים לרעיון, או לפחות פתוחים באמת לדון בו. להגיע עם החלטה חשובה לפורום בו לא ברור לנו מה סיכויי ההצלחה של ההחלטה לעבור – הוא בזבוז זמן, ואולי ״שריפת הזדמנות״ – שלא תחזור.
אני מניח שהדילמות שאנחנו מנסים להתמודד איתן הן לרוב פחות קרדינליות, עדיין – שווה לזכור את הכלל הזה.
צעד שני: השגת קונצנזוס
זה השלב להגיע להחלטה בנושא:
עלינו להבין מי הפורום הנכון לקבלת ההחלטה.
עלינו להכין את החומר להחלטה: עדיף בכתב, מידע שלם – לאחר שאספנו והצלבנו אותו, ומידע מזוקק – כי באחריותנו להעביר את תמצית הדברים לפורום, ולא לנהל דיון של חוסר-הבנה או מתמשך.
השלב השני נכתב קצר (במיוחד אם לא פתחתם את הקישור לפוסט על ניהול דיונים) – ויש לנו הרגשה של סוף מסלול. הנה נתקלנו בדילמה, חקרנו אותה, והגענו להסכמה – סיימנו בהצלחה!
לא כל-כך מהר! פה הרבה מהנדסים נופלים – ולא בעצם מספקים את מה שמצופה מ Staff Engineer.
צעד ראשון: הידוק וסגירת פינות
לא פעם נושאים מורכבים לא נגמרים בהחלטה אחת:
הרבה פעמים יישארו מהדיון /ההחלטה קצוות פתוחים – והם עתידים ״ליפול בין הכיסאות״ או להישכח – אם לא יאספו וטיפלו בהם.
במהלך המימוש – יצוצו בעיות ודילמות נוספות – אולי חלקן קטן וקל לפתרון, אבל אי מענה עליהם – יכול לשבש את העניין הגדול / החשוב.
האם אתם בטוחים שמה שנאמר הובן ונעשה? אם הנושא גדול – יצפו מכם כנראה לדגום את המקום לאחר זמן, ולוודא שמה שהוחלט ונאמר – גם נעשה.
לומר ש ״הסכמנו ש … וסמכתי על אחרים שהכל יסתדר״ – היא לא תשובה שתמיד מתקבלת בהבנה.
בתור מי שהוביל טיפול בדילמה, יצפו מכם כנראה לוודא שהיא סגורה / Done / Finito / Completo. כמובן שזה מעייף – ויותר נחמד לחזור ״להזרים קוד״ או אפילו לעבור לדילמה הבאה… לא סתם לא כל מהנדס מוכר כ Staff Engineer.
צעד שני: איתור השלב הבא
פתרון של דילמה הוא נהדר, במיוחד אם הפתרון הוא מוצלח, שלם, ומיושם בפועל בצורה מלאה.
זה לא הסוף, עד שענינו ״מה השלב הבא״?
האם יש שלב הבא? עד שלא הובן שאין – נכון להניח שיש. אם יש ״שלב הבא״ (והרבה פעמים יש) – ולא איתרנו וטיפלנו בו, כנראה שלא סגרנו באמת את העניין. למשל:
לתקשר את ההחלטה לגורמים / קבוצות שונות בארגון.
יש מציאות חדשה (למשל: דרך פעולה חדשה של המערכת) – נדרשת הדרכה לגורמים מסוימים בארגון.
הדילמה עיכבה תהליכים מסוימים – שעכשיו הגיע הזמן להניע מחדש.
מקרה קלאסי: דילמה מובילה לעוד דילמה ועוד דילמה. פתרון אחד פתר את הדילמה המסוימת, אבל בצפייה קדימה, אנחנו מבינים שבעצם מעכשיו תהיה דילמה נוספת במקום אחר / לגורם אחר בארגון.
למשל: הפתרון כלל תחילת שימוש במערכת חדשה (למשל: Dynamo DB) – אבל עכשיו יש שאלה איך לגבות / לתפעל את הפתרון? זו לכאורה בעיה של ה Cloud Operations (להלן “DevOps״) – אבל לא באמת סגרנו את הפתרון – עד שטיפלנו גם בדילמה הבאה.
דוגמה נוספת: יצרנו מנגנון מסוים, אבל הוא יקשה על או יש שאלה כיצד ישתלב בתוכניות של צוות מסוים – שמושפע מהשינוי.
לוודא שיש מישהו שיכול ומוכן לטפל בשלב הבא. שהשלב הבא מצא ״בית חם״.
עלינו לבחון ולהבין האם באמת ״זה סוף העניין, ולכולם״.
עד שלא הובהר מעבר לספק סביר שאין ״שלב הבא״ – יש ספק אם סגרנו את העניין בצורה טובה.
סיכום
יש משהו קצת פרדוקסלי בפוסט הזה. מצד אחד: הצעדים בו לכאורה טריוואליים (של ״מה בכך?״). מצד שני: אלו המקומות שבהם מהנדסים רבים (אומר בזהירות: כנראה רוב המהנדסים) ״נופלים״ ולא מצליחים לספק ערך / השפעה – גדולים יותר בארגון.
אני לא יודע לומר עד כמה מקריאת הפוסט הזה – אדם יכול להגיע לתובנות אישיות ובאמת לשדרג את התנהלותו סביב נושאים מורכבים. לא פעם, אנו זקוקים לאדם נוסף (מנהל, Tech Lead) שיציג לנו את הפער – ורק אז אנחנו מסוגלים להפנים ולהתמודד איתו.
[1] המודל אינו קשור לשום ליאפולד. ציירתי את התרשים תוך כדי כתיבת הפוסט, ונתתי לו כותרת מפוצצת במאמץ מעט פתטי לגרום לכם, הקוראים, להתייחס ביתר רצינות – לנושא הבאמת חשוב הזה.
Generative AI נכנס לחיינו בסערה! אם לא בשנתיים האחרונות, אז בחודשים האחרונים, עם Dall-E 2.0 ו ChatGPT שהצליחו גם לחדש, אבל בעיקר להביא את הבשורה וההתקדמויות בתחום – לקהל הרחב. אני בטוח שכבר יש חברות סטארט-אפ שמוסיפות לתיאור שלהן ״Generative AI״ (כי זה עוזר לגייס כסף, ואולי גם עובדים), ואני לא מפסיק לקרוא מאמרים וציוצים – על הכלים הללו.
אני ארשה לעצמי להצטרף לטרנד, ולהוסיף כמה דברים משלי. לא בציוץ – אלא בפורמט הארוך יותר. אני אתחיל ב Dall-E 2.0 (הוותיק מעט יותר, שצברתי איתו כבר יותר ניסיונות), אבל אם הפוסט יהיה מוצלח – אנסה לעשות פוסט דומה גם על ChatGPT. בלי נדר.
רשמים, בתפזורת
Dall-E 2.0 הוא מדהים (!!) – היכולת של תוכנת מחשב ליצור תמונות מלאות דמיון ולא פעם ״בעלות קסם״ או ״סגנון״ הוא מפתיע בעליל. אני זוכר שלמדתי באוניברסיטה (לפני 20 שנה+) קורס בבינה מלאכותית, ונאמר שאמנים הם האחרונים שישרדו את השתלטותה של הבינה המלאכותית. ההנחה שמחשב יתקשה ליצור ״יצירתיות״ – הופרכה, ולאמנים רבים יש מקום לדאגה.
באותה נשימה ניתן לומר שרוב התוצרים של Dall-E 2.0 כרגע הם עדיין לא מספיק איכותיים לשימוש מיידי. מעטים מהם אפשר לקחת ״as-is״ ולשים במגזין או אתר אינטרנט בלי שהקוראים לא יבחינו שמשהו חסר / לא-שלם. העין הביקורתית תזהה בקלות מרחב של פגמים בתמונות ש Dall-E מייצר, החל מאזורים בתמונה שאינם ברורים / נראים שגויים, הצללות לא נכונות, עיוות בפנים אנושיים (בעיקר בעיניים ובשיניים), קושי ביצירת טקסט כתוב, ועוד.
למרות ש Dall-E 2.0 כולל מנגנון להערכת האיכות של התמונות (והוא ירוץ עד שהתמונה תראה לו איכותית מספיק) – הוא עדיין זקוק לבני-אדם שיבררו בין תוצרים המוצלחים והלא מוצלחים שלו, ולעתים אנחנו נדרשים לנסות מספר רב של איטרציות (10 ויותר) עד שנגיע לתוצר משביע-רצון.
מקצוע שהולך ומתפתח הוא ״מתקשרי Dall-E לעולם״: עם קצת התמקצעות וריבוי ניסיונות – ניתן לגרום ל Dall-E ליצור תוצרים איכותיים יותר. נוסיף קצת פוטושופ, ותוכנות משלימות – אפשר להגיע לתוצרים איכותיים. לא נמנע שגרפיקאי אחד המתמחה בשימוש ב Dall-E (וחלופות / כלים משלימים) ושעושה השלמות בתוכנות עריכה (כגון PhotoShop) – יכול להגדיל את הפריון שלו פי 10. להלן 10X Graphic Artists.
אין סימן עדיין ש Dall-E (או כלים מקבילים) התקרב למיצוי. תוך שנה הייתה קפיצה דיי משמעותית ביכולות בין Dall-E 1.0 ל Dall-E 2.0. מה שמשנה הוא לא מהן היכולות של Dall-E 2.0, אלא לאן יגיעו Dall-E 5.0 או Dall-E 7.0. היכן תהיה עצירה ביכולות, וכמה רחוק מיכולות של אמנים זוטרים הן תהיינה (לכיוון א׳, או ב׳). בגזרת הסבלנות / מהירות / עלות – Dall-E כבר ניצח בגדול.
בפן החברתי, התפתחויות ה Generative AI (כמו Dall-E, ChatGPT ואחרים), יגרמו ככל הנראה לסבל רב. ההתפתחויות הן מאוד מהירות, ולא ישאירו זמן מספיק לאנשים בכדי להסתגל. הרבה אנשים אשר מבססים את הערך העצמי ו/או הפרנסה שלהם על ״יצירת תוכן״ – עומדים (כנראה) לאבד הרבה מערכם. מזכיר לי קצת את מה שאיקאה עשתה לנגרים: היא לא העלימה אותם – אבל מה שהיה כבר לא יחזור.
בצד הטכני: Dall-E מבוסס על GPT-3 (התקדמות משמעותית בתחום העיבוד של שפה טבעית) ועל CLIP (מודל של OpenAI שיודע לקשר בין טקסט לתמונות). Dall-E קודם כל מצליח לנתח (בצורה מרשימה ביותר) בעזרת GPT-3 את הטקסט של ה Prompot וההקשרים הלשוניים שלו – ואז למצוא מאגר של תמונות רלוונטיות שהוא חומר הגלם לתמונה שתיוצר. הוא בעצם עושה את הפעולה ההפוכה ל AI שמנסה לתאר במילים תמונה שהזנו לו (קונספט שעובד יפה כבר כמה שנים).
המנגנון של ייצור התמונה מחומרי הגלם שנבחרו, נקרא diffusion (תהליך של הוספת רעש לתמונה עד שהיא מאבדת מהמשמעות שלה, והתהליך ההופכי: הסרת רעש מתמונה עד שהיא מקבלת משמעות). המודל של OpenAI ל difusion נקרא GLIDE. דרך הפעולה של GLIDE היא להרכיב ״בגסות״ את חומרי הגלם בהקשר נכון (ע״פ ההבנה של CLIP) ואז להתחיל להסיר אלמנטים לא-רצויים מהתמונה – עד אשר ניתח התמונה כטקסט – עומד בהגדרות ה Prompt. כמובן שיש פעמים שבה הסרנו יותר מדי – וצריך לחזור לאחור.
Dall-E הוא מרשים, ועורר גלים – אבל הוא לא היחיד. ל Dall-E יש מתחרים ישירים כמו Stable Diffusion או Midjourney. יש גם את Imagen של גוגל, שלא יצא לי לבדוק. בהתרשמות מהירה נראה שלא פעם הם מייצרים תוצרים באיכות גרפית יותר גבוהה מ Dall-E אבל מפספסים יותר במה בהבנת ה Prompt. כלומר: תמונה יפה שהיא לא בדיוק מה שביקשתם.
שווה לציין שמאגר התמונות עליהם הכלים הללו מתבססים הוא תמונות מרחבי האינטרנט, למשל: מקור טוב הוא חשבונות אינסטגרם של אנשים בהם יש תמונות מוצמדות לטקסט. זכויות היוצרים של התמונות שנוצרות ע״י הכלים הללו – עדיין לא הובהר.
ספציפית לגבי השימוש ב Dall-E:
השימוש הבסיסי ב Dall-E הוא הזנת טקסט תיאורי – שיהפוך לתמונה.
Dall-E מגיב טוב יותר לתיאורים מסוג מסוים – מאשר סוג אחר. למשל: כדאי להתחיל עם Prompt כללי – ולהמשיך ולדייק/לפרט אותו בכדי להכווין את הכלי לתוצאה שאנו רוצים. Dall-E מכיר סגנונות אומנותיים ושמות של אמנים – ומגיב אליהם היטב. Dall-E מגיב, למשל, לטקסט ״4K״ – כרמז שרוצים תמונה יותר מפורטת. ה Dall-E-2 Prompt book מכיל עצות ודוגמאות הרבה מעבר למה שאוכל לספק בפוסט זה.
אם אנחנו בסה״כ אוהבים תמונה שנוצרה, אבל פרט מסוים מפריע לנו – יש אפשרות ב Dall-E ללחוץ על Edit ולמחוק את החלק שלא נראה לנו – ולתת לנסות ל Dall-E ליצור את האזור הבעייתי מחדש.
הנה תמונה מגניבה, אבל בעצם אני רוצה שלדמות יהיה שפם – זה ממש חסר! איך אני יכול להמשיך, בלי לאבד את התמונה המוצלחת שהשגתי עד כה?
נלחץ על כפתור העריכה.
נמחוק את אזור הפה, האזור שבו אנחנו רוצים Re-Generation ונעדכן את ה Prompt שיכיל גם שפם ענק. Dall-E זקוק ל prompt הקודם / המלא – בכדי להמשיך להבין את ההקשר המלא של התמונה. נלחץ על Generate.
הנה התוצאה: התמונה נשמרה – והשפם לתפארת.
את הדוגמה לקחתי מתוך המאמר הזה – שדוגמה שלו יצאה יותר מוצלחת מכמה דוגמאות שאני ניסיתי. הוא מציג גם שינויי סגנון, ועוד.
את אותו העקרון, של שלמת תמונה ע״פ תיאור – ניתן לעשות גם על תמונה שלכם. נניח צילום שלכם במקום שעבר רכב או סתם חלק בתמונה שמוצל מדי / לא בפוקוס. אתם יכולים להעלות את התמונה ל Dall-E (יש לינק של Upload), למחוק את החלק שאינכם רוצים, לתאר את הסצנה – ולתת ל Dall-E לעבוד ולהשלים את החסר. לפעמים זה לוקח מספר ניסיונות – אבל Dall-E יכול לעשות עבודה לא רעה בכלל.
עוד אופציה מעניינת של Dall-E נקראת Variations – היכולת לקחת תמונה, לזהות לבד את האלמנטים בה, והסגנון שלה – וליצור תמונה אחרת, עם אותם אלמנטים ובאותו הסגנון.
כדי שהפיצ׳ר יעבוד, יהיה עליכם לעשות crop לתמונה ליחס ריבועי. Dall-E עובד על תמונות ריבועיות.
הנה תמונת נוף שלקחתי מגוגל, וביקשתי מ Dall-E שיעשה לה וריאציות (המקור משמאל). אתם יכולים לראות שהאלמנטים והסגנון – נשמרו, בעוד הקומפוזיציה והפרטים – שונים במידה ניכרת. רמת הפרטים אמנם נפגעה – אזור ש Dall-E פחות מוצלח בו, אלא אם מדובר בטקסטורה שהוא מצליח לאפיין בדיוק (בד מסוים, זיפים של זקן, וכו׳) ויש לו דוגמאות רבות שלו ברמת פירוט גבוהה.
כבר ציינתי ש Dall-E לא מוצלח כ״כ בציור של פנים אנושיות, ונוטה לעוות עיניים ושיניים. בחרתי תוצר טוב מהממוצע של Dall-E (הקלט היה ״an engineer excited by a new technology, realistic״) אבל שעדיין יש בו עיוותים שמפריעים (הגדילו את התמונה בכדי לראות בבירור. ברזולוציה נמוכה – הכל נראה טוב יותר).
התוצאה מימין היא שיקום שלי כלי בשם GFPGAN (נדרש GitHub Login) – מודל שנבנה לשיקום תמונות ישנות, אך עושה עבודה מצוינת עם AI Generated Images.
חדי העין יבחינו שאבדו פרטים / חדות בתמונה. ניתן לפתור את זה עם masking של photoshop – בו נאחד לתמונת המקור רק את השיניים / עיניים – מהתוצר של GFPGAN.
אתם יכולים להשתמש ב Dall-E להרחיב תמונה: לקחת תמונה ולהוסיף לה חלל לבן, לתאר את הסצנה – ולתת לדאלי להמשיך ולחבר לתמונה עוד חלקים שמעולם לא היו בה. חשוב שהשטח הלבן לא יהיה גדול מדי – אחרת Dall-E עלול לאבד את הסגנון. כלומר: התוצאה הטובה ביותר היא כאשר ההרחבה נעשית כסדרה של הרחבות קטנות. התוצאות – מרשימות מאוד.
אני כבר גמרתי את הקרדיט שלי ב Dall-E תוך כדי כתיבת הפוסט. הדוגמה הזו היא מהאתר של OpenAI.
סיכום
Generative AI הוא כאן בכדי להישאר, ולהשפיע על העולם. כרגע השימוש העיקרי הוא התלהבות, אבל באופן טבעי – השימושים הפרקטיים והאינטגרציות – הם השלב הבא. ChatGPT בבינג, או בתוך אופיס? – הגיוני ביותר. קצת עזרה לנסח מצגת סיכום בלחיצת כפתור – יכולה לעזור. אתם יכולים כבר עכשיו לנסות את ChatGPT for Google (עד שיחסמו אותו) .
Dall-E כפילטר בפוטושופ? להשלמת תוכן / חיפוש וריאציות של תוכן? – טבעי ושימושי.
Generative AI של מדיה נוספות? אודיו? – הנה דמו מרשים של VAll-E. שימוש מעשי: דיבוב למשחקי מחשב, Audio Books. יהיו עוד.
הנה סצנה ממשחק מחשב ש generated ע״י stable diffusion. נראה שהמודל של Diffusion יהיה מוצלח ביצירת אנימציות – ולא רק תוכן סטטי. משחקי אינדי, שעד עתה לא יכלו להעסיק גרפיקאים / אנימטורים / אנשי סאונד – הם פלח השוק הטבעי שיתחיל להפעיל טכנולוגיות Generative AI לא מושלמות – בכדי להתחיל ולצמצם פערים עם האולפנים הגדולים.
אני בכלל מחכה לסרט באורך מלא, עלילה, תמונה, וקול – שיוצר בעזרת Generatrive AI. אני מניח שזה רק עניין של זמן עד שנוכל לצפות במשהו לא-מביך (שזה יותר טוב מכמה סרטים, מעשי אדם, שהם ממש מביכים). כמובן שתהיה יד מכוונת אנושית, אבל האופציה ליצור סרט בעשירית הצוות – הופכת לממשית.
היכן זה ייעצר? פיסול (בעזרת מדפסת תלת-מימד)? בלוגים ממונים (נשמע דיי קרוב לקרות)? אדריכלות? כתיבת קוד (יש עוד זמן…)? מה עוד?
כרגע נראה, שבהיפוך גמור להצהרות שהיו בקורס בינה מלאכותית, שלקחתי לפני 20 שנה – מנהלי החשבונות עומדים להיות השורדים האחרונים.