Обучение программированию через тестирование или TDD
Еще в XIX веке шотландский автор Самуэль Смайлс написал: «Мы учимся мудрости на ошибках гораздо быстрее, чем на успехах». Этому утверждению созвучны многие методологии разработки, где особое место уделяется тестированию, — например, DevOps и Agile. Лучшей считается та проверка, которая быстро находит ошибки. Если баги не обнаружены — цикл неудачный.
В школах и вузах нас сначала учат многочисленным правилам и ограничениям и лишь потом подпускают к практике. Даже если цена ошибки копеечная, «разрушительная» самодеятельность карается, а не поощряется. И так в любой области.
Программирование показывает, насколько несостоятелен такой подход. В качественном редакторе кода, совершая ошибку, вы получаете указатель на нее, код и ссылку в документации. Так вы понимаете, какие действия в данной задаче эффективны или запрещены. Но если код компилируется без ошибок, то это не гарантирует его качество. При этом вы лишаетесь возможности подробно, на примере, выявить «бутылочное горлышко».
Это не означает, что обучение через одну лишь практику эффектно. Необходима правильная градация. Такая, где на первом месте — анализ возможных ошибок. Это Test-Driven Development (TDD), или разработка через тестирование — частное направление экстремального программирования. Суть этого принципа сводится к следующему:
- Составляется тест для небольшого отрывка кода, описывающего «базу».
- Создается код, прогоняется тест.
- По мере увеличения объема кода тест прогоняется повторно, каждый раз подтверждая правильность.
Отметим плюсы такого подхода:
- Пошаговый рефакторинг кода. При классическом подходе программист часто увлекается разработкой отдельных модулей или всего кода в целом, упуская частности.
- Разработка исходит из анализа возможных ошибок. Это заставляет внимательно изучать, откуда берутся баги, а также помогает трезво расширять функциональность. Если вы не можете гарантировать работоспособность участка кода — придется или отказаться от него, или плотнее взяться за теорию.
- Разработчик рассматривает больше вариантов реализации. Пошагово увеличивая сложность кода с учетом уже созданного теста, вы изучаете варианты решений, чтобы выбрать простое или гарантированно работающее.
Профессионала легко отличить от новичка по умению находить чужие ошибки и отвечать, почему код не работает. Именно для такой тренировки мозга мы шерстим форумы, участвуем в олимпиадах, проходим тестирования. Поэтому TDD или разработка через тестирование действительно позволяет быстрее достичь продвинутого уровня в программировании.
Чтобы погрузиться в тему TDD, почитайте классные вводные статьи:
- Обзорный текст на Habr.
- Подробная статья на Technology Conversations.
- Наглядный туториал на Agile Data.
- Тест на вашу совместимость с TDD на Scott Logic.
И несколько книг:
- Экстремальное программирование: разработка через тестирование. Кент Бек.
- The Art of Unit Testing: With Examples in .NET. Roy Osherove.
- xUnit Test Patterns: Refactoring Test Code. Gerard Meszaros.
- Test-Driven Web Development with Python. Harry Percival.
- Growing Object-Oriented Software, Guided by Tests, Steve Freeman.
И не забывайте, что важнейшее правило в программировании через тестирование — максимум практики. Только погружаясь в реальный код, вы получите реальные знания.