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

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

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

מהשעה הבאה לכל היום היהודי

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

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

ואז השעון הרים את היד

בניתי גרסה יציבה מספיק לאייפון. אז כמובן שה Apple Watch היה ההמשך הטבעי: אם זמני היום תלויים בזמן, למה שלא יהיו על פרק היד, היכן שתמיד הם היו. אבל „להציג זמנים על השעון” נשמע פשוט רק לפני שמתחילים לכתוב את הקוד. נוספו "קומפליקציות" שזה בעברית "תוספי מסך" או ווידג'טים קטנים לתצוגות השונות ללוח השעון שמראה את התאריך העברי, הזמן הבא ופרשת השבוע. ובלחיצה, יופיעו גם לימוד יומי לפי הלוח, הלכה יומית, בחירת פונט וכמובן תמיכה בהתקנה עצמאית — כדי שהאפליקציה תוכל להופיע בחנות של השעון ולא להיות תלויה בהתקנה על האייפון.

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

הטלוויזיה הצטרפה, כי למה לעצור במוצרים ניידים?

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

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

לייט או פרימיום

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

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

הבאגים כתבו חלק מהעלילה

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

ברגע מסוים ה X Code הציג 119 שגיאות שנראו כמו סוף העולם ושהכל נדפק. אבל התבררו רק כדרך דרמטית לומר „נגמר המקום בדיסק”. או כאשר ספריית חישוב הזמנים Hebcal (קישור כקרדיט 🙂 תודה לכם!) נעלמה שוב ושוב אחרי ניקוי מטמון, עד שהעברנו אותה – ואת SunCalc לתוך הפרויקט כתלויות מקומיות ולא חיצוניות. מאז הן אינן תלויות במצב הרוח של הרשת או של DerivedData.

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

גם השיחה עצמה הפכה לכלי פיתוח

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

אך גם לשיטת העבודה הזו היו גבולות פיזיים. שיחת הפרויקט באופןו מוזר גדלה כל כך, שבשלב מסוים עצם פתיחתה כמעט הפכה לפיצ׳ר הרסני למחשב. בכל זאת, אני עובד על מחשב יחסית חלש: מק מיני M1 מודל 2020, עם 8 גיגה ראם בלבד, שאמנם רוב הזמן מתפקד ממש סבבה מבחינת ריצה ולא עיכב אותי או את הקודקס בעבודה עד ש… הצ'ט עצמו היה יותר מדי בשבילו. לכן עברנו לצ'ט חדש, הגבלנו את כמות הפרוצדורות הפתוחות והמשכנו מאותה נקודה — סוג של ניהול זיכרון, רק לבני אדם ולבינה מלאכותית יחד. זו הייתה תזכורת טובה שגם כלי שמסייע לפתח מוצר צריך בעצמו תהליך עבודה מסודר. לאחר שהשלמנו את הפיתוח לגרסה יציבה – חזרתי לאותה השיחה ביררתי מדוע זה קרה ו״תיקנו״ אותה על ידי צמצום דרמטי של קבצי JASON עם ערכים שמשום מה השתכפלו בכל בקשה לגישה למקטע בשיחה, מה שגרם לניפוח הגודל שלה.

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

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

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

מה נשאר אחרי כל הבילדים

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

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

 

להורדת „זמנים יהודיים” ולפרטים נוספים:

 https://yonish.net/JewishZmanimApp/

דילוג לתוכן