چه استارتآپ چه گروئنآپ، تقسیم تسکها بین اعضای تیم در یک کسب و کار پویا مثل کسب و کارهای اینترنتی چالش قابل توجهی است؛ مهمترین کار مجموعه نیست ولی مهم است (مهمترین احتمالاً تشخیص تسکهایی است که لازم است انجام بدهید از تسکهایی که چندان هم ضرورت ندارند، و یا حتی آنهایی که بعداً از اینکه انجامشان ندادهاید خیلی هم خوشحال میشوید). در این پست میخواهم با تکیه به تجربیاتم در بازار و دیوار در این موضوع خاص از جنبهٔ فنی بنویسم، و اینکه چه شد که به مایکروسرویس رسیدیم.
البته که جنبهٔ انسانی موضوع تقسیم کار در تیم پرچالشتر است و احتمالاً برای اکثر مخاطبین این مطلب وزن و اهمیت بیشتری دارد. ولی در آن موضوع مطلب زیاد است و انواع متدولوژیها برای کار تیمهای نرمافزاری ایجاد شده که بعضیهایشان هم خوب جوابشان را پس دادهاند. لذا سعی کردهام در جنبهٔ انسانی به حداقلِ نیاز متن بسنده کنم.*
تا قبل اینکه از چهار پنج نفر بزرگتر شویم، تقسیم کارها نسبتاً راحت بود:
مصطفی: من رفتم سراغ جلالی تو تقویم.
رضا: ایول. من برم سراغ فارسی تو SMS؟
رضا: برم سراغ کلاینت بازار؟
مصطفی: حله، منم رفتم سرور.
مشکل وقتی شروع میشود که تعداد افراد متمرکز روی یک پروژه زیاد شده و لازم میشود که دو نفر همزمان روی یک چیز کار کنند؛ یک Feature، یک Codebase، یک ماژول، یک فایل، زبانم لال یک Class. مشکل اصلی هم نیاز به هماهنگی است، به Communication. و این نیاز به ارتباط به نوعی ستون متدولوژیهای مختلف است. متدولوژیها هم هر یک به نحوی ارتباطات اعضای تیم را سامان میدهند. Kanban سعی میکند با قوانینش نیاز به ارتباط در راستای تقسیم تسک را کم کند و Scrum هم جلسات مختلف مثل Sprint Planning و Daily Scrum، با اهداف مختلف در نظر گرفته است. انتخاب متدولوژی مناسب تیم کار خیلی راحتی نیست ولی میتوانید از تجربههای فراوانِ موجود در جهان استفاده کنید.
(پیشنهاد من اینست که برای ایده گرفتن به سراغ تیمهایی بروید که شباهتهایی با شما دارند؛ مشتریهای مشابهای دارند، ارزشهای مشابه دارند، دغدغههایشان مشترک است، ... شاید با کپی کردن از تیمهای تجربهکرده حس کنید که شبیه میمونی شدهاید که از دست زدن به موز میترسد چون دوستانش او را از این کار ترساندهاند (بلانسبت!)، ولی احتمالش کمه که واقعاً در قفسی تحت نظر یه سری پژوهشگر مردمآزار (یا میمونآزار؟) باشیم؛ احتمالش خیلی بیشتر است که موز مورد بحث یک ایرادی داشته باشد که عزیز کهنهکار میگوید بهش دست نزن! البته که هر وقت فرصتش را پیدا کردید پیگیر دلیل پشت راهکارهای نسخهٔ مربوطه شوید، و اگر بعد کپی کردن هم احساس میکنید اوضاع خراب است و همین الانش هم رو سرتون سطل آب رو خالی کردهاند، دیگر چارهای نیست! باید دست به کار بشوید و نسخهٔ خودتان را بپیچید).
وقتی که تعداد تیمها زیاد میشود، ارتباط بین تیمها تبدیل به یک چالش میشود. اینجاست که متدولوژیها هم تبدیل به موجودات عجیب و غریبی میشوند (مثل SAFe و LeSS) که چندان هم جوابشان را پس ندادهاند و Case Study دندانگیری ازشان موجود نیست. اینجا یک مقدار پیدا کردن الگو سختتر است و گریزی از Customization نیست. خوشبختانه در لایهٔ فنی اینقدر نظرات متنوع نیست. راهکارهای فنی نسبتاً مشابهی را میتوانیم در شرکتهای متفاوت ببینیم که Robust یا حتی Anti-Fragile هستند و مجموعه را برای تغییرات که ذات این صنعت است، چه در لایهٔ انسانی و چه در لایهٔ هدف و محصول، آماده میکنند.
اولین تجربهٔ مرتبط ما در این فاز وقتی بود که تیم فنی بازار از دو تیم کلاینت (۴-۵ نفر) و سرور (۱۰-۱۱ نفر) تشکیل شده بود. چیزی که مشخصاً به یاد دارم تسک «کارت هدیه» است که در تیم کلاینت اولویت گرفته بود و پیاده شده بود ولی در تیم سرور بعد چندین هفته از اتمام پیادهسازیِ تیم کلاینت هنوز حتی وارد فهرست تسکهای ایتریشن هم نشده بود. اینجا بود که رفتیم سراغ ساختارتکانی و بعد بررسیها به این نتیجه رسیدیم که از اسپاتیفای الگو بگیریم. در آن زمان اسپاتیفای مقالهای داشت به تاریخ دو سال قبلش که تیمبندی خود را توصیف کرده بود، و پست بلاگ تازهای داشت که خیلی منطبق بر مقاله بود و این نشان میداد که ساختار مربوطه حداقل دو سال را دوام آورده است (برای دوستان ناآشنا به صنعت: دو سال در این صنعت خیلی است). خوبی دیگر مدل مربوطه این بود که اولاً توسط اسپاتیفای به اشکال ترتمیزی در موردش مطلب منتشر شده بود و لازم نبود به کامنتهایی از کارمندان تصادفی در مجموعه استناد کنیم. خوبیهای دیگری هم داشت مثل اینکه از نظر ابعاد در حد یک صفر بیشتر با ما اختلاف تعداد نیروی فنی نداشت و همچنین اگر به جای Album میگفتیم Application و به جای Track میگفتیم Package، محصول فنیاش هم شبیه محصولمان میشد.
خلاصهٔ ماجرا اینکه ساختار بازار تغییر میکند به چند تیم ارزش محور به جای تکنولوژی محور (تقریباً). بعد این تغییر بود که احساس کردیم که نیازهای فنیمان هم دارد تغییر میکند. بعدتر بود که در این مقاله از جناب Martin Fowler متوجه شدیم که این حس از کجا میآید: Conway s law. این عبارت قصار میگوید که در هر سازمانی که سیستم نرمافزاری در آن شکل میگیرد، طراحی کلان سیستم کپیِ ساختار ارتباطات سازمان مربوطه میشود. یعنی مثلاً اگر سازمان مربوطه تیم دیتابیس داشته باشد، خواهد دید که در معماری کلان سیستماش روی تخته وایتبورد مجموعهٔ دیتابیس یک بخش مستقل از سیستم شده است.
در این دوره مایکروسرویس برای ما معنی پیدا کرد. تیمهای جدا که روی ارزشهای بیزینسی تا حدی مستقل کار میکردهاند، طبیعتاً دوست دارند که کنترل بخشهای مربوط به خودشان را در دست بگیرند. و روش فنیای که آزمایشش را خوب پس داده بود جدا کردن سرویسها و API دادن به مشتری/دیگر تیمها و سرویس گرفتن از طریق API از دیگر تیمها بود.
نکتهٔ جالب مایکروسرویس این است که خیلی هم روی نحوهٔ تیمبندی حساس نیست. یعنی برای مثال سیستمهای تیمهای زیرساختی (که تا حدودی Technology-Based هستند) هم میتوانند در کنار دیگر مایکروسرویسها ایفای نقش کنند، البته به شرط اینکه خود را تأمینکنندهٔ خدمات/محصول ببینند و نه اینکه بخواهند در کار تیمهای دیگر دخالت کنند.
این مسیری بود که ما طی کردیم. بعدتر که این ارائهٔ فوقالعاده از خانم Mary Poppendieck در مورد آیندهٔ نرمافزار را دیدم، متوجه شدم که مسیری که طی کرده بودیم کاملاً قابل پیشبینی بود و احتمالاً حداقل تا چند سال آتی هم این مسیر معقول بماند.
تا اینجای مقاله، اسمی از تکنولوژی خاصی نبردهام. بدین ترتیب خیالم راحت است که تا چند سالی مطالب بالا هنوز معنی خواهند داشت. بدی این کار این است که برای خوانندهٔ دست به آچار این مطالب زیادی نظری است و چیزی برای ور رفتن و تست کردن و حس پیدا کردن به آدم نمیدهد. در ادامه میخواهم یک سری تجربه/توصیهٔ دست به نقد در راستای پیاده کردن تئوریهای بالا مطرح کنم. از الان هشدار بدهم که ممکن است ترفندها و تکنولوژیهایی که مطرح میکنم در زمانی که این مطلب را میخوانید دیگر منقرض شده باشند.
طولانی شد! شاید بعداً کمی بیشتر در مورد دیلماج بنویسم. در انتها میخواهم این ویدئو را معرفی کنم که خیلی سریع ده تا از مهمترین چالشهای مهاجرت به دنیای مایکروسرویسها را مطرح میکند. در این مقاله به بعضیهایش اشاره کردهام ولی مرورش ضرری ندارد.
[*] در باب جنبهٔ انسانی موضوع، اگر علاقه دارید، به نظرم همچنان کتاب کلاسیک و پر عمق Peopleware: Productive Projects and Teams یکی از برترینهای این موضوع است. هر چند در زمان نوشتنش هنوز Scrum و دیگر متدلوژیهای اسمدار امروز معرفی نشده بودند، فصل مربوط به متدولوژیاش و تفاوت methodology با Big M Methodology اش کاملاً شما را به یاد بحثهای امروزه در مورد متدولوژیهای امروزه میاندازد. و البته راستش را بخواهید، فکر نکنم نویسندگان کتاب اگر نوشتهٔ درون پرانتز من در مورد کپی کردن متدولوژی را ببیند، خیلی خوششان بیاید! به هر حال هر کس نظری دارد.
[**] شاید عبارت شهرسازی بهتر باشد، چرا که دیگر با مجموعهای از نرمافزارها روبرو هستیم.