چطور دیباگ کنیم؟!

امروز یه باگ ریپورت داشتیم که ازون بدقلق هاش بود که هنوزم موفق نشدم دلیلشو پیدا کنم. برا همین تصمیم گرفتم تجربیات دیباگم رو باهاتون به اشتراک بذارم و نظراتتونو بدونم. مهم نیست شما برنامه نویس حرفه ای باشید یا جونیور. دیباگ کردن چیزیه که رو پیشونی ماها نوشته شده پس بریم که تو این پست روش های خودمو براتون بگم و از شما روش های جدیدتونو یاد بگیرم. دیباگ یعنی چی؟به فرآیندی که طی آن شما اقدام به شناسایی رفتار کد در حالت های مختلف میکنید تا در نتیجه اشکال سیستم را پیدا کرده یا به سیستم تسلط بیشتری پیدا کنید دیباگ میگوییم (نقطه سر خط)چرا دیباگ میکنیم؟ازونجایی که ممکن بود کسایی این پست رو بخونن که علاقمند به برنامه نویسین یا تازه میخوان شروع کنن, بهتره اول بگیم دیباگ کردن تو کجای قصه قهرمان ما میشه و نجاتمون میده.دیباگ کردن میتونه برای هدف های مختلفی انجام بشه و میخوام چند تا مثال براتون بزنم.یکیش اینکه شما رفتار سیستم رو میشناسید و میخواید باگ ها رو پیدا کنید.دومیش اینکه شما میخواید رفتار سیستم رو کشف کنید.سومیش هم اینکه شما میخواید یک زبان رو یاد بگیرید. به نظر من دیباگ کردن یک کد به زبان جدید و فهمیدن رفتارش کمک خیلی زیادی به سرعت یادگیری شما میکنه.البته که همه ی این سه حالت میتونه باهم انجام بشه ولی حالا برا روشن شدن قضیه چند تا مثال با جزئیات براتون میگم :قرار هست یه قسمت جدید به کد اضافه کنیم یا یه پروژه جدید استارت بزنیم (رفتار سیستم را میشناسید)فرض کنید شما تازه یه پروژرو استارت زدید یا اینکه میخواید یه ویژگی جدید به کدهای قدیمیتون اضافه کنید. شما باید یک قالب کلی از کدتون رو تو ذهنتون بیارید مثل نوشتن فیلم نامه, اجزا و نقش ها کجا باشن, وظیفه ی هرکسی چیه و کجا باید وارد عمل بشه. یک فیلم نامه ممکنه بارها و بارها بازبینی بشه پس نویسنده باید بدونه کدوم اتفاقا کجا میفته و چه پیامدهایی داره. کد شما هم همینطوره. وقتی اولین بار بعد از تموم شدن کد ازش اجرا میگیرید در اکثر مواقع با ارورها یا خروجی های نامتعارف روبرو میشید ( اگه نشدید طبق مثل هرچیزی که آسون حل میشه غلطه به کارتون شک کنید یا اینکه تبریک میگم شما ابر قهرمان امروز هستید) اینجاس که باید وارد عمل بشید و با دیباگ کردن مشکل کارتون رو پیدا کنید.ما ویژگی جدید نمیخوایم! فقط میخوایم کد فعلیمون درست کار کنه (رفتار سیستم را میشناسید)بعضی مواقع خطاهایی توسط کاربران سیستم یا خود برنامه نویسا تو روند اجرای یه دستور مشاهده میشه که اسمشو گذاشتن باگ. این باگ ها توسط خود شما یا همکارانتون تولید شده (بله حقیقت تلخه) و حالا شما باید از گسترش این ویروس خطرناک جلوگیری کنید. اینجا هم ازون مواقعیه که دیباگ کردن به دادتون میرسه و همرو خوشحال میکنه (به شرطی که حل کردن یه باگ موجب ایجاد باگ دیگه ای نشه)مهندسی معکوس! (شناسایی رفتار سیستم یا یادگیری زبان جدید)دلیل این مهندسی معکوس دو حالت بیشتر نیستشما میخواید مثل کشور دوست و همسایه ی چین یه محصولو کپی کنید.شما پول دادید یه محصولو خریدین یا از یک محصول رایگان استفاده میکنید ولی همه ی نیازهای شمارو برطرف نمیکنه و لازم دارید رفتار سیستم رو در مقیاس کوچیک شناسایی کنید و اونو بسته به نیازمندی هاتون تعمیم بدید.دیباگ کردن بدین صورت اتفاق میفته که شما با یکی از دستورهای سیستم شروع میکنید و حین اجرا شدنش چشم از مانیتور برنمیدارید تا بفهمید دقیقا چه اتفاقی داره میفته. بعد همونو با یه زبان دیگه کپی میکنید (چین) یا اینکه اون رفتارو توسعه میدید.چطور دیباگ کنیم؟خب بعد ازینکه صغری کبری هامو چیدم بهتره برم سراغ هسته ی اصلی مطلب.من بیشتر وقتمو تو بک اند گذروندم پس طبیعتا راه حل هایی که بلدم هم بیشتر محدود میشه به این حوزه. یدونه تجربه کوچیک تو فرانت اند دارم که اونم میگم.از IDE استفاده میکنید؟ تبریک میگم شما شش هیچ جلویید.IDE debuggerیک راه خیلی خوب که بهتون کمک میکنه کدتون رو دیباگ کنید استفاده از یک محیط توسعه هست(سعی کردم معادل فارسی برای IDE پیدا کنم و همین به ذهنم رسید). این محیط امکاناتیو برا شما فراهم میکنه(تب debug اون بالا) که میتونید یک قسمت از کد رو نشان گذاری (breakpoint) کنید و کدتون رو ران کنید. کلید های میانبر زیادی هستن که این وسط به کمک شما میان. میتونید باهاشون هر متغیریو که دلتون میخواد به صفحه اضافه کنید و ببینید تو هر لحظه چه مقداری دارن, میتونید انتخاب کنید نشانگر خط به خط جلو بره یا اینکه از روی توابع یا حلقه ها بپره(step over, step into, step...).تکنیک های این قسمت :تو حلقه ها و توابع فراخوانی شده اصولا کار حوصله سر بریه ولی بهتره تو بار اول یک دور کامل کل حلقه یا تابع رو برید تا مطمئن شید چیزی اون وسط نمیترکه.سعی کنید متغیرهای اساسی و اونهایی که حدس میزنید دارن به شما اسیب میزننو مانیتور کنید. اینکه از الف تا ی هرچی دارید نگاه کنید ممکنه باعث شه چشمتون خطای اصلیو نبینه.اگر بعد از تموم شدن یک پارت دیباگ به نتیجه نرسیدین سعی کنید ورودی هاتون رو عوض کنید و از مقادیر غیر قابل پیشبینی استفاده کنید. مثلا وقتی انتظار دارید مقدار یه متغیر یک عدد مثبت باشه, اعداد منفی یا کاراکترهایی یحتمل مثل (+,.) که ممکنه کاربر اشتباها وارد کرده باشه رو هم امتحان کنید.سعی کنید بهترین جا برای گذاشتن breakpoint ها رو انتخاب کنید. اینکه از خط اول کد تا خط دویست رو مانیتور کنید ممکنه حوصلتونو سر ببره. اول نقاط حساسی که حدس میزنید اشکال ازونجاس رو ببینید بعد یکم بالاتر و پایین ترشون و در نهایت اگه به هیچ جوابی نرسیدین لپ تاپو خاموش کنید برید خونتون.من از تکست ادیتور ها استفاده میکنم!بعله خود من علاقه ی عجیبی به ادیتور ها دارم و سرم درد میکنه الکی. ادیتور ها توانایی اینو دارن که مثل حالت قبل نشان گذاری بشن ولی اصولا کار سخت و زشت و حوصله سربریه و من که بیخیالش شدم. اولین باری که من از IDE اومدم روی ادیتورها سوال بزرگی که تو ذهنم بود این بود که حالا من چجوری بفهمم چی چه مقداری داره و چی کار نمیکنه. برا همین این دوتارو از هم جدا کردم چون به عنوان جونیور دولوپر بعضی وقتا ادم از شنیدن بعضی اسما پنیک میکنه و بهتره بدونه حالا باید چکار کنه.بهترین حالت برای دیباگ کردن با ادیتور استفاده از دستور print به زبانی هست که باهاش کد میزنید. البته این روش تو حالت های دیگه هم کارایی داره و در نهایت شما انتخاب میکنید چکار کنید.تکنیک های این قسمت :شما ابتدا باید ببینید خروجی اشتباه محصول دست کدوم فایله بعد تابع مورد نظر رو اونجا پیدا کنید و سعی کنید هرجا که حس میکنید مشکلی هست مقدار متغیر یا یک مقدار فرضی رو چاپ کنید.شما کد طولانی دارید که اجرای بعضی قسمتاش زیاد طول میکشه. بهتره بعد از تموم شدن چاپ مقادیری که میخواید از دستورهای exit یا die تو زبون خودتون استفاده کنید (به شرطی که مطمئنید اجرای بقیه قسمت ها رو رفتاری که میخواید دیباگ کنید تاثیری نداره)ممکنه شما خروجی های دیگه هم رو صفحه داشته باشید پس باید یطوری خروجی های دیباگتون رو ازشون جدا کنید. اگر تنبل نیستید میتونید از یه عبارت استفاده کنید مثلا `FOR DEBUG` من تنبلم و همیشه از ‍‍‍`>>>>>>>` قبل از چاپ استفاده میکنم.چیزی که خیلی مهمه اینکه شما یطوری ترتیب برنامرو تو خروجیتون نشون بدید. مثلا اگر میخواید بدونید مقدار یک متغیر قبل و بعد از اجرای یک تابع چقدره باید بگید.‍`BEFORE FUNCTION VALUE IS``function()‍``AFTER FUNCTION VALUE IS`چون صرفا چاپ مقدار متغیر نشون نمیده که کجای برنامه این مقدارو داشته.یه وقتایی ممکنه یه تابع کوچیک داشته باشید و اصلا متغیر خاصی برای چاپ مد نظرتون نباشه. اینجور مواقع بهتره بعد از هر خط کد یه عبارت ساده چاپ کنید. مثلا اگر من یه تابع ۵ خطی داشته باشم بعد از هر خط اینطوری چاپ میکنم.debug 1debug 2debug 3debug 4debug 5بعد از اجرا بهم خوردن ترتیب اجرا یا چاپ نشدن بعضی مقادیر کمکتون میکنه متوجه شید کجا مشکل داره. مثلا من همین امروز ازین روش استفاده کردم و فهمیدم با یه ورودی خاص وارد قسمت پنجم نمیشم و یچیزی درست اجرا نمیشه.sequential debugفرانت اند رو چطوری دیباگ کنیم؟من به عنوان یه جونیور فرانت اند دولوپر تنها راهی که بلدم اینکه روی صفحه کلیک راست کنم. گزینه ی inspect رو بزنم و اونجا اگر چیزی مرتبط با html باشه تگ هارو چک کنم و اگر مربوط به جاوا اسکریپت به تب console بریم و اونجا دستور console.log() رو با هر متغیری که میخواید فراخوانی کنید تا ببینید کجای کار مشکل داره.باگ رو پیدا کردم, حالا چکار کنم؟فرض کنید شما یک پزشک هستید که موفق شدید عفونتی رو که در بدن بیمارتون وجود داره شناسایی کنید حالا اولویتاتون چیا میتونه باشه؟سریعا جلوی رشد عامل عفونت (باگ) رو بگیرید تا بیشتر بدن بیمارتون ضعیف تر نشه.بقیه ی قسمت های مختلف بدن رو که به عضو مشکل دار وصل هستند چک کنید و مطمئن بشید اونا قبلا توسط اون ویروس آسیب ندیدن. در دنیای کامپیوتر یک باگ ممکنه برای مدتی اطلاعات غلطی رو تولید کرده باشه و وارد دیتابیس شما کرده باشه. باید اونارو پیدا کنید و بازسازی کنید.به بیمارتون توصیه هایی بکنید و بدنشو مقاوم تر کنید تا جلوی ویروس های مشابه گرفته بشه. همونطوری که هزاران هزار باکتری و ویروس وجود داره و آدم هارو تهدید میکنه و ما هم ازشون خبر نداریم, خیلی باگ ها هم وجود داره که ما ازشون خبر نداریم ولی بهتره بعد از پیدا کردن یکیشون سیستم رو در برابر خطر مشابه ایمن کنیم. هر باگ میتونه یه واکسن باشه که شمارو یبار به دردسر بندازه و بعد تا اخر عمر از دستش راحت بشید. سعی کنید حتما تست نویسیرو شروع کنید تا سیستمتون رو قوی تر کنید. اگر حس میکنید تیم های دیگه مسبب تولید این وضعیت شدن حتما باهاشون صحبت کنید. حتی اگر یک کمپانی بزرگ هستن و لازمه شما یک ایمیل طولانی و اداری براشون بنویسید!خب الان دقیقا چکار کنم؟هیچی دیگه تموم شد کامپیوترتو ببند برو یکم ورزش کن عزیزم :)