فصل ۸

تصمیم‌های فناوری (Technology decisions)

این فصل پوشش می‌دهد (This chapter covers)

تصمیم‌گیری درباره فناوری‌هایی که شرکت بر پایه آن‌ها کار خواهد کرد، یکی از مهم‌ترین مسئولیت‌های یک CTO است. ما دوست داریم صنعت خود را سریع، دائماً در حال تغییر و همیشه در حال تکامل ببینیم؛ اما واقعیت این است که یک production system ممکن است دهه‌ها بدون تغییر جدی به کار ادامه دهد. این واقعیت کمی ترسناک است: سیستمی که امروز می‌سازید، شاید زمانی که به بازنشستگی فکر می‌کنید هنوز در حال اجرا باشد.

چرا یک سیستم می‌تواند این‌قدر طولانی عمر کند؟ دلایل رایج عبارت‌اند از:

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

از دل تجربه: سیستم‌های چهل‌ساله

در پروژه‌های زیادی پس از خرید یک شرکت وارد برنامه‌های modernization شده‌ام؛ جایی که مالکان جدید حاضر بوده‌اند هزینه کنند تا platform را به stack امروزی منتقل کنند. سیستم‌های قدیمی معمولاً هزینه عملیاتی زیاد، امنیت ضعیف و scalability محدود دارند. قدیمی‌ترین موردی که دیده‌ام ۴۶ سال عمر داشت و IBM RPG را از طریق green-screen terminal اجرا می‌کرد. رایج‌تر از آن، سیستم‌های ۳۰ تا ۴۰ ساله مبتنی بر Cobol یا برنامه‌های حدوداً ۳۰ ساله ساخته‌شده با زبان‌های 4GL GUI مانند Visual Basic، Gupta و Delphi هستند. همه آن‌ها یک ویژگی مشترک دارند: با هر سنی، برای موفقیت شرکت حیاتی‌اند. اگر آن سیستم‌ها کار نکنند، کسب‌وکار دوام نمی‌آورد.

هنگام انتخاب یک فناوری، دست‌کم این پرسش‌ها را مطرح کنید:

نمونه روشن، برنامه‌های قدیمی Visual Basic از میانه دهه ۱۹۹۰ هستند؛ برنامه‌هایی وابسته به کتابخانه‌های third-party که سال‌هاست پشتیبانی نمی‌شوند و روی Windows 95/XP گیر کرده‌اند و انتقالشان به Windows مدرن ممکن نیست. Microsoft در نهایت تلاش برای سازگاری کامل رو به عقب را کنار گذاشت و در Windows 10 یک Windows XP virtual machine کامل ارائه کرد تا دست‌کم مسیری برای ادامه حیات این legacy appها وجود داشته باشد.

نمونه‌های دیگری هم از منسوخ‌شدن فناوری و اجبار شرکت‌ها به اقدام اصلاحی وجود دارد. زمانی browser pluginها بسیار محبوب بودند و با Adobe/Macromedia Flash، Microsoft Silverlight یا Java Applet می‌شد تجربه‌ای شبیه desktop داخل صفحه وب ساخت. با ظهور HTML5 و پیشرفت جدی JavaScript، این pluginها هم از نظر سن و هم از نظر امنیت عقب ماندند و طی چند سال از browserهای جدید حذف شدند.

نتیجه این است که فقط stack داخلی خودتان مهم نیست؛ همه سیستم‌های third-party که به آن‌ها وابسته‌اید نیز باید زیر نظر باشند. به‌روز نگه‌داشتن software حیاتی است؛ موضوعی که در فصل ۱۳ با جزئیات بیشتری بررسی می‌شود.

۸.۱ جلوگیری از قفل‌شدن به فروشنده (Avoid vendor lock-in)

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

چه انتخاب شما یک vendor باشد، چه یک زبان یا framework، باید از تصمیمی دوری کنید که بدون راه خروج عملی شما را به همان انتخاب قفل کند. هدف این است که بتوانید بخشی از محیط را تغییر دهید، بدون اینکه ناچار به full rewrite شوید.

گفتنش آسان‌تر از انجام‌دادن آن است و بسیاری از CTOها و Architectهای خوش‌نیت در مقطعی از حرفه خود در این زمینه شکست خورده‌اند. مسیرهایی که آزادی عمل آینده را بیشتر می‌کنند، معمولاً دشوارتر و گاهی گران‌ترند. بهتر است این هزینه را شبیه حق بیمه ببینید: اگر اتفاقی افتاد، گزینه‌ای دارید که جلوی دردسر و هزینه بسیار بزرگ‌تر را بگیرد.

از دل تجربه: گیر افتادن در Flash

یکی از مشتریان من software مدیریت SAN خود را سال‌ها upgrade نکرده بود. وقتی برای یک تغییر کوچک به آن نیاز پیدا کرد، همه از console بیرون مانده بودند، چون نرم‌افزار مدیریت SAN با Flash منسوخ‌شده Macromedia ساخته شده بود. ناچار شدیم یک laptop قدیمی پیدا کنیم که مدت‌ها به network متصل نشده و auto-update نگرفته بود. پس از ورود، SAN را upgrade کردیم و admin console از Flash به HTML5 منتقل شد.

Java نمونه خوبی از یک زبان اصلی با گزینه‌های متعدد است. Java برای حل مسئله تنوع زبان‌های وابسته به processor در embedded development شکل گرفت. با ایجاد یک virtual machine انتزاعی، developer می‌تواند با یک زبان استاندارد و portable کد بنویسد و JVM ارتباط میان hardware/operating system و code را برقرار کند.

Java چندین JVM با performance بالا دارد، از جمله Oracle، IBM، OpenJDK و Amazon، بدون آنکه برای جابه‌جایی میان آن‌ها لازم باشد حتی یک خط Java تغییر کند. چه Java را روی Linux اجرا کنید، چه Windows یا Cloudهای Amazon، Google یا Microsoft، code همان است. در نتیجه روی operating system، virtual machine و environment کنترل دارید، بدون اینکه تیم development را مختل کنید.

اگر solution شما هزینه license دارد، از ابتدا برای افزایش قیمت آن برنامه داشته باشید. آیا افزایش قیمت بودجه را به‌طور جدی به‌هم می‌زند؟ بسیاری از سازمان‌ها بعداً از خرید licenseهای Oracle یا SQL Server پشیمان شده‌اند؛ چون قیمت‌ها بالا رفته، flexibility کمتر شده ــ مثلاً انتقال به Cloud دشوار شده ــ و در نهایت فهمیده‌اند از هیچ قابلیت خاص vendor استفاده نمی‌کنند.

از platform یا softwareی که هیچ جایگزینی ندارد دوری کنید. در چنین مسیری، کاملاً به feature set و pricing همان vendor وابسته می‌شوید. این موضوع درباره ابزارهای back-office مانند Office 365، Google Workspace و Salesforce نیز صدق می‌کند. البته برای بعضی کاربردها این trade-off پذیرفتنی است، به‌خصوص برای vendorهای بزرگی که معمولاً تغییر قیمت ناگهانی و بسیار مخرب ندارند.

هدف این است که چند «راه خروج» داشته باشید؛ شبیه بازیکن خوب poker که همه امید خود را به آمدن یک کارت خاص نمی‌بندد. در برنامه‌ریزی enterprise نیز نمی‌دانید در گوشه بعدی چه چیزی منتظر شماست: شاید کسب‌وکار pivot کند، شاید جهت عوض شود، یا شاید یک تغییر بیرونی کل یک صنعت فرعی را وارد بحران کند. واکنش مناسب به چنین تغییرهایی مسئولیت CTO است. مدیریت و تأمین بودجه upgradeهای کوچک و تدریجی، تقریباً همیشه بهتر از rewrite بزرگ و یک‌باره است.

۸.۲ ساخت در برابر خرید (Build vs. Buy)

مقایسه دست‌کشیده ساخت نرم‌افزار اختصاصی با خرید راهکار آماده
ساخت و خرید دو انتخاب مطلق نیستند؛ تصمیم درست از مزیت رقابتی، هزینه، زمان و توان تیم آغاز می‌شود.

در میان بحث‌های کلاسیک فناوری ــ از جمله tabs در برابر spaces ــ یکی از موضوعاتی که خواب را از چشم بسیاری از متخصصان می‌گیرد، انتخاب میان Build و Buy است. اثر این تصمیم فقط به engineering department محدود نمی‌شود و معمولاً تا سطح board نیز درباره آن بحث می‌شود.

در یک سمت، management تصور می‌کند با خرید یک solution می‌توان «یک‌شبه» به نتیجه رسید. در سمت دیگر، technologistها گرفتار سندرم Not Invented Here می‌شوند و باور دارند خودشان می‌توانند محصولی بهتر و ارزان‌تر بسازند. واقعیت معمولاً جایی بین این دو است.

Enterprise software مثل Microsoft Word نیست؛ هیچ off-the-shelf softwareای دقیقاً کسب‌وکار شما را اداره نمی‌کند. اگر چنین نرم‌افزاری وجود داشت، احتمالاً شرکت نیازی به CTO نداشت. یک رستوران معمولی می‌تواند از سرویس‌های آماده مدیریت رستوران و integrationهایی مانند DoorDash و Uber Eats استفاده کند. اما اگر McDonald’s باشید و franchiseهای سراسر جهان را اداره کنید، solution اختصاصی لازم دارید ــ و CTO برای اداره آن.

از سوی دیگر، بازاختراع چرخ هم منطقی نیست. solutionهای واقعاً منعطف زمانی شکل می‌گیرند که بدانید کجا باید نوآوری کنید و بسازید، و کجا باید از tool، service یا open source library آماده استفاده کنید.

ابتدا مشخص کنید IPR یا همان «راز رقابتی» شما کجاست؛ همان‌جا باید استراتژی Build متمرکز شود. این بخش چیزی است که سازمان شما را از رقبا متمایز می‌کند؛ شاید code اختصاصی باشد یا شیوه منحصربه‌فرد integration چند component. هر چیزی بیرون از این حوزه ممکن است فقط حواس‌پرتی و حل دوباره مسئله‌ای باشد که قبلاً حل شده است. با هر گرایشی، لازم است هر دو مسیر را با due diligence یکسان و بدون تعصب ارزیابی کنید.

۸.۲.۱ خرید (Buy)

هنگام ارزیابی مسیر Buy، این موارد را در نظر بگیرید:

زمان لازم برای research، shortlist و evaluation را دست‌کم نگیرید. به sales pitchهای حرفه‌ای vendorها با احتیاط نگاه کنید. همان‌طور که در software development فقط روی whiteboard همه‌چیز بدون خطا کار می‌کند، پیش از امضای قرارداد هم solution هر vendor سریع‌ترین، بهترین و ساده‌ترین گزینه دنیا معرفی می‌شود. این مرحله ممکن است ماه‌ها طول بکشد و وقت زیادی از تیم بگیرد.

برای منظم‌کردن ارزیابی، نیازمندی‌ها را فهرست و هر مورد را به must-have یا nice-to-have تقسیم کنید. این فهرست مبنای مقایسه platformها می‌شود و وقتی به دو گزینه نهایی رسیدید، تمرکز لازم برای اجرای Proof of Concept را فراهم می‌کند.

جدول ۸.۱ — مزایا و معایب خرید

مزایا معایب
platform اثبات‌شده و test‌شده مالک IPR کل solution stack نیستید
Time to Market کوتاه‌تر Vendor lock-in
شبکه support حرفه‌ای feature set محدود یا غیرمنعطف
در SaaS نگران scalability، security patch و software update نیستید جذب نیروی متخصص ممکن است سخت‌تر باشد
bug fix و feature release تابع برنامه vendor است
رقبا نیز به همان toolها دسترسی دارند

یک هشدار: اگر solutionی تقریباً بدون configuration و complication دقیقاً همان کاری را انجام می‌دهد که می‌خواهید و شما را سریع به production می‌رساند، فرض کنید رقیبتان نیز می‌تواند همین کار را انجام دهد. شاید فناوری شما آن‌قدر که فکر می‌کنید IPR منحصربه‌فرد نداشته باشد.

از دل تجربه: خرید بزرگ

هرچه تعهد مالی و عملیاتی شما به vendor بزرگ‌تر باشد، منطقی‌تر است از او بخواهید ثابت کند solution در محیط شما کار می‌کند. vendor می‌تواند engineerهای خود را برای ساخت چند Proof of Concept درگیر کند. این بخشی از technical sale است و شرکت‌های بزرگ software تیم‌هایی ویژه برای قبل و بعد از فروش دارند؛ درست شبیه نمایندگی خودرو که اجازه می‌دهد ماشین را برای یک test drive یا حتی یک آخرهفته تحویل بگیرید.

۸.۲.۲ ساخت (Build)

Build یعنی منابع development را به ساخت یک solution اختصاصی برای نیازهای شرکت اختصاص دهید. این مسیر ممکن است زمان بیشتری ببرد، اما در نهایت دقیقاً همان چیزی را می‌سازد که کسب‌وکار نیاز دارد. Build تعهد بزرگی است، به‌خصوص برای سازمانی که منابع لازم را از قبل ندارد. این مسیر برای شرکتی طبیعی‌تر است که infrastructure توسعه و تیم مناسب را در اختیار دارد.

جدول ۸.۲ — مزایا و معایب ساخت

مزایا معایب
کنترل کامل روی feature set محصول نیاز به Product Management، design، architecture، implementation و delivery
کنترل کامل روی environment زمان ساخت طولانی‌تر
بازار recruitment عمومی‌تر و قابل‌دسترس‌تر effort بیشتر برای planning و resourcing
مالکیت کامل IPR solution محصول به‌اندازه گزینه آماده test‌شده نیست
واکنش سریع‌تر به bug و feature request support باید داخل سازمان تأمین شود

ترکیب خوب این است که هرجا می‌توانید Buy کنید و برای flexibility و customization واقعی Build کنید. Build به معنای ساختن همه‌چیز از صفر نیست. می‌توانید componentهای commodity را integration کنید؛ مثلاً ارسال email را به یک third-party service بسپارید یا analytics پیچیده را به BI solution بدهید و فقط raw data را وارد آن کنید.

در این مسیر نیز از solutionهای Low-code/No-code با احتیاط استفاده کنید. این‌ها نسخه مدرن Visual Basic هستند و به nondeveloper اجازه می‌دهند با point-and-click یا drag-and-drop چیزی بسازند. چنین ابزارهایی خیلی سریع شما را به ۸۰ درصد نتیجه می‌رسانند، اما بستن ۲۰ درصد پایانی ممکن است زمان بسیار بیشتری بگیرد، چون tool انعطاف لازم را ندارد. بدتر آنکه شاید برای توجیه ابزار، نیاز کسب‌وکار را قربانی کنید. سؤال این است: آیا رقیبتان هم همین مصالحه را می‌پذیرد یا با featureهای بهتر از شما عبور می‌کند؟

۸.۲.۳ ملاحظات (Considerations)

گرایش شما به Build یا Buy معمولاً از محیطی می‌آید که در آن تجربه کسب کرده‌اید. این تصور که همه CTOها به‌طور پیش‌فرض عاشق Build هستند، غلط است:

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

از دل تجربه: معماری Enterprise

هنگام architect کردن enterpriseهای بزرگ، در ابتدا فرض می‌کنم قرار است همه‌چیز را Build کنیم. هنوز تصمیمی نگرفته‌ام؛ این فقط نقطه شروع برای شکستن problem spaceها به بخش‌های قابل‌مدیریت است. هرچه requirementهای هر بخش روشن‌تر می‌شود، مه کنار می‌رود و candidateهای مناسب برای Buy ــ از جمله componentهای commodity ــ خودشان را نشان می‌دهند.

هیچ تصمیمی کاملاً binary نیست و همیشه ناحیه خاکستری وجود دارد. platformهایی مانند Salesforce میان دو جهان Build و Buy قرار می‌گیرند: ecosystem بزرگی از componentهای آماده دارند، اما هم‌زمان محیطی کامل برای توسعه code قابل‌توجه فراهم می‌کنند.

قاعده ساده برای چنین platformهایی این است: اگر نمی‌توانید code خود را بردارید، روی platform دیگری بگذارید و اجرا کنید، در عمل Vendor lock-in دارید. موفقیت شما به vendor وابسته است و اگر downtime یا performance degradation رخ دهد، کاری جز صبرکردن ندارید.

۸.۲.۴ چک‌لیست ارزیابی (Evaluation checklist)

برای مقایسه درست Build و Buy باید روشمند باشید و بتوانید تصمیم را برای CEO یا CFO توضیح و دفاع کنید؛ چون برای موفقیت به حمایت آن‌ها نیاز دارید. ابتدا تعیین کنید چه چیزی برای کسب‌وکار مهم است و success criteria این initiative چیست.

جدول ۸.۳ — نمونه ارزیابی ساخت در برابر خرید

معیار گرایش محتمل
باید به تغییرات مشتری و feature request سریع واکنش دهیم بیشتر به سمت Build
نمی‌خواهیم هیچ infrastructureای را مدیریت کنیم بیشتر به سمت Buy
استفاده از development team فعلی مزیت دارد بیشتر به سمت Build
IPR solution مهم نیست و core business محسوب نمی‌شود بیشتر به سمت Buy
داده باید مستقیماً برای سیستم‌های دیگر قابل‌دسترسی باشد بیشتر به سمت Build
solution را افراد nonengineering اداره خواهند کرد بیشتر به سمت Buy
Time to Market مهم‌ترین معیار است معمولاً بیشتر به سمت Buy

اگر جمع‌بندی checklist به سمت Buy است، investigation را روی همان مسیر متمرکز کنید. تصمیم باید data-driven باشد، نه gut-driven.

نکته مهم دیگر این است که Buy معمولاً moat سازمان را کوچک‌تر می‌کند. Moat اصطلاحی در سرمایه‌گذاری است و نشان می‌دهد تقلید از مزیت شرکت برای رقبا چقدر سخت است. اگر toolهای third-party آماده می‌خرید، رقیب نیز می‌تواند همان toolها را بخرد. البته در کسب‌وکاری که IPR آن فناوری نیست، این موضوع شاید اهمیت کمتری داشته باشد.

۸.۳ ابر در برابر زیرساخت داخلی (Cloud vs. on-prem)

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

برای بسیاری از سازمان‌های امروزی، حتی بحثی درباره خرید و اداره server فیزیکی شکل نمی‌گیرد. در مقابل، بعضی سازمان‌ها سرمایه‌گذاری سنگینی روی hardware موجود دارند و توجیه اقتصادی انتقال به Cloud برایشان دشوار است. در این بخش مزایا و معایب هر دو مسیر، شیوه استفاده بهتر از hardware موجود و خطاهای رایج Cloud را بررسی می‌کنیم.

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

در Cloud، معادل این تکامل را Cloud-native می‌نامیم: application از ابتدا برای استفاده از resourceهای on-demand ساخته شده و می‌تواند به‌صورت خودکار scale up و scale down کند.

بااین‌حال گاهی اداره hardware خودتان منطقی‌تر است:

۸.۳.۱ ابر (Cloud)

در این بخش نقاط قوت و ضعف Cloud را بررسی می‌کنیم.

مقاومت در برابر Cloud

Cloud در بیست سال گذشته بسیار بالغ شده و بسیاری از نقدهای قدیمی آن پاسخ گرفته‌اند. بااین‌حال هنوز شرکت‌هایی وجود دارند که حتی حاضر به بررسی آن نیستند. چند استدلال رایج را مرور کنیم:

Cloud نیز مانند هر ابزار دیگری برای نتیجه‌دادن به skill مناسب نیاز دارد و درمان همه مشکلات نیست.

۱۰ علامت هشدار که نشان می‌دهد از Cloud درست استفاده نمی‌کنید

بعضی سازمان‌ها با افتخار می‌گویند «روی Cloud هستیم»، اما کمی که دقیق شوید می‌بینید فقط serverهای خود را به data center یک vendor منتقل کرده‌اند؛ نه مزایای واقعی Cloud را گرفته‌اند و نه لزوماً هزینه کمتری می‌پردازند. موارد زیر زنگ خطرند:

اگر Cloud را مثل data center و فقط مجموعه‌ای از serverها ببینید، نه flexibility می‌گیرید و نه صرفه‌جویی. بسیاری از deploymentهای Cloud فقط به‌دلیل برداشت اشتباه از ماهیت Cloud، گران‌تر از hardware معادل تمام می‌شوند.

Private Cloud و Hybrid Cloud

اکثر افراد Cloud را با Public Cloud یکی می‌دانند، اما برای سازمانی که hardware زیادی در اختیار دارد، Private Cloud می‌تواند مسیر مناسبی باشد. با نصب Cloud OS و مدیریت resourceها به‌صورت pool و usage-based، می‌توان عمر مفید hardware را افزایش داد. solutionهای commercial و open source مختلفی وجود دارد.

این مسیر فقط زمانی پیشنهاد می‌شود که منابع و skill لازم برای اداره pool خصوصی را داشته باشید. stability و reliability بهتر می‌شود، زیرا workload را می‌توان از hardware معیوب دور کرد؛ اما overhead نگهداری hardware همچنان باقی است.

گام طبیعی بعدی Hybrid Cloud است: ترکیب Private و Public Cloud. وقتی resourceهای Private Cloud کافی نیست، Public Cloud می‌تواند کمبود را به‌صورت شفاف جبران کند.

ساختن یک Cloud موفق

برای کسی که با hardware سنتی بزرگ شده، Cloud می‌تواند غریبه و ترسناک باشد، اما skillهای قبلی از بین نمی‌روند؛ فقط سؤال را باید دوباره frame کرد: «این مسئله را در hardware چگونه حل می‌کردم و معادل درست آن در Cloud چیست؟»

سه اصل اساسی:

Cloud بسیاری از مشکلات hardware سنتی را حذف می‌کند، اما کار را لزوماً آسان‌تر نمی‌کند؛ فقط جنس مسئله‌ها تغییر می‌کند.

از دل تجربه: تولید عسل

برای توضیح تفاوت legacy app و Cloud-native app از زنبور استفاده می‌کنم. طبیعت تولید عسل را به موفقیت یک زنبور وابسته نکرده است؛ مرگ یک زنبور خط تولید را متوقف نمی‌کند. application خوبِ Cloud-native نیز failure را در DNA خود دارد. در مقابل، بسیاری از enterpriseها شبیه یک زنبور غول‌پیکر مهندسی‌شده‌اند که تا وقتی زنده است همه عسل را تولید می‌کند، اما با مرگ آن کل production می‌خوابد. دنیای software پر از همین زنبورهای غول‌پیکر است.

۸.۳.۲ زیرساخت داخلی (On-prem)

On-premises اصطلاحی کلی برای خرید، provision و مدیریت hardware فیزیکی موردنیاز سازمان است. این hardware الزاماً در office نیست و ممکن است در data center اختصاصی یا colocation قرار داشته باشد. در این بخش هم ایجاد محیط جدید و هم نگهداری محیط موجود را بررسی می‌کنیم.

در گذشته، اداره hardware تنها روش تأمین چندین server بود. برآورد ظرفیت نیز دشوار بود: شرکت یا hardware بیش از حد می‌خرید و بخش بزرگی بلااستفاده می‌ماند، یا کمتر از نیاز می‌خرید و در زمان load بالا هم hardware و هم کارکنان تحت فشار قرار می‌گرفتند. server باید سفارش داده شود، تحویل برسد، provision و install شود؛ فرایندی که هفته‌ها زمان می‌برد. scaling on-demand سریع نیست و پیش از همه این‌ها باید CFO را برای capital expenditure قانع کنید.

امروز Private Cloud می‌تواند بخشی از این مشکل را کاهش دهد. hardware در یک pool قرار می‌گیرد و بر اساس نیاز تقسیم می‌شود. مثلاً هنگام کمپین آنلاین، می‌توان چند server داخلی کم‌اهمیت را خاموش و resource آن‌ها را به frontline service داد. بااین‌حال pool شما محدود است و فقط به اندازه hardware موجود ظرفیت دارید.

محل میزبانی

برای physical hosting دو انتخاب اصلی دارید:

server مانند گیاهی است که برای زنده‌ماندن به منابع مشخص نیاز دارد؛ فقط به‌جای نور و آب، power، cooling و network می‌خواهد. hardware جدید نسبت به نسل‌های قدیمی گرمای کمتری تولید می‌کند، اما همچنان cooling لازم است. اگر server را در کمد بدون A/C بگذارید، هنگام بازکردن در با دیواری از گرما روبه‌رو می‌شوید.

Power نیز معمولاً دست‌کم گرفته می‌شود. فقط اتصال به پریز کافی نیست؛ باید circuit تحمل load را داشته باشد، برق از spike آسیب‌زا پاک باشد و هنگام قطع شبکه برق، UPS یا منبع جایگزین وجود داشته باشد.

از دل تجربه: محیط تمیز

اوایل کارم، تازه از دانشگاه بیرون آمده بودم و serverها در اتاق کناری آرام کار می‌کردند. ناگهان همه‌چیز به‌هم ریخت؛ همه serverها هم‌زمان خاموش شده بودند. وسط شلوغی فقط صدای منظم جاروبرقی می‌آمد. نیروی خدماتی جدید، بی‌خبر از اهمیت دستگاه، plug server را کشیده بود تا جاروبرقی را وصل کند. از آن روز هیچ‌وقت power را بدیهی فرض نمی‌کنم.

Network خون حیاتی server است. فقط وصل‌کردن کابل RJ45 کافی نیست. باید مطمئن شوید فقط traffic امن وارد می‌شود و برای قطع ارتباط Internet نیز راه جایگزین دارید. architectureهای چندserverه پیچیده‌ای وجود دارند که در نهایت همه به یک کابل بیرونی وابسته‌اند؛ شکوه architecture، روی یک single point of failure باریک.

Data center تخصصی این موارد را مدیریت می‌کند و متناسب با آن هزینه می‌گیرد. pricing معمولاً بر دو معیار است:

هزینه power معمولاً در قیمت لحاظ می‌شود. serverهای rack-ready بلند و تخت‌اند تا عمودی و فشرده نصب شوند و به‌دلیل ظاهرشان گاهی pizza box نامیده می‌شوند. این مدل‌ها معمولاً از serverهای tower گران‌ترند.

Data center همچنین network equipment، private network و redundancy برای Internet فراهم می‌کند. در office، خودتان باید router، switch یا hub، firewall، cooling و backup power آن‌ها را design و نگهداری کنید.

Provisioning و Maintenance

پیش از خرید hardware باید configuration شامل CPU، memory و disk را مشخص کنید و تا حد امکان امکان upgrade آینده را در نظر بگیرید. پس از تحویل باید operating system نصب شود، softwareهای غیرضروری حذف شوند، security protocolها اعمال و جایگاه machine در network تعریف شود. همه این مراحل زمان می‌برد.

اگر self-host می‌کنید، room اختصاصی، قفل‌شونده، دارای ventilation و power مستقل در نظر بگیرید. چیدمان hardware باید منطقی باشد و cableها واضح label و مهار شوند.

برای hardware inventory یک سیستم داشته باشید؛ حتی اگر در شروع فقط نوشتن روی box با marker یا چسباندن barcode باشد. اطلاعات مهم عبارت‌اند از:

ثبت این داده‌ها مدیریت hardware و preventive maintenance را ساده می‌کند. مستندسازی هنگام نصب، زمانی که همه اطلاعات جلوی دست شماست، بسیار آسان‌تر از چند سال بعد است.

از دل تجربه: بخشی از مبلمان

self-hostingهای ترسناک زیادی دیده‌ام. بدترین مورد، تنها server اصلی شرکت بود که زیر میز یکی از developerها قرار داشت و مرتب به‌عنوان زیرپایی استفاده می‌شد. به همان power strip وسایل عادی وصل بود و هیچ علامتی برای «قطع نکنید» نداشت. خوشبختانه این وضعیت خیلی سریع اصلاح شد.

اداره serverهای خودتان ــ حتی serverهای Cloud ــ maintenance می‌خواهد. updateهای operating system آشنا هستند، اما software و firmware خود hardware اغلب فراموش می‌شود. SAN، router، server blade chassis و deviceهای مشابه console و firmware دارند و باید مرتب update شوند.

maintenance hardware دشوارتر است. جایگزینی componentی که هنوز fail نشده، از نظر مالی سخت توجیه می‌شود؛ اما بهتر است دست‌کم replacement آن را از قبل تهیه یا source کنید. hardware سریع از بازار خارج می‌شود و backward compatibility آن کمتر از چیزی است که تصور می‌کنیم؛ به همین دلیل بعضی شرکت‌ها برای spare part به بازار دست‌دوم و eBay پناه می‌برند.

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

۸.۴ بازیابی بحران (Disaster recovery)

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

ابتدا تعریف کنیم Disaster Recovery (DR) چیست. اگر از دسترس خارج‌شدن enterprise ــ به هر دلیل ــ آسیب جدی به مشتریان می‌زند، DR یعنی برای زمان وقوع حادثه برنامه‌ای داشته باشید تا یک محیط جایگزین operation را ادامه دهد. معمولاً این محیط در location جغرافیایی متفاوتی از primary قرار می‌گیرد تا حادثه‌هایی مانند آتش‌سوزی، سیل یا سرقت هر دو محیط را هم‌زمان درگیر نکند.

از دل تجربه: حمله Godzilla

اوایل حرفه‌ام وقتی برای اولین‌بار اصطلاح Disaster Recovery را شنیدم، فوراً Godzilla را تصور کردم که در شهر راه می‌رود و ساختمان‌ها را ویران می‌کند. مدتی طول کشید تا بفهمم disaster معمولاً اتفاق‌های «معمولی‌تری» مانند آتش‌سوزی، سیل، سرقت، قطع power، network یا hardware failure است. بااین‌حال هنوز هم با شنیدن DR اولین تصویر ذهنی‌ام Godzilla است.

در یک application واقعاً Cloud-native و درست architectشده، DR تا حد زیادی در خود architecture تعبیه شده و event جداگانه‌ای به نام «فعال‌کردن DR» وجود ندارد. اما صرف حضور در Cloud به معنای آمادگی در برابر disaster نیست. بحث این بخش بیشتر درباره applicationهای non-cloud-native است.

CTO مسئول تداوم operation فناوری در شرایط خوب و بد است. DR ساده نیست. بسیاری از سازمان‌ها strategy ضعیف ــ یا عملاً هیچ strategy ــ ندارند. بعضی هم تصور می‌کنند DR خوبی دارند، اما هرگز آن را test نکرده‌اند؛ در نتیجه چیزی جز placebo و یک safety net بدون اتصال واقعی نیست.

سه سؤال پایه strategy شما را شکل می‌دهد:

برای بحث، دو zone را فرض کنیم: zone فعال و zone backup که آماده تحویل‌گرفتن operation است. البته می‌توان چند backup zone داشت. به خاطر داشته باشید اگر فقط یک backup دارید، از لحظه‌ای که روی آن اجرا می‌شوید دیگر backup دیگری برای همان backup وجود ندارد.

۸.۴.۱ تحمل زمان قطعی (Downtime tolerance)

برای CEO آسان است که zero downtime بخواهد؛ اما چنین هدفی بسیار گران و پیچیده است، به‌خصوص وقتی بعضی componentهای enterprise قابلیت اجرای چند instance هم‌زمان را ندارند.

Database نمونه کلاسیک است. بسیاری از سازمان‌ها table و keyهای خود را برای real-time redundancy طراحی نکرده‌اند. اگر به primary keyهای auto-increment وابسته‌اید و از GUID یا strategy مناسب distributed استفاده نمی‌کنید، synchronization میان zoneها سخت‌تر می‌شود. legacy systemها و architectureهای ضعیف معمولاً برای یک نسخه duplicate آماده takeover ساخته نشده‌اند.

در دو zone جغرافیایی، دو مسئله اصلی complexity و cost DR را تعیین می‌کند:

Synchronization واقعی زمان می‌برد؛ data باید از network عبور کند. حتی latency حدود ۵۰ تا ۱۰۰ میلی‌ثانیه می‌تواند در replication database اثر بزرگی داشته باشد. هنگام انتخاب locationهای DR، peering مستقیم میان data centerها را بررسی کنید؛ چنین ارتباطی congestion مسیر عمومی Internet را کاهش می‌دهد.

Databaseهای مدرن مانند SQL Server و Oracle قابلیت‌های replication قدرتمندی دارند ــ معمولاً با license گران‌تر ــ اما آن‌ها نیز محدود به سرعت network هستند. بنابراین ممکن است zero downtime از نظر فنی یا اقتصادی ممکن نباشد. در آن صورت باید همراه CEO تعیین کنید مشتری چه مقدار outage را تحمل می‌کند: چند دقیقه، چند ساعت یا چند روز؟ این تصمیم باید پس از ارائه cost و consequence هر سطح گرفته شود.

دو configuration رایج عبارت‌اند از:

۸.۴.۲ سرویس کامل یا جزئی (Full or partial service)

هنگام disaster همیشه لازم نیست همه قابلیت‌ها را با ظرفیت کامل ارائه دهید. بررسی کنید کدام service می‌تواند موقتاً unavailable یا read-only شود.

مثلاً اگر Twitter را با budget محدود اداره می‌کنید، partial service می‌تواند tweetهای قبلی را نمایش دهد اما انتشار tweet جدید را موقتاً متوقف کند. در ecommerce می‌توان مشاهده محصول و افزودن به cart را فعال نگه داشت، اما checkout را بست. در اغلب enterpriseها می‌توان بخشی را برای مدت محدود با ظرفیت کمتر اجرا کرد.

در partial mode ممکن است componentهایی را موقتاً از دست بدهید که user مستقیماً نمی‌بیند؛ مانند logging، reporting یا scheduled administrative task.

Full-service failover بسیار پیچیده‌تر است. system جدید باید بداند primary دقیقاً در چه stateی متوقف شده است. آیا taskهایی دوباره اجرا و duplicate می‌شوند؟ آیا بخشی کاملاً گم می‌شود؟ مثلاً اگر failure وسط ارسال batch email رخ دهد، از کجا می‌فهمید کدام emailها ارسال شده‌اند؟ شاید پذیرش چند email تکراری از تلاش برای تشخیص دقیق، ارزان‌تر و کم‌ریسک‌تر باشد.

بسته به design سیستم، failover تمیز ممکن است بدون مقدار قابل‌توجهی database و file manipulation دستی ممکن نباشد.

از دل تجربه: قیمت همیشه معادل کیفیت نیست

هنگام شروع کار با یک client، شنیدن DR strategy برایم جذاب است. بعضی مدیران با افتخار از هزینه سنگین safeguard کردن data و operation می‌گویند. یک client سالانه رقمی شش‌رقمی برای software و hardware یک شرکت معروف سه‌حرفی می‌پرداخت و همه تصور می‌کردند solution به‌دلیل قیمتش کاملاً قابل‌اعتماد است. بررسی دقیق نشان داد reality متفاوت است. طی چند هفته، setup مبتنی بر AWS ساختیم که واقعاً کار می‌کرد و هزینه سالانه‌اش به چهار رقم کاهش یافت. مشکل اصلی، اعتماد بیش از حد به outsourcing بود. DR را نمی‌توان بدون درگیری و validation داخلی کاملاً برون‌سپاری کرد.

یک هشدار درباره partial solution: باید امکان تبدیل‌شدن آن به full solution وجود داشته باشد. در outage برق احتمالاً انتظار دارید power برگردد؛ اما پس از آتش‌سوزی، سیل یا سرقت، partial backup ممکن است برای مدت طولانی primary شود. DR را مانند لامپی ببینید که نباید خاموش شود؛ شاید مدتی کم‌نورشدن آن قابل‌تحمل باشد، اما تاریکی کامل نه.

۸.۴.۳ حرکت رو به جلو یا بازگشت (Fail forward vs. bounce back)

فرض کنید به backup zone failover کرده‌اید. وقتی primary قبلی دوباره در دسترس شد، چه می‌کنید؟ اگر این پرسش تازه برایتان مطرح می‌شود، احتمالاً DR event را هرگز تجربه یا تمرین نکرده‌اید. برنامه فقط نباید تا لحظه عبور از disaster باشد؛ باید rebuild پس از آن را نیز پوشش دهد.

اگر backup و primary از نظر capacity و capability مشابه‌اند، شاید بهتر باشد backup فعلی را primary جدید کنید. چرا بدون نیاز، یک switch دیگر انجام دهید؟ سپس zone خراب قبلی را repair و به backup جدید تبدیل کنید. این fail-forward configuration است: به عقب برنمی‌گردید.

اگر setupها like-for-like نیستند ــ مثلاً backup فقط partial service ارائه می‌دهد ــ باید پس از repair به primary قبلی bounce back کنید. مزیت این است که لازم نیست فوراً برگردید؛ می‌توانید outage دوم را در زمانی مناسب مانند آخرهفته یا نیمه‌شب برنامه‌ریزی کنید.

۸.۴.۴ مدیریت رخداد بازیابی بحران (Managing the DR event)

تا اینجا درباره configuration صحبت کردیم، اما logistics تصمیم برای switch نیز حیاتی است. شبیه rainy-day fund، سؤال دشوار این است که «آیا آن‌قدر باران آمده که باید از صندوق اضطراری استفاده کنیم؟» رفتن به DR zone event کوچکی نیست و نباید بی‌دلیل انجام شود.

بعضی triggerها واضح‌اند: hardware failure کامل، آتش‌سوزی، سیل یا سرقت. اما بعضی مبهم‌اند: power مدام قطع و وصل می‌شود و UPS به‌سختی serverها را نگه داشته؛ یا upstream provider می‌گوید network «خیلی زود» برمی‌گردد. «زود» دقیقاً یعنی چه؟

Switching strategy باید ambiguity را حذف کند. معیارهایی مانند serviceهای affected و مدت outage را مشخص کنید تا همه بدانند چه زمانی باید switch انجام شود.

پس از trigger، logistics سطح بالا شامل این موارد است:

Document باید در محل شناخته‌شده و در دسترس باشد. بدترین زمان برای پیدا‌کردن password console، وسط failover است.

این procedure را در ساعت کم‌مصرف به‌طور منظم test کنید. enterprise تغییر می‌کند، service اضافه و حذف می‌شود و DR نیز باید نماینده وضعیت فعلی باشد. disaster معمولاً از قبل خبر نمی‌دهد.

از دل تجربه: پیامد ناخواسته

بسیاری از شرکت‌ها VPN می‌دهند تا employee به serverهای داخل office وصل شود. اما اگر به zone دیگری switch کنید، access pointها تغییر می‌کنند. یکی از شرکت‌هایی که با آن کار می‌کردم، هنگام DR خودش را از failover zone بیرون انداخت؛ چون همه firewall ruleها فقط برای primary نوشته شده بود. نیمه پر لیوان این بود که security واقعاً خوب کار می‌کرد!

بهتر است حداقل هفته‌ای یک‌بار health و data flow مربوط به DR بررسی شود. هر سه تا شش ماه یک full switchover تمرین کنید تا افراد با process آشنا شوند و DR دیگر event عجیب و وحشتناکی نباشد. practice واقعاً تفاوت ایجاد می‌کند.

۸.۴.۵ استفاده از ابر در بازیابی بحران (Cloud and DR)

حتی اگر application Cloud-native نیست، می‌توانید Cloud را بخشی از DR کنید. Cloud به‌عنوان data center موقت و on-demand گزینه‌ای عملی و مقرون‌به‌صرفه است.

Cloud برای hot یا cold standby مناسب است؛ می‌توانید data را stream کنید و تا پیش از disaster عمدتاً هزینه storage را بپردازید. ساخت infrastructure مشابه primary نیز ساده‌تر است، چون resource را فقط هنگام نیاز فعال می‌کنید. علاوه بر این، test کردن configurationهای مختلف با budget محدود آسان‌تر می‌شود.

۸.۵ مدیریت داده (Data management)

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

Data خون جاری صنعت ماست. وارد سازمان می‌شود، خارج می‌شود، درباره خودش data بیشتری تولید می‌کند و به dataهای دیگر تبدیل می‌شود؛ همه این‌ها باید sort، translate، store و process شوند. Data فقط file روی disk یا row داخل table نیست؛ معنا، context و value دارد. در عین حال می‌تواند بی‌ارزش، پرهزینه و حواس‌پرت‌کن باشد. هنر اصلی، تشخیص تفاوت این دو است.

در گذشته storage گران و از نظر logistics دشوار بود. امروز در الگوی storage تقریباً نامحدود Cloud، نگهداری data هرگز این‌قدر ساده و ارزان نبوده و هزینه همچنان کاهش می‌یابد. دو پرسش اصلی ایجاد می‌شود:

مدیریت و secure کردن data کار ساده‌ای نیست. Security در فصل دیگری بررسی می‌شود، بنابراین اینجا فقط اشاره‌ای کوتاه خواهیم داشت. CTO در نهایت steward اصلی data شرکت است. تجربه نشان می‌دهد بسیاری از CTOها این asset را آن‌طور که باید مدیریت نمی‌کنند؛ یا ارزش واقعی آن را نمی‌شناسند یا از tool و techniqueهای موجود آگاه نیستند.

در این بخش storage mechanismهای رایج، نوع dataهای تحت مسئولیت و موضوعات ownership، compliance و security را مرور می‌کنیم. در طول بحث، چند buzzword بازار data نیز روشن می‌شود.

۸.۵.۱ ذخیره‌سازی (Storage)

وقتی به data فکر می‌کنیم، معمولاً file و folder به ذهنمان می‌رسد. بسیاری از C-level executiveها ــ با پیشینه مالی ــ data را در قالب Excel spreadsheet تصور می‌کنند. حتی وقتی از database حرف می‌زنند، ممکن است در ذهنشان فقط یک Excel بزرگ‌تر باشد. بخشی از وظیفه CTO این است که value این asset را فراتر از spreadsheet توضیح دهد و برای محل و ساختار بلندمدت data برنامه‌ریزی کند.

امروز بهانه‌ای برای دورریختن data فقط به‌دلیل هزینه storage وجود ندارد. اما storageهای مختلف برای مسئله‌های متفاوت مناسب‌اند:

پیش از Cloud، اداره هم‌زمان همه این storageها بسیار گران بود و در هر مرحله data برای نیاز همان روز کوچک می‌شد. اگر بعداً business به detail بیشتری نیاز پیدا می‌کرد، فقط data جدید در دسترس بود و history از بین رفته بود.

File و relational database تقریباً در همه سازمان‌ها وجود دارند؛ SQL Server، Postgres، MySQL یا Oracle. بااین‌حال architecture data در بسیاری از شرکت‌ها ضعیف است. مثلاً همان database هم website customer-facing را drive می‌کند و هم report سنگین مدیریتی را پاسخ می‌دهد. بهتر است databaseها بر اساس domain یا business area جدا شوند و data لازم با process مشخص replicate شود. در این صورت وقتی CFO report بزرگ پایان فصل را اجرا می‌کند، website از کار نمی‌افتد.

NoSQL databaseهایی مانند MongoDB، CouchDB، DynamoDB و Elasticsearch به‌خصوص در ابتدای development که schema هنوز روشن نیست محبوب‌اند. performance آن‌ها رشد کرده و با semistructure مناسب می‌تواند با relational system رقابت کند.

اما افراط نکنید. بعضی تیم‌ها همه‌چیز را NoSQL می‌سازند و data inconsistency افزایش می‌یابد؛ مثلاً یک document مقدار عددی را به‌صورت string یعنی "2" و دیگری به‌صورت integer یعنی 2 ذخیره می‌کند. NoSQL ذاتاً data integrity یا structure را enforce نمی‌کند؛ این مسئولیت application و governance است.

Data Lakeهایی مانند Apache Hadoop یا Amazon S3 در ظاهر یک storage بزرگ برای file هستند، اما toolهایی برای پیمایش و استخراج elementهای موردنیاز دارند. log fileهای production مثال خوبی‌اند. format می‌تواند در طول زمان evolve کند و بعداً با crawl کردن fileها keyword یا pattern موردنظر را پیدا کنید؛ این رویکرد معمولاً با مفهوم Map/Reduce همراه است.

Data Warehouseهایی مانند Amazon Redshift یا SQL Server در نقش warehouse، محل data مخصوص reporting هستند. data معمولاً aggregate، anonymize و براساس سؤال‌های business design می‌شود. warehouse زمانی ارزش زیادی پیدا می‌کند که حجم قابل‌توجهی data جمع شده باشد. relational database معمولی در شروع جواب می‌دهد، اما در نقطه‌ای برای analytics سنگین به محدودیت می‌رسد.

از دل تجربه: کمی دانش می‌تواند خطرناک باشد

configurationهای عجیب database زیاد دیده‌ام؛ حتی کسی که اصلاً به join اعتقاد نداشت. در یک مورد website به‌دلیل database بسیار کند دائماً از دسترس خارج می‌شد. disk I/O زیادی دیده می‌شد، با اینکه data چندانی نوشته نمی‌شد. مشخص شد یکی از technicianها خوانده بود index باعث سریع‌شدن table می‌شود و با نیت کمک، روی تک‌تک columnهای همه tableها index ساخته بود. database زیر metadata خودش غرق شده بود و data درباره data از خود data بیشتر شده بود. اطلاعات ناقص در دست اشتباه خطرناک است.

در دنیای Cloud، همه این storage serviceها را بدون اداره server و license زیربنایی مصرف می‌کنید. بسیاری از تیم‌ها با انتقال storage به Cloud از scaling on-demand، حذف نگرانی کمبود disk و toolهای امنیتی استاندارد بهره برده‌اند.

حداقل، سازمان باید نوعی Data Lake داشته باشد. آن را انباری data تصور کنید: جایی برای چیزهایی که فعلاً home دائمی ندارند اما نمی‌خواهید دور بریزید، چون شاید روزی لازم شوند. ممکن است پیدا‌کردنشان کمی زمان ببرد، اما دست‌کم وجود دارند.

۸.۵.۲ انواع داده (Data types)

همه dataهای سازمان ارزش، حساسیت و کاربرد یکسان ندارند. این موضوع بدیهی به نظر می‌رسد، اما بسیاری از شرکت‌ها آن را به‌صورت عملی در policy و architecture منعکس نکرده‌اند. برای شروع، data را می‌توان در bucketهای زیر قرار داد:

برای هر classification باید ruleهای متناسب با enterprise تعریف شود. لازم نیست در شروع بیش از حد جزئی شوید، اما هر bucket را از این زاویه‌ها بررسی کنید:

Data یکی از باارزش‌ترین assetهای شرکت است و هرچه بیشتر جمع شود، data بیشتری نیز از آن تولید خواهد شد. mapping جریان data باعث می‌شود از نظر اخلاقی، حقوقی و عملیاتی غافلگیر نشوید.

به dataهای تحت compliance توجه ویژه کنید. PII، HIPAA، PCI و استانداردهای مشابه با تفاوت‌های خود، در اصل یک هدف دارند: data را secure و محترمانه مدیریت کنید. بهتر است best practice امنیتی را فقط برای data اجباری اعمال نکنید، بلکه آن را culture عمومی تیم قرار دهید. در این صورت audit به حادثه‌ای نمایشی و ترسناک تبدیل نمی‌شود. طراحی security و auditability از ابتدا، هم تصمیم درست امروز است و هم بیمه‌ای برای تغییر direction فردا.

۸.۶ میکروسرویس در برابر معماری یکپارچه (Microservices vs. monolithic)

مقایسه دست‌کشیده معماری یکپارچه با مجموعه‌ای از سرویس‌های مستقل
معماری یکپارچه و میکروسرویس هر دو هزینه و مزیت دارند؛ اندازه، بلوغ و نیاز کسب‌وکار انتخاب را تعیین می‌کند.

در enterprise development دو اصل طراحی بزرگ وجود دارد: Monolithic و Microservices؛ هرچند بسیاری از سیستم‌ها hybrid هستند. Microservices به‌دلیل مزیت‌های توسعه، deployment و maintenance به انتخاب محبوب architecture مدرن تبدیل شده است.

در Monolithic، کل enterprise یا بخش بزرگی از آن به‌صورت یک entity واحد build و deploy می‌شود. codebase معمولاً یک unit بزرگ، tightly coupled و با code reuse محدود است.

جدول ۸.۴ — نشانه‌های معماری یکپارچه

پرسش پاسخ
یک codebase واحد و بدون internal library دارید؟ Yes / No
یک database همه systemها را drive می‌کند؟ Yes / No
outage یک بخش، کل delivery را متوقف می‌کند؟ Yes / No
architecture تک‌server است؟ Yes / No
upgrade نیازمند planned outage است؟ Yes / No

اگر پاسخ سه مورد یا بیشتر «Yes» است، احتمالاً architecture شما Monolithic است.

Microservices یعنی enterprise را به mini applicationهای مستقل و narrow-scope تقسیم کنید که هرکدام action یا role مشخصی دارند. آن‌ها از طریق API، service bus یا message queue تعامل می‌کنند. microservice قوی entity مستقلی است با data store، execution environment و release cycle خودش؛ language و library هر service می‌تواند متناسب با همان مسئله انتخاب شود.

جذابیت اصلی Microservices کاهش risk و استفاده از tool مناسب برای هر task است. این pattern زمانی عملاً محبوب شد که remote API call از نظر performance به‌اندازه کافی سریع شد.

برای CTO، Microservices امکان می‌دهد enterprise را به unitهای کوچک‌تر و مستقل تقسیم کند. هر unit با schedule خود update می‌شود. بخش‌هایی که به‌ندرت تغییر می‌کنند، از unintended consequence release بخش‌های دیگر در امان می‌مانند.

در Monolithic legacy، تغییر کوچک پرریسک است؛ حتی upgrade یک library ظاهراً بی‌ضرر می‌تواند به‌دلیل coupling زیاد ripple effect ایجاد کند.

دام رایج این است که microservice بدون governance به mini-monolith تبدیل شود. service در طول زمان مسئولیت‌های بیشتری می‌گیرد و هرچند تیم همچنان نام Microservices را استفاده می‌کند، architecture فقط در اسم microservice باقی می‌ماند.

Microservices همچنین تصمیم فناوری را future-proof می‌کند یا دست‌کم به تعویق می‌اندازد. با API قوی و consistent، implementation service می‌تواند در زمان مناسب evolve شود.

مثلاً فرض کنید همه enterprise به ذخیره و بازیابی file نیاز دارد. یک File Microservice تعریف می‌کنید با API ساده برای upload و retrieval. در ابتدا implementation ممکن است file را روی directory محلی backupشده نگه دارد. با رشد نیاز، به SAN منتقل شود و بعدتر از Amazon S3 استفاده کند. مصرف‌کننده‌ها تغییری نمی‌کنند، چون logistics storage پشت API پنهان شده است.

Microservice شبیه code library در granularity بزرگ‌تر است و اجازه می‌دهد unitهای enterprise با سرعت متناسب با business evolve شوند.

Monolithic هنوز جای خود را دارد. در Proof of Concept یا startup، ممکن است مهم‌ترین سؤال این باشد که «آیا ایده کار می‌کند و value دارد؟» نه اینکه architecture نهایی چگونه باشد. اما اگر برای هر upgrade مجبورید بخش بزرگی از enterprise را down کنید، در بلندمدت به شرکت آسیب می‌زنید.

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

Microservices روی team structure نیز اثر دارد. هر team می‌تواند owner یک unit باشد و development، maintenance و operation آن را مدیریت کند. در سازمان‌های بزرگ، userهای API همان customerهای داخلی یا خارجی team محسوب می‌شوند.

Cloud providerهای مدرن دقیقاً همین مدل را دارند. AWS مجموعه‌ای از microserviceهاست که functionality را از طریق API و pay-as-you-go ارائه می‌کند. بخش بزرگی از AWS از serviceهایی رشد کرد که ابتدا برای ecommerce اصلی Amazon ساخته شده بودند. وقتی library داخلی آن‌ها بالغ شد، همان capabilityها به developerهای بیرونی فروخته شد.

ممکن است شما AWS بعدی نباشید، اما API ecosystem قوی می‌تواند client را به شما نزدیک‌تر کند و اجازه دهد solution خود را بر پایه serviceهای شما بسازد.

۸.۷ متن‌باز (Open source)

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

Open source به codeای گفته می‌شود که برای استفاده جامعه منتشر شده و دست‌کم امکان مشاهده آن وجود دارد؛ اما بسته به license، استفاده و incorporation آن محدودیت‌هایی دارد. تفاوت ظریف licenseها مهم است، چون بعضی شرکت‌ها بدون شناخت دقیق آن‌ها بعداً هنگام فروش product یا همکاری با client با مشکل حقوقی روبه‌رو شده‌اند.

Open source یک منبع بزرگ از commodity software است و با reuse کردن componentها، development را سریع‌تر می‌کند. نمونه‌ها از operating system کامل مانند Linux و databaseهایی مثل MySQL و Postgres تا desktop applicationهایی مانند Firefox و OpenOffice و libraryهایی مثل jQuery و Gson را شامل می‌شوند. تقریباً در هر لایه‌ای گزینه‌ای open source وجود دارد.

۸.۷.۱ انواع مجوز (License types)

صرف اینکه source code را روی web می‌بینید، به این معنا نیست که می‌توانید آن را بردارید و مالکیتش را ادعا کنید. همان‌طور که توانایی اجرای یک آهنگ روی piano اجازه فروش recording بدون پرداخت royalty را نمی‌دهد، source code نیز می‌تواند copyright داشته باشد.

Open source معمولاً با licenseای منتشر می‌شود که دقیقاً تعیین می‌کند چه کارهایی مجاز و چه کارهایی ممنوع است. دو خانواده کلی وجود دارد:

Licenseهای Copyleft معمولاً برای استفاده business محدودکننده‌ترند. معروف‌ترین نمونه GPL است. در بسیاری از سناریوها اگر software شما GPL code را به‌شکلی مشمول license استفاده کند، خود software و modificationهای مرتبط نیز باید تحت GPL منتشر شوند. بنابراین اگر secret-sauce algorithm شما به GPL code وابسته باشد، ممکن است از نظر حقوقی موظف شوید source code را در اختیار درخواست‌کنندگان، از جمله competitor، قرار دهید.

Licenseهای Permissive مانند BSD، MIT و Apache انعطاف بیشتری دارند. معمولاً اجازه می‌دهند commercial software از open source استفاده یا آن را extend کند و work نهایی را proprietary و closed source نگه دارد؛ به همین دلیل برای business مناسب‌ترند.

بعضی licenseهای Permissive می‌خواهند استفاده از library و copyright notice آن را در product نهایی اعلام کنید. در بخش About بسیاری از deviceها، از جمله Android phone، فهرست open source libraryهای استفاده‌شده دیده می‌شود.

Licenseها درباره copyright، patent protection و derivative work متن دقیق دارند. تفاوت‌ها زمانی جدی می‌شوند که modification قابل‌توجه انجام دهید یا work جدیدی بر پایه source اصلی بسازید.

نسخه سبک‌تر GPL، یعنی LGPL، در بعضی شرایط اجازه می‌دهد code خود را open source نکنید، به‌خصوص وقتی library را به‌صورت dynamic link استفاده می‌کنید و modification خاصی روی آن انجام نداده‌اید. این مدل معمولاً business-friendlyتر از GPL است.

این بخش بررسی حقوقی کامل نیست. برای استفاده مهم یا مبهم، research دقیق و نظر legal counsel لازم است.

نکته: Public Domain

Public domain آزادترین حالت است: مالکیت، copyright و محدودیت استفاده ندارد. در software کمتر دیده می‌شود، اما code sampleهای کتاب‌ها گاهی به این شکل منتشر می‌شوند.

۸.۷.۲ راهنمای استفاده (Usage guidelines)

استفاده از Open source باید تشویق شود، به‌خصوص در ecosystemهای Java، JavaScript و Python که تجربه و utility عظیمی در GitHub و SourceForge وجود دارد. بااین‌حال پیش از رهاکردن کامل تیم، guidelineهای زیر را مشخص کنید:

Guideline روشن به تیم اطمینان می‌دهد که سازمان استفاده مسئولانه از Open source را حمایت و تشویق می‌کند.

۸.۷.۳ انتشار متن‌باز (Publishing open source)

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

شرکت‌های بزرگی مانند Google، Oracle، Microsoft، IBM، Netflix و Amazon پروژه‌های زیادی را با licenseهای مختلف open source کرده‌اند. Microsoft مالک GitHub است؛ یکی از بزرگ‌ترین platformهای hosting پروژه‌های Open source.

اگر library ساخته‌شده توسط تیم را open source می‌کنید، صرفاً آن را در Internet رها نکنید. پروژه open source باید maintain و update شود. libraryی که سال‌ها update نشده باشد contributor جذب نمی‌کند. پروژه موفق همانند internal library جدی گرفته می‌شود: bug fix، feature و documentation آن ادامه دارد.

پیش از publish کردن حتی یک line روی account رسمی GitHub شرکت، هدف و دلیل کار باید برای CEO و legal team روشن باشد. مشخص کنید دقیقاً چه codeای، با چه packaging و چه licenseای منتشر می‌شود. مطمئن شوید company IPR، trade secret، credential یا data حساس در repository نیست و خود شرکت حق انتشار code را دارد.

از دل تجربه: مشارکت در Code

پروژه‌های کوچک و بزرگ متعددی را open source کرده‌ام و در طول مسیر feedback و contribution ارزشمندی گرفته‌ام. در پروژه‌های دیگر نیز bug fix و feature اضافه کرده‌ام. انگیزه شخصی من بازگرداندن بخشی از ارزشی است که طی سال‌ها از libraryهای Open source گرفته‌ام.

candidate مناسب برای open source معمولاً library کوچک و عمومی‌ای است که در مسیر ساخت product بزرگ‌تر ایجاد شده است. مواجه‌شدن با project مشابه نیز می‌تواند نشان دهد مسئله واقعی است و design شما در مسیر قابل‌قبولی قرار دارد.

۸.۷.۴ استفاده از کد موجود در وب (Using code from the web)

هر development team در مقطعی برای حل مسئله browser را باز می‌کند؛ برای فهم رفتار یک library، یادگیری syntax یا یافتن implementation نمونه. پاسخ ظاهراً آماده است: CTRL+C و بعد CTRL+V در IDE. اما صرف وجود code در Stack Overflow، blog یا article به معنای مجازبودن copy نیست.

code تولیدشده توسط team، asset و intellectual property شرکت محسوب می‌شود. بنابراین باید بتوانید با حسن‌نیت بگویید code بدون نقض copyright و بدون copy غیرمجاز ساخته شده است.

با guidelineهای commonsense می‌توان risk را کاهش داد:

اعتبارسنجی Code

در technical due diligence ممکن است ownership قانونی source code بررسی شود، به‌خصوص وقتی ارزش شرکت به همان code وابسته است. toolهای تشخیص plagiarism وجود دارند. دیده‌ام معامله‌ای خیلی سریع متوقف شود، چون بخش بزرگی از codeی که شرکت متعلق به خود معرفی می‌کرد از پروژه‌های Open source برداشته شده بود. این discovery اعتبار همه workهای دیگر را نیز زیر سؤال برد. از سوی دیگر، اگر تیمی ادعا کند اصلاً از Open source استفاده نمی‌کند، آن ادعا نیز مشکوک است و بررسی عمیق‌تری می‌طلبد.

۸.۸ زبان‌ها و فریم‌ورک‌ها (Languages and frameworks)

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

انتخاب language و framework یکی دیگر از تصمیم‌های مهم CTO است و ممکن است اثر آن بسیار بیشتر از مدت حضور خود CTO در شرکت باقی بماند. در بسیاری از مواقع انتخاب قبلاً انجام شده، چون stack را از مدیر قبلی تحویل گرفته‌اید.

Business معمولاً اهمیتی نمی‌دهد enterprise با چه languageای اجرا می‌شود؛ تا زمانی که problem را حل کند و client راضی باشد. اما عوض‌کردن language یا حتی framework کار کوچکی نیست. سرمایه‌گذاری روی development team، training، deployment process، operational knowledge و support همگی به stack فعلی وابسته‌اند. تغییر language می‌تواند به rewrite بخش‌های بزرگ منجر شود، بدون اینکه value مستقیم قابل‌توجهی برای business داشته باشد.

بسیاری از انتخاب‌های اولیه language تصمیم آگاهانه نبوده‌اند. در companyهای founder-led، founder یا CTO اولیه همان languageی را که می‌دانسته برای همه‌چیز استفاده کرده و آن را برای taskهایی که برایشان design نشده خم کرده است. انتخاب واقعی وجود نداشته؛ فقط همان گزینه آشنا بوده است.

Framework مجموعه‌ای از library و standard روی language است که taskهای تکراری را ساده می‌کند؛ مانند authentication user یا file handling. نمونه‌ها شامل Java Enterprise Standard یا Spring روی Java، ReactJS برای JavaScript و Express.js برای Node.js هستند.

Framework scope بزرگ‌تری از language دارد و می‌تواند محدودکننده‌تر باشد. developerی که در framework خاصی متخصص است، حتی با شناخت language زیربنایی، ممکن است برای انتقال به framework دیگر همان language زمان بخواهد. بنابراین expertise مربوط به framework به‌اندازه language اهمیت دارد.

Language و framework مد می‌شوند و از مد می‌افتند. frameworkها سریع‌تر منسوخ می‌شوند، چون روی language سوارند و جایگزینی‌شان آسان‌تر است. اگر company بخش بزرگی از plumbing خود را روی framework خاصی ساخته و آن framework چند سال بعد متوقف شود، مجبور می‌شود هم product و هم خود framework را support کند.

Languageها نیز منسوخ می‌شوند، اما معمولاً در بازه طولانی‌تر. risk بیشتر برای languageهایی است که به یک company خاص و بدون independent standards body وابسته‌اند. اگر company خریداری، ورشکسته یا بی‌علاقه شود، language نیز ممکن است رها شود. Gupta، PowerBuilder و Delphi نمونه‌هایی از technologyهایی هستند که در دوره‌ای بسیار مطرح بودند و بعد بازارشان کوچک شد.

هنگام انتخاب language دست‌کم افق پنج‌ساله را ببینید. قرار است developer استخدام کنید، knowledge بسازید، deployment process و coding standard تعریف کنید و امیدوار باشید ecosystem language همچنان رشد کند.

۸.۸.۱ زبان‌های قدیمی (Legacy languages)

اگر language یا framework وارد حالت life support شده، یکی از taskهای مهم برنامه‌ریزی برای جایگزینی آن است. اما فقط به‌دلیل ناآشنایی خودتان آن را حذف نکنید. landscape را با چند factor بررسی کنید؛ از جمله سلامت recruitment market.

اگر development team در حال پیرشدن است و نیروی جوانی برای ادامه skill وارد بازار نمی‌شود، با technology رو به مرگ روبه‌رو هستید.

جایگزینی language effort و resource زیادی می‌خواهد. یکی از بهترین strategyها، جداکردن بخش‌هایی است که می‌توان به Microservice مستقل refactor کرد. به این ترتیب enterprise را piece-by-piece نوسازی می‌کنید و مجبور به full rewrite یک‌باره نیستید.

۸.۸.۲ انتخاب زبان یا فریم‌ورک بعدی

خبر خوب و بد این است که پاسخ واحدی وجود ندارد. صنعت دائماً «جدیدترین و بهترین» technology را معرفی می‌کند و آن را بسیار بهتر از گزینه‌های موجود نشان می‌دهد. احتمال Buyer’s Remorse وجود دارد، اما اگر research خوبی انجام داده باشید، تصمیم شما برای زمان خودش می‌تواند درست باشد.

هر candidate را با این پرسش‌ها ارزیابی کنید:

تصمیم درست همیشه آسان نیست، اما تصمیم غلط معمولاً خیلی زود نشانه‌های خود را نشان می‌دهد. زمان بگذارید و عاقلانه انتخاب کنید. صرف اینکه Proof of Concept با یک technology ساخته شده، دلیل مناسبی برای productionalize کردن همان technology نیست؛ چیزی که برای demo سریع جواب می‌دهد لزوماً در scale واقعی مناسب نیست.

جمع‌بندی (Summary)

چک‌لیست نهایی (Final checklist)

چند مورد از این موارد را واقعاً پوشش داده‌اید؟

خلاصه هوش مصنوعی

خلاصه فصل (Chapter summary)

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

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