Совсем недавно я услышал замечательную историю о проекте внутри крупной российской IT-компании, ищущей руководителя в отдел тестирования. Задача была простая: есть отдел из 20 человек, которые за последние несколько лет наколбасили несколько тысяч автотестов и спроектировали пачку тестов ручных. В целом все работало, но СТО на собеседовании сказал примерно следующее: “Ваша задача — выкинуть все это к чертям собачьим и сделать нормально. А то когда предыдущий QA Lead ушел, мы поняли, что вся эта инфраструктура у нас нигде не используется.”
Ситуация невообразимая. Так не бывает. У нас точно не так. У нас же не так?
Проблемы “works on my machine” и “ответственность за нерабочий код лежит на том, кто его деплоит”, ровно о том же. И пока разработчикам рассказывали про спасительный DevOps, тестировщики и QA-специалисты как-то со стороны смотрели на это “не шаля, никого не трогая, примус починяя”. Ну что, пришло время набросить и на этот вентилятор.
В этой статье мы с Артемом Ерошенко из Qameta Software попробуем разобраться, что такое “делать тестирование нормально” в новых проектах.
Что делают тестировщики? А что должны делать?
Конечно, тестировщики-автоматизаторы пишут и поддерживают тесты. Это первое, что приходит в голову. А когда они написаны, их нужно использовать. Это тоже кажется очевидным? Чтобы понять, что это так, ответьте для себя на 4 вопроса про ваши тесты:
Вашим тестам верят?
Ваши тесты проходят стабильно и постоянно?
Тест-суиты прогоняются быстро?
Результаты прогонов понятны тем, для кого вы их пишете (это не вы)?
Если ответ хотя бы на один вопрос вызывает у вас сомнения, продолжайте читать. Так что же у нас есть в автоматизации?
Пишем автотесты: если тестов не писать, никакого тестирования не будет. Все просто: нет ручек — нет конфетки.
Запускаем тесты — это отдельная история. Несмотря на DevOps, семимильными шагами шагающий в мире разработки, тесты часто деплоят так, что о стабильности и воспроизводимости речи не идет.
Разбираем результаты: если нет понятной системы генерации отчетов, команда тестирования будет заниматься не разработкой тестов и подготовкой инфраструктуры, а разбором отчетов.
Показываем отчеты: часто бывает, что внутри команды тестирования все хорошо, но никто из стейкхолдеров в бизнесе не понимает, что делают люди внутри этой команды. Это вызывает вопросы и потери времени на бюрократические войны.
Итак, высокоуровневые грабли разобрали, давайте посмотрим, что можно сделать, чтобы их избежать!
Пишем автотесты
Выбирайте подходящие инструменты. Обратите внимание, что подходящий инструмент и “правильный” — это не всегда одно и то же:
Подходящий инструмент решает конкретную задачу. Вам не нужен швейцарский нож, в котором вы будете использовать одну-две функции (как обычно бывает). Иначе вы будете работать с кучей зависимостей и лишней сложностью, иногда теряя инструменты, потому что ваш маленький кусочек “испортили” в очередном крупном релизе.
Подходящий инструмент легко расширяется. Каждый сервис имеет свою специфику, поэтому даже если поначалу инструмент кажется полностью подходящим, со временем вам захочется “поработать напильником” по мелочи: рекурсивные pageObject, NTLM аутентификация, нативные операции на десктопе, да кто знает, что еще вам понадобится?
Давайте посмотрим на примеры таких инструментов:
Подходящий инструмент легко объяснить коллеге. Понятные инструменты не только помогут вам упростить масштабирование команды, но и упростят работу с bus-фактором. Здесь главное не увлекаться и оставаться понятным. Объяснение в формате “Так, ну тут все просто: helm апдейтишь, потом катишь в canary и внимательно в эластике за логами следишь” скорее всего приведет к тому, что вас посчитают снобом, а человек потратит больше времени на поиски деталей реализации, чем сэкономит на автоматизации. В результате вы останетесь со своей рутиной, а коллега подумает, что все очень сложно и скорее опустит руки.
Легко заменить. Новые инструменты будут выходить и иногда лучше подходить, так что думайте о том, сколько будет стоить отказ от инструмента в будущем: можно взять Allure Report, проставить аннотации в коде и все будет работать, а если вы решите переехать -- просто удалить одну зависимость, которая ничего не сломает. Тулы, которые остаются в проекте из-за того, что их “хрен выпилишь” — прямая дорога к техническому долгу. Привет core-системам на COBOL и Perl.
Внедряйте новое постепенно
Представьте новый проект, в котором, помимо Web- или API-тестов, появляются экспериментальные штуки типа А/B-тестов или тестов на скриншотах с хранением в новой БД, а что-то параллельно пишут на только что занесенном Kotlin. И это в проекте из 200-300 тестов. Каждый новый инструмент по отдельности хорош, но вместе они делают процесс тестирования максимально непрозрачным.
Представьте, что на вашу основную работу вы тратите, допустим, 10 часов. В какой-то момент вы решаете ее автоматизировать и на это вы потратите еще 10 условных часов. Получается вот такая вот неэффективная с точки зрения времени штука:
Но допустим, что мы справились с задачей, и автоматизация позволяет нам сократить время с 10 часов до 5 (4 на работу и 1 час на поддержку автоматизации), как-то так:
В этот момент хочется отправиться к руководителю и заявить о победе, но не стоит торопиться. С точки зрения классического менеджера, вы все еще потратили больше времени, чем было бы без нового подхода. По сути, вам необходимо “компенсировать” вот этот зеленый горб на графике экономией синей области, а это произойдет только в будущем.
А теперь давайте вспомним, к чему это все: если вы постоянно затягиваете в проект что-то новое (БД для данных, новый язык программирования или фреймворк, API-тесты и пр.), ваш “долг” будет расти, а система — становиться монструозной. Собирайте ваш фреймворк постепенно и не торопясь — итоговое решение получится намного более сбалансированным.
Делайте код-ревью.
Если вы сениор, то вы сможете на реальных примерах показать правильные паттерны и практики, и разобрать ошибки или неоптимальные решения.
Если вы джун — смотрите пул-реквесты коллег и старайтесь перенять то, что было сделано хорошо, и запомнить то, что было исправлено (или из-за чего пул-реквест завернули).
И в любом случае во время ревью и новички, и профессионалы найдут для себя что-то новое. Например, можно увидеть необычные способы использования знакомых инструментов: нагрузку на прод web-тестами? пожалуйста! — можно найти вещи, которые вам и в голову не пришли просто потому, что вы знаете, как правильно. А может быть, ваши коллеги используют их неправильно.
Запускаем автотесты
Первый совет как для автоматизаторов, так и для ручных тестировщиков — научитесь работать с Docker. Это не очень сложно, но очень полезно в ситуациях, когда хочется проверить какие-то специфичные кейсы вроде “нужен вот такой-то плагин на Jenkins” или “хочу сравнить стабильность Selenoid и Selenium Grid, как бы их потестить”. Понятное дело, что сразу в продакшене вам такие эксперименты проводить не разрешат (или это все будет очень сложно и долго). Посмотреть немного про Докер можно в Ошибке Выжившего.
Запускайте тесты на пулл-реквесты. Новый код может ломать проект, и это нормально для молодых проектов, поскольку структура может часто меняться в условиях появления новой функциональности или глубокого рефакторинга старой. А вот отвалившийся прод — это не нормально ни для кого. Давайте посмотрим, что можно сделать, чтобы все было хорошо:
Разработчик отводит новую ветку;
Заводит пул-реквест и прогоняет все тесты;
Командой фиксим тесты и ошибки;
Заводим ветку в stable. Обратите внимание, что это ветка спринта, и в мастер весь код попадает только после того, как все новые фичи и тесты спринта загорятся зеленым. Перед мерджем, конечно, тоже нужно будет прогнать все тесты.
Запускайте тесты часто. У вас всегда будут плавающие проблемы, которые могут быть вызваны разными факторами:
Нестабильные тесты;
Нестабильный тестинг;
ВременнЫе проблемы;
Работа инфраструктуры.
Чтобы свести количество таких факторов к минимуму, старайтесь гонять тесты на прогретой машине. Запускайте тесты по максимуму: в разных окружениях, в разных ветках, в разное время, — пока у вас нет сотен и тысяч тестов, которые будут часами выполняться на агенте, скорее всего, машина все равно будет простаивать.
Найдите потребителя результатов ваших тестов. Помните, что тесты вы пишете не для себя, поэтому результаты тестирования должны быть удобными.
Если вы делаете автотесты для тестировщика — дайте доступ к запуску из TMS.
В TestRail интеграция ручных и автотестов делается по API. Для этого можно добавить кнопку в TMS и на нее повесить скрипт с конфигурацией запуска вашего тест-суита на пайплане.
В Allure TestOps это можно сделать из UI, просто выставив нужное окружение в конфигурации запуска.
Если вы хотите, чтобы тестами пользовались разработчики — сделайте запуск в пайплайне, чтобы ваши коллеги могли сами запускать тест-суиты на релизах, пул-реквестах и мерджах.
С менеджерами немного сложнее, потому что результаты тестов сами по себе их не очень интересуют. В этом случае можно попробовать делать кастомные страницы, на которых показать данные о фичах, бранчах, результатах тестирования и прочем. Попробуйте настроить красивые дашборды в Grafana или Yandex.Datalens.
Разбор результатов
Перезапускайте ваши тесты. Тесты могут падать из-за миллиона разных факторов, начинающихся от проблем с сетью, заканчивая Луной в доме Сатурна. Отследить и исправить такие факторы можно не всегда, но если тесты проходят нестабильно, гоняйте их до позеленения. На самом деле, конечно, двух-трех прогонов будет достаточно, чтобы отсеять странности от проблем. Для этого в Gradle есть официальный Test Retry Gradle plugin, а в Maven — Rerun Failing Tests.
На ранних этапах flaky тесты и их причины будут вашему заказчику неинтересны, ему будет интересно общее состояние продукта. Однако, чтобы не было ощущения, что мы “замыливаем” проблемы с красными тестами, делая несколько прогонов, можно запускать два инстанса с перезапуском (для заказчиков/стейкхолдеров) и без него (для себя, чтобы была возможность увидеть каждое непонятное падение, пострадать и посыпать голову пеплом).
Настройте категории тестов. Как только вы начнете постоянно гонять тесты в разных бранчах, в разное время, в разных окружениях, определение причин падения теста и категоризация проблем станет актуальной задачей.
Просто представьте, что 5% ваших тестов падают, при этом всего у вас 100 тестов — разбор пяти падений не займет много времени. Но если за день запустить тот же самый тест-суит 10 раз, то придется разбирать и в 10 раз больше падений, жертвуя своим драгоценным временем (которое мы пытаемся сделать более продуктивным).
В Allure Report эта задача решается тем, что у тестов есть четыре основных статуса: skipped, broken, failed, passed, — а также есть простой JSON-реестр реестр категорий, который по Regex-сообщениям распределяет свалившиеся тесты. В результате получается понятный список категорий, по которым разложены тесты, и вам надо разбирать только 3-5-7 причин падения 5% из 1000 свалившихся тестов. Для команд побольше, в Allure TestOps есть возможность создавать дефекты и работать с категориями прямо из web-интерфейса, так что если сейчас прям кольнуло в сердце — попробуйте взглянуть на разбор результатов по-новому.
Не копите технический долг
Этот пункт сильно пересекается с созданием зоопарка инструментов, о котором я писал ранее, с одним дополнением. Каждый раз, когда вы обнаруживаете непонятное поведение инструмента, теста или инфраструктуры, заводите задачки на их исправление, а не оставайтесь пленниками костыльных обходных способов эти баги проигнорировать. На самом деле, если вы справитесь с тем, чтобы автоматизировать рутину по запускам тестов, разбором результатов или обновлением документации, у вас появится время на работу с техническим долгом.
Чаще всего в техническом долге оказываются довольно интересные задачи: допилить инструменты, разобраться с инфраструктурой, — такие штуки обычно позволяют разобраться с проблемами, на которые многие забивают, хотя они сделают из вас более ценного специалиста, а в долгосрочной перспективе будут приносить выгоду компании.
Показываем отчеты
Отчеты нужны не вам. Помните об этом. Вам для понимания происходящего будет достаточно почитать стектрейс. Но большинству ваших коллег этого достаточно не будет.
Экспорт отчетов прогона автотестов в ТМС для коллег-тестировщиков. Можно сколько угодно говорить о том, что ручное и автоматизированное тестирование — это два разных мира, но по факту, все тестировщики работают на единый результат. Постарайтесь сделать отчеты максимально подробно, чтобы вашим коллегам было удобно и понятно.
Экспорт результатов (багов и дефектов) в трекер для коллег-разработчиков. Следует стремиться к состоянию, когда разработчики видят ваши тесты, принимают их результаты и понимают, о чем говорят полученные отчеты.
Умейте делать кастомные отчеты быстро. Иногда коллегам или руководителям нужны какие-то специфичные данные о ходе тестирования или разработки. Для этого, конечно, важно правильно хранить и помечать все тесты, чтобы потом нарезать данные как в Allure.
Поймите, кому будут полезны отчеты о ходе и результатах тестирования и организуйте постоянную и стабильную инфраструктуру для их генерации.
Итоги
Давайте посмотрим, что у нас получается в итоге:
Тесты надо писать: выбирайте тулы и подходы, но не увлекайтесь. Оверхед на обслуживание вашего тулбокса должен быть меньше объема вашей операционной работы.
Тесты надо гонять: утром, вечером, перед пул-реквестами и после ночных релизов. Чем больше — тем лучше. Готовьте и автоматизируйте инфраструктуру для многочисленных запусков в разных окружениях.
Хорошо бы понимать, как тесты прошли. Много запусков — много красных тестов. Старайтесь категоризировать типы ошибок автоматически.
И последнее — хорошо бы, чтобы результаты тестирования видел и понимал кто-то, кроме вас. Покажите тестерам, разработчикам и менеджерам результаты так, чтобы они могли их использовать в жизни.
А теперь давайте посмотрим на определение TestOps в Википедии:
TestOps is often considered a subset of DevOps, focusing on accelerating the practice of software testing within agile development methodologies. It includes the operations of test planning, managing test data, controlling changes to tests, organizing tests, managing test status, and gaining insights from testing activities to inform status and process improvements.
Вы поймете, что все это звенья единой системы, которая и называется TestOps. В апреле я постараюсь подготовить более "фундаментальную" статью о TestOps, в которой постараюсь рассказать об этом подходе не столько со стороны практик и тулинга, сколько со стороны ее места в мире разработки, принципах и месте в DevOps.
P.S. Важно понимать, что Ops в контексте TestOps значит operations в тестировании, а не operations на стороне клиента.
miga
Вот чего я никогда не понимал (ещё меньше чем разделение труда между разработкой и эксплуатацией) — это разделение труда между разработкой и QA.
Ну то есть я осознаю, что есть целая индустрия QA, но мне тем не менее кажется противоестественным тот факт что говноко^Wпишут одни, а проверяют другие.
ARG89 Автор
Я в статье не хотел нигде подчеркивать такое разделение, если честно. Мне тоже оно не кажется правильным.
Если только во введении есть «вброс» про это, но в целом, конечно TestOps работает как для тестировщиков, так и для разработчиков, пишущих тесты.
amarao
Разные слои требуют разной специализации и квалификации. Правильно спланированная система содержит слои таким образом, что нижележащие слои предполагаются рабочими, а тесты фокусируются только на своём слое. Вот если кто-то в end2end тесте решает нафигачить тестов на "мусор в форме ввода" (утрирую), вот тут вот и начинается боль и плохо поддерживаемые тесты.
QA, вообще, должен быть частью release team, и задача qa — проверить свою работу (свой релиз). Тогда человек владеет компетенцией и чувствует продукт. Может так случиться, что окажется, что "своя работа" не работает из-за того, что предыдущий отдел фигню отгрузил. Такое бывает на каждом уровне, вплоть до "кривой версии libc с багом" или фиксом деления в процессоре.
miga
Мне кажется порочной идея разделения ответственности за слои, я топлю за вертикальное владение продуктом. Как-то на практике такое разделение приводит к ситуации «у семи нянек — четырнадцать сисек».
Да и, собственно, какие такие есть особые квалификации у QA, которых нет у разработчиков?
amarao
Окей. Допустим, у вас сайт для машинного перевода. Ваша команда программистов знает ML, умеет писать (допустим, на окамле), пишет для него юнит-тесты. Ещё одна умеет его пакетировать (молодцы) и пишет (условные) chart'ы helm'а. Ещё одна умеет отлаживать куб и нижележащую ОС (упс, не слишком ли много?), решать проблемы с бондингом на сетевом оборудовании, может обновить прошивку в блоке питания и обсудить с главным энергетиком дата-центра расхождение фаз в двух вводах.
Вы уверены, что правильный подход? Или, лучше, положиться на нижележащие слои? Производитель процессоров даёт вам абстракцию, производитель ОС даёт вам абстракцию, libc даёт вам абстракцию, ваш язык программирования даёт вам абстракцию,… но тут всё прекращается, потому что "порочная идея".
unsound.
miga
Не вижу тут противоречия.
Окамлисты пишут свой сервис, тестируют его, собирают там пакет или образ и нажимают кнопку для деплоя его в CI/CD, который написали, протестировали и задеплоили люди, знакомые с кубом и хелмчартами.
Если что-то пошло не так, то квалификации окамлистов должно хватить, чтобы нажать другую кнопку в CI/CD и откатиться на предыдущую версию, починить баг и добавить регрессионный тест.
И все это весело бежит на железе, которое поставили, запитали и протестировали инженеры в ДЦ.
Конечно же я не хочу заставить каждого программиста начинать со сбора речного песочка для микросхем, на которых будет бежать его программа, не надо доводить идею до абсурда. Но проверить свой сервис без QA, задеплоить, поонколлить, откатить и отдебажить производительность без админа — можно и нужно.
amarao
Ага, а anycast вашей сети в bgp у вас тоже программисты на ocaml делают? А софт на сервере кто обновляет? Инженеры DC?
Потому что сначала вы говорите, что вы против разделения компетенций и за вертикальность, а в следующем посте у программиста в руках три кнопки в CI (которые им кто-то написал и протестировал, включая ситуации с авариями).
Вы определитесь, многорукие тьюринг-полные шивы, или всё-таки разделение обязанностей?
miga
Я против того, когда единый продукт (одну и ту же программу, фактически) пишут, тестируют и эксплуатируют разные люди и разные команды.
Сервис перевода — один продукт.
CI/CD — другой.
Серверная инфраструктура — третий, а сетевая — четвертый.
amarao
То есть сервер, на котором работает приложение — это другой "продукт"? Ну, тогда всё просто.
Программа серверного перевода — один продукт.
Услуга "перевод aas" — другой продукт.
ОС и система оркестрации — другой продукт.
Сервер, на котором крутится услуга — другой продукт.
Между каждым слоем — свои тесты. Сервер протестирован (хостером), хостер же отвечает за непрерывность электричества; ОС и оркестрация выкачена другой командой, прошла тестирование и мониторится ею же. Команда разработки сделала продукт и протестировала его (dev окружение, e2e, юнит-тесты и т.д.)
Команда эксплутации выкатила его в продакшен и следит за работоспособностью, при необходимости закатывая SRE-рукава и ковыряясь в потрошках.
Между каждым слоем контракт, который проверяется тестами. Каждый слой предполагает, что нижележащий сервис работает хорошо.
Если же у вас операционная работа лежит на программистах, то а) это on-call (попробуйте сеньёра уговорить на on-call), б) они занимаются безумиями, которые их не касаются (на мирроры апстрима влили фигю, надо откатить два сервера) в) многорукость шивы чревата поверхностностью.
miga
а) никакой проблемы, у нас все синьоры онколлят, и я сам онколлю. А если у какого-то синьора от онколла корона с головы свалится, так для всех будет лучше, если он пойдет работать куда-нибудь еще, благо пока еще есть выбор компаний, где-можно по-старинке говно за стенку админам перекидывать.
б) а почему это их не касается? Если это ломает их продукт, то вполне себе касается
в) это просто отмазка для тех, кому лень расширять свой кругозор, ну правда. Я очень хорошо представляю, какой необходим объем знаний для того, чтобы успешно совмещать разработку и эксплуатацию и вполне уверен, что это легко ложится в одну голову на более чем достаточном уровне.
amarao
Ого, как у нас теперь глубоко всё пошло. Во-первых, в рамках вашей модели мы должны поменять КЗОТ и существующие практики трудового законодательства. Во-вторых, мы должны поменять графики работы детских садов (сколько у вас детей в доме, когда вы и ваша супруга on-call)?
В целом, подход "многорукой шива с 24/7 availability" не является завершённым, потому что в в формулу ещё входит "за миску риса в день".
miga
Вы меня извините, но наша дискуссия уже перешла в демагогию. Причем тут КЗОТ, причем тут детские сады? На админов, которые онколлят у вас сейчас, не распространяется КЗОТ и им запрещено иметь детей? Или по КЗОТу в семье запрещается иметь больше одного админа на онколле?
amarao
У нас сейчас админы работают в рабочие часы, без on-call. Включая 4 часа ночи по Мск, что соответствует комфортному рабочему времени смены в соотв. часовом поясе.
Внезапно, правильная организация рабочих процессов позволяет не тащить работу в жизнь людей.
А главное, это совершенно не похоже на утопию, которую вы тут описываете, когда разработчиков сдёргивают в 5 утра первого января, "потому что devops".
miga
А у нас, например, разработчики онколлят тоже только в рабочее время, потому что есть команды в других часовых поясах, закрывающие остальное время суток. Хорошо когда такая возможность есть, я нисколько не спорю :)
А если такой возможности нет, то почему тащить работу в жизнь админов можно, а в жизнь программистов — нет? Админ тоже человек, так-то.
Конечно, никому не нравится вставать по ночам и что-то чинить, ну что ж поделать — такая работа, перекладывать ее на кого-то еще — не совсем справедливо. А главное, совершенно неэффективно — я поработал с разными моделями отношений разработка — эксплуатация (как программистом, так и админом), и вполне в этом уверен.
amarao
Я предлагаю из диалога убрать спор про on-call. Есть devops модель (которая на самом деле) говорит, что "пусть разработчики и деплоят". И предлагает иметь инструменты для этого (ci/cd, красивые дашборды и т.д.). Как метод ускорения деплоя это хорошо, но ровно до того момента, пока программист не вынужден нырять глубже. Если он вынужден и рядом нет людей, которые имеют в этом специализацию, то это даунгрейд компетенции компании.
Более того, вот эти "ci кнопки" для разработчика тоже кто-то должен писать. Если это делает разработчик (условный senior), то он берёт на себя обязанности этого человека и показывает продуктивность уровня junior'а. (Потому что деплой — это вполне себе отдельная дисциплина, и условно, человеку нужно 2-3 года ежедневной практики на ансибле, чтобы писать на нём прилично).
В хорошей команде каждый человек "знает" в слой выше и ниже него. Админ может читать и писать код, и знает как сервера работают. Программист может писать и читать инфра-код и понимает как (условный сейлз) работает. Но у каждого своя компетенция и зона ответственности.
Чем больше concerns на человеке, тем более примитивными становятся его ответы на эти concerns. "Заткнули и ладно".
miga
Ну уж нет, давайте онколл мы не будем убирать, это принципиальный момент.
> Админ может читать и писать код, и знает как сервера работают
> Программист может писать и читать инфра-код и понимает как (условный сейлз) работает
Хорошо бы, но такого не происходит «само по себе», внезапно. Если программист не сидит на околле своего сервиса, то плевать ему на то, как там его код крутится на серверах, сколько он памяти и процессора жрет и как часто падает — если чо, админы поднимут.
Точно так же и условный админ никогда не полезет в код разбираться, почему падает сервис, он просто возьмет и откатит на какую-нибудь версию, которая работала раньше, и хоть трава не расти — с утречка погромисты посмотрят.
А вот когда человек по-настоящему «владеет» своим сервисом, когда он отвечает за него — вот тогда появляется настоящая мотивация слазить за пределы своего скоупа, и наверх, и вниз — и чтобы бизнес не клевал мозг за то, что «почему так медленно работаете, на каждый деплой по пять роллбеков», и чтобы сервис по ночам не будил, словив ООМ.
И это мы только рассмотрели один сервис в вакууме — все становится еще более интересно, когда этих сервисов десятки и сотни, и ответственность за их работоспособность и функциональнось размазана между разными сторонними людьми и ни у кого нет полного понимания, как же именно конкретный сервис работает.
Что же касается глубины знаний, нужных для того чтобы продуктивно крутить свой сервис самостоятельно — полноте вам, у погромиста не взорвется голова и не отвалится задница, если он иногда будет запускать какой-нить tcpdump или perf. А если и отвалится, то это даже к лучшему — будет мотивация навтыкать нормальных логов и метрик внутрь кода, а не гадать на стрейсе :)
amarao
Вот интересно. Вы пользуетесь браузером — и вам хорошо, что рядом нет программиста, который "если, что починит". И как-то у них получается. А в вашей модели — к каждому браузеру и к каждой операционной системе должен прилагаться программист, который её написал, и которому "не всё равно".
… Или интернет-магазин с лэндингом специальный случай, и он сильно сложнее, чем какая-то там операционная система?
miga
Ну вообще-то к каждому браузеру и операционной системе уже прилагается целая куча программистов, которым не все равно, они просто обновляются раз в месяц или раз в полгода, а не 1-2 раза в сутки, как в нормальном аджайле.
amarao
… При этом эти программисты вечером уходят домой и им не звонят ночью. Кажется, вы только что продали agile. Agile, это когда программисты релизят часто и готовы чинить продакшен 24/7.
miga
Вы весьма неприятным образом передергиваете, сравнивая коробочные продукты, такие как браузер и ОС, у которых нет эксплуатации как таковой (точнее, она делается другой стороной), и вещи вроде сайтов или других сервисов в интернете, которые пишет и эксплуатирует одна и та же сторона.
amarao
Вы правы в том, что есть существенная разница между ПО для широкого потребления и in-house продуктом. В случае in-house продукта его эксплуатация осуществляется той же компанией, которая разработала продукт.
Однако, это деление сугубо административно-финансовое. В одной компании уборщица в штате, в другой — аутсорс в клининговую компанию.
В принципе, наличие "единственного in-house пользователя" позволяет сильно срезать на качестве документации, границах интерфейсов, обещании стабильности, политике поддержки, бэкпортах фиксов и прочих весьма затратных вещах. После этого классическая эксплуатация становится уже невозможной, т.к. оказывается, что многие эксплутационные сценарии вообще не покрыты или покрыты частично. Такие проблемы закрываются привлечением к эксплуатации разработчиков. Теоретически, при фиксированном числе разработчиков, это позволяет экономить на operational team, поскольку разработчики и так и так есть, осталось их уговорить работать 24/7.
Mike-M
Объяснение очень простое: чужие ошибки мы замечаем быстрее и чаще, чем свои собственные. Так устроен человек.
Именно на этом основополагающем принципе построена вся индустрия тестирования.
Именно поэтому Хабр советует перед публикацией статьи дать прочитать её другому человеку, с «незамыленным глазом». HeadHunter советует сделать то же самое в отношении резюме, и т.д.
И именно поэтому в уважающих себя и своих читателей изданиях существуют раздельные должности для авторов, редакторов, и корректоров.
miga
Всё-таки в отличие от текста на естественном языке, программы таки должны соответствовать определённым формальным требованиям и формальными методами должны и проверяться, метод пристального взгляда незамыленным глазом — это всё-таки не основной метод тестирования, не так ли? И я не понимаю, почему написание тестов должно делаться другими людьми.
Mike-M
Попробуйте абстрагироваться от автотестов, и посмотреть на конечный продукт с точки зрения качества, как на черный ящик.
Сразу станет понятна взаимосвязь «программы пишут люди => человеку свойственно ошибаться => чужие ошибки заметнее собственных».
Возможно, Вам будет понятнее теологическое объяснение: про соринку в своём глазу, и бревно за плечом другого.
miga
Что значит «заметнее»? Проваленный тест лучше видно?
Если же вы имеете в виду ручное тестирование, то, наверное, да. Но ручное тестирование следует запретить как жестокое обращение с тестировщиками, конечно же.