خلاصه کتاب Pragmatic Programmer. درس20

درس 20: اشکال زدایی Debuggingکلمه باگ به معنی لغوی حشره است که برای توصیف ترس هم استفاده میشه و از قرن 14 میلادی استفاده میشده.در سال 1946 دکتر گریس هاپر مخترع زبون برنامه نویسی کوبول، یک روز وقتی سیستم بدرستی کار نمیکرد به اپراتور گفت تا سخت افزارها رو چک بکنه و اون متوجه یک حشره که توی یک رله سخت افزاری گیر کرده میشه، این شد که کلمه باگ وارد دنیای کامپیوتر شد و از اون به بعد هر مشکل یا خطا توی هر سطحی از سخت افزار، نرم افزار، شبکه و زیرساخت، و ... باگ نامیده شد.هیچ کس نمیتونه نرم افزار بدون مشکل بنویسه، از این رو بخش عمده ای از تایم روزتون رو دیباگینگ میگیره و در این فصل یکسری استراتژی و چالشهای مربوط به دیباگینگ رو بررسی خاهیم کرد.روانشناسی دیباگینگدیباگینگ برای بعضی از برنامه نویس ها موضوعی حساس و یاحتی احساسی میشه، گاها بجای اینکه مثل حل یک معما بیفتیم به جون حل مشکل، ممکنه انکار، مقصر کردن دیگران، توجیه های مسخره صورت بگیره. این واقعیت را بپزیرید که رفع یک باگ دقیقا حل یک مسئله است و بجای اینکه دنبال مقصر کردن و یا سرزنش دیگران باشید، باید برای رفع آن اقدام کنید. متاسفانه ممکنه در برخی از محیط های کاری این رفتارهای اشتباه فرهنگ شده باشه. تمرکزتون روی حل مشکل باشه و نه سرزنش و یا توجیه.(مترجم: مرتبط با این موضوع یک نوشته جالب از یکی از مهندسای ایرانی گوگل خوندم شاید جالب باشه اینجا رفرنس بزنیمhttps://virgool.io/@kian1024/%D9%86%DA%A9%D8%A7%D8%AA%DB%8C-%D8%A7%D8%B2-%D9%81%D8%B1%D9%87%D9%86%DA%AF%D9%90-%DA%A9%D8%A7%D8%B1%DB%8C%D9%90-%D8%A8%D8%AF%D9%88%D9%86-%D9%85%D9%82%D8%B5%D8%B1%DB%8C%D8%A7%D8%A8%DB%8C-blameless-fxacoestxkax)ذهنیت آماده برای دیباگینگقبل از شروع به دیباگ شما باید ذهنتونو آماده کنید از این جهت که از لاک دفاعی خارج بشید، دنبال دفاع از نفس خودتون نباشید و به پروژه فکر کنید و حساسیت هایی که پیش رو دارید، اینجوری خیلی راحت تر میفتید توی دیباگینگ و اولین قانون دیباگینگ رو هم همواره جلوی چشمتون داشته باشید:**وحشت نکنخیلی ساده است که بیفتی توی ترس و وحشت، وقتی توی ددلاین پروژه ای، یا اینکه مشتری یا مدیر یقه تو چسبیدن تا هر چه سریعتر مشکل رفع بشه، این خیلی مهمه که ذهنتو مدیریت کنی و با تمام تمرکز به علت و یا منشا مشکل پیش اومده فکر کنی. اگر موقعی که کسی باگ رو بهت اعلام کرد، بگی : "این غیر ممکنه"، شما توی موضع اشتباه قرار گرفتی، چون هر چیزی ممکنه رخ بده و نباید ذهنتو درگیر این قسمت بکنی.** از کجا شروع کنیمقبل از اینکه خوده باگ رو چک کنید، کد رو چک کنید که بدون مشکل بیلد و هیچ وارنینگی نداره، ما معمولا سطح وارنینگ های کامپایلر رو میزاریم روی بالاترین سطح ممکن تا با بیشترین دقت بهمون وارنینگ ها رو اطلاع بده و چه باگ های رانتایمی که از توی دقت نکردن به اونها در میاد...موقعی که برای حل یک مشکل اقدام میکنید نیاز دارید که از تمام دیتیل و زوایاش مطلع باشی یا خودتو توی شرایطش بزاری تا به دست بیاری اون اطلاعاتو، چون معمولا گزارش باگ ها ممکنه دقیق یا کامل نباشه.فرض کنید روی یک اپلیکیشن گرافیکی رسم اشکال هندسی کار میکنید، تستر بهتون میگه وقتی یک چیزی رو میکشم یهو برنامه کرش میکنه، و شما و برنامه نویسهای دیگه هر چی تست میکنید خودتون میگید نه برای ما که پیش نمیاد، در نهایت پس از ساعتها یا روزها دیلی خوردن روی باگ مورد بحث، تستر میاد و اون عملیاتی که انجام میده تا باگ میخوره رو بهتون نشون میده، و شما زیر لفظی میگید "اوه" و ذکر میکنید هیچ وقت از گوشه پایین چپ به گوشه بالا راست اقدام به رسم شکل نکرده بودم. دو تا نکته توی این داستان هست:- ممکنه شما نیاز داشته باشید با کاربری که این باگ رو خورده جلسه داشته باشید (یا تلفنی یا اسکایپ یا انی دسکی) و باهاش ارتباط بگیرید.- تست های هوشمند بنویسید به شکلی که تمام حالتهای رسم شکل صفحه ای که نرم افزارتون ساپورت میکنه رو سیستمی تست بکنه** استراتژی های دیباگینگموقعی که شما فکر میکنید به اوضاع مسلطید و میدونید چه اتفاقی میفته، دقیقا همون زمانیه که نرم افزار بهتون نشون میده که اوضاع اونجوری که اون فکر میکنه پیش میره نه شما.- باگ هارو قابل تکرار کنیدباگی که در سیستم پیدا میشه رو آرشیو و با یک کامند اون رو شبیه سازی و قابل تکرار کنید، این توی قالب تست نویسی باید پوشش داده بشه.- متن لعنتی خطا رو بخونمتن خطا و استک تریس محل رخ دادنش خیلی کمک میکنه که سریعتر به کد مدنظر برسیم- نتیجه اشتباهاگر خطای پیش اومده کرش یا اکسپشن نباشه و خطای منطقی باشه، یعنی مثلا نتیجه محاسبه ای باید میشده 4 ولی شده 4.1 ، تو این حالت تریس کردن بهتون کمک میکنه تا روال محاسبه رو بررسی کنید، پیمایش کد و مسلط بودن به شورتکاتهای دیباگر خیلی مهمه- حساسیت روی دیتای ورودیگاها ممکنه شما برنامه رو رلیز کنید و حتی هفته اول رو هم با افتخار بدون مشکل سپری کنه ولی یهو توی حالت خاص با دیتای ورودی خاص کرش کنه، این خیلی مهمه که ورودی هاتون رو با دیتاست های مختلف تست و زیر بار ببرید یا ولیدیت ورودیها رو دقیقتر کنید.- پسرفت در رلیزهاشما در یک تیم خوب هستید و رلیز جدید نرم افزارتون رو میزارید، یهو خطایی در قسمتی از سیستم پیش میاد که قبلا درست کار میکرده، خوب میشد اگر میتونستید تغییری که باعث اون شده رو شناسایی کنید؟ وقت ریز ریز کردنه.- جستجوی دودوییالگوریتم دودویی میگه : آرایه سورت شده رو 2 قسمت میکنید، اگر مقداری که دنبالشید همون وسطه آرایه است که تامام و اگر بزرگ تر بود روی تکه دوم و اگر کوچیکتر بود روی تکه اول دنبالش میگردید، همین حرکتو ادامه میدید تا مقدار مورد نظر پیدا بشه یا حتی نشه.حالا چجوری از این توی دیباگینگ استفاده کنیم؟ وقتی با یک خطا با استک تریس بزرگ مواجهید و در تلاشید تا متوجه بشید کدوم فانکنشن خطا داده، دقیقا مکانیزم دودویی رو میتونید روی فریم های استک تریس بکار ببرید و با تقسیم کردن فریم ها سریعتر به تارگت برسید. یا اگر دنبال ردیفی از دیتا هستید که از بین یک دیتاست خطا رو توی سیستم بوجود آورده، باز میتونید همین مکانیزمو توی ردیف های دیتاست پیاده کنید تا به ردیف مدنظر برسید.- لاگ کردنلاگ کردن اتفاقات و خطاهای سیستم خیلی میتونه موثر باشه و کمکمون کنه تا حالتهای خاص رو در هر تایمی که رخ دادن شناسایی و گزارش بگیریم، همچنین خودمونم میتونیم در قسمت های حساسی که لازم میدونیم، منطق رخ داده یا دیتای خاصی رو لاگ کنیم تا بهمون توی دیباگ کردن سیستم کمک بکنه.** در اکثر پروژه ها شما وقتی در حال دیباگ کردن هستید ممکنه قسمت های زیادی از کد رو خودتون نزده باشید و هم تیمی هاتون زده باشن یا مربوط به محصولات ترد پارتی و کتابخونه ها باشه و بخشیشم وابسته به محیط اجرا و سیستم عامل باشه و کتابخونه های سیستمی. این احتمال وجود داره که سیستم عامل باگ داشته باشه، یا کامپایلر یا کتابخونه های ترد پارتی. اما این احتمال کاندید اول نیست موقعی که به خطایی میخورید، قطعا این احتمال بیشتر وجود داره که کد پروژه شما باگ داشته باشه و یا به شکل درست از اون منبع خارجی استفاده نکرده تا اینکه اون سیستم عامل یا کتابخونه باگ داشته باشه.توی ی پروژه بودیم که بابت یک باگی یکی از مهندسای ارشد پروژه مصرانه میگفت "select" سیستم یونیکس مشکل داره، و هفته ها هم درگیرش بود و کوتاه هم نمیومد، در نهایت وقتی که داکیومنت سلکت سیستم یونیکس رو خوند متوجه نحوه اشتباه استفادش شد و ماهم از اون به بعد این اصطلاحو باب کردیم توی تیم: "سلکتش خرابه!!"، هر موقع یکی از اعضای تیم باگی رو به سیستم های خارجی نسبت میداد میگفتیم نکنه سلکتش خرابه..** چک لیست دیباگینگ- آیا گزارش و دیتکت کردن باگ مستقیم از رخ دادن اون بوده یا توسط نشونه های دیگه کشف شده؟- آیا باگ پیش اومده ممکنه از فریمورک، سیستم عامل، کتابخونه و .. باشه؟- اگر این باگو برای همکاراتون شرح بدید، چی به ذهنشون میرسه؟- اگر کدی که منجر به باگ شده تست داشته و تست هاشو پاس کرده، نیاز هست دیتاهای مختلفی به تستش پاس بدید تا دقت تست بالا بره؟ و اینکه چرا تست رو پاس کرده اصن؟- ایا ممکنه در قسمت های مختلف سیستم مشابه این باگ رخ بده؟- ...دروس مرتبط: 24منبع کانال تلگرامی: https://t.me/pragmaticprogrammer_fa