معمای حل نشده! (قسمت اول: باگ! )

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

با این فرمول هر باگی در برنامه نویسی قابل حل است؛ زمان کافی + سماجت!

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

 

باگ ها چند دسته اند!

باگ هایی هستند که بسیار کوچک بوده و به راحتی قابل یافتن می باشند. حتی خود زبان برنامه نویسی مد نظر نیز این باگ ها را به شما نمایش داده و راه حل را نیز ارائه می دهند. مثل باگ هایی که مربوط به نحو (syntax) می باشد. ( مانند فراموش کردن ; در php ). دسته ی دیگری از باگ ها مربوط به منطق برنامه می شوند، یعنی باگ هایی که کامپایلر ( یا مفسر در php ) به این دلیل این خطا ها در منطق برنامه ( اهداف خاص برنامه ) می باشد، قادر به تشخیص آن نیست. به طور مثال انتظاری که از تکه کد زیر دارید می تواند نمایش مقدار true باشد

 

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

 

بر طرف کردن کدام دسته از باگ ها سخت تر است؟

باگ های مربوط به syntax توسط خود کامپایلر/مفسر با جزئیات دقیقی از جمله خط مورد نظر گزارش می شوند. در بدترین حالت ممکن این امکان وجود دارد که با فراموش کردن یک ; ( نقطه ویرگول یا همان semicolon ) خطا در یک یا دو خط بالاتر از آنچه که برنامه می گوید باشد. اما یافتن باگ هایی که مربوط به منطق برنامه باشند ( برنامه کاری را که انتظار داریم، به درستی انجام ندهد ) بسیار سخت تر می باشد. پس تا اینجا متوجه شدیم که باگ های منطقی زمان بیشتری را برای دیباگ کردن نیاز دارند. اما آیا این نوع باگ ها، سخت ترین و زمان بر ترین هستند؟ خیر! باگی که در ادامه در مورد آن خواهم نوشت از سخت ترین و زمان بر ترین باگ ها می باشد.

 

داستان معروف خودروی معیوب و مکانیک

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

 

چیندی و مکانیک ( که خودم مکانیکش هستم )

از زمانی که به تیم چیندی ( سفارش آنلاین غذا در مشهد ) ملحق شدم، با مشکل عجیبی روبرو بودیم که دقیقا مثل داستان فوق بود. گزارشات زیادی از این مشکل به من ( که در سِمَت مدیر فنی سایت هستم ) می رسید، اما هر وقت که خودم ( به عنوان مکانیک ) برنامه را تست می کردم، تمامی قسمت ها، بدون هیچ مشکلی کار می کردند و درست مثل مکانیک، تا زمانی که ندانید مشکل چیست و علت آن چیست نمی توانید به حل آن مشکل بپردازید. به همین دلیل در یک ماهه ی قبل این مشکل هم چنان پابرجا بوده است.

و بدتر از همه آنکه، سایت چیندی هم مثل ماشین پدری من که گاهی صدای مذکور به گوش می رسید و گاهی هم بدون هیچ سر و صدایی همه چیز خوب و مرتب کار می کرد. گاهی با این مشکل روبرو بود و گاهی هم نبود. فرض کنید کدی که در بالا نوشته شده است، چندین بار جواب درست (true) به شما نمایش دهد و در این بین هم یک بار غلط (false) به شما نمایش دهد.

 

معمای حل نشده ی چیندی

همانگونه که گفته شد، چیندی سایت سفارش آنلاین غذا در مشهد می باشد و معنی اش اینست که این سایت بخشی برای مشتریان خود داشته و کاربر برای تکمیل فرآیند خرید خود باید وارد سایت شود و مراحل را به طور کامل و در نهایت تا مرحله ی پرداخت طی کند. با توجه به این موضوع هر گونه مشکلی در این می تواند باعث شکست در روال سفارش و خروج کاربر شود. متاسفانه چیندی درست در همین قسمت باگی نه از نوع نحو (syntax) که بلکه از نوع دوم باگ های منطقی داشت. این مشکل از بین هر ۵۰ مشتری برای یک نفر اتفاق می افتاد که در مرحله ی تایید نهایی سفارش با خطای شماره ی ۴۰۰ ( شما قادر به تایید اطلاعات ارسالی خود نمی باشید) روبرو می شد.

 

Yii2 – Bad Request (#400) Unable to verify your data submission

 

مشکل فوق زمانی حادتر می شد که من ( به عنوان مکانیک سایت 🙂 ) قصد داشتم مشکل مربوطه را عیب یابی کنم، من هم مثل تمام مکانیک ها هیچ وقت جزو آن ۵۰ مشتری ای که با این مشکل می خوردند نبودم و به طبع هم نمی توانستم مشکل را عیب یابی (دیباگ) کنم! فقط تا آنجا متوجه شدم که این مشکل به دلیل درست نبودن CSRF_TOKEN ایجاد می شود. یعنی توکن ( کد رمز ) درون برنامه و توکنی که کاربر ارسال کرده است، یکسان نبوده و کد مربوط با هر بار رفرش کردن سایت در سمت سرور تغییر می کرد. جواب این معمای حل نشده را ( که امروز حلش کردم) در قسمت دوم این مطلب خواهم نوشت.

2 Replies to “معمای حل نشده! (قسمت اول: باگ! )”

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *