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

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

Fatahi Gold

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

مسئله تجاری

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

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

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

رویکرد فنی

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

نتیجه و شواهد

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

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

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

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

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

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

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

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

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