حالت تاریک
فصل ۳۲ — دوشنبه، ۱۰ نوامبر
دو هفتهٔ بعد با فعالیتهای تیم SWAT که بخش زیادی از وقت من و Wes و Patty را میگیرد، مثل برق میگذرد.
بیش از یک دهه است که تعامل روزانه با developerها نداشتهام. فراموش کرده بودم چقدر عجیبغریب میتوانند باشند. برای من بیشتر شبیه موزیسینهای indie هستند تا engineer.
در زمان من، developerها جامحافظ جیب میزدند—نه T-shirt vintage و صندل—و slide rule حمل میکردند، نه skateboard.
از خیلی جهات، بیشتر این بچهها temperamental opposite من هستند. آدمهایی را دوست دارم که process میسازند و دنبال میکنند، آدمهایی که rigor و discipline را value میکنند. اینها process را به نفع whim و whimsy رد میکنند.
اما خدا را شکر اینجا هستند.
میدانم stereotype کردن یک حرفه عادلانه نیست. میدانم همهٔ این skillهای متنوع برای موفقیت vital هستند. چالش این است چطور همهٔ ما را کنار هم بیاوریم تا به یک هدف کار کنیم.
اولین چالش: نام گذاشتن برای پروژهٔ تیم SWAT. نمیتوانستیم مدام «mini-Phoenix» صدا کنیم، پس بالاخره یک ساعت برای نام بحث کردیم.
بچههای من میخواستند «Cujo» یا «Stiletto» بگذارند. اما developerها میخواستند «Unicorn».
Unicorn؟ مثل rainbow و Care Bears؟
و خلاف همهٔ انتظاراتم، «Unicorn» در رأیگیری برنده میشود.
Developerها. هرگز نمیفهممشان.
صرفنظر از بیمیلیام به نام، Project Unicorn فوقالعاده شکل میگرفت. با هدف هر کاری لازم است برای تحویل customer recommendation و promotion مؤثر، با code base تمیزی شروع کردیم که کاملاً از غول پروژه Phoenix جدا بود.
شگفتانگیز بود این تیم چطور مانعها را از میان برداشت. یکی از اولین چالشها تحلیل customer purchase data بود که اولین دیوار آجری بود. حتی لمس production database یعنی link به libraryهایشان، و هر تغییری نیاز داشت architecture team را قانع کنیم approve کند.
چون تا آن زمان کل شرکت ممکن بود از کار افتاده باشد، developerها و Brent تصمیم گرفتند database کاملاً جدید با open source tool بسازند، با دادهٔ کپیشده نهفقط از پروژه Phoenix بلکه از order entry و inventory management system هم.
با این کار میتوانستیم develop، test و حتی در operations run کنیم بدون impact روی پروژه Phoenix یا applicationهای business-critical دیگر. و با decouple شدن از پروژههای دیگر، همهٔ تغییرات لازم را بدون به خطر انداختن پروژههای دیگر میتوانستیم بدهیم. همزمان در processهایی که لازم نبود part باشیم گیر نمیکردیم.
کاملاً این رویکرد را تأیید و تحسین کردم. با این حال، بخش کوچکی از من فکر میکرد اگر هر پروژه بتواند بهناگه database جدید بسازد، sprawl اجتنابناپذیر را چطور manage میکنیم. به خودم یادآوری میکنم standardize کنیم چه نوع databaseهایی میتوانیم در production بگذاریم تا skill درست برای پشتیبانی long-term داشته باشیم.
در همین حین Brent با تیم William build procedureها و مکانیزمهای automated ساخت که همزمان محیطهای Dev، QA و Production را میساختند کار کرد. همهٔ ما شگفتزده شدیم که در sprint سههفتهای، شاید برای اولین بار در حافظه، همهٔ developerها دقیقاً همان operating system، library version، database، database setting و غیره را استفاده میکردند.
«باورنکردنی است،» یکی از developerها در sprint retrospective گفت که در پایان هر sprint برگزار میشود. «برای پروژه Phoenix، سه یا چهار هفته طول میکشد developer جدید build را روی machine خودش run کند، چون هرگز فهرست کامل gazillion چیزی که برای compile و run لازم است جمع نکردهایم. اما حالا فقط virtual machineای که Brent و تیم ساختند را check out میکنیم و همه آمادهاند.»
بهطور مشابه، همهٔ ما شگفتزده شدیم اینقدر زود در پروژه محیط QA در دسترس بود که با Dev match میکرد. آن هم بیسابقه بود. bunchی adjustment لازم بود چون سیستمهای Dev حافظه و storage considerably کمتری از QA داشتند و QA کمتر از Production. اما اکثریت عظیم محیطها identical بودند و در چند دقیقه modify و spin up میشدند.
Automated code deployment هنوز کاملاً کار نمیکرد، و migration کد بین محیطها هم نه، اما تیم William به اندازهٔ کافی از آن capabilityها demo داده بود که همه مطمئن بودیم زود nail down میکنند.
علاوه بر این، developerها feature sprint goalهایشان را ahead of schedule زدند. گزارشهایی ساختند که «مشتریانی که این محصول را خریدهاند آن محصولات دیگر را هم خریدهاند» نشان میداد. گزارشها صدها برابر بیشتر از انتظار طول میکشید، اما قول دادند performance را بهبود میدهند.
بهخاطر پیشرفت سریع، تصمیم گرفتیم sprint interval را به دو هفته کوتاه کنیم. با این کار planning horizon را کم میکنیم تا تصمیمات را مکررتر بگیریم و اجرا کنیم، بهجای stick کردن به planی که تقریباً یک ماه پیش ساخته شده.
پروژه Phoenix همچنان با planی که بیش از سه سال پیش نوشته شده operate میکند. سعی میکنم زیاد به آن فکر نکنم.
پیشرفتمان بهنظر exponentially بهتر میشد. سریعتر از ever plan و execute میکردیم، و velocity gap بین Unicorn و Phoenix مدام بزرگتر میشد. تیمهای Phoenix متوجه شدهاند و شروع کردهاند practiceها را left and right borrow کنند و resultهایی میگیرند که فکر نمیکردیم ممکن باشد.
momentum Unicorn غیرقابل توقف به نظر میرسد و حالا life of its own دارد. شک دارم حتی اگر میخواستیم بتوانستیم آنها را متوقف کنیم و به روش قدیمی برگردانیم.
در وسط جلسهٔ بودجهبندی، Wes زنگ میزند. «مشکل بزرگی داریم.»
از اتاق بیرون میروم و میگویم: «چی شده؟»
«دو روز است کسی Brent را پیدا نکرده. ایدهای داری کجاست؟» میپرسد.
«نه،» جواب میدهم. «صبر کن، یعنی پیدایش نمیکنید؟ حالش خوب است؟ به cell phoneاش زدی، درسته؟»
Wes کلافگیاش را پنهان نمیکند. «البته به cell phoneاش زدم! هر ساعت برایش voicemail گذاشتهام. همه سعی میکنند پیدایش کنند. کار از گوشه و کنار ریخته و teammateهایش دارند دیوانه میشوند که—لعنتی، Brent دارد زنگ میزند… صبر کن…»
میشنوم desk phoneاش را برمیدارد و میگوید: «کجا لعنتی بودی؟ همه دنبالت میگردند! نه… نه… Des Moines؟ اونجا چه کار میکنی؟ کسی بهم نگفت… مأموریت مخفی برای Dick و Sarah؟ چه the fuck—»
چند لحظه با کمی amusement گوش میدهم Wes سعی میکند bottom line ماجرا را با Brent پیدا کند. بالاخره میشنوم میگوید: «یک لحظه صبر کن. ببینم Bill چه میخواهد…» و دوباره cell phoneاش را برمیدارد.
«باشد، بخشی ازش را شنیدی، درسته؟» به من میگوید.
«بگو Bill همین الان دارد بهش زنگ میزند.»
بعد از قطع، به Brent زنگ میزنم و فکر میکنم Sarah حالا چه کرده.
«سلام Bill،» میشنوم.
«میتوانی بگویی چه خبر است و چرا در Des Moines هستی؟» مؤدبانه میپرسم.
«کسی از دفتر Dick بهت نگفت؟» میپرسد. وقتی چیزی نمیگویم ادامه میدهد: «Dick و finance team دیروز صبح مرا عجلهای بیرون فرستادند تا بخشی از task force برای ساخت plan تجزیهٔ شرکت باشم. ظاهراً top priority project است و باید بفهمند implication برای همهٔ IT systemها چیست.»
«و چرا Dick تو را روی تیم گذاشت؟» میپرسم.
«نمیدانم،» جواب میدهد. «باور کن، نمیخواهم اینجا باشم. از airplane متنفرم. باید یکی از business analystهایشان این کار را بکند، اما شاید چون بیشترین را دربارهٔ اینکه major systemها چطور به هم وصلاند، کجا reside میکنند، همهٔ serviceهایی که depend on دارند… میدانم—الان میتوانم بگویم split up کردن شرکت complete nightmare خواهد بود.»
یادم میآید وقتی تیم یکپارچهسازی پس از خرید retailer بزرگ را رهبری کردم. پروژهٔ عظیمی بود. تجزیهٔ شرکت شاید حتی سختتر باشد.
اگر این روی هر کدام از صدها applicationی که پشتیبانی میکنیم اثر بگذارد، Brent احتمالاً حق دارد. سالها طول میکشد.
IT همهجا است، پس مثل بریدن یک limb نیست. بیشتر شبیه تجزیهٔ nervous system شرکت است.
با یادآوری اینکه Dick و Sarah یکی از key resourceهایم را بدون حتی پرسیدن از من برداشتند، آهسته و با تأکید میگویم: «Brent، با دقت گوش کن: مهمترین priority تو این است بفهمی teammateهای Unicorn چه نیاز دارند و به آنها برسانی. اگر لازم است flightت را miss کن. چند تماس میزنم، اما احتمال زیاد assistant من Ellen برایت return flight امشب book میکند. فهمیدی؟»
«میخواهی عمداً flightت را miss کنی،» میگوید.
«بله.»
«به Dick و Sarah چه بگویم؟» با تردید میپرسد.
لحظهای فکر میکنم. «بگو من به emergency call نیازت دارم و بعد catch up میکنی.»
«باشد…» میگوید. «اینجا چه خبر است؟»
«ساده است Brent،» توضیح میدهم. «Unicorn آخرین امید ما برای زدن quarterly number است. یک quarter دیگر blown، هیئتمدیره حتماً شرکت را split میکند و آن وقت میتوانی به task force کمک کنی. اما اگر numberها را بزنیم، شانس داریم شرکت را با هم نگه داریم. به همین دلیل Unicorn absolute highest priority ماست. Steve روی این خیلی واضح بود.»
Brent با تردید میگوید: «باشد. فقط بگو کجا بروم، میآیم. بحث با mucky-mucks را به تو میسپارم.» clearly از سیگنالهای متناقضی که به او میرسد عصبانی است.
اما نه به اندازهٔ من.
به assistant Steve، Stacy، زنگ میزنم و میگویم در راهم.
در راه به Building 2 برای پیدا کردن Steve، به Wes زنگ میزنم.
«چی کار کردی؟» میخندد. «عالی شد. الان وسط نبرد سیاسی با Steve از یک طرف و Dick و Sarah از طرف دیگر هستی. و راستش، مطمئن نیستم طرف برنده را انتخاب کرده باشی.»
بعد از لحظهای میگوید: «واقعاً فکر میکنی Steve این بار پشت ما میایستد؟»
آه میکشم و suppress میکنم. «امیدوارم. اگر Brent را full-time برنگردانیم، Unicorn غرق میشود. و احتمالاً یعنی CEO جدید، outsource شدن، و همینطور figure out کردن split up شرکت. به نظرت job fun میآید؟»
قطع میکنم و وارد دفتر Steve میشوم. لبخند ضعیفی میزند و میگوید: «صبح بخیر. Stacy میگوید bad news برایم داری.»
وقتی آنچه در تماس با Brent فهمیدم میگویم، شگفتزده میبینم صورتش scarlet میشود. فکر میکردم از همهٔ این خبر دارد، با توجه به اینکه CEO است.
واضحاً نه.
بعد از لحظهای بالاخره میگوید: «هیئتمدیره به من اطمینان داد تا ببینیم این quarter چطور میشود بیشتر در مسیر تجزیهٔ شرکت پیش نمیروند. فکر میکنم صبرشان تمام شده.»
ادامه میدهد: «پس بگو اگر Brent reassign شود impact به Unicorn چیست.»
«با Chris، Wes و Patty حرف زدم،» جواب میدهم. «Project Unicorn کاملاً غرق میشود. من بهطور طبیعی skeptical هستم، اما واقعاً فکر میکنم Unicorn کار میکند. با Thanksgiving فقط دو هفته فاصله، Brent بخش significant از capabilityهایی که لازم داریم را own میکند. و راستش، خیلی از breakthroughهایی که داریم توسط تیم Phoenix copy میشوند، که fantastic است.»
برای تأکید با قطعیت میگویم: «بدون Brent، هیچکدام از sales و profit goalهایی که به Unicorn وصل کردهایم را نمیزنیم. هیچ شانسی.»
لبهایش را جمع میکند و میپرسد: «و اگر Brent را با next best guy backfill کنی؟»
به Steve آنچه Wes گفته بود را relay میکنم که mirror thinking خودم بود. «Brent خیلی unique است. Unicorn کسی لازم دارد که respect developerها را دارد، experience عمیق با تقریباً هر نوع IT infrastructure داریم، و میتواند describe کند developerها چه باید بسازند تا واقعاً در production manage و operate کنیم. آن skillها rare هستند و کسی دیگر نداریم که الان rotate into این special role کند.»
«و اگر next best person را به task force Dick assign کنی؟» میپرسد.
«حدس میزنم breakup planning بهاندازهٔ accurate نباشد اما still just fine complete شود،» جواب میدهم.
Steve به صندلی تکیه میدهد و چیزی نمیگوید.
بالاخره میگوید: «Brent را برگردان. بقیه را با من.»