پچ بنویس و التماس کن

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

اول مقداری قصه. هر برنامه گرافیکی از کتابخانه‌هایی برای ساختن رابط کاربری‌اش استفاده می‌کنه. در دنیای ویندوز خیلی‌ها از دات‌نت استفاده می‌کنند. اما کلی پروژه دیگر هم هست که قطعات گرافیکی قابل استفاده در برنامه‌ها رو ساختند و قابل استفاده هستند. در دنیای نرم‌افزار آزاد رایج‌ترین تولکیت‌های گرافیکی GTK و Qt هستند. اولی در گنوم به طور گسترده استفاده شده و دومی در KDE. اگر از دسکتاپ‌های شبیه به گنوم استفاده کنیم، چه نسخه سه چه قدیمی‌تر و چه سایر دسکتاپهایی که فورکی از گنوم هستند اکثر برنامه‌های گرافیکیشون با GTK نوشته شده. مثلا برنامه gedit و Zim که من ازشون روزانه استفاده می‌کنم با این تولکیت نوشته شده‌اند.

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

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

برگردیم سر مشکل من با GTK. من موقع تایپ فارسی در gedit و Zim متوجه شدم که وقتی کلید کنترل رو با یا بدون شیفت پایین می‌گیریم تا با کلیدهای جهت لغت به لغت در متن حرکت کنیم، جهت حرکت نشانگر تایپ بر خلاف انتظار ما برعکس جهت فشرده شدن کلیدهاست. مثلا همین الان امتحان کنید. اگر کلید جهت سمت راست رو فشار بدین نشانگر می‌ره سمت چپ و برعکس. از جایی که من به دفعات موقع تایپ از این قابلیت استفاده می‌کنم دنبال علت مشکل گشتم. مثلا متوجه شدم در فایرفاکس و کروم این مشکل نیست. مثلا در باکس نوشتن ایمیل جدید داخل جیمیل این مشکل وجود نداره. علت اینه که کروم و فایرفاکس از Webkit استفاده می‌کنند نه GTK. اول تصمیم گرفت که باگ رو گزارش کنم. بلافاصله متوجه شدم که این مشکلی قدیمی است که گزارشی‎ در سال ۲۰۰۳ توسط بهداد اسفهبد که خودش از مشارکت‌کنندگان قدیمی GTK است براش ثبت شده. باگ‌های زیادی هم بعد از اون توسط کاربران فارسی و عرب و عبری زبان برای همین مشکل ثبت شده که همگی ارجاع داده شده‌اند به قدیمی‌ترین باگ. باورتون می‌شه باگی ۱۴ سال در انتظار تعمیر باقی بمونه؟ ولی خب مونده.

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

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

این روش توسعه در سال ۲۰۱۷ مشکلات جدی‌ای داره. اگر ده یا بیست سال پیش بود مشکلی نبود. ولی امروز این روش به نظر من یک روش ضد مشارکته. اول که خبری از Continious Integration نیست. یعنی شما پچ رو آپلود می‌کنید ولی هیچ تست اتوماتیکی روی پچ شما اجرا نمی‌شه که مراجعه‌کنندگان بفهمند وضعیت در صورت اعمال این پچ چه خواهد بود. دیگر اینکه شما نمی‌تونید فورک کنید و پول ریکوئست بفرستید. فورک و ارسال پول‌ریکوئست که روش رایج روی گیتهابه تازه‌واردان رو خیلی کمک می‌کنه و مشارکت رو ساده می‌کنه.

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

نتیجه‌ای که از مشکلاتی که شرح دادم می‌خوام بگیرم اینه که برای پروژه‌های مستقل مهمه که همکاری کاربران تازه‌کار و هکرهای مستقل رو به خودش جذب کنه. برای اینکار باید مستندات و مثال‌های خوب و گام به گام در وبسایت و از همه مهمتر در خود مخزن گیت پروژه وجود داشته باشه. از پول ریکوئست بجای پچ استفاده بشه و با تست دائمی پچ یا پول‌ریکوئست تا جای امکان به ارسال کننده و دیگران فیدبک داد. در مجموع باید هزینه مشارکت رو به قدری کاهش داد که مقاومتی در ذهن مشارکت‌کننده ایجاد نشه. از طرفی باید یک کامیونیتی به newbie-friendly باشه. یک کامیونیتی باید کاربر تازه‌واردپسند باشه.

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

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

git clone git://git.gnome.org/gtk+
cd gtk+
wget https://bug136059.bugzilla-attachments.gnome.org/attachment.cgi\?id\=343512 -O fix.patch
git apply fix.patch
./autogen
make -j4
cd demos/gtk-demo
./gtk4-demo

از سایدبار برنامه‌ی دمو باکس متنی Hypertext رو پیدا کنید و داخلش فارسی بنویسید و با gedit روی دستگاه خودتون مقایسه کنید. اگر از نتیجه راضی بودید در صفحه باگ کامنت بذارید که خدا رو خوش بیاد!