مسعود ملکی
مسعود ملکی
خواندن ۸ دقیقه·۱۰ ماه پیش

بهبود فرایند نسخه‌دهی کلاینت اندروید بله

حدودا یک سال پیش بود که ایرادهای فرایند نسخه‌دهی کلاینت اندروید در شرکت مطرح شد. ایراداتی مثل نامنظم بودن زمان انتشار نسخه‌های رسمی، کیفیت نسبتا پایین در انتشار برخی از نسخه‌ها و تعدد نسخه‌های هاتفیکس. یکی از دلایل این ایرادات حذف شدن اپلیکیشن بله از گوگل پلی به خاطر تحریم‌ها بود. قبل از این اتفاق یک فرایند نسخه داشتیم که بخش مهمی از آن از طریق گوگل پلی انجام می‌شد. هم کانال‌های انتشار نسخه (اینترنال، آلفا و بتا) و هم تضمین کیفیت و سلامت نسخه خروجی. برای اندازه‌گیری کیفیت و سلامت نسخه اندروید روش نوآورانه‌ای ارائه داده بودیم (AHI: App Health Indicator) که بعدها در متنی دیگر به طور مفصل در مورد آن صحبت خواهیم کرد و خواهیم گفت که چگونه تحولی در کارایی اپلیکیشن ما ایجاد کرد :)

فعلا می‌رویم سراغ اینکه در این یک سال چه مشکلاتی در روند نسخه‌دهی کلاینت اندروید داشتیم و چگونه با ایجاد فرایندهای جدید توانستیم این روند را بهبود بخشیم.

۱. مطالعه و بررسی Best Practiceهای فرایند انتشار نسخه در دنیا

مقالات مختلفی را در زمینه مدیریت انتشار نسخه مطالعه کردیم. یکی از اصلی‌ترین بحث‌هایی که در این مقالات مطرح کرده بودند Continuous Delivery بود. یعنی اینکه ما بتوانیم رفع باگ‌ها، بهبودها و قابلیت‌های جدید را به صورت امن (Safe) و سریع به دست کاربر برسانیم. امن یعنی نسخه‌ای که می‌دهیم کیفیت لازم را داشته باشد و موجب اذیت کاربر نشود. سریع هم یعنی نسخه‌ها با فاصله‌های کمی به دست کاربران برسد.

برای اینکه نسخه‌های ما امن باشد و زود به زود نسخه بدهیم،‌ رفتیم سراغ ایجاد فرایند انتشار نسخه (اینترنال و بتا).

۲. انتشار نسخه اینترنال

نخست، فرایند انتشار نسخه اینترنال از طریق اپلیکیشن بله برای اعضای داخلی شرکت را راه‌اندازی کردیم. این نسخه اینترنال به صورت روزانه منتشر می‌شود و بچه‌های بله آن را تست می‌کنند و بازخوردهای خود را در گروه مربوطه ارسال می‌کنند. برای اینکه این تست به صورت هدف‌مندتری صورت گیرد، نیاز بود که لیست تغییرات نسخه نوشته شود. با توجه به اینکه نوشتن دستی لیست این تغییرات کار زمانبر و غیربهینه‌ای است، از کامیت مسیج‌ها (Commit message) برای استخراج و تولید لیست تغییرات (Change Log) استفاده کردیم.

۳. انتشار نسخه تستی

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

۴. فرهنگ سازی و بهبود روال‌ها

وقتی فرایندهای اولیه برای انتشار نسخه را ایجاد کردیم، رفتیم سراغ اینکه آن را در بین اعضای بله منتشر و فرهنگ‌سازی کنیم. برای مثال با ارائه‌هایی که در جامعه اندرویدمون داشتیم، اینکه چگونه کامیت معنادار بزنیم و یا نحوه استفاده از تک #CL برای نوشتن چنج لاگ کاستوم را توضیح دادیم و در فرایند رویو به این موارد بیشتر دقت کردیم.

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

در نهایت اولین نسخه رسمی را با روال جدید منتشر کردیم.

۴. انتشار نسخه بتا

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

نسخه‌ای که در اسفندماه منتشر شد با حداقل رفت و برگشت و با کیفیت مناسب منتشر شد و توانستیم تاثیر فرایند جدید بر روالی نسخه‌دهی را ببینیم.

فرایندی که به آن رسیدیم را می‌توانید در شکل زیر مشاهده کنید.

حال نوبت آن بود که کیفیت نسخه‌های منتشر شده را افزایش دهیم.

۵. بهبود کیفیت نسخه‌های منتشر شده

بسیاری از ابزارها و معیارهایی که برای بررسی کیفیت نسخه‌های منتشر شده استفاده می‌کردیم (کرش، ANR، میزان مصرف باتری و حافظه گوشی، میزان مصرف پهنای باند و غیره)، مربوط به پنل گوگل پلی می‌شد (معیار AHI که بعدا در مقاله‌ای جدا توضیح خواهیم داد). بعد از تحریم اپلیکیشن بله توسط گوگل پلی،‌ شروع به جایگزین کردن این ابزارها و معیارها کردیم. در بعضی قسمت‌ها سراغ ابزارهای آماده رفتیم، در بعضی هم خودمان ابزار ارائه کردیم.

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

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

۶. شناسایی و رفع مشکلات فرایند نسخه‌دهی

با اینکه فرایند نسخه ما خیلی پخته‌تر شده بود، اما همچنان نسخه رسمی با تاخیر منتشر می‌شد و گاها کیفیت لازم را نداشت و مجدد مجبور می‌شدیم نسخه جدیدی ارائه دهیم. با هر نسخه‌ای که ارائه دادیم تجربیات جدیدی آموختیم. برخی از این تجربیات در ادامه آمده است:

  • تاخیر در انتشار نسخه رسمی به دلیل تغییرات لحظه آخری: یکی از دلایلی که باعث عقب افتادن نسخه‌مان می‌شد، تغییراتی بود که در لحظه آخر مرج می‌شد یا حتی تو تایمی که برای هاتفیکس داده بودیم. در این راستا چند تا اقدام انجام دادیم. اولا ددلاین‌هایی که برای آخرین نسخه بتا و رسمی داشتیم را جدی‌تر گرفتیم و در جلسات مختلف بر آن تاکید کردیم. دوما در رویوها خیلی سخت‌گیرانه‌تر با کدهایی که می‌خواهد مرج شود برخورد کردیم. سوما با مدیران تیم‌های مختلف صحبت کردیم و این قضیه را شفاف کردیم که مدل نسخه‌دهی ما Time Based هست و نه Task Based. پس نباید تیمی بگوید تا وقتی کارهای ما نرسیده نسخه نباید برود. بلکه فرایند نسخه ما مثل قطاری است که هر کسی نرسید باید منتظر قطار بعدی باشد!
  • پند بودن فرایند نسخه به یک مسئول نسخه ثابت: چندین وقت بود که فرایند نسخه‌مان را یک شخص ثابتی بر عهده داشت. این قضیه یکسری معایب داشت. اولا اینکه دانش انتشار نسخه اندروید در تیم‌های مختلف پخش نمی‌شد و در صورتی که این فرد به هر دلیلی نمی‌توانست در فرایند انتشار یک نسخه مشارکت داشته باشد به مشکل می‌خوردیم. دوما این مسئول نسخه به اقداماتی که انجام می‌داد تا حدی عادت کرده بود و موجب شده بود که تلاش لازم برای خودکارسازی فرایند نسخه را انجام ندهد. سوما چون همیشه مسائل نسخه را این شخص به تنهایی حل می‌کرد، برخی از توسعه‌دهندگان و مدیران تیم‌ها درک درستی از مشکلات فرایند نسخه نداشتند و مثلا به جای اینکه تلاش کنند کارهای خودشان را به موقع به نسخه برسانند، تلاش می‌کردند نسخه را تا زمانی که کارهایشان برسد به عقب بیاندازند! در نهایت تصمیم بر این شد که مسئول نسخه به صورت چرخشی از بین توسعه‌دهندگان اندروید انتخاب شود.

۷. تدوین و انتشار سند مانا

با توجه به اینکه برا هر نسخه‌ای که منتشر می‌کردیم یکسری تجربیات جدید در مسیر نسخه‌دهی به دست می‌آوردیم، سندی به نام مانا (مدیریت انتشار نسخه اندروید) تدوین کردیم و در جلسات مختلف با توسعه‌دهندگان،‌ مدیران تیم‌ها و اقلیم‌ها به اشتراک گذاشتیم.

قالب کلی سند مانا در ادامه آورده شده است:

«بسم الله الرحمن الرحیم»

روال نسخه‌دهی اندروید:

نسخه اینترنال:

  • هر روز ساعت ۱۳:۰۰
  • [بقیه جزئیات نسخه اینترنال]

نسخه بتا:

  • دوشنبه‌ها ساعت ۱۶:۰۰
  • [بقیه جزئیات نسخه بتا]

نسخه پروداکشن:

  • هفته اول هر ماه نسخه رسمی خواهیم داشت. مگر اینکه مدیر محصول زمان خاصی برای یک نسخه در نظر بگیرد.
  • محدودیت یک‌ماه بین دو نسخه: دیرتر از یک ماه نسخه نمی‌دهیم.
  • [بقیه جزئیات نسخه پروداکش]

مسئول نسخه:

  • برای هر نسخه مسئولی تعیین می‌شود که وظایف مختلفی را بر عهده دارد.
  • [مسئولیت‌های مسئول نسخه: هر کدام از این مسئولیت‌ها سر تجربیات مختلفی که داشتیم به دست آمده است]

۸. تیم QA یا فرایند QA؟

فرایند انتشار نسخه خود بخشی از فرایند تضمین کیفیت (QA) ماست. در سری جلسات و بحث‌های مختلفی که در شرکت در مورد تضمین کیفیت (QA) داشتیم به این نتیجه رسیدیم که چیزی که ما نیاز داریم فرایند QA هست و نه تیم QA. به طور خلاصه برخی از دلایل این تصمیم در ادامه آورده شده است:

  • فرایند QA قابلیت مقیاس‌پذیری (Scalability) بیشتری نسبت به تیم QA دارد.
  • فرایند QA باعث نزدیک شدن توسعه‌دهندگان به کاربران می‌شود، که این خود باعث درک بهتر توسعه‌دهندگان از مسائل کاربران می‌شود.
  • فرایند QA از منابع توزیع‌شده استفاده می‌کند و در آن تلاش بر آن هست که اکثر کارها به صورت اتومات انجام شوند. در نتیجه نیاز به استخدام،‌ آموزش و پشتیبانی یک تیم QA را از بین می‌برد.
  • شرکت‌های بزرگی مثل گوگل و مایکروسافت هم به مرور به سمت داشتن فرایند QA رفته‌اند و مقالات و کتاب‌های مختلفی در این زمینه منتشر شده است.

۹. در ادامه...

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

فرایند انتشار نسخهاپلیکیشن بلهنسخه اینترنال و بتاتضمین کیفیتنسخه‌دهی کلاینت اندروید
من عاشق بارونم :)
شاید از این پست‌ها خوشتان بیاید