OpenQuality.ru

Качество программного обеспечения

Разработка ПО: что скрывает ложь?

Добрый день.

Challenger, shuttleПолет космического челнока “Челленджер”, намеченный на 28 января 1986 года, должен был войти в историю достижений американской индустрии. Криста МакОлифф, преподавательница гуманитарых дисциплин из штата Нью-Гэмпшир, планировала дать первый открытый урок из космоса. Телевидение вело прямую трансляцию с мыса Канаверал, видеокамеры фиксировали все происходящее, миллионы телезрителей прильнули к экранам. Но урок не состоялся. Семьдесят три секунды полета вместили в себя белый дымок из правого ускорителя, клубы черного дыма, вспышку пламени и мощнейший взрыв, превративший челнок в груду раскаленных обломков. Страна застыла в ужасе, но для сотрудников фирмы “Morton Thiokol” произошедшее не было неожиданным. Накануне группа инженеров рекомендовала отложить запуск челнока, а Алан МакДоналд, руководитель отдела разработки двигателей, отказался подписать акт о готовности корабля к запуску. Ожидалась холодная погода, которая могла привести к снижению эластичности колец изоляции, что в свою очередь могло привести к утечке топлива и взрыву двигателей. Именно так и произошло. Герметичность уплотнителей была нарушена – образовалась щель, в которую попали горячие газы. В результате были повреждены водородный и кислородный баки. Последовавший взрыв топлива унес жизни всего экипажа и заморозил космическую программу США на несколько лет.

Как руководство NASA могло отправить челнок в космос, зная о высокой вероятности взрыва (один к тридцати пяти)? Президентская комиссия пришла к выводу, что топ-менеджеры NASA, принимавшие решение о запуске корабля, ничего не знали об опасениях инженеров. Информация застряла у основания “управленческой пирамиды”. Лоуренс Маллой, сотрудник NASA, знал о возможности взрыва, но посоветовал руководителю “Thiokol” мыслить как мыслит управленец, а не как инженер. По сути, Маллой продавил “добро” на старт в обход позиции инженеров и технического менеджмента “Thiokol”. Запуск челнока откладывался три раза, и Маллой решил не расстраивать свое руководство. Очередная задержка могла повлиять на размер субсидий, выделяемых Конгрессом, и привести к неприятным последствиям для гонца, принесшего дурную весть. Маллой находился под сильным давлением. “Давай, давай, давай”, – его начальству был нужен результат. Только положительный и как можно быстрее. Маллой не видел другого выхода кроме как счесть позицию инженеров преувеличением и поставить судьбу челнока на рулетку погодных условий.

Columbia team“Это больше не повторится. Выводы сделаны и меры приняты”, – звучало из уст руководителей NASA после оглашения результатов работы комиссии. Семнадцать лет спустя, 1 февраля 2003 года, другой челнок, “Колумбия”, потерпел катастрофу при посадке. Корабль развалился на две части в результате разрушения наружного теплозащитного слоя на левом крыле. Как и в случае с “Челленджером”, инженеры предвидели такой исход по результатам старта челнока и требовали провести анализ поверхности крыла. Аппаратно-программный комплекс “Кратер” предсказал повреждение, но руководство NASA сочло эту информацию несущественной, сняв с нее гриф “High Importance” и отклонив запрос на дорогостоящую инспекцию корабля. История учит тому, что ничему не учит.

Катастрофы “Челленджера” и “Колумбии” иллюстрируют две наиболее типичные формы лжи, проявившиеся в позиции чиновников NASA: умолчание (как в случае с “Челленджером”) и искажение информации (”Колумбия”). Что общего у этих двух катастроф? Позиция менеджмента NASA и их подход к управлению рисками. “Этого не может быть. Нет, нет, нет, этого не должно быть. Мы не можем этого допустить, потому что тогда вместо челнока полетят сроки”. Иными словами, “этого не может быть, потому что не должно быть никогда”. Раз так, то в ход идет умолчание, любые средства. Главное – “не допустить”. Притупляется чувство реальности, способность взглянуть на ситуацию со стороны. Подменяются понятия: теперь управление риском не подразумевает стремление предвидеть и предовратить неполадки. Их просто не может быть, нас не поймут. Вместо этого – дикое, необоримое желание закрыть глаза и отмахнуться от неприятных сведений. Мозг размышляет примерно так: “если разгласим, то будет неминуемо плохо, а если промолчим, то есть шанс прорваться”. На одной чаше весов – крах карьеры и потеря бенефитов, на другой – “ложь во спасение”. Нет, чиновники NASA не желали гибели челноков. Они просто хотели проскочить.

Встречаются ли подобные ситуации в проектах по разработке ПО?

Мы должны отдать систему к 1 ноября, или нас задушат. Значит, идем напрямик. Agile у нас или не agile? Сделаем ровно столько, сколько требуется в итерации. Модульные тесты не врут, все работает. О стабильности и масштабировании подумаем 2 ноября. Остались баги с приоритетами P1-P2? Что-то здесь не так. Наверное, это все-таки P3. Значит, их можно отложить.

Или так: у нас просто нет времени на тестирование производительности. Сначала все было слишком сыро – лишь бы функциональность работала, ей все внимание. А потом стало слишком поздно – пора выпускать. Но за нами не встанет. Мы вернемся к этому 2 ноября.

Или так: низкая производительность? Что вы. Это повышенная безопасность, сверхнадежная защита. Это инновации. Так и задумывалось. Нам только надо грамотно изложить это в маркетинговых проспектах. Железо помощнее – и все будет летать.

Или так: пожалуй, эти баги никому не интересны. Все равно их никто не найдет. Кому эта фишка нужна? Вон в прошлый раз нашел и потом замучался перепроверять. Ни тебе спасибо, ни тебе пожалуйста. Что у меня, других дел нет? Вон Гоша на все забил и радуется жизни. Изо дня в день, из месяца в месяц. И хорошо живет. Это мудро. Кстати, слишком умных начальство не любит и даже боится. Лучше не высовывать нос из норы.

Или так: блин, вожусь с этим багом вторую неделю, а все не выходит. Введу-ка я пару-тройку констант. Ну да, никакого масштабирования. Но нам же потом выделят время на рефакторинг?

Список можно продолжать до бесконечности. У каждого проекта своя специфика, но такие ситуации роднит одно важное свойство: сокрыть или исказить информацию гораздо выгоднее чем правдиво изложить. В результате проигрывают все участники цепочки – от рядового разработчика до пользователя системы. Даже если все обошлось, результат уже плачевный: система, построенная на хлипком фундаменте страха и лжи. Что делать? Как избежать таких последствий?

Нет, не надо вызывать доктора Лайтмена или устанавливать детектор лжи. Не надо вводить тотальный контроль всего и вся с многочисленными бюрократическими завихрениями. Нужно пересмотреть базовые принципы, на которых строится разработка. Если программисту, тестировщику и линейному менеджеру выгодно/комфортно работать по совести, он будет работать по совести. Если его трудности находят понимание, если его инициатива поощряется, то он будет работать не только на свое благо, но и на благо проекта. Если во главу угла ставится качественный, надежный продукт, то искажениям информации просто не будет места.

OK, все это здорово, но в реальной жизни все не так? Страх за свое место? Мнительность и паранойя? Инициатива не приветствуется? Приветствуется, но не поощряется? Манипуляции, увертки, лицемерие, страх? Бывает и так. В таких случаях важно не корчить из себя героя: “Я один пекусь о качестве продукта”. Это была бы еще одна форма лжи, уже непреднамеренная: мышление и поступки, диктуемые чувствами и эмоциями (не стоит забывать, что мы видим в людях черты, присущие нам самим). Лучше попытаться понять мотивы всех участников проекта. Возможно, есть варианты, при которых интересы каждого игрока будут учтены, но уже на других, более достойных принципах? Чем не вызов – помочь человеку преодолеть свой страх и все то, что за ним следует: двуличность, бездействие, неосознанные плохие поступки? Важно попробовать, приложить усилия. Не выходит? Что ж, тогда остается быть честным с самим собой, достойно работать в круге своего влияния. И затачивать пилу. Всегда пригодится. Оставайтесь с нами.

03.11.2009 Капитан Аляска | Подходы | Комментарии (5)

Мастерство тестировщика: перепросмотр

Добрый день.

Единственный способ определить границы возможного – выйти за эти границы (Артур Кларк).

Дон КихотСчастье тестировщика? Вот список из 62 пунктов: наш тяжелый изнуряющий труд не находит ни понимания, ни признания. Проклятые менеджеры и разработчики сводят на нет все наши усилия. Мы Дон Кихоты, бредущие по дорогам программных проектов и безуспешно сражающиеся с ветряными мельницами. Кто виноват?

Произво́дная в математике — функция, являющаяся результатом применения той или иной операции дифференцирования к исходной функции.

Нет исходной функции – нет производной. Тестирование программного обеспечения представляет собой сервис. Очень важный, ответственный, интеллектуальный сервис, без которого зачастую не обойтись. Но это производный сервис, надстройка над базисом. Разработчик может создать продукт без сучка и задоринки или же просто пренебречь шероховатостями, сделав акцент на ключевой функциональности приложения. Да, не все будет гладко, но продукт сможет найти признание у миллионов пользователей. Таким образом, тестировщик зачастую оказывается в двойственном положении. С одной стороны, QC-инженер осознает важность и полезность своего труда. С другой стороны, он видит, что его роль – второго плана. Что делать?

Казалось бы, ничего не остается, как опустить руки и принять неизбежное. Смириться со своим “производным” предназначением подобно рыбке-чистильщице, заплывающей в пасть бегемота и следящей за состоянием его зубов и десен. Выискивать мириады багов, бажков и бажочков в своих и сторонних продуктах, пытаясь убедить весь мир, к какой катастрофе он движется. Не самый плохой выбор. Полезная работа на благо продукта, разработчиков и пользователей. Важный винтик в скрипучем колесе проекта.

Скрипучем? Почему оно скрипит и что сделать, чтобы не скрипело? Каждый проект уникален. В каждом проекте своя специфика, свои слабые места и недоработки. Кто найдет их лучше чем тестировщик, знающий продукт вдоль и поперек? Быть может, тестировщик в состоянии не только увидеть просчеты, но и устранить их? Нет, это не новый виток спирали, не стародавний термин Quality Assurance (безусловно, серьезная активность, но достаточно размытая и неоднозначная). Речь идет о новых, дополнительных сферах деятельности, которые могут а) оказаться по силам тестировщику; б) обогатить его новым опытом; в) повысить значимость QC-инженера в проекте по созданию ПО.

В своих книгах об учении Дона Хуана писатель и антрополог Карлос Кастанеда призывает к перепросмотру – вспоминанию и “перепроживанию” всей своей жизни с целью высвобождения энергии. Порой книги Кастанеды вызывают недоверие, но сама мысль о перепросмотре, безусловно, важная и актуальная. Мы живем в плену устоявшихся убеждений, в прокрустовом ложе своих (не)умений и (не)удач:

Тестировщик, считающий поиск багов верхом своих возможностей, так и останется у своего корыта жалоб и причитаний, пыхтя как паровоз и требуя прибавки в зарплате за каждый найденный баг или каждый отработанный год. Тестировщик, не застрявший в своем развитии, способен пересмотреть свои взгляды, поднять планку своих возможностей и “заточить пилу” — овладеть новыми навыками и взять на себя новые задачи. Не в ущерб, а в дополнение к старым.

Вот три примера.

1. Задержать, нельзя выпустить? Задержать нельзя, выпустить?

Каждый программный продукт должен соответствовать набору критериев, заложенных на этапе подготовки спецификации. Безусловно, требования к продукту могут меняться в ходе разработки и тестирования приложения, но неизменной остается конечная цель – выпустить качественный продукт в сжатые сроки и с наименьшими затратами. Практически любой серьезный проект рано или поздно оказывается на критическом пути. Задачи на этом пути не имеют резерва времени выполнения – любая задержка в их реализации приводит к изменению сроков всего проекта либо к урезанию функциональности продукта. Помимо всего прочего, лихорадочное предрелизное кодирование отнюдь не способствует качеству приложения. Баги могут быть привнесены в самый последний момент, когда еще нет автотестов, а времени на вдумчивое тестирование уже не остается. Чем может помочь тестировщик в таких случаях?

Нет, нет, не стоит грудью бросаться на амбразуру: на создание классов, методов и объектов. Интересен стык “разработка/тестирование”. Например, при нахождении бага тестировщик может взломать черный ящик продукта и в открывшемся белом ящике найти причины возникновения бага. Тем самым можно высвободить время разработчика на исправление ошибки. Помимо всего прочего, QC-инженер получает более глубокие знания продукта, а значит и новую информацию для размышлений.

Дело за малым – овладеть соответствующими навыками. Рассмотрим процесс обучения ребенка катанию на велосипеде. Можно выделить четыре промежуточных состояния:

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

То же самое с анализом бага. Поговорить с компетентным разработчиком. Выяснить, какие средства отладки он использует. WinDbg? Найти время и сделать первые шаги, вооружившись документацией. Выбрать интересный баг с падением приложения. Понаблюдать, как с этим багом справится разработчик и воспроизвести его действия в своей среде. Северный ветер создал викингов. Будет трудно. Помимо знания WinDbg, нужно понимать код: и синтаксис языка, и задумки разработчика. Но результат может превзойти все ожидания: баги на блюдечке с голубой каемочкой, с анализом и комментариями.

2. Good beginning is half of battle

Предотвратить баги гораздо важнее чем исправить. Понимает ли тестировщик рынок продукта? Знает о потребностях заказчика? Представляет среду, в которой будет работать продукт? “Видит” архитектуру разрабатываемого приложения? Даже при наличии выделенного аналитика (а зачастую по причине его бездействия) проект может оказаться в тупике. Конкурент решил задачу более эффективно. Ошибки при выборе сторонних библиотек. Неудачная структура приложения, нет возможностей для масштабирования и т.п. Это баги наивысшего приоритета, или, скорее, окончательный диагноз. Избежать таких последствий – чем не вызов, чем не почетная задача, которую трудно переоценить?

3. Где должен быть тестировщик? Впереди, на лихом коне!

Жизнь не стоит на месте. Развиваются проекты, рождаются новые технологии. Рано или поздно IT-инфраструктура компании перестает соответствовать бизнес-задачам. Что там говорят про облачные вычисления? Динамическое управление ресурсами? Что выбрать? Решения от VMware? Бесплатный ESXi или же стек ESX/vCenter/LabManager? А может быть, Eucalyptus? Как новые технологии смогут повысить эффективность процесса разработки? Как избежать лишних затрат?

Пассионарии – это “люди, обладающие врожденной способностью абсорбировать из внешней среды энергии больше, чем это требуется только для личного и видового самосохранения, и выдавать эту энергию в виде целенаправленной работы по видоизменению окружающей их среды” (Л.Н.Гумилев). Сможет ли тестировщик стать пассионарием в разработке программного обеспечения? Палочкой-выручалочкой в трудную минуту? Лучше зажечь одну свечу, чем проклинать темноту.

01.10.2009 Капитан Аляска | Подходы | Комментарии (1)