خطا پیش از شما پیدا میشود
هر تغییر، پیش از آنکه به دست کسی برسد، از یک مسیر بررسی خودکار رد میشود. چیزی که آنجا گیر بیفتد، هیچوقت به شما نمیرسد.
در حال بارگذاری…
مهندسی
هر انتخاب به دلیلی انجام شده که از مُد روز بیشتر عمر میکند: پشتیبانی بلندمدت، جامعهٔ کاربریای بهاندازهٔ کافی بزرگ که بشود نیروی متخصص پیدا کرد، و رفتار قابل پیشبینی زیر بار.
توجیه کردن یک انتخاب فنی بعد از انجام کار آسان است و برگرداندنش گران. به همین دلیل هر مورد در این صفحه به یک شکل نوشته شده: چیست، دقیقاً چه چیزی به شما میدهد، و از کجا به بعد دیگر کمکی نمیکند. اگر راهکار سادهتری همان کار را انجام بدهد، همان را پیشنهاد میکنیم؛ حتی اگر پروژه برای ما کوچکتر شود.
کیفیت
بیشتر هزینهٔ یک نرمافزار بعد از تحویل پرداخت میشود؛ بابت چیزهایی که موقع ساخت کسی به آنها فکر نکرده بود. بالای هر ادعا نشان دادهایم که در عمل چطور انجام میشود.
هر تغییر، پیش از آنکه به دست کسی برسد، از یک مسیر بررسی خودکار رد میشود. چیزی که آنجا گیر بیفتد، هیچوقت به شما نمیرسد.
اگر کارمندتان برای استفاده از یک صفحه به راهنما نیاز داشته باشد، آن صفحه هنوز تمام نشده. در هر صفحه یک کار اصلی هست، و جلوی چشم است.
اگر باز شدن صفحه چهار ثانیه طول بکشد، بیشتر آدمها پیش از دیدن بقیهاش آن را میبندند. برای همین صفحهها آماده به دست کاربر میرسند.
جداسازی دسترسی در پایینترین لایه انجام میشود، نه در یک صفحه. یک اشتباه در یک صفحه نمیتواند اطلاعات کسی را به دیگری نشان بدهد.
کدِ پشت این چهار ادعا
روی هر کدام از این چهار ادعا بزنید تا کدی که واقعاً آن کار را انجام میدهد ببینید — مستقیم از همین مخزن کد، با نام فایل و شمارهٔ خط. بالای هر کد یک توضیح ساده هست که میگوید دارید به چه چیزی نگاه میکنید، پس برای بررسی ادعا لازم نیست کد بلد باشید.
همان چهار ادعای بالا — یکی را انتخاب کنید:
یک تعریف از سطر، که هم کوئریای که آن را میخواند، هم تابع سمت سروری که آن را مینویسد و هم فرمی که ویرایشش میکند، همه از همان استفاده میکنند. نام یک ستون را عوض کنید و همهٔ جاهایی که باید تغییر کنند، پیش از اجرای کد فهرست میشوند — و این تفاوتِ شکستن Build با شکستن یک صفحهٔ زنده است.
export type Profile = { id: string; role: Role; email: string; full_name: string | null; company: string | null; phone: string | null; locale: Locale; /** Panel rendering only — never a slot calculation. See lib/time/zones.ts. */ display_timezone: string | null;};اثبات
در این نمونه، نام یک ستون در پایگاه داده عوض شده ولی کار نیمهکاره مانده است. آن را به همان چهار مرحلهٔ بررسی بفرستید که هر تغییر این سایت از آنها رد میشود و ببینید در مرحلهٔ اول متوقف میشود؛ بعد کاملش کنید و دوباره بفرستید.
mazarix/site · rename-member-idاجرای ضبطشدهاگر نام یک ستون عوض شود، خطا پیش از انتشار پیدا میشود؛ نه ساعت دو بامداد روی سایت.
یک مجموعه تعریف نوع داده، هم سطر پایگاه داده را توصیف میکند، هم تابع سمت سرور و هم فرم روی صفحه. اگر نام یک ستون عوض شود، ویرایشگر پیش از اجرای برنامه همهٔ جاهایی را که باید تغییر کنند فهرست میکند. بدون این، ناسازگاری ساکت میماند تا وقتی یک کاربر واقعی، یک فرم واقعی را عصر پنجشنبه ثبت کند.
مرز کارایی
نوع داده، شکل اطلاعات را بررسی میکند نه معنایش را. فیلدی از نوع عدد، عدد اشتباه را هم بدون اعتراض نگه میدارد. آن بخش کارِ تست است.
یک زبان در کل سیستم، و کتابخانهای آماده برای تقریباً هر نیاز دیگر.
Node.js سمت سرور را با همان زبان سمت مرورگر اجرا میکند. در نتیجه یک تیم کل سیستم را میخواند و یک قاعدهٔ اعتبارسنجی یک بار نوشته میشود، نه دو بار در دو زبان که بهمرور با هم ناهماهنگ میشوند. این ابزار به معنای خوب کلمه قدیمی و بیحاشیه است: بیش از یک دهه سابقه، نسخههای با پشتیبانی بلندمدت، و بستهٔ آماده برای تقریباً هر سرویسی که لازم شود. مهمتر از همه، نیروی متخصصش پیدا میشود؛ روزی که یکی از اعضای تیم برود، این از هر معیار سرعتی مهمتر است.
مرز کارایی
Node برای محاسبات سنگین و ممتد ابزار مناسبی نیست. در چنین مواردی آن بخش روی سرویس مخصوص خودش اجرا میشود و Node آن را صدا میزند.
قاعدهای که داخل پایگاه داده باشد، با یک باگ در یک صفحه دور زده نمیشود.
محدودیتها، کلیدهای خارجی، تراکنشها و سطح دسترسی سطری، قواعد را کنار خودِ داده میگذارند. صفحهای که باگ دارد هم نمیتواند نیمی از یک سفارش را ذخیره کند یا اطلاعات یک مشتری را به مشتری دیگر بدهد، چون پایگاه داده اجازه نمیدهد. PostgreSQL بیشتر از تصور رایج کار میکند: جستوجوی متن کامل، JSON، صف و کارهای زمانبندیشده. همین باعث میشود تعداد قطعات سامانه — و تعداد چیزهایی که میتوانند از کار بیفتند — کم بماند.
مرز کارایی
این قواعد عمداً سختگیرند، پس عوض کردنشان در آینده یعنی یک Migration. این هزینهٔ واقعی است، اما از هزینهٔ اینکه یک روز بفهمید دادههایتان هیچوقت آن چیزی نبوده که فکر میکردید کمتر است.
اگر باز شدن صفحه چهار ثانیه طول بکشد، بیشتر آدمها بقیهاش را نمیبینند.
صفحهها روی سرور ساخته میشوند و آماده به دست کاربر میرسند. اولین چیزی که کاربر میبیند محتواست، نه نشانهٔ در حال بارگذاری. روی موبایل و اینترنت همراه، که مسیر ورود بیشتر کاربران است، همین تفاوتِ میان نرمافزاری است که سریع به نظر میرسد و نرمافزاری که خراب به نظر میرسد.
مرز کارایی
سرعت به کل مسیر بستگی دارد: کوئری، حجم پاسخ، تصویرها و اسکریپتهای بیرونی. برای همین از هفتهٔ اول به آن فکر میکنیم؛ سرعت را نمیشود هفتهٔ آخر به کار اضافه کرد.
سروری در گوشهٔ دفتر نیست که بهروزرسانیاش فراموش شود.
همهچیز روی زیرساختی اجرا میشود که حسابش به نام شماست، نه به نام ما. مقیاسپذیری، پشتیبانگیری، گواهی TLS و وصلههای امنیتی وظیفهٔ خودِ پلتفرم است، نه کاری که کسی باید لای کارهای دیگر یادش بماند. ظرفیت با تقاضا بالا میرود، پس یک هفتهٔ پرمراجعه باعث قطعی سرویس نمیشود. اگر همکاریمان تمام شود، لازم نیست چیزی تحویل بگیرید؛ همهٔ دسترسیها از اول دست خودتان بوده است.
مرز کارایی
سرویسهای مدیریتشده ماهانه از یک سرور اجارهای گرانترند، اما در طول سال از وقتی که نگهداری همان سرور از تیم میگیرد ارزانتر تمام میشوند. جایی که پروژه واقعاً به سرور اختصاصی نیاز داشته باشد، سرور اختصاصی میگیرد.
وقت معمولاً در یک مشکل بزرگ هدر نمیرود؛ در بیست کار کوچک و تکراری هدر میرود.
دادهای که در سامانهٔ دوم دوباره تایپ میشود. گزارشی که هر دوشنبه از همان سه فایل ساخته میشود. تأییدی که با پیام پیگیری میشود. اتوماسیون این سامانهها را مستقیم به هم وصل میکند و کارهای تکراری را طبق برنامه و خودکار انجام میدهد، تا انجام شدنشان به یاد کسی بستگی نداشته باشد و با نبودن یک نفر کار متوقف نشود.
مرز کارایی
خودکار کردن فرایندی که کسی درکش نکرده، فقط خرابی را سریعتر و بیصداتر میکند. اول فرایند بررسی و نوشته میشود. گاهی همان مرحله به راهکاری سادهتر از نرمافزار میرسد و همان را پیشنهاد میکنیم.
انتشار نسخهٔ جدید دیگر کار پرریسکی نیست.
هر تغییر همان بررسیها را با همان ترتیب اجرا میکند — نوع دادهها، تستها، Build و پیشنمایش — و تا قبول نشود به محیط عملیاتی نزدیک نمیشود. انتشار بعد از ادغام انجام میشود، نه دستی و نیمهشب. نسخهٔ خراب در یک قدم برگردانده میشود، بهجای اینکه جلوی چشم مشتری رفع اشکال شود.
مرز کارایی
خط تحویل دقیقاً به اندازهٔ بررسیهای داخلش معتبر است. Build سبزی که پشتش تستی نباشد، چراغ سبزی است که هیچ معنایی ندارد.
نرمافزاری که اجرا میشود، لزوماً نرمافزاری که کار میکند نیست.
تست واحد برای منطق برنامه، تست یکپارچگی برای محل اتصال بخشها، تست سرتاسری برای همان چند مسیری که درآمد از آن میآید، و بررسی سلامت بعد از هر انتشار. هر لایه دستهٔ متفاوتی از خرابی را میگیرد، و همان لایههای ارزانِ پاییناند که نگه داشتن لایههای گرانِ بالا را بهصرفه میکنند.
مرز کارایی
تست، همان حالتهایی را اثبات میکند که کسی به آنها فکر کرده است. نبودِ باگ را اثبات نمیکند، و مجموعه تستی که کسی اجرایش نکند فقط مستنداتی است که دیگر درست نیست.
عمیقتر
چرا نرمافزارهایی که ظاهر کامل دارند بعد از راهاندازی خراب میشوند، و هر لایهٔ تست جلوی کدام خرابی را میگیرد.
خط تحویل خودکار روی کدی که از قبل نوشته شده هم اضافه میشود. در یک جلسهٔ سی دقیقهای نگاه میکنیم که پروژه امروز چطور ساخته و منتشر میشود، و رک میگوییم انجامش چه میخواهد.