הטכנולוגיה של cutty.dev — בחירות מודעות
מה נמצא מתחת לפני השטח של cutty.dev ולמה. בלי מטיפות דת — פילוסופיה: סטק משעמם ויציב, אירוח באיחוד האירופי ופרטיות המוטמעת בארכיטקטורה שאדם אחד מסוגל לתחזק.
רוב הפוסטים של "my tech stack" הם רשימה גאה של חידושים. תראה, יש לי את זה, יש לי את ההוא, והנה ספרייה ממש טרייה משבוע שעבר. הזה יהיה שונה.
כי האמת היא שכשאתה מנהל פרויקט לבד, אתה לא מחפש את הכי אופנתי. אתה מחפש משהו שלא יעיר אותך בשלוש לפנות בבוקר. וזה בדיוק כל ערימת הטכנולוגיה (stack) של cutty.dev: משעמם במקום אופנתי, אירופאי במקום אמריקאי, פרטי מהיסודות, ופשוט מספיק כדי שזוג ידיים אחד יוכל להסתדר איתו.
אני הולך על זה לפי הסדר, כאילו אני מסביר לך את זה תוך כדי קפה.
Astro מרונדר בשרת (ולמה לא משהו "מגניב יותר")
cutty.dev הוא Astro עם רינדור בצד השרת (SSR). כל בקשה עוברת דרך השרת, מרכיבה את הדף ושולחת חזרה HTML מוכן. משעמם? בדיוק בזה העניין.
רציתי שלושה דברים: רינדור בשרת ללא מנגנונים כבדים, תמיכה טובה בשפות רבות באופן מיידי, ומהירות ללא תוספת עומס. Astro מספקת את כל זה, והקוד נשאר קריא. כשאני חוזר אליה אחרי הפסקה של חודשיים, אני יודע מה קורה שם. בפרויקט סולו, זה שווה יותר מכל תוסף אופנתי שאחרי שנה כבר אף אחד לא תומך בו.
קובץ אחד במקום בסיס נתונים עם זיקוקים
SQLite. בסיס נתונים אחד, קובץ אחד על הדיסק. בנוסף שכבת שאילתות שמדברת עם TypeScript, כך שכששינוי במבנה הנתונים יקרה, השגיאה תקפוץ לי בעורך, ולא בייצור בחצות.
למה דווקא זה? cutty הוא "read-heavy". מישהו לוחץ על קישור מקוצר, אנחנו מבצעים קריאה ומעלים את המונה. זה הכל. SQLite מתמודדת עם תעבורה כזו בקלות, עד למספרים גדולים מאוד ביום. וגיבוי? פשוט מעתיקים את הקובץ. נגמר. בלי טקסים של רפליקציה, בלי סקריפטים שאף אחד לא זוכר איך הם עובדים.
כאן כדאי להיזהר מדבר אחד, כי זו מלכודת נפוצה: אנשים שומעים "SQLite" וחושבים "צעצוע לפרויקט סטודנטים". זה לא נכון. פחות חלקים נעים פירושו פחות דברים שיכולים להתפרק. זה לא חיסכון באיכות, זו החלטה מודעת.
השרת נמצא באירופה וזה לא מקרה
שרת ייעודי באיחוד האירופי. TLS משלך, reverse proxy עם HTTPS אוטומטי, אפליקציה בתוך קונטיינרים.
זהו הבסיס לאופן שבו cutty מתמודדת עם נתונים. אני יודע בדיוק איפה הם נמצאים פיזית (אצל לקוחות באיחוד האירופי וב-GDPR זה לא רק עניין מעניין, אלא תנאי), אני לא כבול לספק אחד, שום דבר לא דולף אוטומטית מעבר לאוקיינוס, והעלות היא צפויה במקום לקפוץ יחד עם התנועה.
כן, פלטפורמות נוחות מהמערב היו נותנות התחלה מהירה יותר. לוחצים, deploy, עובד. רק שמשלמים על זה במקום שבו נתונים המשתמשים שלך נוחתים. עבורי זה היה עסקה גרועה.
תרגומים עושה מודל משלו, אצלו בעצמו
cutty מדבר 25 שפות. זה מתורגם על ידי מודל AI מקומי ופתוח, שרץ על התשתית שלי. אני לא שולח טקסט מהממשק לאף ספק חיצוני.
היתרונות הם פרקטיים. תרגום בודד עולה אפס. יש לי שליטה מלאה על האיכות ואני יכול לרענן אותם מתי שאני רוצה. ובנוסף, מכונה תמיד זקוקה לעין אנושית, כך שכל אחד מ-25 השפות הללו עבר בדיקה. אך העובדה שאני עושה זאת אצלי, פירושה שהפרטיות אינה סעיף במחירון. היא תכונה של האופן שבו הכל בנוי.
Tailwind, קונטיינרים וכמה החלטות קטנות יותר
סגנון? Utility-first, כלומר Tailwind. בלי CSS-in-JS, בלי קבצי עיצוב נפרדים, הכל ישירות בתבניות. אני לא מבזבז זמן על המצאת שמות למחלקות, סגנונות שלא נעשה בהם שימוש ממילא לא מגיעים לדף הסופי, והעיצוב נשאר עקבי כי המערכת עצמה מחייבת זאת. עבור אדם אחד, כל דקה שלא מתבזבזת על שטויות היא קריטית.
הפריסה הזו היא Docker. אותה סביבה מקומית ובסביבת הייצור, סוף ל-"אצלי זה עבד". ואם אי פעם יהיה צורך, אני מעביר את הכל לשרת אחר תוך בערך חצי שעה. ניידות היא בצורה שקטה סוג של עצמאות.
מה למדתי מזה
סטאק משעמם מנצח. Astro, SQLite, Tailwind, קונטיינרים. הכל בשל, מוכר ומתועד. שום דבר לא נשבר ברגע שבו הכי פחות צריך זאת.
אירוח ב-EU מוכן לייצור, באמת. האגדה ש"אתה חייב ללכת לענן האמריקאי הגדול כדי שזה יהיה רציני", היא אגדה. גם AI מקומי הוא מציאותי, אין צורך למסור נתונים ל-API חיצוני כדי לקבל תרגומים סבירים. והדבר האחרון: אדם אחד יכול להוציא משהו שנראה כמו עבודה של צוות שלם. רק צריך לזכור שהזמן יקר יותר מכסף, ובהקשר הזה לבחור כל רכיב בקפידה.
כשאתה בונה משהו משלך, שאל את עצמך שאלה אחת לגבי כל טכנולוגיה: האם בעוד שנה אדע לתחזק זאת לבד? אם לא, כנראה שיש לך את התשובה.
הכל עובד כאן: cutty.dev. ואם תרצה לשוחח על אחת מההחלטות הללו, כתוב ל-[email protected], אני עונה באותו היום.