Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

Fatahi Gold

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

مسئله تجاری

قیمتی که مشتری می‌بیند باید همانی باشد که فروشگاه پایش می‌ایستد. پس سود و کارمزد باید پیش از نمایش اعمال شود، نه داخل مرورگر مشتری که هم خواندنی است هم دست‌کاری‌شدنی. نیمه‌ی دوم مسئله خود فید است: اگر API قیمت بالادستی گیر کند، یا صفحه قفل می‌شود یا رقمی کهنه می‌ماند که زنده به نظر می‌رسد. حالت دوم بدتر است.

آنچه تحویل دادم

  • یک PWA فارسی راست‌به‌چپ و موبایل‌اول با manifest، service worker و جریان نصب، چون مشتری‌ها با گوشی سراغش می‌آیند.
  • یک اندپوینت قیمت سمت سرور که فید بالادستی را می‌گیرد، سود درصدی و سود ثابت و کارمزد را رویش می‌گذارد و فقط رقم نهایی را برمی‌گرداند.
  • پول پنج‌ثانیه‌ای کلاینت روی همان اندپوینت، تا قیمت تابلو پای بازار بماند و مرورگر هیچ‌وقت عدد خام بالادستی را نبیند.
  • یک قیمت فالبک اعلام‌شده و یک فیلد منبع در هر پاسخ، تا فرانت‌اند بداند دارد عدد زنده نشان می‌دهد یا فالبک.
  • تایم‌اوت چهارثانیه‌ای روی دریافت بالادستی، با فاصله‌ی مطمئن از بازه‌ی پول، تا فید کند نتواند درخواست‌ها را روی هم انباشته کند.
  • یک اندپوینت سفارش جدا با تایم‌اوت و توکن خودش، تا سفارش‌گیری به مسیر قیمت‌گذاری گره نخورد.
  • هدرهای امنیتی صریح و یک permissions policy که موقعیت مکانی، میکروفون و دوربین را خاموش می‌کند.
  • تم تیره و روشن با رنگ مخصوص هر تم و یک رنگ تأکیدی برند که هر فروشگاه خودش تنظیم می‌کند، چون همین ساختار به چند خرده‌فروش طلا سرویس می‌دهد.

رویکرد فنی

  • سود و کارمزد روی سرور اعمال می‌شوند. مرورگر فقط قیمت نهایی را می‌گیرد؛ ورودی‌های محاسبه هیچ‌وقت به آن نمی‌رسند.
  • هر پاسخ منبع خودش را اعلام می‌کند، پس قیمت فالبک از قیمت زنده قابل تشخیص است. فرق یک نمایش تنزل‌یافته با یک نمایش گمراه‌کننده همین است.
  • تایم‌اوت بالادستی عمداً کوتاه‌تر از بازه‌ی پول است: فید کند به فالبک می‌رسد، نه به صفی از درخواست‌های معلق.
  • پیش از تبدیل عدد، کاراکترهای غیرعددی حذف می‌شوند. فیدهای قیمت در قالب‌بندی یکدست نیستند و یک خطای پارس روی تابلوی قیمت پذیرفتنی نیست.
  • قیمت‌گذاری و سفارش‌گیری دو اندپوینت جدا با تایم‌اوت جدا دارند، تا خرابی سفارش تابلوی قیمت را از کار نیندازد.
  • برند، سود، کارمزد و تم همه ثابت‌های پیکربندی‌اند. به همین دلیل همین کدبیس بدون fork به خرده‌فروش دوم هم رسید.

نتیجه و شواهد

فروشگاه یک تابلوی قیمت زنده دارد که مشتری‌ها روی گوشی نصبش می‌کنند. وقتی چیزی خراب شود، چیزی که می‌بینند یک فالبک برچسب‌خورده است، نه عددی یخ‌زده یا کهنه. جداشدن پیکربندی از کد هم باعث شد همین کدبیس برای بیش از یک خرده‌فروش طلا راه بیفتد.

اهمیت برای کارفرما

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

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Fatahi Gold"
  پشته: "اندپوینت‌های PHP + جاوااسکریپت خالص، PWA فارسی RTL"
  قیمت‌گذاری: "api/price.php با پول هر ۵ ثانیه"
  محاسبه_سمت_سرور: "سود درصدی + سود ثابت + کارمزد"
  تنزل: "قیمت فالبک اعلام‌شده؛ هر پاسخ منبعش را
         اعلام می‌کند (زنده یا فالبک)"
  تایم‌اوت: "۴ ثانیه بالادستی، کوتاه‌تر از پول ۵ ثانیه‌ای، بدون انباشت"
  سفارش: "اندپوینت جدا، تایم‌اوت و توکن خودش"
  هدرها: "nosniff، SAMEORIGIN، referrer هم‌مبدأ،
          موقعیت/میکروفون/دوربین خاموش"
  استفاده_مجدد: "برند، سود، کارمزد و تم ثابت‌اند"
}

ارزش حرفه‌ای این پروژه

تصمیمی که دوست دارم دیده شود، بردن سود و کارمزد به سرور و اعلام منبع در هر پاسخ است. هزینه‌ای ندارد و همان است که فالبک را صادق نگه می‌دارد.

کوتاه‌تر گرفتن تایم‌اوت بالادستی از بازه‌ی پول یک حساب ساده است، اما جلوی رایج‌ترین خرابی فرانت‌اندهای polling را می‌گیرد: انباشت درخواست موقع قطعی.