Як часто вам доводилося сидіти над своєю програмою, що не працює, і розбиратися в чому ж справа? Скільки часу ви на це витрачали? В цій статті поговоримо про те, як отримати навичку швидкого пошуку й усунення помилок в коді.
- Налагоджуємо код
У сучасному світі існує купа різних інструментів, які допомагають в розробці ПЗ. У багатьох інтегрованих середовищах розробки (IDE) такі інструменти, як налагодження коду (debugging) вже вбудовані спочатку, і все, що вимагається від розробника програмного забезпечення — це просто уміти використати цей інструмент.
Ми думаємо, що навіть не варто говорити про те, як навичка налагодження прискорює розробку ПЗ.
Замість того щоб самостійно (зорово) прораховувати кожен крок вашої програми, ви доручаєте робити це комп'ютеру, у якого вірогідність помилитися практично зводитися до нуля.
Від програміста ж вимагається лише уважно дивитися на поетапний «прогін» програми й аналізувати її на можливі помилки.
Новачку програмісту іноді буває складно відразу освоїти налагодження коду, проте це необхідно зробити, оскільки ця навичка просто зобов'язана бути у будь-якого розробника. Щоб краще розібратися з налагодженням коду в конкретному середовищі, можна зайти на сайт розробника вашого IDE і вивчити тонкощі цієї справи там. Наприклад, якщо ви користуєтеся VisualStudio, то вам підійде наступний ресурс.
- Використовуємо unit-тестування
Гадаємо, багато наших читачів чули про юніт-тестування (модульне тестування) і знають, що це таке. Але для тих, хто ще, можливо, не встиг ознайомитися з цим видом тестування, ми коротко пояснимо, що до чого.
Unit-тестування — це процес, що дає змогу перевірити на коректність окремі модулі (функції) вихідного коду програми.
Ідея полягає в тому, щоб розбити програму на частини, які легко аналізуються, і писати тести для кожної функції або методу. Це дає змогу досить швидко перевірити, чи не призвела чергова зміна коду до появи помилок у вже відтестованих місцях програми, а також полегшує виявлення та усунення таких помилок.
Простіше кажучи, наприклад, є клас «Transport System», який відповідає за транспортні перевезення між містами. Припустимо, у цього класу є окремі методи («GetBusses(), GetTrains()» тощо). Тоді, під час юніт-тестування, ми спочатку перевіряємо на коректність роботу GetBusses(), а потім, якщо впевнилися в його правильній роботі, перевіряємо наступний метод GetTrains() тощо. Якщо ж робляться правки в якомусь місці програми, то тоді не доводиться тестувати всю програму цілком — достатнім буде тестування тільки залежних компонентів цього місця програми.
У цьому, власне, і є перевага юніт-тестування. До того ж придумувати тести для однієї простої, тривіальної функції значно простіше, ніж для всієї величезної програми.
- Підготуємо вичерпний набір тестів
Буває так, що програма проходить усі придумані тести й програміст вважає, що програма працює коректно. Однак потім, у процесі подальшої роботи над ПЗ або, що ще гірше в процесі експлуатації, стає зрозуміло, що програма працює неправильно. Але як же так? Адже вона пройшла всі тести...
У такому разі проявляється недолік тестування, тобто ми не передбачили в нашій програмі якийсь варіант розвитку подій. Як приклад, розглянемо просту програму, яка розв'язує квадратне рівняння із заданими коефіцієнтами.
Нехай ми написали правильний код, що працює. І навіть перестрахувалися на той випадок, що якісь коефіцієнти можуть бути нулем і що дискримінант рівняння може бути негативним. Але не врахували одного: що програма повинна виводити в разі, якщо всі коефіцієнти дорівнюють нулю й у нас виходить рівняння 0*x^2 + 0*x + 0 = 0?
А не врахували ми цей випадок, тому що під час тестування коду не розглянули такий варіант розвитку подій. Саме тому потрібно намагатися вигадувати абсолютно повний вичерпний набір тестів і тестувати свою програму абсолютно на всіх (нехай навіть «найпідліших» або неможливих) вхідних даних.
- Звертаємося по допомогу до інших
З цією порадою все набагато простіше: якщо ви відчуваєте, що застрягли на якомусь моменті, і не розумієте, чому програма працює неправильно, то порада очевидна — шукайте допомоги в оточення.
Варто звернутися до більш досвідчених програмістів або хоча б до своїх друзів-розробників, які зможуть поглянути на вашу програму «тверезим» поглядом і виявити, можливо, навіть дуже очевидну помилку, яку ви проґавили через те, що вже просто втомилися.
До того ж колективний розум завжди «розрулює» проблеми. І, можливо, вам вдасться не тільки виявити помилку, а й зрозуміти, чому вона сталася, і у майбутньому подібних помилок не робити.
- Повернемося до пошуку пізніше
Теж досить банальна, але дуже дієва порада. Іноді буває просто потрібно відпочити, «перемикнутися», зайнятися чимось іншим і повернутися до пошуку помилок пізніше. Так ви не тільки даєте можливість своєму мозку трохи відпочити, що в підсумку допоможе краще сконцентруватися й помітити помилку, яка «втекла» від очей, а й продовжуєте мислити в підсвідомості, що, можливо, теж призведе до генерування чергових тестових ідей, а відповідно й до вдалого пошуку помилок.
Сподіваємося, цей матеріал допоможе вам в усуненні помилок у ваших програмах.
Удачі у налагодженні програм!
Олег Топорков