אינטגרציה של Sharp (Node.js) לעיבוד תמונות בצד השרת

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

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
אינטגרציה של Sharp (Node.js) לעיבוד תמונות בצד השרת
בינוני
מ- 1 יום עד 3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

עיבוד תמונות בצד השרת ב-Node.js: היכן זה נשבר

עיבוד סינכרוני של תמונות ב-thread הראשי הוא צוואר בקבוק קלאסי בטעינת תמונות ב-Node.js. כל עוד הקוד מבצע resize או המרת פורמט לקובץ, ה-event loop נחסם: שאר הבקשות ממתינות בתור, ותחת עומס זמן התגובה צונח מעשרות מילישניות לשניות. הראשון שמבחין בכך אינו המפתח אלא המשתמש — הגלריה "נתקעת", וטעינת אווטאר מאטה את כל הממשק.

הסיבה טמונה באופי הפלטפורמה: Node.js מריץ JavaScript ב-thread אחד, ופעולות כבדות על פיקסלים הן עומס CPU טהור. ספריות שמבצעות resize "בכוח" ב-JS טהור מחמירות את המצב: הן תופסות את ה-thread על כל תמונה ולא מחזירות שליטה עד שהן מסיימות. ככל שמקור התמונה גדול יותר וככל שיש יותר העלאות במקביל, כך התור ארוך יותר והצניחה מורגשת יותר.

Sharp node.js פותר זאת אחרת. זוהי עטיפה מעל מנוע עיבוד תמונות נייטיבי: העבודה יוצאת מה-thread הראשי, ובפנים נעשה שימוש ב-worker threads ובבאפרים יעילים. בפועל המשמעות היא שהשרת מעבד תמונה בשרת מבלי לחסום את ה-event loop, וממשיך לקבל בקשות. זמן התגובה נשאר יציב, גם כאשר עשרות קבצים מגיעים בו-זמנית.

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

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

מה נותן אינטגרציה של Sharp לעיבוד בצד השרת

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

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

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

השפעות מדידות שאנו מתעדים בהטמעות:

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

בנפרד אנו מטפלים במלכודות הטיפוסיות: עבודה נכונה עם זרמים (streams) במקום קריאת הקובץ כולו לזיכרון, הגבלת מקביליות כדי שהעיבוד לא יאכל את כל הליבות, מטמון (cache) של מידות מוכנות כדי שבקשות חוזרות לא יפעילו מחדש את שינוי הגודל. זה בדיוק ההבדל בין "הספרייה מחוברת" לבין "עיבוד התמונות הפסיק להיות בעיה".

מצבי עיבוד: בזמן אמת, ברקע, בשלב ההעלאה

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

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

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

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

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

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

כיצד אנו מטמיעים את Sharp בשירות קיים

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

כיצד בנוי התהליך

  1. סקירת קוד וצינור העיבוד הנוכחי. אנו בוחנים היכן נוצרות התמונות, אילו פורמטים מגיעים מהמשתמשים, מה נשמר במטמון ומה נבנה מחדש בכל בקשה. אנו מזהים את הנקודות שבהן העיבוד חוסם את התגובה ללקוח.
  2. תרשים הצינור. אנו מתכננים את הזרימה: קליטת קובץ, אימות, שינוי גודל, המרת פורמט, דחיסה, כתיבה לאחסון. אנו קובעים מה מבוצע באופן סינכרוני ומה עובר לתור ברקע.
  3. הגדרת העיבוד. אנו בוחרים פרמטרים לשינוי גודל, איכות דחיסה ופורמטי פלט בהתאם לתרחישים אמיתיים: תצוגה מקדימה בקטלוג, כרטיס מוצר, החזרה בגודל מלא. אנו מגדירים מטמון כך שבקשות חוזרות לא יפעילו את העיבוד מחדש.
  4. בדיקת עומס. אנו מריצים את הצינור בזרימה הקרובה לזו של סביבת הייצור: העלאות במקביל, מקורות גדולים, קפיצות שיא. אנו בוחנים צריכת זיכרון וזמן תגובה תחת עומס, ולא על קובץ בודד.
  5. טיפול בשגיאות ונסיגה. אנו בודקים את ההתנהגות עם קבצים פגומים, פורמטים לא נתמכים והפסקות בהעלאה. אנו מוודאים שכשל בעיבוד אינו מפיל את השירות ואינו חוסם בקשות אחרות.
  6. פריסה ומעקב. אנו פורסים בשלבים, עוקבים אחר מדדי זמן תגובה ושיעור שגיאות. אנו שומרים על היכולת לחזור לתרשים הקודם ללא השבתה.
  7. מסירת הפתרון. אנו מעבירים לצוות את הצינור המוגדר, את תרשים הזרימה ואת כללי התפעול: כיצד לשנות פרמטרים, היכן לצפות בלוגים, מה לעשות בעת ירידה בביצועים.

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

תצורה וארטיפקטים: מה נשאר בפרויקט

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

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

כל האמור נשמר במאגר שלכם ואינו תלוי בצוות שלנו: אתם יכולים לפתח את המודול בכוחות עצמכם או להעביר אותו לקבלן אחר. אם צריך — תארו את המשימה, נחזור עם הערכה ותוכנית לקונ�вейер שלכם.

מקרה בוחן: איך הסרנו את ירידת זמן התגובה בטעינת תמונות

הפרויקט — מרקטפלייס עם מודעות, שבו כל כרטיס מושך 8–12 תמונות משתמש. העיבוד התבצע בזמן הבקשה: מקורות עד 12 MB עברו שינוי גודל תוך כדי, ה-workers נתקלו במעבד, ותחת עומס זמן התגובה של עמוד הקטלוג עלה ל-4–6 שניות. בשיאי העומס חלק מהבקשות נפלו עקב timeout, ותור המשימות לעיבוד הצטבר מהר יותר משהתפנה.

מה שינינו

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

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

מדדים לפני ואחרי

מדד לפני אחרי
זמן תגובה של הקטלוג (אחוזון 95) 4–6 ש' 0,6–0,9 ש'
תפוקת עיבוד ~40 תמונות/ש' ~600 תמונות/ש'
שיעור בקשות עם timeout בשיא 7–9% מתחת ל-0,3%
גודל תצוגה מקדימה נשלחת 1,8–2,5 MB 90–160 KB

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

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

במה שונה Sharp מספריות אחרות לעיבוד תמונות?

Sharp מנצחת לא בזכות "קסם" של אלגוריתמים, אלא בזכות הארכיטקטורה: הספרייה כתובה ב-C++ מעל libvips, ושכבת ה-JavaScript היא עטיפה דקה.

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

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

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

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

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

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

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

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

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

ספקות טכניים בעת הטמעת Sharp node.js

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

האם Sharp תואם לגרסת Node.js שלנו ולפריימוורק הנוכחי?

כן, אם הריצה היא על ענף LTS עדכני של Node.js ולא על מהדורה מיושנת. Sharp מותקן כתלות רגילה ועובד גם ב-Express, גם ב-Fastify וגם ב-NestJS — ברמת הפריימוורק אין קונפליקט.

הניואנס היחיד הוא בינאריים מקוריים: ב-Linux, macOS ו-Windows הם שונים, ולכן הבנייה בקונטיינר ובמכונת המפתח חייבת להתבצע על אותה פלטפורמה. אם יש לכם סביבה לא סטנדרטית (אימג' אלפיני, שרתי ARM), זה נפתר בשלב ההגדרה ולא בשכתוב הקוד.

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

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

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

אילו פורמטים נתמכים והאם יש מגבלות?

נתמכים JPEG, PNG, WebP, AVIF, TIFF, GIF ו-SVG בקלט. בפלט — אותם פורמטים בתוספת פורמטים דחוסים מודרניים. המגבלה אחת: GIF ו-SVG מונפשים דורשים הגדרה נפרדת ולא "פשוט עובדים". עבור מקורות גדולים יש טעם להגביל את גודל הקלט, כדי שתמונה ענקית אחת לא תאכל את זיכרון התהליך.

כיצד Sharp מתנהג תחת עומס?

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

נדון במשימה שלך לעיבוד תמונות

כדי לחזור עם הערכה ותוכנית, ולא עם מילים כלליות, אנחנו צריכים הקשר טכני קצר על המשימה שלך. תאר אותה בצורה חופשית — בהמשך המהנדסים שלנו ישאלו שאלות הבהרה ויציעו תוכנית להטמעת Sharp בשירות שלך ב-Node.js.

מה שמועיל לציין מיד:

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

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