Новенький файл, відкритий в текстовому редакторі, і жодної написаної рядки коду…Кожен новий проект бачиться повним можливостей і перспектив…

Кількома тисячами рядків коду пізніше, той же самий проект може виявитися обтяженим помилками, з-за яких додавання нових функцій стає головним болем, і падає ентузіазм програмістів. Кращі розробники знають, як знайти і усунути помилки, і дотримуються найкращих практик у розробці програмного забезпечення, щоб звести до мінімуму, в першу чергу, виникнення помилок.

Жоден програміст ніколи не напише абсолютно вірний код, але з деякою практикою і рішучістю цілком можливо писати чистий код, стримувати помилки і розробляти надійні програмні системи.

Ваш набір інструментів для боротьби з помилками

1. Оператор друку

Інструмент номер один для налагодження коду – це випробуваний і перевірений спосіб вставки операторів друку. Як рівнозначної заміни, для випадків, коли операторів друку багато, і ними важко керувати, може бути використана система протоколювання замість операторів друку. У багатьох мовах програмування для цього є у вільному доступі спеціальні бібліотеки, як, наприклад, бібліотека logging, вбудована в Python.

Оператори друку – це самий швидкий, простий і безпосередній для програміста спосіб інспектування значень даних і типів змінних. Правильно розміщені оператори друку дозволяють програмісту відслідковувати потік даних на ділянці коду і швидко визначати джерело помилки.

Не має значення, скільки передових технологій використовується, скромний оператор друку повинен бути першим інструментом, до якого звертається програміст, коли намагається налагодити ділянку коду.

2. Відладчик

Відладчики вихідного коду доводять метод налагодження за допомогою операторів друку до його логічного завершення. Вони дозволяють програмісту відстежити по кроках виконання коду рядок за рядком і інспектувати все, що завгодно, починаючи від значень змінних і закінчуючи станом віртуальної машини.

Більшість мов програмування мають безліч доступних отладчиков, які пропонують різні можливості, включаючи графічні інтерфейси, налаштування точок зупину для припинення виконання програми, і виконання довільного коду всередині середовища виконання.

Застосування налагоджувач може бути зайвим у багатьох ситуаціях, але при належному використанні, відладчик може стати потужним і ефективним інструментом. Для кращого розуміння можливостей відладчика, познайомтеся з відладчиком Python pdb.

3. Система відстеження помилок

Використання будь-яких системи відстеження помилок є життєво важливою умовою для нетривіальних проектів по створенню програмного забезпечення. Типова ситуація, яка складається, коли не використовують систему відслідковування помилок, така: програмісти змушені розбиратися в старих е-мейлах або листування в чаті в пошуках інформації про помилки, або того гірше — єдиним сховищем інформації про помилки є пам’ять програміста.

Коли таке трапляється, деякі помилки неминуче залишаються невиправленими, і що більш важливо, їх важче виявити та усунути інші, пов’язані з ними помилки.

Простий текстовий файл може слугувати початковою системою відстеження помилок для проекту. Із зростанням обсягу коду кількість помилок вийде за межі текстового файлу.

Існує великий вибір систем відстеження помилок в програмному забезпеченні, як комерційних, так і з відкритим вихідним кодом. Найважливішим критерієм у виборі такої системи є доступність для співробітників-непрограммистов, яким потрібно працювати з файлом помилок.

4. Верифікація програм

У деяких мовах програмування верифікатор може проводити статичний аналіз коду для виявлення проблемних місць до того, як код буде відкомпільований або виконаний, а в інших мовах верифікатор корисний для перевірки синтаксису і стилю написання.

Виконання програми верифікації всередині редактора під час написання коду або прогін коду через верифікатор до компіляції та виконання допомагає програмістам знаходити і виправляти несправності до того, як вони переросли у помилки в виконуваному програмному забезпеченні.

Використання верифікації дозволяє значно заощадити час з відстеження джерела несправності, викликаних синтаксичними помилками, помилками, і некоректними типами даних. Щоб отримати більш повне уявлення про можливості верифікатора, подивіться Pyflakes, верифікатор для Python.

5. Контроль версій

Також як і використання системи відслідковування помилок, застосування системи контролю версії – це найкраща практика в розробці програмного забезпечення, яка не може бути игнорирована при розробці будь-якого проекту значного розміру.

Системи контролю версії, такі як Git, Mercurial і SVN, дозволяють різними версіями бази коду бути розділеними, грунтуючись на тому, над чим працюють або хто розробляє код. Різні версії можуть бути об’єднані разом, тому кілька програмістів можуть працювати з базою коду в один той же час, не створюючи помилки, які могли б вплинути на хід роботи інших розробників.

Системи контролю версій відіграють ключову роль ще й тому, що дозволяють програмістам відкотити зміни до більш ранньої версії коду, просто повернувшись в стан бази до появи помилок, не допускаючи при цьому інших помилок, виправлення яких довелося би дорого поплатитися.

6. Модульність

Погано спроектований код – це головне джерело важко виправляються помилки. Якщо код легко зрозуміти, і він може бути виконаний» подумки або на папері, є велика ймовірність, що програмісти зможуть швидко знаходити і виправляти помилки.

Найкращий спосіб досягти цього – писати функції, що виконують щось одне. А от ділянку коду з великою кількістю функцій має більшу схильність до виникнення помилок, які важко відстежувати.

Проектування компонентів програмного забезпечення, які здійснює лише одну функцію, часто називається модульним дизайном. Модульність допомагає програмістам розглядати системи програмного забезпечення в двох вимірах. По-перше, модульність створює рівень абстракції, що дозволяє думати про модулі системи без розуміння всіх деталей його роботи.

Наприклад, програміст, який розробляє систему електронної комерції, міг би, розглядаючи модуль обробки кредитної картки, бачити, як він пов’язаний з іншим кодом, не вдаючись у деталі самої обробки кредитної картки. З іншого боку, деталі модуля (в нашому прикладі того, який займається обробкою кредитної картки) можуть бути розглянуті і зрозумілі без звернення до не має відношення до цього модулю кодом.

7. Автоматизовані тести

Модульні тести і інші типи автоматизованих тестів йдуть рука об руку з модульним програмуванням.

Автоматизований код – це ділянка коду, який виконує програму з певними вхідними параметрами і перевіряє, чи відповідає поведінка програми очікуваному.

Модульні тести перевіряють функціонування окремих функцій або методів класу, у той час як функціональні тести перевіряють специфічне поведінка всієї програми, а інтеграційні тести перевіряють великі частини системи або всю систему в цілому.

Існує багато фреймворків для тестування, які роблять написання тестів легше. Багато хто з відомих фреймворків, використовуваних сьогодні, були отримані з бібліотеки JUnit, написаної Кентом Бентом (Kent Bent), одним з перших прихильників ідеї розробки через тестування. Стандартна бібліотека Python включає свою версію JUnit під ім’ям PyUni або просто unittest.

8. Метод «Плюшевий ведмедик» (або налагодження «Гумова качечка»)

Якщо вірити легендам програмування Брайану Кернигану і Робу Пайку (Brain Kernighan і Rob Pike), налагодження за типом «Гумова качечка» виникла в університетському комп’ютерному центрі, де студенти повинні були сідати навпроти плюшевого ведмедика і пояснювати йому їх помилки, перш ніж звертатися за допомогою до живої людини.

Цей метод налагодження виявився настільки ефективним, що швидко поширився в усьому світі розробки програмного забезпечення, і також як простий оператор друку, продовжує існувати до цього дня, незважаючи на те, що є, здавалося б, більш складні інструменти. Практично все може замінити плюшевого ведмедика: гумові качечки, як терплячі слухачі, теж користуються попитом.

Важливою частиною цього методу є те, що потрібно пояснювати код і проблему вголос у простих і зрозумілих термінах. Є подібна методика, яка також корисна – вести журнал програмування, в який потрібно записувати думки про коді до і після його реалізації.

9. Пишіть коментарі до коду

Коментарі повинні пояснювати мету коду на низькому рівні. Повинна існувати можливість легко відповісти на питання про те, що рядок коду робить і як вона це робить, прочитавши сам код. Це досягається шляхом написання читабельного коду, який розроблений настільки просто, наскільки це можливо, і використовує осмислені імена функцій і змінних.

Коментарі до коду повинні заповнювати прогалини інформації в максимально можливій мірі, відповідаючи на такі запитання, як: чому використовується конкретна реалізація, або як цю ділянку коду взаємодіє з іншою частиною програми.

Написання хороших коментарів – це відмінна практика розробки програмного забезпечення навіть у вільний від помилок коді, але коли помилки з’являються, коментарі допоможуть заощадити масу часу, що витрачається на розуміння коду, написаного кілька днів, тижнів або навіть місяців тому.

10. Пишіть документацію

У той час як коментарі описують код на низькому рівні, з точки зору програміста, програмна документація описує функціонування всієї системи в доступній для користувачів формі. В залежності від типу розроблюваного програмного забезпечення, документація може описувати інтерфейси програмування, графічні інтерфейси або робочі процеси.

Написання документації демонструє розуміння програмної системи, і часто вказує на ті частини системи, які не до кінця зрозумілі і є імовірним джерелом помилок.

На шляху до майстерності: позбавляємося від помилок

Програмування – це, насамперед, мистецтво. І також як для будь-якого іншого виду мистецтва, шлях до майстерності в ньому вимощений працьовитістю і прагненням вчитися. Робота з вивчення програмування ніколи не закінчується. Завжди є щось нове для вивчення і нові способи поліпшення.

Якими з цих 10 налагодження ви користуєтеся зараз? Якими ви могли б почати користуватися з сьогоднішнього дня? Які з цих інструментів вимагають часу на практику і освоєння нових навичок?

Програмісти користуються перевагою, яким тільки деякі інші майстри можуть коли-небудь скористатися: найкращі інструменти і знання про програмування вільно і безкоштовно доступні для всіх, хто зацікавлений у цьому питанні. Ви можете стати профі в налагодженні коду: все, що ви повинні зробити для цього – просто взяти інструменти з налагодження і приступити до роботи.

Переклад статті «10 Useful Tips For Debugging and Troubleshooting in Programming» був підготовлений дружною командою проекту Сайтостроение від А до Я.