Wednesday, June 22, 2016

Как вырастить в себе автоматизатора и прокачать в себе навыки разработчика.


Ссылка на презентацию

О проблеме:

Я пришел в айти в зрелом возрасте, у меня гуманитарное образование. До айти я полтора года преподавал студентам и школьникам.
Автоматизации я научился в процессе работы. Поэтому вопрос обучения мне знаком не по наслышке. Когда я пришел в банки.ру, я подумал, что смогу брать людей с непрофильным образованием и доводить их до нужной мне квалификации. Но увы я столкнулся с тем, что не все могут или хотят обучаться, что у людей есть объективные границы роста. Тогда я в первые задумался о том какие навыки нужны для развития и что именно требуется для достижения успеха в автоматизации.

Подготовка к докладу:

В ходе подготовки к докладу я понял, что недостаточно рассказать о своем опыте или об опыте своих подчиненных. Так как 6 человек - это маленькая выборка. Поэтому я сделал опрос из 30 общих и специализированных вопросов и опубликовал его через Гугл формс.
Я планировал получить данные от трех групп: тех кто не справился с обучением автоматизации, кто попробовал и его история закончилась успехом, а так же тех кто только планирует начать.
Результаты опроса я объединил со своими нараработками и сейчас я планирую вас с ними познакомить.

Кто такой автоматизатор тестирования:

Для начала давайте определимся с тем что входит в обязанности в инженера по автоматизации тестирования в сфере веб-разработки программного обеспечения.

Общее для всех типов автоматизаторов является:

  • Работа с системой контроля версий (например, Git)
  • Знание тестовых фреймворков (для php - Codeception)
  • Работа с IDE (например, Idea, PHPStorm, PyCharm)
  • Работа с данными:
    • Подготовка тестовых данных
    • Создание и обработка отчетов
    • Работа с логами
  • Организация кода
  • Описание архитектуры

DevOps практики:

  • Подключение и обновление компонентов
  • Непрерывная интеграция
    • Работа с xUnit
    • Сборка тестовой среды
    • Настройка CI:
      • создание и настройка планов
      • Автоматизированная сборка артефактов

Автоматизация фронтового тестирования:

  • Автоматизация бизнес логики;
  • Формирование локаторов.

Автоматизация бэкенд тестирования:

  • Тестирование базы:
    • Валидация данных
    • Тестирование производительности запросов
  • Тестирование запросами:
    • Валидация ответа через схему
    • Проверка скорости ответа
    • Проверка времени исполнения

Базовые требования для работы инженером по тестированию:

Какие требования к работе инженером по автоматизации? Для начала опишу какие личные качества и образование нужны для работы автоматизатором:

Личные качества

На основе опроса 31 человека были выявлены следующие личные качества успешного инженера по автоматизации:
  • Аналитический склад ума
  • Способность видеть систему в целом
  • Усидчивость.

Образование

Когда я посмотрел результаты опроса, то меня поразили две вещи:
  1. Среди успешных автоматизаторов ¼ людей - это люди без технического образования
  2. ⅓ людей с техническим образованием не смогли стать автоматизаторами.
Причин для этого могло быть несколько:
  • Прозанимавшись недостаточно долго они не получили ожидаемый результат и бросили обучение;
  • В процессе обучения они потеряли интерес к обучению автоматизации;
  • Возможно они низко оценили свои результаты и посчитали, что недостигли нужной им цели;
В результате я пришел к выводу, что техническое образование не является гарантированным критерием для успешного обучения.
При этом важно понимать, что фундаментальные знания существенно упрощают и ускоряют процесс обучения специалиста по автоматизации.

Какими навыками должен обладать инженер по автоматизированному тестированию?

Я разбил обучение автоматизации (на следующие уровни):

Новичок.

Начинать лучше с изучения следующих навыков:
  • Теоретические знания:
    • Понимание основ тестирования
    • Понимание предметной области
    • Булевая алгебра
    • Комбинаторика
    • Теория вероятности
    • Статистика
  • Практические знания:
    • Умение декомпозировать задачу
    • Английский (на уровне чтения документации)
    • Знание структуры веб-приложения и умение работать с запросами
  • Навыки работы с кодом:
    • Понимание языка локаторов (для тестов интерфейса)
    • Умение работать с IDE и понимание его достоинств и ограничений
    • Работа с системой контроля версий (commit, add, push, pull).
    • Умение запускать тесты локально
  • Программирование:
    • Знание основ языка программирования на котором происходит автоматизация: JS, Java, Python, PHP и bash/powershell.
    • Базовое владение языком (синтаксис, типы данных, основные операторы, исключения, логирование, input/output)
    • Владение процедурным программированием:
      • Линейная автоматизация тестового сценария с обработкой исключений и валидацией результатов
    • Понимание алгоритмов на начальном уровне

Продвинутый.

Когда вы достигли предидущей ступени вам стоит продолжить обучение в следующем направлении:
  • Теоретические знания:
    • Английский (на уровне письменного изложения своих мыслей)
    • Теория графов
  • Программирование:
    • ООП
    • Продвинутое понимание алгоритмов
    • Принципы организация кода (DRY, SOLID, KISS)
    • Понимание стандартов языка: PHP(PSR), Python (Pythonic, PEP8)
    • Работа с базой данных для генерации тестовых данных
  • Работа с окружением:
    • Знание основных тестовых фреймворков
    • Продвинутая работа с системой контроля версий. Знание таких команд как: merge, rebase, работа с ветками, пулл-реквесты.
    • Работа с CI:
      • Подключение тестов
      • Сбор результатов
      • Обновление пакетов
      • Оценка покрытия
      • Разница между средами (staging, test, production)
  • Практики разработки:
    • CodeReview
    • Рефакторинг
    • Использование методов статического анализа

Эксперт:

  • Практики разработки:
    • Проектирование
    • Разработка через прототип
  • CI:
    • Скрипты накатки
    • Деплой
  • Программирование:
    • Функциональное программирование
    • Оптимизация кода
    • Юнит-тесты
    • Расширение покрытия за счет доработки тестируемого приложения

Про разработку и автоматизацию:

Разница между экспертом в автоматизации и профессиональным разработчиком не так уж и велика. После того как вы изучите то, что я описал выше вы можете себя попробовать в разработке:
  • блога
  • мобильного приложения
  • разработка админки для базы данных
  • Интернет-магазине
  • Yet another bot for Telegram
Для тех кто хочет оценить себя как разработчика есть матрица компетенций разработчика:

Какие технологии изучать?

По результатам опроса наиболее популярные фреймворки:
  • TestComplete
  • Appium
  • Codeception
Драйверы:
  • Selenium WebDriver
  • Selenium


Что стоит изучать - вопрос открытый.
Корпоративные инструменты для тестирования автоматизируют большую часть работы и за счет простоты освоения пользователь теряет глубину понимания. Популярные фреймворки активнее развиваются, доступны и позволяют поднять уровень программирования.

Где можно получить эти знания?

Остается главный вопрос: откуда черпать все эти знания и где тренироваться?
Существуют два пути, которые лучше черодовать:

Теоретический:

  • Изучать синтаксис языка
  • Читать блоги
  • Читать книги (список литературы будет в конце доклада)
  • Читать мануалы
  • Изучать другие языки программирования

Практический:

  • Набиванием шишек или личным опытом
  • Выполнять простые упражнения
  • Участвовать в code review
  • Рекомендации опытных коллег
  • Сертификационные центры и сайты (список будет в конце)
  • Инструменты по статическому анализу кода
  • Состоязания (типа, hackerrank)

Что может помешать вам в ходе обучения?

  • Отсутствие положительной обратной связи долгое время может оттолкнуть вас от выбранного пути, но увы в начале вероятность таких ситуаций велика.
  • Не умение правильно планировать время:
    • Неверная оценка сложности задачи (например, сложный язык программирования)
    • Плохая декомпозиция задач
    • Плохая приоритезация
  • Плохая концентрация на задаче
  • Страх выглядеть глупым и неопытным
  • Отсутствие веры в себя и в свои способности
  • Нежелание отказаться от привычных моделей поведения (тестировать руками)

Как практиковать обучение и оценивать результат?

Разбивайте цель на проекты и задачи.

Задачи должны быть небольшими и занимать от 1 часа до 4. Таким образом за половину дня вы сможете сделать что-то завершенное и получить результат.
Очень важно фиксировать успехи и вести план.
Даже если вы будете вычеркивать из него по ⅓ в неделю - это вас подстегнет и вдохновит продолжить.
Так же это позволит вам в какой-то момент оглянуться назад и увидеть насколько большой путь вам удалось пройти.

Уделяйте процессу обучения время.

Очень важно заниматься обучением каждый день. Для фиксирования времени вам может помочь плагин wakatime для IDE. Он фиксирует время, проведенное в IDE и позволяет вам понять сколько времени вы уделили тому или иному проекту, языку или участку.

Вкладывайте деньги

В обучение, в покупку книг, инструментов, оплату средств разработки. Это замотивирует вас зарабатывать больше и покажет вашу замотивированность в росте работодателю. Что вы действительно готовы чем-то пожертвовать ради вашей цели.

В любом случае ваше обучение - это жертва.

Вам потребуется отказаться от чего-то ради обучения. Не важно что это будет: поход в кино, прогулка, ужин с друзьями, футбол или пивасик.

Сколько времени уходит на обучение?

Наименьшее количество времени на вход в автоматизацию занял у тех, кто изначально ограничил количество изучаемых областей (необходимыми), выделял на это время, силы и деньги.
При этом важно не забывать про человеческий фактор (IQ, умение сосредотачиваться, правильная организация обучения, декомпозиция и постановка цели, мотивация и умение выделять время).
Голые данные из опроса говорят о том, что:
  • Среди тех кто занимался меньше 3 трех часов в неделю в течении года и меньше было наибольшее количество неудач;
  • Более 50% успешных автоматизаторов потратили на обучение меньше года, но этом потратили на свое обучение минимум от 3 часов в неделю (78 часов за полгода) до 5 и более часов (от 130 часов за полгода).

Стоит ли рассчитывать на внешнюю помощь и как строить этот процесс?

Наставник не является гарантом успеха. А возможно в некоторых случаях он является помехой. Среди успешных автоматизаторов очень мало кто пользовался услугами ментора. Более того, среди ⅔ тех кто пытался обучиться и не смог были люди, кому помогали из вне.
Среди вашего окружения мало кто сможет нормально вам помочь не сделав за вас основную часть работы. При этом хорошо сделанная задача вашим коллегой научит вас гораздо меньшему, чем плохо сделанная своими руками задача. Умение правильно строить процесс обучения, ставить задачи по возрастающей - это отдельный навык.
Другими словами рассчитывать на помощь из вне не стоит. Это мешает вашей мотивации. Но это не означает, что стоит избегать советов, критики и ревью вашего кода. Такие вещи могут подстегнуть вас и направить по верному пути.

Заключение

Рекомендации:

  • Недостаточно просто хотеть стать автоматизатором, купить книжку, найти онлайн курс или подыскать наставника. Это все способствует вашему обучению, но не определяет его.
  • Недостаточно иметь подходящие личностные качества и знания.
  • Самое важное - это выделить время на то, что бы освоить этот навык, потратить на него время и силы, а затем начать внедрять его в жизнь. Понимать зачем это вам нужно и как вы это планируете в дальнейшем использовать.

Итоги:

  • Часть людей из тех, что оценили себя негативно - активно используют автоматизацию в работе и при этом на очень приличном уровне. Изучите эффект Даннинга-Крюгера;
  • Рядом с вами куча разработчиков, которые вам охотно помогут и немножко по-отечески потроллят;
  • Вдохновение - это дорогая и редкая вещь. Расчитывать на него не стоит;
  • Путешествие в 1000 миль начинается с первого шага.

Примечания:

Литература:

  • Новичок:
    • 57 задач для изучения разработки
  • Продвинутый:
    • Continuous Delivery. Martin Fowler
    • Искусство автономного тестирования с примерами на С#. Рой Ошероув
    • PHP. Объекты, шаблоны и методики программирования. Мэт Зандстра
  • Экспертный:
    • Совершенный код. Макконнел
    • Рефакторинг. Улучшение существующего кода. Фаулер.
    • Чистый код: создание, анализ и рефакторинг. Роберт К. Мартин

Курсы и сертификация:

Сертификация: (complete)

Ссылки: (complete)

Ссылка на опрос: http://goo.gl/forms/eVEJIOHXdf7HPlzN2