مطالعه موردی مهندسی
وفاداری و دفترکل کیف پول
موجودی وفاداری پول است. هر نقصی در کدی که آن را جابهجا میکند مبلغ واقعیای است که یا به مشتری بدهکاری یا از او گرفتهای، و به همین دلیل این پروژه اول بهشکل یک دامنه ساخته و اثبات شد، پیش از اینکه حتی یک هوک وردپرس یا جدول دیتابیس وجود داشته باشد.
مسئله تجاری
بیشتر پیادهسازیهای وفاداری یک موجودی را در یک ستون ذخیره میکنند و به آن اضافه میکنند. این تا اولین بازپرداخت، اولین پسگیری، یا اولین اختلاف دربارهی اینکه شش ماه پیش واقعاً چقدر به مشتری بدهکار بودهایم خوب کار میکند؛ از آن نقطه به بعد هیچ راهی برای بازسازی اینکه آن عدد چطور بهدست آمده وجود ندارد. حساب اعشاری بدترش میکند: یک کسب امتیاز و برگشتش دیگر دقیقاً همدیگر را خنثی نمیکنند، و خطا دائمی است.
آنچه تحویل دادم
- یک نوع Money با واحدهای صحیح خرد ریال، که بهجای گردکردن بیصدای اعشار آنها را رد میکند، و در هر دو جهت بهسمت صفر گرد میکند تا یک کسب و پسگیریاش دقیقاً همدیگر را خنثی کنند.
- یک دفتر کیف پول فقط-افزودنی که در آن موجودی جمع ورودیهایش است و هیچوقت یک ستون ذخیرهشده نیست، پس هر موجودی قابل بازسازی و توضیح است.
- سطلهای جدا برای اعتبار نقدی، اعتبار تبلیغاتی و اعتبار بازپرداخت، چون این سه در برخورد مالیاتی، وضعیت حقوقی و قوانین انقضا فرق دارند و نمیتوانند یک موجودی مشترک داشته باشند.
- یک چرخهی حیات امتیاز که در آن امتیازها غیرقابلخرج ضرب میشوند و تا وقتی سفارشی که آنها را کسب کرده برگشتناپذیر نشود همانطور میمانند.
- یک مبنای کسب صریح: پس از تخفیف، پیش از مالیات، پیش از حمل، با استثناهای نوعدار، تا اینکه یک سفارش برای کسب امتیاز چقدر میارزد در یک جا تعریف شده باشد.
- یک بررسیکنندهی جهش که نقصهای پولی شناختهشده را یکییکی میکارد و اگر هرکدام زنده بماند شکست میخورد.
رویکرد فنی
- دامنه کاملاً ساخته و اثبات شد پیش از اینکه هیچ ذخیرهسازی، اندپوینت، هوک یا کرونی وجود داشته باشد. هیچچیز اینجا قابل نصب نیست، و نکته دقیقاً همین بود: منطق پول باید پیش از قابلدسترسشدن درست باشد.
- موجودیها مشتق میشوند، هیچوقت ذخیره نمیشوند. خواندنش گرانتر است و تنها راهی است که میشود جواب داد چرا یک موجودی همانی است که هست.
- تفکیک سطلها مدلسازی شده نه قراردادی. اعتبار تبلیغاتی که منقضی میشود و اعتبار نقدی که نمیشود دو چیز متفاوتاند، و یک ستون موجودی واحد مجبورشان میکند وانمود کنند نیستند.
- امتیازها غیرقابلخرج ضرب میشوند چون جایگزینش این است که مشتری امتیازهای سفارشی را خرج کند که بعداً بازپرداخت میشود، و این یک زیان واقعی است که سخت جبران میشود.
- بررسیکنندهی جهش وجود دارد چون یک مجموعه تست سبز ثابت میکند کد از تستهایش عبور میکند، نه اینکه تستها یک نقص را میگیرند. این ابزار گردکردن رو به بالا روی یک کسب، خرجکردن اعتبار نقدی پیش از تبلیغاتی، ضرب امتیاز بهصورت از پیش قابلخرج، و بازخرید یک اعطای منقضیشده را میکارد.
نتیجه و شواهد
بررسیکنندهی جهش تا الان چهار بار این کد را تغییر داده: دو گارد کد مرده و غیرقابلدسترس بودند، یکی یک محدودکنندهی بیصدا بود که همان باگی را پنهان میکرد که بهنظر میرسید جلویش را میگیرد، و یکی علت اشتباه را گزارش میکرد. هر کدام از اینها از بازبینی و از تستها عبور میکردند.
اهمیت برای کارفرما
یک سیستم وفاداری که نتواند یک موجودی را توضیح دهد تبدیل به بار پشتیبانی و در نهایت به یک اختلاف میشود. درستساختن دفتر از ابتدا ارزانتر از بازسازیاش بعد از اولین ماه موجودیهای زنده است.
خلاصه اجرایی خوانا
خلاصه_اجرایی {
پروژه: "Loyalty + Wallet Ledger"
وضعیت: "دامنهی خالص؛ بدون اسکیما، هوک، اندپوینت یا کرون"
پول: "واحدهای صحیح خرد ریال؛ اعشار رد میشود نه گرد؛
بهسمت صفر گرد میشود تا کسب و پسگیری خنثی شوند"
دفتر: "فقط-افزودنی؛ موجودی = جمع ورودیها، هرگز یک ستون"
سطلها: "نقدی / تبلیغاتی / بازپرداخت، جدا بر اساس مالیات،
وضعیت حقوقی و انقضا"
امتیاز: "غیرقابلخرج ضرب میشود تا سفارش برگشتناپذیر شود"
مبنای_کسب: "پس از تخفیف، پیش از مالیات، پیش از حمل،
با استثناهای نوعدار"
اثبات: "بررسیکنندهی جهش نقصهای پولی شناختهشده را میکارد؛
تا الان چهار بار این کد را اصلاح کرده"
}ارزش حرفهای این پروژه
بررسیکنندهی جهش همان چیزی است که دوست دارم بازبین به آن نگاه کند. نوشتن تست حداقل انتظار است؛ اثبات اینکه تستها روی یک نقص واقعی شکست میخورند بخشی است که تقریباً هیچکس انجام نمیدهد.
امتناع از ساختن لایهی وردپرس تا وقتی دامنه اثبات نشده بود انضباط میخواست و آشکارا درست بود. باگهای پولی که بعد از راهاندازی پیدا میشوند باگ نیستند، بدهیاند.