رفتن به محتوا
cutty.dev
All posts

پشته تکنولوژی cutty.dev — انتخاب‌های آگاهانه

چه چیزی زیر لایه‌های cutty.dev قرار دارد و چرا؟ بدون تبلیغات اغراق‌آمیز — فلسفه: یک استک (stack) خسته‌کننده و پایدار، میزبانی در اتحادیه اروپا و حریم خصوصی که در معماری سیستم گنجانده شده است؛ سیستمی که یک نفر قادر به نگهداری آن باشد.

بیشتر نوشته‌های «مجموعه تکنولوژی من» لیستی مغرورانه از نوآوری‌ها هستند. ببین، من این را دارم، آن را هم دارم، و اینجا هم یک کتابخانه کاملاً تازه از هفته گذشته است. این یکی متفاوت خواهد بود.

چون حقیقت این است که وقتی پروژه‌ای را به تنهایی مدیریت می‌کنید، به دنبال ترندترین تکنولوژی نیستید. شما به دنبال چیزی هستید که شما را ساعت سه صبح از خواب بیدار نکند. و تمام این پشته تکنولوژی (tech stack) در cutty.dev دقیقاً همین است: کسل‌کننده به جای مد روز، اروپایی به جای آمریکایی، خصوصی از همان پایه، و آنقدر ساده که یک نفر بتواند از پس آن بربیاید.

من مرحله به مرحله پیش می‌روم، انگار که دارم این را در حین نوشیدن قهوه برایت توضیح می‌دهم.

Astro رندر شده در سمت سرور (و چرا نه چیز «جالب‌تر»)

cutty.dev یک Astro با رندرینگ سمت سرور است. هر درخواست از طریق سرور عبور می‌کند، صفحه را می‌سازد و HTML آماده را بازمی‌گرداند. خسته‌کننده است؟ دقیقاً هدف همین است.

من سه چیز می‌خواستم: رندرینگ در سمت سرور بدون ماشین‌آلات سنگین، پشتیبانی مناسب از چندین زبان به صورت آماده، و سرعت بدون سربار. Astro همه این‌ها را ارائه می‌دهد و کد نیز خوانا باقی می‌ماند. وقتی پس از دو ماه وقفه به آن برمی‌گردم، می‌دانم چه اتفاقی در آنجا می‌افتد. در پروژه‌های انفرادی، این ارزش بیشتری نسبت به هر افزونه مد روز دارد که پس از یک سال دیگر هیچ‌کس از آن پشتیبانی نمی‌کند.

یک فایل به جای پایگاه داده با آتش‌بازی

SQLite. یک پایگاه داده، یک فایل روی دیسک. به علاوه یک لایه پرس‌وجو که با TypeScript صحبت می‌کند، بنابراین اگر ساختار داده را تغییر دهم، خطا در ادیتور به من نمایش داده می‌شود، نه در محیط تولید (production) در نیمه‌شب.

چرا دقیقاً این؟ cutty "read-heavy" است. کسی روی لینک کوتاه شده کلیک می‌کند، ما یک خواندن انجام می‌دهیم و شمارنده را بالا می‌بریم. همین. SQLite به راحتی چنین ترافیکی را، تا اعداد واقعاً بزرگ در روز، مدیریت می‌کند. و بک‌آپ؟ فایل را کپی می‌کنید. تمام. بدون تشریفات replication، بدون اسکریپت‌هایی که هیچ‌کس یادش نیست چطور کار می‌کنند.

در اینجا باید مراقب یک نکته باشید، زیرا این یک تله رایج است: مردم کلمه "SQLite" را می‌شنوند و فکر می‌کنند "یک اسباب‌بازی برای پروژه‌های درسی". این درست نیست. قطعات متحرک کمتر به معنای چیزهای کمتری است که ممکن است از هم بپاشند. این صرفه‌جویی در کیفیت نیست، بلکه یک تصمیم آگاهانه است.

سرور در اروپا قرار دارد و این تصادفی نیست

سرور اختصاصی در اتحادیه اروپا. TLS اختصاصی، ریورس پروکسی با HTTPS خودکار، اپلیکیشن در کانتینرها.

این زیربنای نحوه برخورد cutty با داده‌ها است. من دقیقاً می‌دانم آن‌ها فیزیکی کجا قرار دارند (در مورد مشتریان اتحادیه اروپا و GDPR، این یک نکته جالب نیست، بلکه یک شرط است)، من به یک ارائه‌دهنده واحد وابسته نیستم، هیچ چیز به‌طور خودکار به آن سوی اقیانوس نشت نمی‌کند، و هزینه‌ها به جای نوسان همراه با ترافیک، قابل پیش‌بینی هستند.

بله، پلتفرم‌های راحتِ غرب شروع سریع‌تری را فراهم می‌کردند. کلیک می‌کنی، deploy، کار می‌کند. فقط مسئله اینجاست که بهای آن را با جایی که داده‌های کاربران شما در آن قرار می‌گیرند، می‌پردازید. برای من، این یک معامله بد بود.

ترجمه‌ها مدل خود را می‌سازد، نزد خود

cutty به ۲۵ زبان صحبت می‌کند. این کار توسط یک مدل هوش مصنوعی محلی و متن‌باز انجام می‌شود که روی زیرساخت من اجرا می‌گردد. من متن را از رابط کاربری به هیچ ارائه‌دهنده خارجی ارسال نمی‌کنم.

مزایا کاربردی هستند. ترجمه تک‌مرحله‌ای هزینه‌ای ندارد. من کنترل کامل بر کیفیت دارم و می‌توانم هر زمان که بخواهم آن‌ها را به‌روزرسانی کنم. و اینکه ماشین همیشه به چشم انسان نیاز دارد، بنابراین هر یک از این ۲۵ زبان بازبینی شده‌اند. اما این واقعیت که من این کار را در محیط خودم انجام می‌دهم، به این معناست که حریم خصوصی یک ردیف در لیست قیمت نیست؛ بلکه ویژگیِ نحوه ساخت کل این سیستم است.

Tailwind، کانتینرها و چند تصمیم کوچک‌تر

استایل؟ اولویت با کاربرد (Utility-first)، یعنی Tailwind. بدون CSS-in-JS، بدون فایل‌های جداگانه برای استایل‌ها، همه چیز مستقیماً در قالب‌ها. من وقتم را برای ابداع نام کلاس‌ها تلف نمی‌کنم؛ استایل‌های استفاده نشده هم که به صفحه نهایی نمی‌روند، و طراحی هم منسجم باقی می‌ماند چون خودِ این سیستم آن را تحمیل می‌کند. برای یک نفر، هر دقیقه‌ای که برای مسائل بی‌اهمیت هدر نرود، ارزشمند است.

این است یک Docker. همان محیط در سیستم محلی و در تولید، پایانِ «روی سیستم من کار می‌کرد». و اگر زمانی لازم باشد، کل آن را در حدود نیم ساعت به سرور دیگری منتقل می‌کنم. قابلیت جابه‌جایی، شکلی پنهان از استقلال است.

چه چیزی از این آموختم

یک استک خسته‌کننده برنده می‌شود. Astro، SQLite، Tailwind، کانتینرها. همه چیز بالغ، امتحان‌شده و مستند شده است. هیچ‌چیز در لحظه‌ای که کمترین نیاز را به آن دارید، از کار نمی‌افتد.

میزبانی در اتحادیه اروپا واقعاً برای تولید آماده است. این که «باید به سراغ ابر بزرگ آمریکایی بروید تا کار جدی باشد»، فقط یک افسانه است. هوش مصنوعی محلی نیز واقعی است، نیازی نیست داده‌ها را به یک API خارجی بسپارید تا ترجمه‌های مناسب داشته باشید. و آخرین نکته: یک نفر می‌تواند چیزی منتشر کند که شبیه کار یک تیم کامل به نظر برسد. فقط باید به یاد داشت که زمان گران‌تر از پول است، و از این نظر باید هر قطعه را انتخاب کرد.

وقتی در حال ساختن چیزی برای خودتان هستید، هنگام کار با هر فناوری این یک سوال را از خود بپرسید: آیا یک سال دیگر می‌توانم خودم آن را نگهداری کنم؟ اگر نه، احتمالا پاسخ را می‌دانید.

همه این‌ها اینجا کار می‌کند: cutty.dev. و اگر می‌خواهید درباره هر یک از این تصمیمات صحبت کنید، به [email protected] ایمیل بزنید، من همان روز پاسخ می‌دهم.