پرتوپرتو

اعلام تغییرات محصول

کدام سطح برای کدام اندازه ریلیز — زنگوله، پنل، مودال — و بودجهٔ وقفه‌ای که هر کدام مصرف می‌کنند

معرفی

این صفحه قضاوت را نگه می‌دارد؛ صفحه‌های کامپوننت props را. اگر می‌خواهید بدانید WhatsNewPanel چه propهایی دارد، به صفحهٔ خودش بروید. اگر می‌خواهید بدانید یک تغییر را باید اعلام کنید یا نه و با چه بلندی، اینجا بمانید.

سه سطح وجود دارد و ترتیبشان یک نردبانِ وقفه است:

سطحچه می‌گویدچه هزینه‌ای دارد
تاریخچه (ReleaseTimeline)«همه‌چیز اینجاست»هیچ. کاربر خودش می‌آید
نشانه روی زنگوله (WhatsNewBell)«چیز تازه‌ای هست»یک نقطه. کاربر انتخاب می‌کند ببیند یا نه
مودال (WhatsNewSpotlight)«این را همین حالا ببین»کار کاربر را قطع می‌کند

بودجه، نه پرچم

channel سه مقدار دارد و پیش‌فرض ندارد — عمداً. silent برای بیشترِ یادداشت‌ها، announce برای موارد گزیده، و spotlight حداکثر یکی در ۳۰ روز برای هر محصول. این سقف در defineReleaseFeed گیت شده و build را می‌شکند، چون تنها راه محافظت از اعتبار آن نقطه، کم‌مصرف نگه‌داشتنش است.

چرا نه «هر ریلیز یک مودال»

سنجیده شد، نه فرض: هر اپ حدود چهار روزِ دیپلوی در هفته دارد و حدود ۲۰ تا ۳۰ درصد کامیت‌ها برای کاربر دیدنی‌اند — یعنی تقریباً یک تغییر دیدنی در هفته برای هر اپ.

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

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

جنس تغییر باید دیده شود — و رنگ سومین کانال است

چهار نوع تغییر وجود دارد: feature، improvement، fix، breaking. جنس تغییر با سرتیتر گروه حمل می‌شود که سه چیز را هم‌زمان می‌گوید: یک واژهٔ فارسی، یک آیکون، و یک ته‌رنگ. ترتیب اهمیتشان همین است.

این قاعده از یک اشتباه سنجیده‌شده آمده

feature و improvement قبلاً دو سبز بودند با فاصلهٔ ۹.۹ درجه رنگ‌مایه و OKLab ΔE ۰.۰۶۴ — ۲.۷ برابر نزدیک‌تر از نزدیک‌ترین جفت بعدی. زیر کوررنگی سبز-قرمز هر دو به زردِ کم‌اشباع می‌رسیدند (ΔE ۰.۰۶۳) یعنی دو نوعی که در تقریباً هر ریلیز حاضرند، عملاً یکی بودند. اگر روزی وسوسه شدید نوع تازه‌ای اضافه کنید، رنگ تازه نسازید — واژه و آیکون را جدا کنید.

فاصلهٔ رنگ فقط جایی خرج می‌شود که رفتار کاربر را عوض می‌کند: breaking تنها قرمز را دارد، fix خنثی می‌ماند، و improvement آبی است تا از سبزِ feature جدا باشد.

fix عمداً بی‌صداست. یک چیپ قرمز روی هر «رفع اشکال»، changelog را به فهرست نقص تبدیل می‌کند.

چهار چیزی که هر یادداشت باید داشته باشد

  1. تاریخ — شمسی، و هویتِ ورودی است. شمارهٔ نسخه نه؛ کاربر نسخه را دنبال نمی‌کند.
  2. چه چیزی است — عنوان کوتاه که می‌گوید کاربر حالا چه می‌تواند بکند، نه چه پیاده شد.
  3. چه فایده‌ای دارد — خلاصهٔ یک تا دو جمله‌ای.
  4. قدم بعدیcta به همان جایی که قابلیت زندگی می‌کند. یادداشتی که کاربر نمی‌داند بعدش کجا برود، فقط اطلاع‌رسانی است.

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

عمق: حدود ده ورودی، بقیه پشت لینک

پنل تاریخچه را نشان می‌دهد نه فقط آخرین ریلیز — ولی نه بی‌انتها. حدود ده ورودی در نمای اول، و «تاریخچهٔ کامل تغییرات» به صفحهٔ ReleaseTimeline.

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

دو کلاس خرابی که این طراحی غیرقابل‌بیان می‌کند

هر دو در محصولات واقعی همین مجموعه زنده بودند و به همین دلیل مدل داده این شکل را دارد:

  • حالت «دیده‌شده» با یک منبع دوم مقایسه می‌شد. یک محصول نسخه را از public/version.json می‌خواند و با localStorage مقایسه می‌کرد. آن فایل روی نسخهٔ قدیمی ماند و سه ریلیز هیچ اعلامی نکردند. اینجا کلید، id خودِ یادداشت است که در همان فایل و همان کامیتِ محتوا زندگی می‌کند — منبع دومی نیست که رانش کند.
  • «جدید» یک فیلد ذخیره‌شده بود. محصول دیگری isNew: true را دستی نوشته بود و هیچ‌چیز برش نمی‌گرداند؛ آن نقطه سه ماه برای همهٔ کاربران روشن بود. اینجا هیچ فیلد isNew وجود ندارد: «دیده‌نشده» از ترتیب آرایه مشتق می‌شود.

پیاده‌سازی مرجع

خودِ همین سایت مستندات کاملِ این خانواده را اجرا می‌کند — زنگوله در هدر، پنل، و صفحهٔ تغییرات. فایل محتوایش apps/docs/data/changelog.ts است و به‌جای نمونه‌های ساختگی، همان را بخوانید.

الگوهای مرتبط

  • وقفه و مودال — این صفحه یک تصمیمِ وقفه است؛ آنجا قاعدهٔ کلی‌تر را دارد
  • ادبیات و لحن — قواعد نوشتنِ یادداشت
  • ضدالگوها — از جمله «مودال به‌ازای هر ریلیز» و «شمارنده برای خبر خوب»