Русский
Русский
English
Статистика
Реклама

Контроль качества

Кто такой QA Engineer, QC Engineer и Software Engineer in Test

17.06.2021 10:17:44 | Автор: admin

Я недавно латала дыры в понимании разницы между Quality Assuarance и Quality Control. Статей на эту тему много, я накидала свой вариант, хотелось по существу. Делюсь с вами. Enjoy, если актуально!

Кто такой QС Engineer

Контроль качества (QC) - часть международного стандарта управления качеством ISO 9000. Суть контроля качества сводится к поиску дефектов и ошибок после создания продукта.

Таким образом, специалист, чья работа крутится вокруг тестирования - это QC Engineer, по-русски, тестировщик.

Должностные обязанности QC Engineer

Примерный обобщенный список:

  • Оценка и внедрение программного обеспечения для тестирования.

  • Проверка продукта на соответствие установленным требованиям и ожиданиям.

  • Настройка автоматического тестирования.

  • Поиск дефектов или ошибок, которые могут подорвать доверие покупателей к вашим продуктам.

  • Проверка, что конечный продукт соответствует стандартам компании, стандартам отрасли, законам.

  • Составление отчетов об испытаниях и проверках.

  • Выявление и документирование ошибок и дефектов, которые необходимо исправить перед выпуском продукта.

  • Выявление и документирование ошибок и дефектов, которые можно исправить после отправки продукта.

  • Тестирование инструкций, гайдов, документации.

  • Работа со специалистами по обеспечению качества.

  • Оценка отзывов и жалоб клиентов -- поиск и рекомендации решений, которые сделают их счастливыми.

  • Мониторинг поступления на рынок только высококачественной продукции.

Кто такой QA Engineer

Обеспечение качества (QA) - часть международного стандарта управления качеством ISO 9000, которая помогает компаниям соответствовать требованиям, удовлетворять потребностям клиентов и постоянно улучшать свои процессы и процедуры.

Должностные обязанности QA Engineer

Примерный обобщенный список:

  • Планирование, разработка и внедрение политики, процессов и процедуры обеспечения качества.

  • Документирование и обновление типовых инструкций и лучших решений (best practices).

  • Проверка процессов, процедур и документации на соответствие правилам и стандартам.

  • Мониторинг текущих процессами с целью их улучшения.

  • Обучение производственных и инженерных групп соблюдению установленных процессов и процедур.

  • Анализ первопричин и внедрение решений, направленных на устранение проблем, обнаруженных в текущих процессах и процедурах.

  • Сбор и оценка отзывы клиентов.

ВАЖНО. Даже если в компании есть четко определенная позиция QA Engineer, обеспечивать качественный процесс, создавать качественный продукт остается обязанностью каждого участника команды.

В общем, QA Engineer, если такой есть на проекте, человек, который прицельно отследит и поможет подтянуть проседающий процесс разработки: направит, надоумит, отправит учиться или подкинет инструментов и идей.

Разница между QA и QC

Кто такой Software Engineer in Test

На моей текущей работе недавно сменился босс и он регламентировал, что QA - полностью обязанность каждого сотрудника, а я для них Software Engineer in Test.

При ближайшем рассмотрении Software Engineer in Test у меня получилось, что это тоже QC Engineer с одной лишь разницей, что фокус его обязанностей в автоматизации тестирования и включает и разработку собственного фреймворка/инструмента, и написание автотестов:

  • Создание/расширение фреймворка для тестирования.

  • Разработка вспомогательных утилит для тестирования сервисов.

  • Настройка и поддержка тестового окружения.

  • Настройка автоматизированных тестов для надежного и эффективного выполнения в средах CI / CD.

  • Обеспечение оптимального покрытия автотестами на всех уровнях.

  • Автоматизация отчетности.

  • и т.п.

Обязанности второго плана по сути копируют список QC Engineer.

Заключение

Итак, в любой компании есть Quality assuarance - это обязанность каждого сотрудника работать на высокое качество, но может присутствовать QA Engineer, который держит улучшение процесса разработки в постоянном фокусе.

И есть Quality Control. В центре QC - различные виды тестирования и все, что с этим связано, поэтому это зона ответственности Тестировщика, QC Engineer и Software Engineer in Test.

Полезно выяснить какой же у вас все-таки список должностных обязанностей и кого в вас видит руководство. Распространено, что руководство не различает некоторые понятия, и чаще всего ожидается, что вы два в одном QA + QC Engineer, либо в вас видят только QC Engineer.

Но кем бы вы ни были совместным итогом поступательных шагов в QA и QC всегда будут:

  • высококачественный продукт на выходе

  • приятный процесс работы и профессионализм

  • доверие и приверженность клиентов

  • отсутствие серьезных дефектов в продукте

  • оптимизация ресурсов и снижение затрат

Удачи!

Подробнее..

Постановка задач для универсального интеллекта у нас нет общего языка

21.01.2021 16:23:47 | Автор: admin

Введение или о каком ИИ я говорю

В первую очередь меня интересует универсальный ИИ как машина достижения сложных целей. То есть некий программно-аппаратный комплекс, которому можно сказать: сделай самолёт, который будет стоить 100$, летать на 1000 километров со скоростью 800 км/ч и перевозить 5 человек. Или так: вылечи человека такого-то от рака на терминальной стадии.

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

На данный момент я вижу два пути, как получить универсальный ИИ.

Первый путь - это системы, подобные reinforcement learning. Они подключаются в сенсорам и исполнительным механизмам некоего робота, и ещё у них есть сигнал награды. Reinforcement learning (далее RL) действует так, чтобы получать в среднем как можно больше награды. И канал вознаграждения - это основной способ сообщить ИИ, чего мы от него хотим.

обобщённая схема RLобобщённая схема RL

Второй путь - это системы, подобные GPT-3, генераторы текстов. О них скажу всего пару слов. Они берут начало текста и продлевают - так, чтобы выглядело связно. Часто эти тексты звучат глубоко и здорово, но Если вы спросите GPT-3 почему астрология - это самообман - он подробно это аргументирует. А если спросить его же почему астрология - это реально эффективная практика - наш продлеватель текстов опять же, подробно аргументирует. На вопрос эффективна ли астрология? GPT-3 ответит, исходя из контекста. Эти особенности не позволяют просто в лоб применять GPT-3 и его аналоги для создания хороших планов.

Проблемы с Reinforcement Learning и подобными системами

Я бы разделил проблемы на две большие группы.

Первая группа - это проблемы, которые RL в принципе мог бы решить, если бы у него было больше данных, больше вычислительных мощностей, более ёмкие буферы данных и нейросети.

Вторая группа - это проблемы с написанием ТЗ. В голове задание звучит хорошо, но записать его в виде правила выдачи подкреплений не выходит.

Проблемы данных, памяти и вычислительной мощности

Проблема размерности

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

Проблема решается сжатием картинки в маленький информативный вектор. Есть два основных способа это сделать:

1) Взять готовую нейросеть, умеющую классифицировать изображения на много классов. Отрезать последний слой, взять выход предпоследнего. Там будет вектор размерности ~1000-2000 элементов. Это намного меньше, чем исходная картинка, но этот вектор остаётся очень информативным.

2) Обучить автоэнкодер. Автоэнкодер - это нейросеть, у которой есть узкое место, то есть промежуточный слой малого размера. На вход нейросеть получает кадр, на выходе должна воспроизвести его же. Если отрезать все слои, что идут после узкого места, получится нейронка, создающая из картинки то самое сжатое представление.

Если RL будет обучаться по сжатым представлениям, он потребует значительно меньше данных.

Проблема опасных исследований

Обычно RL стартует с пустой памятью. Его поведение случайно. Со временем RL накапливает больше данных и обучается управлять условным роботом более-менее сносно. Или так и не обучается - как повезёт.

А теперь представим себе, что мы такой RL поместили в продакшн. На бирже торговать или искать новый способ изготавливать скрепки. Пока RL будет экспериментировать и познавать мир, он допустит множество ошибок, и это серьёзно навредит бизнесу.

Как с этим бороться?

  1. Можно сделать мир-симуляцию, и гонять RL в нём. А лишь потом, когда он научится справляться, выпускать ИИ в реальный мир. Очевидный минус - для некоторых случаев мы не можем сделать симуляцию. Мы сами слишком плохо знаем интересующую нас среду.

    RL эксплуатирует кривую физикуRL эксплуатирует кривую физику
  2. Запустить в среду другого игрока - человека или иную систему управления. Залогировать их действия и передать в RL так, будто это его собственный опыт. Например, человек играет в Doom, игра записывается на видео, все ключевые переменные записываться, все действия записываются. Затем нейросеть в RL учится по кадру с экрана и текущему действию предсказывать, сколько будет награды. Таким образом у RL на момент выхода в мир уже будет какая-то стратегия - теоретически она должна быть не хуже, чем у живого игрока, но на практике это не всегда выполняется. Сигналы подкрепления проставить ретроспективно - мы же этими сигналами хотим гнать ИИ к какому-то результату, значит, у нас есть какое-то правило, по которому входящий кадрназывается "хорошим" или "плохим".

Проблема отдалённой цели

Допустим, мы даём RL задачу: пройти уровень из Doom. Награда даётся только за полное успешное прохождение.

Наивный RL будет очень долго и бесплодно искать, какое же действие приведёт к награде. Он же не знает, что в шутере надо ходить по коридорам и стрелять монстров, и что конец уровня - это дверь в надписью Exit.

Если у RL есть эвристика любопытства, то ситуация немного улучшается - ИИ будет искать места, где он ещё не был, совершать действия, которых не совершал, и со временем попробует всё, что можно, в том числе дверь с надписью Exit. После этого он должен смекнуть, в чём была задача.

Но всё равно, люди гораздо быстрее бы поняли, куда идти.

Как решать проблему?

  1. Дать RL человеческий опыт. Или опыт некоего другого бота. Так он хоть поймёт, к чему стремиться.

  2. Сделать несколько миниатюрных уровней, где прямо перед RL находится та самая дверь с переходом на новый уровень. Можно даже просто записать ему в память видео, как кто-то другой проходит такой мини-уровень и получает награду.

  3. Дать подсказку через канал подкрепления: пусть RL получает небольшие награды за подбор предметов и убийства врагов, и небольшие наказания за ранения. Это похоже на то, как человек проходил бы первый шутер в своей жизни - он бы воспринимал аптечки и победы как награды, а ранения - как наказания. Но есть вариант, что RL найдёт какой-то возобновляемый источник наград и вообще не захочет покидать уровень.

    RL зациклился на вспомогательной наградеRL зациклился на вспомогательной награде
  4. Явным образом описать цель: отснять эту дверь с разных ракурсов, получить её сжатое представление. Все кадры проверять на предмет того, насколько они похожи на эту дверь - и давать пропорциональную награду. Таким образом может получиться, что RL станет целенаправленно искать объекты, похожие на дверь с надписью Exit. Недостаток в том, что он может залипнуть на какую-нибудь другую дверь - ну да, степень сходства 5%, но зато можно просто смотреть на дверь и бесконечно получать небольшие награды. Возможно, стоит совместить такое описание цели с эвристикой любопытства - пусть награда от созерцания двери будет пропорциональна и её новизне, и её похожести на Ту Самую Дверь.

Распространённый частный случай. Допустим, у RL очень много опыта взаимодействия с миром, но его нужно натравливать на разные цели. Сегодня он собирает аптечки, завтра стреляет монстров, послезавтра ищет ключи Применительно к реальному миру: сегодня RL придумывает умный способ вернуть паралитику способность ходить, а завтра изобретает план, как лечить рак. Всё это в одном и том же мире, одними и теми же инструментами, но он должен быстро сориентироваться и понять, что от него хотят на этот раз, а не пытаться методом тыка разобраться, за что дают награды.

Скорее всего, у такого RL должен быть некий канал, через который ему подаётся описание цели. В самом просепени сходства этих двух векторов.

RL, которому подсказывают цельRL, которому подсказывают цель

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

Есть вариант создать много целевых состояний и обучить некую нейросеть отличать целевое состояние от не-целевого. А затем использовать что-то вроде Model-Based подхода. ИИ будет в воображении генерировать траекторию изменений мира - он же знает по прошлому опыту, как изменяются входные кадры, и как на них влияют активные действия. Можно каждому придуманному кадру (или сжатому представлению кадра, или сжатому представлению от цепочки кадров) поставить в соответствие награду. Награду проставляет та самая нейросеть, которая пыталась выучить правило, чем целевые кадры отличаются от не-целевых.

Далее ИИ обучается целиком в воображении - либо он подбирает конкретный план, ведущий к целевому состоянию, либо разрабатывает некое правило соответствия кадр->действие, либо учится делать прогноз (кадр, действие)->суммарная награда в некоем горизонте планирования.

Таким образом можно было бы свести реальные эксперименты в физическом мире к массивному перебору в воображении.

Есть и другое решение. Допустим, мы создадим некий язык для взаимодействия с ИИ. Он будет кратко и сжато описывать сложные цели. На вход RL будет получать и картинку с сенсоров, и некое символическое описание текущей цели. Это может быть или картинка, или текст, сжатый в вектор, или какая-то иная форма языка. В любом случае, RL должен иметь достаточно статистики, чтобы понять: описание цели никак не влияет на физику окружающего мира, но влияет на то, за что будут давать награды.

Например, если мы делаем ИИ, который ищет пропавших людей дронами, описанием цели может быть фотография человека, либо сжатое представление этой фотографии, либо сжатое представление от словесного описания внешности.

Проблемы на уровне ТЗ

Допустим, мы хотим создать универсальный ИИ, который сможет лечить неоперабельный рак. Допустим так же, что универсальный ИИ мы уже делать умеем - это просто достаточно хороший RL.

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

Итак, можно сделать для ИИ гуманоидное тело. Оно достаточно универсально, а где универсальности не хватает, можно использовать различные интерфейсы - например, у ИИ будет инфракрасный термометр с цифровым дисплеем, отвёртка и микроскоп. Вполне человеческие инструменты, не интегрированные в корпус - такие, которые можно быстро взять в руку и быстро заменить на что-то иное.

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

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

А теперь ключевой вопрос: как сформировать сигнал подкрепления? Как постфактум определить, решена ли задача?

Человек бы решал задачу так: он бы провёл ряд измерений - рентген, анализ крови, попросил бы пациента описать своё состояние Наверное, врач мог бы полнее раскрыть эту тему.

Есть другой вариант: если мы хотим ретроспективно оценить, здоров ли пациент, надо за ним наблюдать. Смотреть, насколько он справляется со своими обычными делами, и смотреть, сколько он проживёт. В конце концов, если все анализы показывают, что человек болен, а человек явно ведёт себя как здоровый, не чувствует дискомфорта и доживает до 110 лет - значит, проблема в анализах.

Но как это всё выразить в терминах прямых наблюдений?

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

Это бы сработало, если бы рентген был одним из входных сенсоров, интегрированных в ИИ. Причём даже не сам рентген, а вся процедура, как провести рентгеновский снимок. Если же мы говорим ИИ надо сделать, чтобы снимок выглядел вот так, ИИ может этот снимок нарисовать или снять на рентген что-то постороннее.

У человека есть концепция объективной реальности - понимание, что в реальном мире есть некоторые явления, которые можно измерять. Есть процедуры измерения. И эта процедура делает так, что реальные переменные отображаются на наших приборах. И мы хотим управлять именно реальными переменными, а не только теми, что показаны на приборах. Пока ИИ управляет, скажем, ракетой, он не может разрушить корреляцию между приборами и реальным миром. Но если ему дать рентгеновский аппарат, который управляется робо-руками, то ИИ мигом себя ослепит и нарисует картинку, как всё замечательно по приборам.

Можно ли с этим бороться? Можно ли запретить ИИ ослеплять свои приборы?

В какой-то мере. Например, можно обучить нейросеть-ревизора, которая по наблюдаемым кадрам будет проверять, верно ли проходят измерения. Но эту нейросеть можно обмануть, потому что она не дообучается, а RL дообучается постоянно. Можно этого ревизора тоже дообучать - скорее всего, вручную заносить в датасет ситуации, где ИИ всё-таки сумел её обмануть.

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

Ещё есть вариант вынести процедуры контроля за пределы той территории, где ИИ активно работает. ИИ может запросить рентген, но делать его будут люди. В такой ситуации может выйти, что RL сможет хакнуть людей - убедить их совершить подлог, спровоцировать на ошибку или сделать роботов, которые выйдут за пределы цеха и сами неправильно сделают рентген. Будет ли ИИ всё это делать?

По моему опыту, ИИ обычно идёт по наиболее простому пути. То есть зависит от того, до чего ИИ раньше догадается - как вылечить пациента или взломать систему контроля.

Наконец, можно создать автоматическую систему контроля, работающую наподобие GAN. ИИ (не именно хирург, а просто какая-то система RL) ищет способы подделать, например, рентгенограмму тестовой мишени. Затем тестовая мишень уезжает за пределы цеха, и её отснимает простенький необучаемый робот. Если результаты тупого робота и умного разошлись - значит, произошёл взлом, и обучаемая нейронка-ревизор добавит этот случай в датасет. А взломщик получит свою награду.

А потом всякий раз, когда RL проводит планирование, его план проверяет ревизор - нет ли там подлога. В данной ситуации хитрого ИИ будет останавливать опытный надсмотрщик, который насмотрелся на не менее хитрого ИИ в контролируемых условиях.

Пару слов об ИИ-безопасности

Есть множество статей о том, как хрупки человеческие ценности и о том, как сложно их записать в виде правила подкрепления. Есть страшные истории о том, как ИИ, которому поручено делать скрепки, будет их делать, пока не израсходует все атомы во Вселенной - просто потому, что это естественная линия поведения для оптимизатора.

Обычно в таких историях говорится, что ИИ должен быть самоулучшаемый - то есть RL должен уметь влезать в свой код и как-то его улучшать, а потом улучшенный код будет снова улучшать себя. Автору этой статьи не доводилось видеть научных работ по RL, способному к рекурсивному самоулучшению. Рекурсивное самоулучшение чего-то вроде эволюции - это пожалуйста, но эволюция не умеет решать задачи RL.

Есть очевидный способ сделать RL самоулучшающимся. В список возможных действий (наряду с вперёд-назад-стрелять) добавить какие-либо действия с гиперпараметрами: изменить шаг обучения нейронки, изменить коэффициент дисконтирования, изменить размер буфера памяти Это несерьёзное самоулучшение, но даже оно наталкивается на ряд сложностей.

В первую очередь, рекурсивная самоулучшающася система нестабильна. Она может выкрутить размер буфера памяти, например, в такие значения, что ИИ начнёт сильно тормозить.

Он даже не понял, что его убилоОн даже не понял, что его убило

И исправить эту ошибку ему будет очень сложно, это займёт кучу времени. Либо же ИИ может поменять параметры так, что он станет хуже обучаться. И тогда он не сможет сделать выводов из своей ошибки. Либо же он может изменить параметр дисконтирования или любопытства - и тогда изменятся его жизненные приоритеты, то есть он уже не будет решать наши задачи.

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

Другой момент заключается в том, что RL идёт по наиболее очевидному пути. Если есть простой способ достичь цели, система не будет искать сложный. Конечно, сложность выражается во внутренних концепциях RL - например, он может в шутерах разбивать локацию не на дороги и стены, а на теневые и светлые зоны. А противников видеть не как объекты, а как изменения текстуры. За счёт этого стратегии поведения будут не вполне человеческие.

Обратите внимание, что именно лучше всего заметила нейросеть. Тени, светлые зоны, HUD, линию горизонтаОбратите внимание, что именно лучше всего заметила нейросеть. Тени, светлые зоны, HUD, линию горизонта

Так вот, если проще не взламывать защиту, а решать задачу, то ИИ именно этим и займётся. Судя по наблюдениям автора, ИИ гораздо чаще взламывает системы, которые можно взломать чуть-чуть, и это уже принесёт отдачу. Например, однажды автор этой статьи делал ИИ для торговли на бирже. Провёл тестирование на симуляторе биржи и получил странный результат: ИИ научился делать 1000$ из 100$ на интервалах в полчаса. Как? Оказалось, в симуляторе можно брать кредит, и ограничения нет. ИИ стал понемногу наращивать объём кредита, и добрался до десяти миллионов долларов. Покупал на всё акции, потом продавал и возвращал кредит. В случае, если контролирующая система - это нейросеть, она будет давать чуть-чуть разные значения награды за чуть-чуть разные наблюдения. В результате можно, двигаясь малыми шагами, подобрать такие входные данные, на которые нейросеть будет отвечать неоправданно большой наградой. Так что если мы хотим, чтобы нейросеть проверяла, справился ли RL, это должна быть или очень надёжная нейросеть, или она должна дообучаться, получая всё новые примеры хаков, или RL не должен иметь возможности много экспериментировать с ней.

Подводя итоги

Когда-то я думал, что создать сильный ИИ (в смысле универсальный оптимизатор) - это вполне достаточно, чтобы решить любую решаемую задачу. Но когда стал размышлять, как решить конкретную нерешённую задачу с помощью современного ИИ - оказалось, что эти очень тяжело сформулировать понятное техзадание. RL можно встроить в работающую инфраструктуру - например, регулировать цены на товары. База данных на входе, база данных на выходе - в таких условиях RL работает хорошо. Никаких чудес, но довольно эффективно.

Кроме того, воплощённый ИИ можно обучать конкретной задаче в хорошо защищённом цеху, а затем включать, чтобы он решил одну конкретную задачу. Например, нашёл способ открыть запертую дверь.

Но это всё, как мы понимаем, не похоже на сингулярность силами одного ИИ.

Я задумывал эту статью как способ спровоцировать диалог. Наверняка я где-то неправ и есть более хитрые решения, чем те, до которых мне удалось додуматься. Так что развёрнутые комментарии и интересные споры приветствуются!

Подробнее..

Перевод Как добиться того, чтобы инспектор кода воспылал к вам любовью

15.12.2020 12:20:26 | Автор: admin


Когда речь заходит об инспекции кода, внимание людей обычно сосредоточено на том, кто её проводит. Но разработчик, который писал код, играет в процессе такую же важную роль, как и проверяющий. Рекомендаций по подготовке кода к инспекции почти не встречается, поэтому авторы часто допускают ошибки просто по незнанию.

В этой статье собраны лучшие практики для участия в инспекции кода в роли автора. По завершению чтения вы начнёте отсылать инспекторам такие безупречные наборы изменений, что они воспылают к вам любовью, не меньше.

Но я не хочу, чтобы инспекторы кода пылали ко мне любовью


А они всё равно будут. Смиритесь. Никто в истории человечества ещё не сетовал на смертном одре, что при жизни его слишком уж любили.

Зачем совершенствовать инспекцию кода?


Освоение эффективных техник инспекции облегчит жизнь проверяющему, команде и, самое-то главное, вам.

  • Ускоренный процесс передачи знаний. Если как следует подготовить набор изменений, внимание инспектора будут притягивать именно те области, в которых вам нужно расти, а не скучные стилистические огрехи. А когда вы даёте понять, что цените конструктивную критику, проверяющий начинает вкладывать больше сил в обратную связь.
  • Пример для окружающих. Эффективные практики инспекции кода в вашем исполнении зададут планки для окружающих. Хорошие техники обычно перенимаются, а значит, вам будет проще, когда кто-нибудь из коллег вышлет код вам на проверку.
  • Минимум конфликтов. Инспекция кода часто вызывает напряжение в команде. Если подходить к делу ответственно и сознательно, споры будут возникать реже.

Золотое правило: цените время проверяющего


Это вроде бы очевидно, но мне часто встречаются авторы, которые относятся к инспекторам как к своим личным специалистам контроля качества. Такие люди палец о палец не ударят, чтобы отловить хоть часть ошибок или сделать набор изменений удобным для проверки.

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

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

Техники


1. Сначала просмотрите код сами

Прежде чем отсылать код коллеге, прочитайте его. Не ограничивайтесь вылавливанием ошибок представьте, что видите этот фрагмент впервые. Что в нём может сбить с толку?

По моему опыту, бывает полезно сделать перерыв между написанием и редактированием кода. Люди часто отсылают свежую порцию кода под конец дня, но именно в этот период наиболее высока вероятность что-то упустить по небрежности. Дождитесь утра, посмотрите на набор изменений свежим взглядом и тогда уж передавайте его коллеге.



Какой идиот это написал?
Синхронизация Cron Jobs с лунным циклом: Я добавил логику с синхронизацией, чтобы наш пайплайн ETL оставался в гармонии с природой


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

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

2. Составьте ясное описание набора изменений

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

И он был прав. Я писал документ с расчётом на разработчиков из своей команды, но не учёл, что его, возможно, будут читать и люди со стороны. Аудитория не ограничивалась пределами моего отдела оставались ещё партнёрские команды, наставники, люди, которые принимали решения о повышениях. Документ следовало писать так, чтобы и им всё было ясно. После этого разговора я всегда стараюсь подать свою работу в необходимом для понимания контексте.

Описание набора изменений должно включать в себя всю фоновую информацию, которая может понадобиться читателю. Даже если вы составляете описание прицельно для проверяющего, имейте в виду, что у него может быть меньше сведений о контексте, чем вам кажется. Кроме того, не исключено, что другим коллегам тоже придётся работать с этим кодом в будущем при просмотре истории изменений им должны быть понятны ваши намерения.

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

Если вы хотите глубже погрузиться в искусство составления превосходных описаний, прочитайте How to Write a Git Commit Message Криса Бимса и My favourite Git commit Дэвида Томпсона.

3. Автоматизируйте простые вещи

Если вы полагаетесь на инспектора в таких мелочах, как уплывшая фигурная скобка или проблемы с автоматическими тестами, значит тратите его время впустую.



Проверишь, всё ли там в порядке с синтаксисом? Я бы к компилятору обратился, но жаль тратить его время.

Автоматические тесты должны считаться в команде частью стандартной процедуры. Инспекция начинается только тогда, когда пройдена вся серия автоматических проверок в среде непрерывной интеграции.

Если же ваша команда пребывает в трагическом заблуждении и отказывается от непрерывной интеграции, организуйте автоматизированную проверку своими силами. Внедрите в среду разработки pre-commit хуки, линтеры и форматтеры, чтобы удостовериться, что все соглашения соблюдены и предполагаемое поведение сохраняется от коммита к коммиту.

4. Позаботьтесь о том, чтобы код сам отвечал на вопросы

Что не так на этой картинке?



Мне непонятно назначение функции.
А, это на случай если при вызове передаётся Frombobulator при отсутствии имплементации frombobulate


Мне автор помог разобраться в функции, а как быть следующему читателю? Закопаться в историю изменений и перечитывать все обсуждения? Ещё хуже, когда автор подходит к моему столу, чтобы объяснить всё лично. Во-первых, это мешает мне сосредоточиться, во-вторых, ни у одной живой души больше не будет доступа к озвученной информации.

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



Алло?
Когда ты шесть лет назад писал bill.py, почему у тебя t=6?
Рад, что ты позвонил! Это из-за налога на продажи в 6%.
Ну разумеется!
Отличный способ обосновать решение по реализации.


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

5. Вводите изменения дробно

Разрастание границ это дурная практика, которую часто можно наблюдать при инспекции кода. Разработчик берётся за устранение бага в логике, но по ходу дела ему на глаза попадается какой-то изъян в интерфейсе. Ну, раз уж всё равно с этим куском работаю, думает он, заодно и его исправлю. А в итоге начинается путаница. Проверяющему теперь придётся вникать, какие изменения работают на задачу А, а какие на задачу Б.

Лучшие наборы изменений делают что-то одно. Чем точечнее и проще изменение, тем легче инспектору удерживать в голове контекст. Разделяя не связанные друг с другом изменения, вы также получаете возможность организовать параллельную проверку несколькими коллегами, а значит, код вернётся к вам быстрее.

6. Отделяйте функциональные изменения от нефункциональных

Из ограничения масштабов следует другое правило функциональные и нефункциональные изменения не должны смешиваться.

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



А вы найдёте функциональное изменение?

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

Вдобавок разработчики любят несвоевременно примешивать к основным изменениям рефакторинг. Рефакторинг кода со стороны коллег я всячески одобряю, но не когда они параллельно реализуют новое поведение.



Изменение в поведении, погребённое среди рефакторинга

Если фрагмент кода нуждается и в рефакторинге, и в изменениях поведения, необходимо разбить процесс на два-три набора:

  1. Добавить тесты для текущего поведения (если их нет)
  2. Провести рефакторинг кода, ничего не меняя в тестах
  3. Изменить поведение и соответствующим образом обновить тесты

За счёт того, что тесты на втором этапе остаются нетронутыми, проверяющий может убедиться, что рефакторинг ничего не нарушает в поведении. Соответственно, на третьем этапе ему не придётся разбираться, что здесь рефакторинг, а что работает на изменение поведения ведь вы отделили одного от другого заранее.

7. Разбивайте слишком крупные наборы изменений

Раздутые наборы изменений это что-то вроде страшненьких родственников разрастающихся границ. Представьте себе ситуацию: разработчик приходит к выводу, что для внедрения функциональности А ему сначала придётся подкорректировать семантику библиотек Б и В. Если изменений немного, то ещё куда ни шло, но очень часто эти модификации расползаются и на выходе получается огромный список изменений.

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

Может, вместо того чтобы делать всё разом, удастся сначала поработать с зависимостями, а уже в следующем наборе реализовать новую функциональность? Реально ли сохранить код в здравом состоянии, если внедрить половину функциональности сейчас, а другую половину на следующем этапе?

Раздумывать, как бы разбить код, чтобы получился рабочий, вразумительный фрагмент, бывает утомительно. Но это позволяет получить более качественную обратную связь и создаёт меньше сложностей для проверяющего.

8. Принимайте критику доброжелательно

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

В конечном счёте, вы, как автор, вольны решать, как именно вам реагировать на замечания. Относитесь к словам инспектора как к объективному обсуждению кода, которое не имеет никакого отношения к оценке вашей личности. Если вы займёте оборонительную позицию, станет только хуже.

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



Для января и февраля 1900 года это не сработает.
Точно, хорошо подмечено!


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

9. Проявляйте терпение, если инспектор допускает ошибку

Периодически случается, что проверяющий просто-напросто не прав. Он может неверно прочесть совершенно нормальный код с таким же успехом, как вы насажать багов. Многие разработчики в таких случаях начинают яростно защищаться. Их оскорбляет, что кто-то подвергает их работу критике, да ещё и ни на чём не основанной.

Однако даже при том, что проверяющий не прав, вам есть о чём задуматься. Если он что-то неверно прочёл, какова вероятность того, что в будущем и другие люди допустят ту же ошибку? Не придётся ли читателям изучать код вдоль и поперёк, только чтобы убедиться, что бага, который им мерещится, здесь всё-таки нет?



Здесь переполнение буфера, потому что не проводилась верификация, хватит ли памяти в name, чтобы вместить все символы NewNameLen.
Это в моём-то коде? Немыслимо! Конструктор вызывает PurchaseHats, а она вызывает CheckWeather, которая выдала бы ошибку, если бы длина буфера не соответствовала. Ты бы сначала прочитал 200 000 строк кода, а потом уже осмеливался допускать возможность, что я где-то ошибся.


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

10. Давайте доходчивую реакцию

Я часто попадаю в такую ситуацию: отправляю человеку замечания, он обновляет код с учётом некоторых из них, но при этом хранит молчание. Наступает период неопределённости. То ли он пропустил остальные замечания, то ли ещё в процессе исправления. Если начать проверять уже сделанное, гипотетически может оказаться, что этот фрагмент кода ещё в работе и я зря теряю время. Если выжидать, можно попасть в патовую ситуацию будем оба сидеть и ждать друг от друга следующего шага.

Заведите в команде определённый порядок действий, чтобы всегда была ясно, у кого в данный момент эстафетная палочка. Нельзя допускать, чтобы процесс затормаживался только из-за того, что никто не понимает, что вообще происходит. Сделать это легко достаточно оставлять на уровне набора изменений комментарии, из которых понятно, когда право действовать передаётся другому участнику.



Исправляю заголовки > Обновляю код в соответствии с замечаниями > Всё готово, посмотри, пожалуйста

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



Некоторые инструменты вроде Reviewable и Gerritt предлагают ставить метки на обработанные замечания

Соразмеряйте свои реакции с усилиями, которые приложил проверяющий. Если он подробно расписал какой-то момент, чтобы вы могли почерпнуть что-то новое для себя, не ограничивайтесь пометкой Сделано. Отвечайте вдумчиво, чтобы показать, что цените его труд.

11. Умело запрашивайте недостающую информацию

Иногда комментарии инспектора оставляют слишком много возможностей для толкования. Когда тебе пишут что-то в духе Мне непонятна эта функция, сразу возникает вопрос, что именно человеку непонятно. Слишком длинная? Название неудачное? Нужно лучше задокументировать?

Долгое время я ломал голову, как внести ясность в туманные комментарии и при этом ненароком не вступать в конфронтацию. Первое, что приходило в голову спросить: Что в ней непонятного?, но это звучит сварливо.

Как-то раз я умышленно отправил неопределённую реплику такого рода коллеге, и он обезоружил меня своим ответом:

Что изменить, чтобы стало лучше?

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

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

12. Отдавайте преимущество проверяющему

В теннисе, если не совсем ясно попал ли мяч в аут при подаче противника, принято трактовать ситуацию в его пользу. При инспекции кода тоже следует придерживаться этого правила.

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

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

13. Сокращайте время передачи кода

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

Прошло шесть недель и таинственный разработчик снова возник в проекте с правками. Хоть я и ценю его труд, но большой перерыв между двумя этапами проверки привёл к тому, что я потратил в два раза больше сил на инспекцию. Пришлось перечитывать не только код, но и собственные комментарии, чтобы вспомнить о чём вообще шла речь. Если бы человек появился через пару дней, в дополнительной работе не было бы необходимости.



Интеллектуальные затраты на инспекцию кода при коротких (слева) и долгих (справа) сроках передачи
Ось x время; ось y память инспектора; синяя штриховка восстановление контекста; голубая заливка проверка кода; серая заливка ожидание; красная штриховка дополнительные издержки


Шесть недель это, конечно, исключительный случай, однако мне часто приходится наблюдать долгие, ничем не оправданные паузы у себя в команде. Кто-нибудь отсылает набор изменений на проверку, получает обратную связь и неделю откладывает правки на потом, потому что отвлёкся на другую задачу.

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

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

В заключение


Готовя следующий список изменений к отправке, подумайте, на какие факторы можете воздействовать и используйте эти возможности, чтобы проверка прошла продуктивно. В процессе участия в инспекции кода отмечайте те вещи, которые регулярно замедляют процесс и впустую тратят ресурсы.

Запомните золотое правило: цените время проверяющего. Если вы дадите ему возможность сосредоточиться на по-настоящему интересных сторонах кода, его комментарии будут дельными. Если же вы вынудите его тратить время на мелочи или распутывать путаницу тем хуже для вас обоих.

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

Поздравляю! Если вы дочитали до этого места, то можете уже считать себя экспертом по инспекции кода. Ваши проверяющие, скорее всего, уже воспылали, так что и вы обращайтесь с ними по-человечески.
Подробнее..

Идеальный QA

05.11.2020 16:06:36 | Автор: admin

(Небольшие размышления на тему философии и психологии системы контроля качества)

Нормальность - это общепринятый вид сумасшествия.
Коллективное бессознательное

Введение

Все нижеизложенное, это моя субъективная точка зрения, и если я где-то постулирую что-то неоднозначное, то я просто опустил оборот с моей точки зрения. Прошу воспринимать это именно так. Я за простоту языка, но, говоря о смыслах, у меня всегда получаются сложноподчиненные предложения с излишне абстрактной лексикой. И мне не хочется ничего исправлять, так что прощу прощения за возможно избыточную сложность речи. Одна из моих подруг сказала я прочитала половину и у меня устал мозг.

Предпосылки

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

Кто я?

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

Ценности

Я отвечаю за себя, за свое согласие или не согласие принять участие в оценке/контроле какой-то системы, за оценку другими моих оценок, осознание причин этих оценок и выработки своей следующей оценки системы с учетом всех доступных обратных связей. И так рекурсивно до момента, когда текущий результат мне нравится и до той поры пока он мне нравится. И так везде, на работе, в жизни, в конфликтных и новых ситуациях, я должен понять, что происходит, почему, куда все двигается, что мне в этом нравится и что нет. А до этого я не могу оценить систему, так как не имею достаточно данных. Я идеальный судья, инквизитор. Я в первую очередь оцениваю себя, со своей точки зрения, и со стороны. С какой? С точки зрения будущего, мира в котором я хочу жить, моих детей, женщин, близких. Им понравится результат моей деятельности? Я должен в процессе своей работы уметь честно отвечать себе на сложные, скользкие и запретные вопросы. Мой разум свободен мыслить любое, пока это не выливается в мир в виде оценки и начинает этот мир неизбежно менять. В конечном счете наибольшим весом в моей оценке любой системы обладает результат ее развития в динамике с учетом моего влияния на нее. Как мое участие в каком-то проекте (а это любая деятельность) улучшит мир? Я хочу, чтобы вокруг меня был рай, то есть мир, который предсказуем, безопасен и эстетически приятен мне. Потому что этот мир мой. Миры других в идеале должны мой мир дополнять и взаимно влиять друг на друга, улучшая один другого. Я могу менять другие миры, если знаю как и знаю, что результат мне понравится. Я хочу видеть улыбающиеся глаза всех людей, видящих меня и готовых поучаствовать в любой совместной движухе, развитых на столько же как я, имеющих свою точку зрения и умение объяснить ее даже ребенку. Это ценности, которые объясняют мой способ мышления.

О задачах.

С точки зрения профессии это значит, что я не воспринимаю задачу поставленную заказчиком как конечный результат своей работы, я сначала ее оцениваю, осознаю ее полезность, нейтральность или нужность миру. Чаще всего результат - нейтральный. Я не стесняюсь выглядеть дураком задавая дурацкие вопросы, чтобы человек, ставящий задачу, объясняя мне как ребенку простым языком, понял суть этой задачи и ее нужность так же как я, а значит и результат решения мы с ним будем оценивать похожим образом. Многие задачи отваливаются на этом этапе уточнения, о чем речь вообще, нафига нам все это надо, и точно ли таким способом, с учетом контекста.

Оценка меня.

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

О коммуникации.

Я готов делать ошибки, я готов высказывать ошибочные мнения по всяким ситуациям, требующим оценки, в которых даже не разбираюсь. Естественно, при этом я использую сослагательное наклонение, это не мое окончательное суждение, а предположение, я фантазирую. Да, по многим из этих вопросов я могу найти ответ у Гугла, но я работаю с профессионалами и работаю удаленно. Поэтому, я убиваю сразу трех зайцев - имею возможность получить ответ быстро, возможно более точный, чем знает Гугл, и заодно выстраиваю живую коммуникацию между людьми, которые перегружены знаниями и не имеют полноценной возможности ими поделиться. Меня поправляют, чат оживает, работается веселей.

Я люблю людей. С ними интересно, они создают, пусть иногда даже конфликтные, ситуации, которые меня развивают. У меня очень плохая память на название форм. Я не помню имен, я не знаю, как называются алгоритмы, или технологии, кроме тех, которые регулярно использую. И эту проф-деформацию я тоже использую как инструмент в работе. Любой новый термин должен быть объяснен мне так, чтоб я его понял. Я профессионал, и любой другой профессионал способен объяснить суть термина в двух-трех аналогиях или даже синонимах. При этом чем проще аналогии, тем выше я оцениваю его понимание сути того, что он объясняет. Он оценивает мое понимание по тем мазкам, которыми я отвечаю на его картинку. По тому, насколько точные вопросы я задаю. По тому как быстро просто и красиво я добавляю к его контексту то, что ему соответствует. Так создается общий контекст. Мы рисуем его вместе до той поры, пока не начнем видеть одинаково. И так мы оцениваем друг друга, адаптируемся к языку и оптимизируем коммуникацию.

О мотивации

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

P.S.

Хотел бы я жить в мире, где все были бы такие как я? Да, этот мир для меня был бы вполне уютен и предсказуем. В нем бы не было немотивированной агрессии, лжи, страха, жадности. Он бы строил себя сам, потому что в нем все были бы судьями, отвечающими за весь мир, профессионалами, оценивающими других с точки зрения рациональности, а не судящими рефлексивно, ориентируясь на мнения большинства по инерции. В нем слова не расходились бы с делами и устного договора было бы достаточно, чтобы быть уверенным в том, что так и будет.

Но тогда у идеального QA не осталось бы работы, так как остальные смогли бы решить все сами.

Возможно, именно тогда ему бы пришлось сменить профессию на идеального Творца и начать создавать свою систему, а не оценивать чужие.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru