لینوس ترووالدز خالق گیت از پشت‌صحنه حکایت می‌کند

ده سال پیش در چنین هفته‌ای جامعه هسته لینوکس با چالش سختی مواجه شد. آن‌ها بیش از این نمی‌توانستند به استفاده از  سیستم کنترل بازبینی BitKeeper یا هر مدیر کنترل منبع (SCM) دیگری که نیاز آن‌ها برای سیستم توزیع شده را برطرف کند، ادامه دهند. لینوس ترووالدز، سازنده لینوکس، این چالش را بر عهده گرفت و روز‌های آخر هفته از دیده‌ها پنهان و هفته بعد با گیت پدیدار شد. امروزه گیت برای هزاران پروژه استفاده می‌شود و خود به طلیعه‌دار سطح جدیدی از کد زدن اجتماعی در میان برنامه‌نویسان تبدیل شده است. 

برای تجلیل این اتفاق مهم از لینوس خواستیم تا پشت صحنه داستان گیت را با ما درمیان بگذارد و از فکرش در مورد این پروژه و تاثیری که بر توسعه نرم‌افزار گذاشته است بگوید.Linus-Torvalds-LinuxCon-Europe-2014

چرا گیت را ساختی؟

ترووالدز: واقعا من هیچ وقت نمی‌خواستم مدیر کنترل منبع بسازم و فکر می‌کردم کم‌ترین جذابیت را در دنیای رایانه داشته باشه (اگر احیانا برای پایگاه‌داده استثنا قائل شوم). به شدت از تمام SCM ها تنفر داشتم اما بعد ها BitKeeper به میان آمد و به طور کلی دیدگاه من را نسبت به کنترل منبع عوض کرد. بیشتر چیزها در BK درست بودند و داشتن یک نسخه محلی از مخزن به همراه ادغام توزیع شده یک امتیاز مهم بود. مساله مهم در مورد کنترل منبع توزیع شده این هست که باعث برطرف شدن یکی از مشکلات اصلی SCM می‌شود. منظورم سیاست‌هایی از قبیل این که «چه کسی می‌تواند تغییرات را ایجاد کند؟» است. BK نشان داد که با دادن مخرن منبع شخصی به هر فرد می‌تواند این مشکل را نادیده گیرد. البته BK مشکلات خودش را هم داشت: انتخاب‌های فنی‌ کمی وجود داشت که باعث مشکلات می‌شد (rename کردن‌ها آزاردهنده بود)، اما مشل بزرگ‌تر این حقیقت بود که BK متن‌باز نبود. افراد زیادی بودند که نمی‌خواستند از آن استفاده کنند. بنابراین در آخر چندین نگه‌دارنده هسته داشتیم که از BK استفاده می‌کردند «BK برای استفاده در پروژه‌های متن‌باز آزاد بود» البته فراگیر نشد. می‌توانم بگویم که به توسعه هسته کمک کرد، اما همچنان موارد آزاردهنده‌ای وجود داشت.

مشکلات زمانی به حالت بحرانی رسید که Tridge (Andrew Tridgell ) مهندسی معکوس پروتکل BK (نسبتا ساده) را آغاز کرد. این مساله برخلاف قوانین کاری برای BK بود. من چندین هفته (فکر می‌کنم حتی چند ماه!) تلاش کردم تا ارتباط میان Tridge و Larry McVoy را برقرار کنم. اما در آخر کاملا واضح و مشخص بود که کار نمی‌کرد. بنابراین من اطمینان پیدا کردم که با BK نمی‌توانم ادامه دهم. اما واقعا هم نمی‌خواستم به روز‌های بد قبل از BK برگردم.  آن موقع ناراحت بودم . اگرچه SCMهای دیگر از این نوع سعی می‌کردند همه‌چیز را توزیع شده نگه دارند، هیچکدامشان این مساله را به شکل راه‌دور درست انجام نمی‌دادند. نیازمندی من کارایی بود که هرگز توسط آن چیزی که وجود داشت از راه‌دور ارضا نمی‌شد. همین طور من نگران ادغام کد و کل جریان کاری بودم، بنابراین در همان لحظه به این مساله پایان دادم و تصمیم گرفتم ابزار خودم را بنویسم.

چه‌طور با آن روبرو شدی؟ 

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

من دوست دارم تاکید کنم که در حدود ۱۰ روز یا همین حدود‌ها زمان برد تا ساخته شود و من بتوانم اولین Commit هسته را با استفاده از گیت انجام بدم. حجم واقعی آن کدهای آغازین واقعا کوچک بود. همه آن‌ها به خاطر فهمیدن درست ایده پایه بود. همان ایده‌هایی که من برای مدتی، قبل از این که این پروژه شروع شود، بهشون فکر می‌کردم. من مشکلات بقیه سیستم‌ها را دیده بودم. من اون چیزی را که باید ازش دوری می‌کردم، دیده بودم.

آیا همان طور که دوست داشتی گیت تا حالا ادامه داده؟ بر اساس تخمین خودت امروزه چه‌طور کار می‌کنه؟ آیا محدودیت‌هایی وجود داره؟

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

چرا فکر می‌کنی گیت به شکل گسترده‌ای تطبیق یافته؟ 

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

آیا گیت آخرین برای همیشه خواهد بود؟ یا RCS دیگری را برای ۱۰ سال آینده پیش‌بینی می‌کنی؟ نویسنده آن تو خواهی بود؟

توروالدز: من نویسندش نخواهم بود و شاید چیز جدیدی را در این ۱۰ سال ببینیم. اما من تضمین می‌کنم که بسیار شبه گیت خواهد بود. معنی این حرف این نیست که گیت همه‌چیز را درست انجام داده. اما مسائل پایه‌ای را به گونه‌ای درست کرده هیچکدام از SCM‌های پیشین آن را انجام نداده‌اند.

بدون هیچ شکسته نفسی دروغی.

چرا گیت برای لینوکس به این خوبی کار می‌کند؟

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

فقط برای مثال: مفهموم «merging» معمولا به عنوان چیزی بسیار آزاردهنده و سخت در SCMهای دیگه شناخته می‌شه. شما مجبورید mergeهاتون رو زمان‌بندی کنید، به این دلیل که آن‌ها مقدار بزرگی هستند. این امر برای من قابل قبول نیست. به خاطر این که من در روز ده‌ها merge را در زمانی که در پنجره merge هستم انجام می‌دهم. حتی بعد از آن، خود merge نباید بزرگترین سربار باشد و نتیحه باید تست بشه. قسمت merge از گیت تنها چند ثانیه است، باید برای من زمان بیشتری بگیره تا پیام توضیح merge را بنویسم.

بنابراین گیت اساسا برای نیازمندی‌های من نوشته و طراحی شده واین‌ها را هم نشون می‌ده.

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

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

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

چند دلیل تاریخی هم برای پیچیده پنداشتن گیت وجود داره. یکی از اون‌ها این هست که گیت اساسا پیجیده شده هست. افرادی که اوایل از گیت برای کار کردن بر روی هسته استفاده کردند مجبور به یادگیری مجموعه ناجوری از اسکریپت‌ها برای این که همه چیز کار کنه بودند. تمام تلاش این بود که فناوری هسته درست کار کنه و کم‌تر بر روی راحتی وا واضح بودنش کار شد. بنابراین گیت (به شایستگی) به وادار کردن شما به دانستن آن چیزی که پیش از آن بر روش انجام داده‌اید، شهره هست. اما این موضوع برای ۶ماه یا ۱سال اول درست هست.

دلیل بزرگ دیگه‌ای که  افراد فکر می‌کنند گیت مشکل هست اینه که گیت خیلی متفاوته. افرادی وجود دارند که از چیز‌هایی مثل CVS برای ۱۰ سال یا بیست سال استفاده کرده‌اند و خب گیت معلومه CVS نیست. حتی شبیه هم نیست. مفاهیم متفاوت هستند. دستورات متفاوت هستند. گیت هیچ وقت حتی تلاش نکرده تا شبیه CVS باشه. کاملا برعکس. اگر شما از سیسستمی شبیه CVS برای مدت زمان زیادی استفاده کرده باشید، اون وقت گیت پیچیده است و به شکل بدی متفاوته. افراد از اعداد بازبینی عجیب نازیبا می‌ترسند. برای چی شماره بازبینی گیت مثل 1.3.1 نیست؟ با اعداد افزایشی نازنین، درست مثل چیزی که در CVS بود؟ برای چی اعداد وحشتناک هِگز ۴۰ کاراکتری هستند؟

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

آیا فکر می‌کنی هسته لینوکس بدون گیت هم نرخ توسعه فعلیش را حفظ کنه؟ چرا یا چرا نه؟ 

توروالدز: خب، «بدون گیت» مطمعنا. اما نیاز هست که فرد دیگری چیز هم ارز گیت رو بنویسه. یک SCM توزیع شده که به اندازه گیت کارا باشه. بی‌شک ما به چیزی شبیه گیت نیاز داریم.

AtlassianGit10yearآخرین دیدگاهت در مورد گیت‌هاب چیه؟ 

ترووالدز: گیت‌هاب سرویس میزبانی فوق‌‌العاده‌ای هست. من هیچ وقت چیزی علیه اون نداشتم. اکنون شکایت‌هایی که دارم این هست که گیت‌هاب به عنوان یک سکوی توسعه – ساختن commitها- pull کردن‌ درخواست‌ها- دنبال کردن مشکلات و … به هیچ وجه به خوبی کار نمی‌کنه. حتی شبیه هم نیست. نه برای چیزی مثل هسته. فوق‌العاده محدود هست.

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

جذاب‌ترین چیزی که تو از گیت یا گیت‌هاب دیدی چی بوده؟ 

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

آیا پروژه جدید دیگری داری؟  هر پروژه نرم‌افزاری زیرک دیگری که بر توسعه نرم‌افزار در سال‌های آتی چیره بشه. 

ترووالدز: طرح چیزی ریخته نشده. اما اگر اتفاقی افتاد خبرت می‌کنم.