راهنمای عملی سورس‌کد خوانی

راهنمای عملی سورس‌کد خوانی

یکی از جملات مشترک بین بسیاری از دولوپر‌ها در هر سطحی، جملهٔ «از خواندن کد دیگران متنفرم!» است؛ به‌هرحال، توان خواندن و بررسی کد دیگر دولوپرها یک مهارت لازم و ضروری است، مخصوصاً برای دولوپرهایی که برای خواندن و بررسی یک کدبیس (Codebase) موجود اقدام می‌کنند.

دلیلی که اکثر دولوپرها از خواندن کد دیگران دوری می‌کنند این است که آن کد، توسط خودشان نوشته نشده است؛ این جمله هرگز به این معنا نیست که همهٔ ‌ما این باور را داریم که ما بهترین کد‌نویس‌های عالم هستیم و هیچ‌کس دیگر نمی‌تواند مانند ما کد بزند!

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

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

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

به‌هرحال، این شتری است که به احتمال قریب به یقین روزی درب خانهٔ اکثر دولوپرها خواهد خوابید و از همین روی بهتر است با راه‌کارهایی که سرعت‌ بخشیدن به این کار از یک سو و همچنین لذت‌بخش کردن این فرایند از سوی دیگر را امکان‌پذیر می‌سازد آشنا شوید:

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

اگر این‌قدر خوش‌شانس باشید که با کدبیسی کار کنید که از ابتدا در ورژن کنترل بوده باشد، بهتر است جشن بگیرید چراکه می‌توانید به حجم قابل‌توجهی از متادیتاها دسترسی داشته باشید که به فهم شما -نه‌تنها روی کد بلکه روی کانتکس- بسیار کمک می‌کند (در ادامه فرض بر این گذاشته می‌شود که از سیستم ورژن کنترل Git استفاده شده است).

Git Blame: از git blame می‌توانید استفاده کنید تا نام دولوپر، آخرین تاریخ تغییرات و حتی کامیت هر یک خط‌ کد را به‌دست آورید؛ اما اگر بدشانسی بیاورید، ممکن است ده‌ها دولوپر که حتی اسم‌شان هم به گوش‌تان نخورده، کدهای موجود را نوشته باشند!

جدای از این مسائل، سعی کند حس و طرز تفکر دولوپرهای اصلی را در خود ایجاد کنید؛ اگر هم به توابع عجیب‌و‌غریبی برخوردید، از git blame برای پیدا کردن دولوپر اصلی کمک بگیرید تا بتوانید از آن‌ها اطلاعات لازم را کسب کنید.

Git Log: از git log برای دیدن تاریخچهٔ کلی Repo (ریپازیتوری) استفاده کنید؛ این دستور پیام‌های کامیت‌ها را چک می‌کند. اگر دنبال موضوع خاصی در پیام‌های کامیت می‌گردید، بهتر است grep را فراموش نکنید. برای دیدن تاریخچهٔ یک فایل بهتر است به دستور git log فلگ p- را اضافه کنید. به افرادی که آخرین تغییرات را در فایل‌ها انجام داده‌اند دقت کنید، چراکه اگر سؤالی برایتان پیش آید، منبع مناسبی برای جواب‌های شما هستند.

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

اگر پروژه بر روی گیت‌هاب یا سایر سرویس‌های مشابه باشد، می‌توانید دید مناسبی با خواندن مسائل و مشکلات، Pull Requestها و بررسی کد‌ها به‌دست آورید. به مشکلاتی که بیشترین بحث‌ و گفت‌وگو‌ها را ایجاد کرده‌اند بیشتر دقت کنید. ممکن است نقاط مشکل‌زایی باشند که احتمالاً با آن‌ها برخورد خواهید داشت و سودش این است که قبل از برخورد با مشکل، نحوهٔ رفع کردنش را یافته‌اید.

جزئیات را بررسی کنید
مشخصات پروژه به‌نوعی به‌منزلهٔ کامنت‌های پروژه نیز هستند؛ مشخصات و جزئیات ماژول‌ها را بخوانید تا بدانید که توابع و کلاس‌های هر ماژول چه کاری انجام می‌دهند و برای مدیریت آن‌ها چه شرایط خاصی طراحی شده است.

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

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

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

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

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

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

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

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

سطح به‌اصطلاح Abstraction سورس‌کد چقدر است؟ اگر کدی با لایه‌های انتزاعی بسیاری نوشته شده است، از شما نیز انتظار می‌رود همین نوع کد‌نویسی را ادامه دهید که در غیر این صورت، دولوپری که پس از شما قرار است روی این سورس‌کد کار کند به‌مراتب گیج‌تر از شما خواهد شد. در یک کلام، سعی کنید از شیوهٔ یکسانی در زمان نوشتن کدها استفاده کنید.

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

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

کم نیاورید
در فرایند سورس‌کد خوانی، زمان‌های زیادی پیش می‌آید که خود را در مخمصه می‌یابید؛ در چنین شرایطی، انتظار یک روند خطی را نداشته باشید و همچنین دلیلی هم ندارد که حتماً همه‌چیز را 100 درصد متوجه شوید. به جزئیات مهم دقت کنید و راه کنکاش برای پیدا کردن جواب سولٔاتتان را بیابید.

اگر هم پس از چندین ساعت سروکله زدن با سورس‌کد دید که دارید بیش از پیش سردرگم می‌شوید، بهتر است که کار را کنار گذاشته و کمی استراحت کنید و زمانی که انرژی لازم برای انجام این‌کار را داشتید، مجدداً به کار مزخرف سورس‌کد خوانی بپردازید!

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

منبع