هر چیزی که عملکرد نرمافزار را از حالت پیشبینیشده خارج کند، در دنیای برنامهنویسی اصطلاحاً Bug نامیده میشود و یافتن باگهای برنامه گاهی اوقات کار بسیار دشواری خواهد شد (در همین راستا، توصیه میکنیم به مقالهٔ Grace Murray Hopper: کسی که برای اولین بار اصطلاح Bug را باب کرد! مراجعه نمایید.) باگها انواع و اقسام مختلفی دارند و هر یک از آنها ویژگیهای مخصوص به خود را دارند. برای رفع یک باگ ابتدا باید نوعِ آن را مشخص کرده و آن را دستهبندی کنیم که در همین راستا در ادامه دستهبندیهای مختلف باگها را معرفی میکنیم و به راهحلهای پیشنهادی برای رفع آنها میپردازیم.
باگهای فانکشنال
برای یافتن این نوع باگها میباید فانکشنالیتی (کارکرد) برنامه را زیر نظر داشته باشیم بدین صورت که ببینیم آیا اپلیکیشن مد نظر آنچه را که از آن توقع داریم به درستی انجام میدهد یا خیر. اگر یک فانکشن کار عجیبوغریبی انجام میدهد که برای آن کار ساخته نشده است، نتیجه میگیریم که باگ است. به عنوان مثال، تصور کنید دکمهای در برنامه قرار دارد که با کلیک روی آن باید پنجرۀ A باز شود اما وقتی روی آن کلیک میکنیم پنجرۀ B باز میشود و یا اینکه اتفاقی که در نیازمندیهای فانکشنال برایش در نظر گرفتهایم نمیافتد که در این حالت نتیجه میگیریم با یک باگ فانکشنال روبهرو هستیم.
در پاسخ به این پرسش که «نیازمندیهای فانکشنال چیست؟» میتوان گفت که مستنداتی است که در آن ورودیها، خروجیها و هر آنچه از هر فانکشنی انتظار داریم که انجام دهد ذکر شده است. اگر از قبل نیازمندیهای فانکشنال را تهیه نکرده باشیم، یافتن اینگونه باگها چالشبرانگیز خواهد شد مضاف بر اینکه یافتن و رفع این نوع باگها نیازمند تجربه و کارآزمودگی است و نیاز به صبوری دارد. یکی از راهکارهای پیشنهادی برای پیدا کردن این نوع باگها، Exploratory Testing یا به اختصار ET است؛ به عبارتی، این نوع تست شامل یادگیری، تستِ طراحی و تستِ اجرا به طور همزمان میشود.
علاوه بر این، نوشتن یونیت تست برای هر یک از فانکشنها یکی از بهترین روشها برای یافتن و رفع این نوع باگ است و گرچه این کار زمانبر و طاقتفرسا است اما نتیجۀ آن سادگیِ کشف و رفع باگ است (منظور از یونیت تست این است که به ازای هر یک از فانکشنها، یک فانکشنِ تست نیز نوشته میشود که عملکرد آن فانکشن را بررسی میکند.)
باگهای رابط کاربری
این دسته از باگها به راحتی قابلیت شناسایی دارند زیرا در صفحۀ نمایش دیده میشوند و برای پیدا کردن این نوع باگها کافی است تمام اِلِمانهای موجود در صفحۀ نمایش را از نظر موقعیت مکانی، رنگ و اندازه با اِسکچ اولیهٔ اپلیکیشن خود چک کنید (اِسکچ برنامه شکل ظاهری برنامه است که معمولاً روی کاغذ کشیده میشود اما در عین حال نرمافزارهایی هم برای این کار به بازار عرضه شدهاند.)
همچنین میتوانید از دستورالعملهای طراحی در کنار اِسکچ یا به جای آن استفاده کنید. این دستورالعملها معمولاً استایلها و اِلِمانها را در حالتهای مختلفشان توصیف میکنند. به عنوان مثال، مشخص میکنند که یک لینک در ابتدا، بعد از قرار گرفتن ماوس روی آن و وقتی روی آن کلیک میکنیم به چه شکلی باید نمایش داده شود. به طور کلی، باگهای رابط کاربری دیر یا زود خود را برملا میکنند و در اثر چند بار تست برنامه لو میروند و فقط کافی است به موارد زیر دقت کنید:
- بلوکها یا اِلِمانهای روی هم افتاده
- تکستهایی که از بلوک بیرون زدهاند
- اِلِمانهایی که سرجایشان نیستند
همچنین توجه داشته باشید که ممکن است باگهای رابط کاربری هنگامی که به دنبال باگهای فانکشنال میگردید خودشان را نشان دهند.
باگهای مکانی-زمانی
این نوع باگها هنگامی رخ میدهند که برنامۀ شما از چند زبان مختلف پشتیبانی کند و یا برای مخاطبانی از کشورهایی با تایمزونهای متفاوت تهیه شده باشد. ابتدا باید چک کنید که آیا برنامه در مُدهای زبانی مختلف به درستی عمل میکند یا خیر. با تغییر زبان، متنها باید در تمامی اِلِمانهای برنامه ترجمه شده باشند و اگر با تغییر زبانِ برنامه از حالت پیشفرض به زبان دیگر متوجه شدید که چیزی ترجمه نشده یا زبانش تغییر نکرده این بدان معنا است که با یک باگ مکانی-زمانی مواجه هستید (در این مورد احتمالاً با باگ رابط کاربری نیز روبهرو میشوید، زیرا متون در زبانهای مختلف طول متفاوتی دارند و احتمالاً با بروز این باگ از کادر خارج میشوند.)
بسته به نوع اپلیکیشن، گاهی مجبور هستید که تایم برنامه را هم چک کنید که آیا زمانِ درست و منطبق با تایمزونِ کشور مخاطب را نشان میدهد یا خیر مضاف بر اینکه به فرمتِ تاریخ و ساعت دقت کنید زیرا برخی کشورها فرمتِ ساعت و تاریخ مختص به خود را دارند (اگر واحد پولی یا وزنی مثل دلار، ریال، پوند، کیلوگرم و ... در برنامه به کار رفته، نیاز است تا آن را هم منطبق با کشور مخاطب قرار دهید.)
باگهای کاربردپذیری
اگر اپلیکیشنی در زمینهٔ کاربردپذیری (Usability) ضعف داشته باشد، کمتر کاربری را میتوان یافت که با رغبت از آن استفاده کند و طبیعتاً محبوب نیز نخواهد شد. اگر کاربر چیز خاصی را به مدت طولانی پیدا نکند (مثلاً دکمۀ ثبتنام) و یا دسترسی به آن برایش دشوار باشد، شما دچار باگِ کاربردپذیری شدهاید. همچنین استفاده از رنگهای نامناسب نیز گونهای دیگر از این نوع باگها است. مثلاً اگر رنگ بکگراند با تکست نزدیکی داشته باشد، چشم کاربر پس از مدتی خسته شده و از اپلیکیشن شما دلزده میشود.
گونهای دیگر از این نوع باگ، که به وفور رخ میدهد، نامشخص بودن عملکرد یک دکمه است. دکمهای که فاقد عنوانی مناسب است و یا آیکان مناسبی ندارد کاربر را گیج میکند و به تجربهٔ کاربری لطمه میزند که در این مورد بهتر است در نظر داشته باشیم ممکن است کاربری که دچار کوررنگی است از برنامۀ ما استفاده کند و باید تمهیداتی از قبیل رنگبندی مناسب و ... را برای این دسته از کاربران در نظر بگیریم.
باگهایی که در ادامه به آنها میپردازیم باگهایی هستند که در فضای وب و کتابها کمتر به آنها پرداخته شده است اما به این معنی نیست که اصلاً حائز اهمیت نیستند.
باگهای یکپارچگی
یکپارچگی (Integration) میان بخشهای مختلف برنامه فقط مختص اپلیکیشنهای پیچیده نیست، بلکه ویژگی مشترک تمام وبسایتها و برنامههای خوشساخت است. اگر اطلاعات به درستی میان بخشهای مختلف برنامه ردوبدل نشود، این بدان معنی است که برنامه باگ یکپارچگی دارد. مثلاً تصور کنید وبسایتی داریم که قرار است دیتای خاصی را از صفحۀ A به صفحۀ B منتقل کند که اگر اطلاعات موجود در صفحۀ A، با اطلاعات نمایش داده شده در صفحۀ B همخوانی نداشته باشد، باگ یکپارچگی رخ داده است.
باگهای بهروزرسانی سیستم
امروزه بهروزرسانیهایِ نرمافزارها بسیار مرسوم است که معمولاً شامل فانکشنهای جدید یا رفعِ باگهای مهم سیستم هستند. در عین حال، ممکن است روند اجرای این بهروزرسانیها خود دارای باگ باشد که پیدا کردن این دسته از باگها بسیار دشوار است چرا که معمولاً باعث از دست رفتن تنظیمات کاربر یا لاگاوت اجباری کاربر از سیستم میشوند.
باگهای صوتی
شاید از صوت در همۀ نرمافزارها استفاده نشود، اما اگر در برنامهتان نوتیفیکیشن میفرستید یا پخش صدا دارید، حتماً آن را چک کنید بدین صورت که ببینید آیا اصلاً صدایی تولید میشود یا خیر سپس بررسی کنید که کیفیت صدا مناسب باشد و هیچ قطعی یا بههمریختهگی در صدا ایجاد نشود مضاف بر اینکه میزان صدای پیشفرض و قابلیت کم و زیاد کردن آن نیز از مواردی است که باید مورد بررسی قرار بگیرد.
باگهای تِکسچر و آبجتهای سهبُعدی
این دسته از باگها معمولاً در بازیهای سهبُعدی رخ میدهد و در اکثر مواقع از چشم طراح مخفی میمانند. برای پیدا کردن این باگها ابتدا باید فرق بین باگ تکسچر و باگ آبجکتهای سهبُعدی را بدانید.
طراحی بازی سهبُعدی به این صورت است که یک تعداد آبجکت داریم که موجودیتها را مشخص میکنند و این آبجکتها با تِکسچر پوشانده میشوند تا دیده شوند. باگ آبجکتهای سهبُعدی به این صورت است که مثلاً کاراکتر شما بعد از انجام عملی خاص یا رفتن به یک مکان خاص ناگهان غیب میشود! که دلیل این اتفاق وجود ناهماهنگی یا ضعف در جایگذاری آبجکت (Aliasing) در آن موقعیت خاص است. این باگ ممکن است زمانی رخ دهد که تِکسچرها روی هم بیفتند و اصطلاحاً با هم Overlap داشته باشند در حالی که ظاهراً اطرافش چیزی نیست که سد راهش باشد که در این حالت میگوییم برنامه دارای باگ آبجکت سهبُعدی است.
تِکسچر تصویری است که روی آبجکت قرار میگیرد و آن آبجکت را متمایز میکند. اگر «چیزِ» نامرئی سدِ راه کاراکتر شود به طوری که کاراکتر نتواند جلوتر برود، به این معنی است که این «چیز» تکسچر ندارد و طراح فراموش کرده بر روی این آبجکت تِکسچر قرار دهد (البته در برخی موارد هم تِکسچر موجود است اما با آبجکت هماهنگ نیست.)
باگهای محتوایی
محتوای وبسایت معمولاً به وسیلۀ تیم تولید محتوا و کپیرایتینگ بررسی میشود به طوری که این افراد بایدها و نبایدها را به درستی میدانند و محتوا را پیش از انتشار بررسی میکنند. از انتخاب واژگان مناسب گرفته تا تایپو (غلط املایی) جملگی جزو باگهای محتوایی هستند و نیاز به توضیح نیست که این نوع باگها میتواند اعتبار یک مقاله یا پُست را تحتالشعاع قرار دهد.
جمعبندی
لازم به یادآوری است که انواع دیگری از باگها نیز معرفی شدهاند از جمله باگ HeisenbergBug ،BohrBug ،MandelBug و Schrödinbug که در مقالۀ درآمدی بر انواع باگها در صنعت توسعۀ نرمافزار به آنها پرداخته شده است. به علاوه اینکه نوع دیگری از باگها تحت عنوان «باگهای پرفورمنسی» هستند که اساساً پیدا کردنشان کاری بس زمانگیر است که برای کسب اطلاعات بیشتر، توصیه میکنیم به مقالهٔ Performance Bugs: یکی از بدترین انواع باگهای برنامهنویسی مراجعه نمایید.
بشر با دستهبندیِ مسائل سعی در سادهسازی آنها دارد. نه تنها در این مبحث بلکه در تمامی مباحث با دستهبندیِ درستِ مسئله میتوان محدودۀ جوابها را کوچکتر کرده و انرژی و تمرکز خود را معطوف به راهحلهای محتمل برای آن دسته کرد. در همین راستا، برای یافتن و رفعِ باگها ابتدا آنها را در دستۀ مربوطهشان قرار دهید سپس با توجه به راهحلهای پیشنهادی، آنها را رفع نمایید.