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

Опыт

Подводные камни межкультурных коммуникаций

08.07.2020 18:05:40 | Автор: admin

Бывало такое, что ваши коллеги, которых занесло в западные компании, то ли в командировку, то ли насовсем, или просто им приходится день ото дня взаимодействовать по проекту с иностранцами делились с вами думами тяжкими? И жаловались вам они на проблемы, с которыми тут в России вы ни разу не сталкивались. То не нравится мне наш иностранный заказчик, какой-то он нелюдимый, ни улыбнется, ни пошутит!, то Новый начальник из Европы робот какой-то! Не отпустил меня вчера с обеда домой! А мне в налоговую надо было!, то Позвал нового коллегу из Германии в ресторан, так сказать, проект обсудить, а он отказал! Сказал, что все вопросы надо решать на работе! Я к нему, как к человеку, а он вон как!


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


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


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



Я не всегда работал в текущей компании и не всегда был руководителем проектов, когда-то я был младшим разработчиком, а еще раньше системным администратором и именно тогда меня забросило в мою первую иностранную компанию. Называлась она Siemens Business Services, где мне и открылись все прелести работы с иностранными коллегами, которые я продолжаю постигать по сегодняшний день, ведь из 15 лет в IT, примерно 10 прошла и проходит по сей день в тех самых иностранных компаниях.


Вспомним Киплинга: О, Запад есть Запад, Восток есть Восток, и с мест они не сойдут,
Пока не предстанет Небо с Землей на Страшный Господень суд
.


Запад это Северная Америка и Европа, кроме Средиземноморья. Восток русскоязычные страны (СНГ), в меньшей степени Китай, Япония и Азия в целом.


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


  • Эдвард Холл. Результаты он описал в книге Вне культуры или Beyond culture. В этой книге он плотно занимался так называемым контекстом коммуникации (широким и узким), а также проистекающими из этого явлениями, про которые мы сегодня как раз и поговорим.
  • Герт Хофстеде и его книга Последствия культуры или Cultures Consequences. В ней он разработал типологию культур, в частности степень индивидуализма и проистекающие отсюда эффекты при взаимодействии разных культур.
  • Ну и книга немецкого культуролога Александра Томаса Справочник по межкультурной коммуникации и сотрудничеству, где содержатся практические советы по межкультурной коммуникации в деловой среде, а также освещена теория культурных стандартов.

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



Внешние факторы контроля:


Делаем хорошо, только если он/она мне нравится.
Убежденность в деле (пропитка идеей)
Я скажу, если ты спросишь.
Преобладает контролирующая роль.


Внутренние факторы контроля:


Сам себе контроль.
Я скажу до того, как ты спросишь.
Контролирующая роль не основная или отсутствует совсем.


Что нужно делать, чтобы было эффективное взаимодействие с западными коллегами:


Вырабатывать внутренний стержень контроля.
Своевременно докладывать о проблемах.
Давать правдивый статус задач.


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


Кейс звучит так: Начальник вашей команды в отпуске, а люди продолжают работать дальше, почему?


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


Никуда не деться от культурных различий. Всё же условный Запад и условный Восток долгое время развивались достаточно изолировано, особенно после 1054 года. Это только в 20 веке начались активные процессы взаимопроникновения культур.



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


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


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


Как же эти различия в культурных стандартах проявляются еще?


Например в противопоставлении личностной доминанты деловой доминанте.


Как вы думаете, какой процент работающих в РФ указывает хороший коллектив и атмосферу в коллективе, как основной мотивирующий фактор для работы? 35% это 2-3 место в списке мотивирующих факторов по разным исследованиям. А знаете какое место этот фактор занимает в ментальной карте европейцев? Примерно 9-е из 10.


Личностная доминанта:


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


Деловая доминанта:


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


Что делать, чтобы западные коллеги тебя поняли:


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


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



И объединяло нас общие христианские корни. Но продержалось это единение недолго. Из школьного курса истории средних веков известно, что все началось с раскола христианской церкви в 1054 году, после которого окончательно произошло разделение Церкви на Римско-католическую церковь на Западе с центром в Риме и Православную на Востоке с центром в Константинополе. Разделение, вызванное расколом, не преодолено до настоящего времени, невзирая на то, что в 1965 году взаимные анафемы были обоюдно сняты Папой Павлом VI и Вселенским Патриархом Афинагором.


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


Равноправие всех перед Богом.
Уважение к личности.
Индивид преобразователь мира.
Рационализм.
Важность индивидуального восприятия.


В восточной цивилизации это привело вот к чему:


Император (Царь) вседержитель.
Смирение.
Коллективизм.
Конформизм.
Импровизация и завуалированная коммуникация.


Теперь понятно откуда взялась личностная доминанта и внешний контроль в восточной культуре? Мы привыкли к коллективной жизни, в которой нет места индивидууму, а есть всегда некая внешняя сила (царь/император), который и регламентирует наше поведение. В то время как на западе основой жизни был индивид, рационализм и равноправие. В таком контексте нет места внешнему контролю и личным симпатиям в деловой среде.


Но это еще не все. Проявлений культурных стандартов на самом деле много. Вот еще пример.


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


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


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


И знаете, что они сказали в конце моей тирады? Алексей, спасибо, с 1 февраля вы приступаете к работе на этой позиции.


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


Есть такое проявление восточного и западного культурного стандарта как широкий контекст против узкого. Что имеется в виду:


Широкий контекст:


Эксплицитная коммуникация 30%.
Имплицитная 70% (мимика, жесты, интонация, контакт глаз). Детали не проговариваются.
Не говорят нет, но делают нет.


Узкий контекст:


Чувства партнера не считываются. Детали уточняются.
Важно что будет сделано, а не как это будет сделано.


Что нужно делать, чтобы не влететь по самую макушку в такую ситуацию:


Явно коммуницировать статус и результаты, без двойных трактовок.
Явно говорить нет с аргументацией.
Коммуницировать факты, а не чувства.


Мы рассмотрели не все возможные проявления культурных стандартов. На мой взгляд следует посмотреть еще вот про эти вещи. Про первый пункт хорошо рассказано в уже упомянутой книге Холла Вне культуры, а второй пункт хорошо раскрыт в исследовании Хофстеде и его книге Последствия культуры, ну а про третий хорошо рассказано в справочнике Александра Томаса, правда на немецком.



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


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


Автор наблюдений Алексей Куксенок, соавтор и ведущий курса Профессия SCRUM-мастер. Первый бесплатный семинар курса пройдёт уже завтра, 9 июля в 19-00.


Руководитель проектов в компании DataArt, входящей в Inc. 500 I 5000 (самые быстрорастущие компании США), в список 1000 компаний вдохновляющих Британию. Участвовал в трех десятках проектов с численностью сотрудников от 2 до 60 человек, реализованных, как и с использованием гибких методологий (Scrum, Kanban), так предиктивных (PMI-PmBoK).

Подробнее..

Не 1000 и 1 ночь, но 1 год и 10 дней в Слёрме

14.11.2020 06:22:30 | Автор: admin

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


  • Мы бирюзовая компания
  • Мы никого не увольняем и у нас нет текучки
  • У нас компания только с белой зарплатой, все работают удалённо
  • Мы не назначаем человеку должность, он сам врастает в обязанности
  • У нас с этой недели Agile

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


N.B. Для хранителей "Хабра". Да, "Хабр" не жалобная книга. И это правильно. Но в данном тексте я рассказываю о работе в течение 1 года в компании, которае ныне находится в ТОП-10 (моими усилиями тоже). Думаю, что отправлять в черновики не стоит. Пусть "хабровчане" решат полезен им такой опыт или нет. А в некоторой степени он был уникален. Лично я знаю, что я своим знакомым и друзьям никогда не посоветую на Слёрма, ни Southbridge. Ниже вы прочитаете почему. Даже с документами.

Началось всё относительно спокойно. Я прогуливался с женой по Коломенскому парку и мне позвонил мой старый друг Нияз Абдуллин и говорит: Слушай, хочешь попробовать себя IT-редактором. Ты уже уже пять лет журналистикой и публицистикой занимаешься. А давай!, ответил я.


И понеслось.



Москва, гостиница Ленинград, примерно трети из этих улыбчивых людей в компании уже нет. Кто вовремя и вежливо "свинтил", вроде Павла Селиванова, кого "свинтили".


Первая встреча и первые обещания


3 сентября в Питере в конференц-зале Selectel Слёрм проводил мероприятие, а так же ещё проходил День техдира Димы Симонова.


Генеральный директор Игорь Олемской пригласил меня в переговорку. И первым вопросом перед здрасте было: Ты, наверное, запойный, да?. Классический, как потом выяснилось, его подход к общению с сотрудниками.


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


То ещё было приключение: и медведица, которая бродила рядом с поисковыми отрядами, и соответственно сотрудники Росгвардии с грачами, хотя хотя у меня очень большие сомнения, что 9х19 Para сможет остановить взрослого медведя. Потом мы ещё нашли следы медвежонка и поняли, что медведица нас просто уводит от места лежбища, но если мы туда случайно нагрянем, порвёт на множество японских флагов и пистолеты Ярыгина Грачи никак не помогут. Тут нужен 7,62х54 минимум.


Поиск: https://drive.google.com/file/d/13nzmjhgqzthYRqN-pHM0YwFx0d2FY0ON/view?usp=sharing
Поиск: https://drive.google.com/file/d/13vVFhbCT6kJ7krrKz0BN2oLsVATnDF5W/view?usp=sharing
Поиск: https://drive.google.com/file/d/14-BFJf_0b0a0t8tVTYR9tKIKMHJZhC-g/view?usp=sharing
Девочку нашли на 4 сутки: https://drive.google.com/file/d/14mwdzsnt9Vru07z66vd8QcjaTtYh7K68/view?usp=sharing


Девочка, слава богу, нашлась, правда не спали мы четверо суток. Но на мероприятия я успел. Был свеж, бодр. Вот только не готов к вопросу: запойный я алкоголик или нет. В ответ просилась фраза: А не удак ли ты, человече?. Но так как у меня хорошее воспитании и врождённое любопытство, я решил посмотреть, чтобы будет далее.


А далее руководство Слёрма рассказало, что в компании работает 600 человек (потом выяснилось, что около 50, может я ослышался, не знаю), что Слёрм одна из немногих в России бюрюзовых компаний, что всё у них по-белому от и до, что их задача выстраивать IT-комьюнити в России, что в компании никого и никогда не увольняют и нет текучки. И если человек не встраивается в одну из команд, ему подбирают место в другой. Что не человек получает должность, а набирает на себя компетенции и постепенно должность обрастает вокруг него.


Райское место, тысяча чертей, подумал я. А говорил мне папа ещё в 5 лет не верить в сказки.


Нияза уволили через два месяца. Это я к тому, что мы никого не увольняем, у нас нет текучки. Так как мы с Ниязом знакомы уже 16 лет, то естественно я с ним связался и спросил Why?. Ну, просто, вот так, сказали и всё, ответил жизнерадостно Нияз. Он вообще не умеет расстраиваться светлый человечище.


N.B. Рекомендую Нияза Абдуллина, как (говорю, не стесняясь) великолепного художественного и технического переводчика. Мы с начинали вместе в фантастике ещё в 2004 году. Только я свернул на художественные тексты и публицистику, а Нияз на переводику, где достиг поистине впечатляющих профессиональных высот.

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


Главные актёры труппы образовательно-развлекательного центра Слёрм


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


Игорь olemskoi, генеральный директор человек обладающий напором, уверенностью, неплохими интеллектуальными задатками, отсутствием морали и нарциссизмом. Получает удовольствием продавливать людей чаще всего сотрудников, так безопаснее. То есть вперившись взором задавать порой странные вопросы, выводить из себя, провоцировать. В случае возможности девушек доводить до слёз и откровенной истерики. Ему достаточно почувствовать хоть раз слабое место человека, и он это будет использовать постоянно хоть на daily, хоть на demo, хоть на retro. Он считает это сильными качествами руководителя обесценивать работу, чтобы никто даже не думал попросить повышение зарплаты (aSkobin некогда мне в красках рассказывал, как Игорь матами объяснял Владимиру Гурьянову, опытному и отличному DevOps-инженеру, что он никто и не имеет даже права требовать повышения заработной платы), минут пять поизбивать морально за ошибку, а потом сказать но это не важно, главное, мы получили ценный опыт и так далее. Я к этому относился нормально, потому что ещё при первой встрече отметил нарциссические черты его личности. А потом только многократно убеждался, что он классический нарцисс и его реакции банальные и скучные в рамках этой патологии психики. Нарциссы сами по себе скучны у них очень скудна вариативность поведения. В целом, он меня так и не удивил не вышел за рамки.


Антон aSkobin, коммерческий директор вторая его половинка. Именно потому руководство Слёрм настолько целостно. Антон пограничник. Он открыто называет себя consigliere Игоря. Если кто не помнит, этот термин вошёл в литературную среду из Крёстного отца. У Антона пограничное психическое расстройство и потому он полностью зависим от Игоря. Достаточно одной уничижительной фразы Игоря, чтобы Антон впал в молчаливую меланхолию. И опять же достаточно похвалы, чтобы Антона выбросило в деятельную фазу мании с кучей идей, бешеной работоспособностью, работой по ночам, беспрецедентной верностью. Думаю, такой верности не было даже у доктора Гёббельса по отношению к Фюреру а любил он его беззаветно.


У них сложилась невероятно крепкая, хотя и немного банальная по своей сути пара нарцисс-пограничник


Я наравне с другими
Хочу тебе служить.
От ревности сухими
Губами ворожить.
Я больше не ревную.
Но я тебя хочу.
И сам себя несу я,
Как жертва палачу.

Осип Мандельштам


Сэм Вакнин, автор книги Злокачественная самовлюбленность: Нарциссизм пересмотренный (2001), считает, что идеал нарцисса обожающий, покорный и самопорочащий партнёр. Кто работал или работает в Слёрме, думаю, сразу увидит этот образ и назовут имя.


Совсем недавно, когда обсуждалось, что зарплатного фонда хватит на 2-3 месяца и ещё 1 миллион на овердрафте в банке и рассматривались варианты слияния с крупной компанией или присоединение крупного инвестора с правом голоса, Антон в рамках своей роли пограничника заявил: Что уйдёт из компании, если будет третий человек принимать решения, а не только двое он и Игорь. Чем только подтвердил мою уверенность в диагнозе взаимоотношений этой пары.


Потом Игорь вопросил: Кто готов отказаться от части зарплаты ради компании? Я готов отказаться ещё от трети зарплаты, сразу же воскликнул Антон. Ещё?, недоумённо переспросил Игорь. Он просто забыл или даже не заметил, что Антон уже отказывался от трети своей зарплаты весной, когда ударил карантин по всем офлайн мероприятиям. И все увидели, как Антон просто поник, сполз в кресле его весеннюю жертву не просто не оценили, её даже не заметили.


Если обратиться к классической теории, то нарцисс может быть счастлив с:


инвертированным нарциссом;
мазохистичной личностью;
пограничником, то есть, человеком с пограничным расстройством личности.


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


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


Agile, и никаких гвоздей


В какой-то момент игры в оловянных солдатиков Игорю наскучили и он захотел трансформеров. В том смысле, что бирюзовость была забыта, вышла из лексикона предприятия. Зато прочно вошло словосочетанием Agile-трансформация. Со всеми необходимым артефактами Scrum.


Хорошее по-сути начинание, если бы не превратилось в карго-культ.


Помню первое проявление blameless-культуры. Тогда, в феврале 2020 года формировалась команда маркетинга. Появились новые люди. И Слёрм проводил в Москве в гостинице Севастополь Слёрм Agile. И была там новенькая девушка Юля Остапенко. Она даже сама сшила двух плюшевых слёрмиков, так хотела стать частью проекта и так старался влиться в него.


Вечером после мероприятия вся команда собралась в ресторане "Крым" на втором этаже. Я расположился в уголочке, чтобы спокойно за всеми наблюдать и релаксировать. А Юля совершила три ошибки:


  • Села напротив Антона
  • Включилась в разговор, который вёл Антон
  • В какой-то момент возразила ему и решила отстоять своё мнение

Дальнейшее можно было охарактеризовать, как попала белка в мясорубку. Вначале с ней спорил Антон, а когда стал проигрывать по аргументам, включился Игорь. Ну, вы же помните, Слёрм бюрюзовая компания, каждый специалист равен другому, каждый может высказать своё мнение. Плюс мы внедряем Agile и его фреймворк Scrum c его blameless-культурой.


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


В какой-то момент я не выдержал: Эй, коллеги, может хватит?. За девушку заступился Александр Зосим, которого тоже уволили через пару месяцев. Остальные молчали ошарашенные, что воообще сейчас это происходит. А происходила банальная вещь девочка зацепила главную ценность нарцисса, а именно его пограничника. Психопатологического любовника. И потом Игорь морально избивал её до тех пор, пока она не разрыдалась и не убежала. А когда мы поднимались обратно на 4 этаж похвастался перед несколькими людьми в моём присутствии: Как я её, а?. В тот же день Юлю уволили. Антон сказал, что он психологически не может с ней работать.


В Agile важна ещё честность, открытость, прозрачность. Постепенно в процессах выбыло и первое, и второе, и третье.


Зачем-то, хотя в компании это не принято, Игорь и маркетингу, а затем технической поддержке, указывая на меня, в тот же февральский вечер рассказал без моего согласия, сколько я получаю: Вот, смотрите, берите пример. Человек зарабатывает 200 000. И вы можете. Главное стараться. Как выяснилось всего дней через 10, он прекрасно понимал, зачем это делает.


Как 4 раза за год изменить условия оплаты и чувствовать при этом свою правоту


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


Изначально в сентябре у меня с Игорем сложилась договорённость, что я получаю за статью 10 000 рублей + 1 рубль за каждый просмотр. Правда, они малость офигели от результатов, всё же у меня был пятилетний опыт публициста и даже военного журналиста. Создать в комментариях дискуссию, подобрать заголовок и 50 000 70 000 просмотров обеспечены.


Зато я смог поднять Слёрм в рейтинге Хабра где-то с 40-го места на 3-е. Выше уже никак. Выше уже Selectel и mail.ru, у которых полноценные редакторские отделы с парой десятков людей.


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


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


N.B. Вы не поверите, но мама одной девушки прочитала мою статью на Хабре о депрессии, дала почитать ей. И она связалась со мной через нашего контент-менеджера. Спасибо Жене. И теперь я веду эту девушку в Германии, поддерживаю её в очень тяжёлом депрессивном эпизоде. Я помог ей подобрать хорошего врача, вместе с врачом мы выбрали верный SNRIs антидепрессант и стратегию лечения. Девушке всё ещё тяжело, но она уже оценивает своё состояние на 70%. И у неё нет суицидальных мыслей. Я могу сказать, что уже в этом в этом от Слёрма получилась хоть какая-то польза. Благодаря публикациям я спас (совсем без шуток и бахвальства, кто испытывал депрессию, тот знает) спас человека от гибели. И продолжаю поддерживать в лечении сейчас. Каждый день. Каждое утро.

Я слушал Игоря примерно 5 минут. После этого очень мягко и корректно, только литературными словами объяснил: Игорь, если мы решили поговорить по-красному, то теперь мой черёд. Говорить со мной в таком тоне и даже с такими словами может крайне ограниченный круг лиц. Во-первых, это очень близкие друзья и я к ним прислушаюсь. Я тоже могу ошибаться, как любой человек. Во-вторых, это люди, которых я очень уважаю. Это три человека. Оператор Генштаба полковник ВС в запасе, полковник ГРУ в запасе и подполковник Вымпела в запасе за их невероятную тяжёлую и долгую службы стране, за военный опыт и за жизненный опыт. Кроме того, я готов выслушать по-красному моих однополчан, когда я работал военным журналистом. Всё. А тебе, Игорь, я права говорить со мной по-красному не давал. Никогда. Ни разу. И до этого права ты никогда не дорастёшь. Весь страшномосковский твой риск, который у тебя в жизни был и будет, это подвернуть ногу, вылезая с кожаного кресла внедорожника. И когда ты со мной пытаешься говорить по-красному, то вызываешь исключительно молчаливое веселье и каменное выражение морды лица, чтобы не заржать в голос.


Больше со мной по-красному говорить не пытались. Говорили с другими и не раз. Но это уже другие истории, принадлежащие другим людям.


В итоге Игорь сказал, что правила оплаты для меня меняются. Я больше не получаю 10 000 рублей за каждую статью и 1 рубль за комментарий. Теперь я просто получаю 20 000 за статью. Плюс мне были запрещены любые побочные темы, кроме технических. Никаких статей в хаб "Здоровье гика", никаких историй от военных о других странах, которые "хабровчане" просто нигде больше бы не прочитали чтобы услышать эти истории, чтобы добиться согласия на публикацию, нужен очень высокий уровень доверия или ряд военных операций бок о бок. Я сразу сказал, что рейтинг обвалится так и случилось. Но когда это нарциссы кого-то слушали, кроме себя?


Это был первый раз, когда без предупреждения за месяц изменились правила игры.


Я долечил маму, хотя и влез в кредитки потому что даже зарплаты в 200 000 не хватило. Завершался февраль. Тут я напомню, как Игорь без моего согласия всем рассказал, сколько я получаю. Тогда я не понял зачем.


Через 10 дней я узнал ответ. 4 марта, как говорится в 4 часа утра, без объявления войны, а так-то в 10 утра мне по Zoom вызвонили Игорь с Антоном и сказали простую вещь: Мы решили, что ты слишком много зарабатываешь. Скажу честно, я слышал и в свой адрес, и в адрес других людей разные поводы и увольнений, и снижение зарплат, и отмены бонусов. Из-за тебя сорвалась сделка, Из-за тебя ушёл клиент, Ты не выполняешь KPI уже полгода, Ты непонятно чем занимался полмесяца. Но такое


Определённо в бриллиантовую книжку цитат: Ты слишком много зарабатываешь.


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


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


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


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



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


Скажу честно, непростая задача, потому что хабровчан уже легонько поташнивало от бесконечных статей об Agile и статей купи-купи-купи. Как и меня, скажу честно. Я не для этого пришёл в "Слёрм". Но поделать я уж ничего не мог такие ставились задачи. Разве что по мере сил давал свободу переводчику Паше Демковичу Finnix он очень талантливый DevOps-инженер и хороший переводчик. Пока я был в Слёрме, я прикрывал его, как мог. Да и после увольнения сделал так, чтобы у него появилась возможность сбежать с этой пиратской шхуны, где генеральный с коммерческим дуют шмаль, по вантам бегают офигевшие от разнонаправленных команд матросы, все днища у бочек с ромом выбиты, а попугай охрип от воплей Полундрррра!. Я не бросаю своих.


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



Я сразу же позвонил коммерческому директору Антону и вопрос: Что есть это, о юный падаван? А так как я давно понял, что слёрмовским шулерам доверять нельзя, то уютно расположил свой Samsung Note 10+ чуть ниже стола, чтобы выглядывал блок камеры, и снял на всякий случай весь видео-разговор по Zoom. На всякий случай, вдруг мне захочется показать, как Антон лично эмоционально жестикулируя, рассказывает:


  • Что это нормально для компании, все подписывают это соглашение на 22 000 рублей;
  • Сделано это, чтобы уйти от налогов это к слову о белой зарплате и белой компании;
  • Сделано на всякий случай, если с человеком приходится расставаться по-плохому, то чтобы заплатить ему меньше на выходе;

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


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


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


План закон, выполнение долг, перевыполнение честь


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


"У ну-ка, возьмём (условно) 10 000 000?" вопрошал генеральный директор Игорь Олемской с ленинским прищуром в глазах.


Обычно воцарялось молчание. Потому что (условно) 8 миллионов в прошлом месяце наскребли еле-еле и то только с применением китайских пыток по отношению к корпоративным клиентам.


Чтобы беломорина табачной фабрики имени Урицкого казалось слаще и выглядела, как Cohiba Esplendidos, Игорь добавлял: Если возьмём 10 000 000 всему маркетингу премия. 100 000 рублей.


Нет, если вы подумали, что каждому по сто штук, это громадная, чуть ли не классово-социальная ошибка. Эти самые сто тысяч делились на количество человек в маркетинге в разные периоды от 8 до 11. Согласитесь, отличная мотивация для свершения невозможного. Игорь тоже там думал потому в его взгляде сверкала гордость за команду личных оловянных солдатиков.


А так как никому особо не хотелось с спорить с генеральным, а потом неожиданно оказаться "слабым звеном", то все с каменными лицами строителей коммунизма кивали. Как сделать эти (условно) 10 миллионов, когда по всем прикидкам, дай бог, наскребается в лучшем случае семь непонятно.


Но, как в старом советском анекдоте: У нас на партсобрании каждый немножко против, но все вместе категорически за


Что? Не слышу? Погромче товарищи с галёрки Какие-то показатели? Сравнение с предыдущими периодами или предыдущими мероприятиями? Какие-то предиктивные модели? Retention rate? Churn rate?


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


Гвозди бы делать из этих людей


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


Теперь поговорим о том, что не человек получает должность, а набирает на себя компетенции и постепенно должность обрастает вокруг него.


С некоторых пор Игорь начал повторять, что Иркутск это Клондайк IT-специалистов. И начал массово набирать оттуда сотрудников. Логику его можно было понять, если в центральных регионах специалист стоил, предположим, 80 000, то в Иркутске 40 000. Сплошная выгода. Клондайк.


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


Через две недели после появления чуПАКабры Игорь сделал её product owner и маркетига, и отдела по производству. Напомню мы не назначаем человеку должность, он сам врастает в обязанности.


Мы новое домоуправление нашего дома, в сдержанной ярости заговорил черный.
Я Швондер, она Вяземская, он товарищ Пеструхин и Шаровкин. И вот мы
Это вас вселили в квартиру Федора Павловича Саблина?
Нас, ответил Швондер.
Боже, пропал калабуховский дом! в отчаянии воскликнул Филипп Филиппович и всплеснул руками.

Не помню с тех пор ни одного спринта, который был бы выполнен на 100%. А ситуация с курсом по Ceph, когда провалили все сроки, решили отмолчаться и просто тихонько менять даты на сайте. А курс по мониторингу и логированию, где ровно то же самое? А


Сейчас "Слёрм" объективно провалил по срокам три курса.


Антон в объяснительной записке перед вкладчиками написал, что они попали в идеальный шторм. Хороший ответ, который ни на что не отвечает. Если это происходит с тремя курсами одновременно это три идеальных шторма или один? Или же кто-то с кадровой политикой промахнулись, как армянский затонированный Шаттл мимо Луны? Или когда-то случайно попали в "голубой океан" Kubrnetes и не поняли, когда он стали "красным"?


Недавно взяли девочку 1995 года рождения в качестве product owner. В понедельник взяли, а в четверг её имя уже начало системно удаляться из всех внутренних телеграм-чатов Слёрма. Это так в Слёрме знаменуются увольнения без фейерверков и шампанского, зато все знают и понимают. Я тогда, помнится, даже прокомментировал: Бедная девочка, даже чихнуть не успела. Скорее всего, оценила этот балаган изнутри и решила на кабаньих копытцах пересечь границу у реки, как в песне поётся. Ну, или в очередной раз коммерческий директор Антон Скобин ультимативно заявил, что работать с ней не сможет это нарушает его хрупкое душевное равновесие.


Недавно вспоминали с сотрудниками, а кто продержался больше года? А никто. Ну, разве что я 1 год и 10 дней.


Недавно взяли специалиста по экспансии. Не шучу, так и назвали. А что, дело правильное, хорошее и светлое, как призрак коммунизма. В конце-то концов для Слёрма не охвачены такие перспективные рынки, как Марс, Венера, спутники Юпитера, да и Сатурн, чего он там прячется, тоже громадная территория для экспансии. А там и до Урана на ионных движках доползти можно будет.


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


Но зато звучит мощно специалист по экспансии. Осталось только Звезду Смерти построить и править Галактикой. Уверен, у них получится.


Сеем разумное, доброе, вечное


В Слёрм, то есть в Southbridge, есть одна маленькая особенность. Насколько издевательски относятся к работникам Слёрма, настолько же уважительно к работникам Southbridge. Потому что без инженеров, эта шхуна капитана Джека Воробья затонет, не выходя из порта.


В Southbridge много классных DevOps инженеров и просто классных ребят. И многие уже сейчас ищут работу достойные компании с 300+. Я с ними общался. Одного уже переманил на нормальную должность в нормальной компании. Это HR на заметку.


Отличный специалист и оратор Марсель Ибраев. Просто классный человечище и гениальный DevOps Павел Селиванов, который вовремя свалил с Титаника в mail.ru, где хотя бы понятны правила игры. Ироничный, хоть и молчаливый, и невероятно опытный инженер Владимир Гурьянов. Морально твёрдый, правильный по-человечески, опытный и надёжный Николай Месропян. Прекрасная и внешне, и внутренне Ирина Кубанева корпоративным клиентам повезло с ней. Мягкая, добрая, способная терпеливо и понятно объяснять все финансовые вопросы главный бухгалтер Ирина Шурупова. Они слишком хороши для патологической парочки нарцисса-пограничника, чтобы оставаться в Слёрме там долго.


Увольнение


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


Но даже тут Антон не смог не соврать сотрудникам Southbridge. Когда они честно ответили, что Хабр порой самих их вводит во фрустрацию и многое из них на него ложили.



То Антон тут же дал заднюю. Пограничник что с него взять, твёрдости, как в пластилине (мягко говоря, судя по запаху).



Никогда он меня не защищал. Вспомним его хитрый подход с окладом в 22000 рублей вместо 80 000. Да и никого он не ценит, кроме Игоря, своей бесценной нарциссической пары. И место в целом мне подходило, но мне крепко надоели Игорь с Антоном. Я не люблю психопатологические пары. И не люблю наркоманов, даже тех, кто просто дует шмаль. Я им не доверяю.


В конце концов я не психиатр и даже не психотерапевт, чтобы каждое утро наблюдать их у себя на приёме на daily. Мне за вредность молоко не дают. Мне и вправду стало легче. Без нарцисса и без пограничника.


А чтобы будет дальше? Экспансирует ли Слёрм Галактику? Кто знает


Time will tell. Sooner or later time will tell.

Подробнее..

TypeScript Раскладываем tsconfig по полочкам. Часть 1

13.02.2021 12:07:16 | Автор: admin

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

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

Если открыть официальный референс tsconfig, то там будет полный список всех настроек, разделённых по группам. Однако, это не даёт понимания, с чего начать и что из данного обширного списка опций обязательно, а на что можно не обращать внимания (по крайней мере до поры до времени). Плюс, иногда опции сгруппированы по некому техническому, а не логическому смыслу. Например, некоторые флаги проверок можно найти в группе Strict Checks, некоторые в Linter Checks, а другие в Advanced. Это не всегда удобно для понимания.

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

Структура tsconfig

Рассмотрим структуру и некоторые особенности конфига.

  • tsconfig.json состоит из двух частей. Какие-то опции необходимо указывать в root, а какие-то в compilerOptions

  • tsconfig.json поддерживает комментарии. Такие IDE как WebStorm и Visual Studio Code знают об этом не выделяют комментарии как синтаксическую ошибку

  • tsconfig.json поддерживает наследование. Опции можно разделить по некоторому принципу, описать их в разных файлах и объединить с помощью специальной директивы

Это болванка нашего tsconfig.json:

{  // extends позволяет обогатить опции другими опциями из указанного файла  // файлом tsconfig-checks.json займёмся во второй части статьи  "extends": "./tsconfig-checks.json",  // в корне конфига находятся project-specific опции  "compilerOptions": {    // здесь все настройки, связанные с компилятором  }}

К root опциям относится только следующие: extends, files, include, exclude, references, typeAcquisition. Из них мы будем рассматривать первые 4. Все остальные опции размещаются в compilerOptions.

Иногда в root секции конфига можно встретить такие опции как compileOnSave и ts-node. Эти опции не являются официальными и используются IDE для своих целей.

Секция root

extends

Type: string | false, default: false.

Указывает путь к файлу из которого нужно унаследовать опции. По большей части, служит инструментом упорядочивания. Можно разделить опции по некой логике, чтобы они не смешивались. Например, вынести настройки строгости в отдельный файл, как в примере болванки конфига. Однако, учитывая поддержку комментариев в tsconfig.json это можно сделать проще:

{  "compilerOptions": {    // блок базовых настроек    // блок настроек строгости  }}

Рассмотрим другой use-case, где комментариями отделаться не получится. Если необходимо создать production и development конфиги. Так бы мог выглядеть tsconfig-dev.json версия конфига:

{  "extends": "./tsconfig.json",  "compilerOptions": {    // переопределяем настройки, которые нужны только для dev режима    "sourceMap": true,    "watch": true  }}

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

Если вы решите использовать эту опцию. То увидеть итоговую, объединённую версию конфига поможет команда tsc --showConfig.

files

Type: string[] | false, default: false, связана с include.

Указать список конкретных файлов для компиляции можно использовав данную опцию.

{  "compilerOptions": {},  "files": [    "core.ts",    "app.ts"  ]}

Данная опция подходит лишь для совсем маленьких проектов из нескольких файлов.

include

Type string[], default: зависит от значения files, связана с exclude.

Если опция files не указана, то TypeScript будет использовать эту директиву для поиска компилируемых файлов. Если include так же не указана, то её значение будет неявно объявлено как ["**/*"]. Это означает, что поиск файлов будет осуществляться во всех папках и их подпапках. Такое поведение не оптимально, поэтому в целях производительности лучше всегда указывать конкретные пути. Можно прописывать как пути к конкретным файлам, так и паттерны путей.

{  "compilerOptions": {},  "include": [    "src/**/*",    "tests/**/*"  ]}

Если паттерны не указывают конкретных расширений, то TypeScript будет искать файлы с расширениями .ts, .tsx, and .d.ts. А если включен флаг allowJs, то ещё .js и .jsx.

Следующие форматы записей делают одно и тоже src, ./src, src/**/*. Я предпочитаю вариант ./src.

Технически, используя опции include и exclude, TypeScript сгенерирует список всех подходящих файлов и поместит их в files. Это можно наблюдать если выполнить команду tsc --showConfig.

exclude

Type: string[], default: ["nodemodules", "bowercomponents", "jspm_packages"].

Директива служит для того, чтобы исключать некоторые лишние пути или файлы, которые включились директивой include. По умолчанию, опция имеет значение путей пакетных менеджеров npm, bower и jspm, так как модули в них уже собраны. Помимо этого, TypeScript будет так же игнорировать папку из опции outDir, если она указана. Это папка, куда помещаются собранные артефакты сборки. Логично, что их нужно исключить. Если добавить свои значения в эту опцию, то необходимо не забыть восстановить умолчания. Так как пользовательские значения не объединяются со значениями по умолчанию. Другими словами, необходимо вручную указать корень модулей своего пакетного менеджера.

{  "compilerOptions": {},  "exclude": [    "node_modules",    "./src/**/*.spec.ts"  ]}

Опция exclude не может исключить файлы, указанные через files.

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

Секция compilerOptions

target

Type: string, default: ES3, влияет на опции lib, module.

Версия стандарта ECMAScript, в которую будет скомпилирован код. Здесь большой выбор: ES3, ES5, ES6 (он же ES2015), ES2016, ES2017, ES2018, ES2019, ES2020, ESNext. Для backend приложений/пакетов подойдёт ES6, если рассчитываете только на современные версии Node.js и ES5, если хотите поддержать более старые версии. На данный момент стандарт ES6, с небольшими оговорками, поддерживается 97.29% браузеров. Так что для frontend приложений ситуация аналогичная.

module

Type: string, default: зависит от target, влияет на опцию moduleResolution.

Модульная система, которую будет использовать ваше собранное приложение. На выбор: None, CommonJS, AMD, System, UMD, ES6, ES2015, ES2020 or ESNext. Для backend приложений/пакетов подойдёт ES6 или CommonJS в зависимости от версий Node.js, которые хотите поддерживать. Для frontend приложений под современные браузеры также подходит ES6. А для поддержки более старых браузеров и для изоморфных приложений, определённо стоит выбрать UMD.

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

moduleResolution

Type: string, default: зависит от module.

Стратегия, которая будет использоваться для импорта модулей. Здесь всего две опции: node и classic. При этом classic в 99% не будет использоваться, так как это legacy. Однако, я специально упомянул этот флаг, так как он меняется в зависимости от предыдущего флага. При изменении значения module режим moduleResolution может переключиться на classic и в консоли начнут появляться сообщения об ошибках на строчках с импортами.

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

lib

Type: string[], default: зависит от target.

В зависимости от того какой target установлен в конфиге, TypeScript подключает тайпинги (*.d.ts-файлы) для поддержки соответствующих спецификаций. Например, если ваш target установлен в ES6, то TypeScript подключит поддержку array.find и прочих вещей, которые есть в стандарте. Но если target стоит ES5, то использовать метод массива find нельзя, так как его не существует в этой версии JavaScript. Можно подключить полифилы. Однако, для того, чтобы TypeScript понял, что теперь данную функциональность можно использовать, необходимо подключить необходимые тайпинги в секции lib. При этом, можно подключить как весь стандарт ES2015, так и его часть ES2015.Core (только методы find, findInex и т.д.).

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

Для --target ES5 подключаются: DOM, ES5, ScriptHostДля --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Как только вы что-либо добавляете в lib умолчания сбрасываются. Необходимо руками добавить то, что нужно, например DOM:

{  "compilerOptions": {    "target": "ES5",    "lib": [      "DOM",      "ES2015.Core"    ]  }}

outDir

Type: string, default: равняется корневой директории.

Конечная папка, куда будут помещаться собранные артефакты. К ним относятся: .js, .d.ts, и .js.map файлы. Если оставить не указывать значение для данной опции, то все вышеуказанные файлы будут повторять структуру исходных файлов в корне вашего проекта. В таком случае будет сложно удалять предыдущие билды и описывать .gitignore файлы. Да и кодовая база будет похожа на свалку. Советую складывать все артефакты в одну папку, которую легко удалить или заигнорировать системой контроля версий.

Если оставить опцию outDir пустой:

 module    core.js    core.ts index.js index.ts

Если указать outDir:

 dist    module   |    core.js    index.js module    core.ts index.ts

outFile

Type: string, default: none.

Судя по описанию, данная опция позволяет объединить все файлы в один. Кажется, что бандлеры вроде webpack больше не нужны Однако, опция работает только если значение module указано None, System, or AMD. К огромному сожалению, опция не будет работать с модулями CommonJS or ES6. Поэтому скорее всего использовать outFile не придётся. Так как опция выглядит максимально привлекательно, но работает не так как ожидается, я решил предупредить вас об этом гигантском подводном камне.

allowSyntheticDefaultImports

Type: boolean, default: зависит от module или esModuleInterop.

Если какая-либо библиотека не имеет default import, лоадеры вроде ts-loader или babel-loader автоматически создают их. Однако, d.ts-файлы библиотеки об этом не знают. Данный флаг говорит компилятору, что можно писать следующим образом:

// вместо такого импортаimport * as React from 'react';// можно писать такойimport React from 'react';

Опция включена по умолчанию, если включен флаг esModuleInterop или module === "system".

esModuleInterop

Type: boolean, default: false.

За счёт добавления болерплейта в выходной код, позволяет импортировать CommonJS пакеты как ES6.

// библиотека moment экспортируется только как CommonJS// пытаемся импортировать её как ES6import Moment from 'moment';// без флага esModuleInterop результат undefinedconsole.log(Moment);// c флагом результат [object Object]console.log(Moment);

Данный флаг по зависимости активирует allowSyntheticDefaultImports. Вместе они помогают избавиться от зоопарка разных импортов и писать их единообразно по всему проекту.

alwaysStrict

Type: boolean, default: зависит от strict.

Компилятор будет парсить код в strict mode и добавлять use strict в выходные файлы.

По умолчанию false, но если включен флаг strict, то true.

downlevelIteration

Type: boolean, default: false.

Спецификация ES6 добавила новый синтаксис для итерирования: цикл for / of, array spread, arguments spread. Если код проекта преобразовывается в ES5, то конструкция с циклом for / of будет преобразована в обычный for:

// код es6const str = 'Hello!';for (const s of str) {  console.log(s);}
// код es5 без downlevelIterationvar str = "Hello!";for (var _i = 0, str_1 = str; _i < str_1.length; _i++) {  var s = str_1[_i];  console.log(s);}

Однако, некоторые символы, такие как emoji кодируются с помощью двух символов. Т. е. такое преобразование в некоторых местах будет работать не так, как ожидается. Включенный флаг downlevelIteration генерирует более многословный и более "правильный", но менее производительный код. Код получается действительно очень большим, поэтому не буду занимать место на экране. Если интересно посмотреть пример, то перейдите в playground и выберете в настройках target -> es5, downlevelIteration -> true.

Для работы данного флага, необходимо, чтобы в браузере была реализация Symbol.iterator. В противном случае необходимо установить полифил.

forceConsistentCasingInFileNames

Type: boolean, default: false.

Включает режим чувствительности к регистру (case-sensitive) для импорта файлов. Таким образом, даже в case-insensitive файловых системах при попытке сделать импорт import FileManager from './FileManager.ts', если файл в действительности называется fileManager.ts, приведёт к ошибке. Перестраховаться лишний раз не повредит. TypeScript - это про строгость.

Опции секции compilerOptions, которые нужны не в каждом проекте

declaration

Type: boolean, default: false.

С помощью включения данного флага, помимо JavaScript файлов, к ним будут генерироваться файлы-аннотации, известные как d.ts-файлы или тайпинги. Благодаря тайпингам становится возможным определение типов для уже скомпилированных js файлов. Другими словами код попадает в js, а типы в d.ts-файлы. Это полезно в случае, например, если вы публикуете свой пакет в npm. Такой библиотекой смогут пользоваться разработчики, которые пишут как на чистом JavaScript, так и на TypeScript.

declarationDir

Type: string, default: none, связан с declaration.

По умолчанию тайпинги генерируются рядом с js-файлами. Используя данную опцию можно перенаправить все d.ts-файлы в отдельную папку.

emitDeclarationOnly

Type: boolean, default: false, связан с declaration.

Если по какой-то причине вам нужны только d.ts-файлы, то включение данного флага предотвратит генерацию js-файлов.

allowJs

Type: boolean, default: false.

Портировать ваш JavaScript проект на TypeScript поможет данный флаг. Активировав allowJs TypeScript компилятор будет обрабатывать не только ts файлы, но и js. Нет нужды полностью мигрировать проект, прежде чем продолжить его разработку. Можно это делать файл за файлом, просто меня расширение и добавляя типизацию. А новый функционал сразу можно писать на TypeScript.

checkJs

Type: boolean, default: false, связан с allowJs.

TypeScript будет проверять ошибки не только в ts, но и в js-файлах. Помимо встроенных тайпингов для языковых конструкций JavaScript, TS-компилятор так же умеет использовать jsDoc для анализа файлов. Я предпочитаю не использовать этот флаг, а наводить порядок в коде в момент его типизации. Однако, если в вашем проекте хорошее покрытие кода jsDoc, стоит попробовать.

С версии 4.1 при включении checkJs, флаг allowJs включается автоматически.

experimentalDecorators и emitDecoratorMetadata

Type: boolean, default: false.

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

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

Для работы emitDecoratorMetadata необходимо подтянуть в проект библиотеку reflect-metadata.

resolveJsonModule

Type: boolean, default: false.

Флаг позволяет включить возможность импортировать *.json файлы. Ничего дополнительно устанавливать не требуется.

// необходимо указывать расширение .jsonimport config from './config.json'

jsx

Type: string, default: none.

Если проект использует React, необходимо включить поддержку jsx. В подавляющем большинстве случаев будет достаточно опций react или react-native. Так же есть возможность оставить jsx-код нетронутым с помощью опции preserve или использовать кастомные преобразователи react-jsx и react-jsx.

Завершение первой части

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

Подробнее..

Recovery mode Кейс как мы с помощью контент-маркетинга увеличили продажи авиабилетов в 10 раз

03.07.2020 16:05:03 | Автор: admin


Краткое описание проекта, который продвигали


Проект по продаже туристических услуг, авиабилетов и билетов на поезд.

Цель, которую поставил перед нами заказчик


Увеличение количества заказов авиабилетов.

Начало работ

Договор был подписан в конце лета 2017 года, и мы приступили к работе, а именно к разработке стратегии продвижения проекта.

Проблемы проекта


Перед началом любых работ мы обычно собираем информации о проекте и его конкурентах, после чего анализируем ее. Этот проект не стал исключением. Действовали по наработанной схеме.

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

  • Очень большая конкуренция (впрочем, как и везде сейчас).
  • Малоизвестный и нераскрученный бренд.
  • Платная реклама, несмотря на все усилия, обходилась дорого, плохо окупалась.
  • Конверсия проекта была очень низкой, продажи небольшими.
  • Трафик на сайт небольшой.
  • SEO: по высокочастотным, коммерческим словам сайт из-за большой конкуренции продвигать очень сложно и дорого.

Почему мы сделали ставку именно на контент-маркетинг


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

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


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

Гипотеза была такая:
Человек приходит на сайт за информацией, получает то, что ему нужно, и ненавязчиво и постепенно запоминает бренд и услуги, которые предоставляет сайт.

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

Кроме того, уникальный контент крайне необходим для SEO, поскольку:

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

Требования к контенту: основные принципы, которых мы придерживались


Требования к текстам

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


Требования к иллюстрациям

  • В текстах необходимо размещать хотя бы одно изображение.
  • Превью и иллюстрации внутри статьи должны отражать суть заголовка и текста и не вводить в заблуждение относительно содержания материала.
  • Запрет неприятных, вызывающих отвращение изображений.
  • Разрешается использование либо уникальных фотографий, сделанных собственноручно, либо у них должен быть указан источник.
  • Фотография должна быть эстетичной и качественной: не допускаются изображения с плохой резкостью, перевёрнутые, перетемнённые или пересветлённые.
  • Желательно использовать горизонтальные фото размером не менее 800х450 пикселей.
  • Запрещены фото людей в нижнем белье или полностью обнаженных, если они имеют ярко выраженный сексуальный характер даже когда изображения частично или полностью размыты или цензурированы.
  • Запрещены фото со сценами курения, употребления спиртного или наркотиков.


Тематика контента



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

Форматы контента, который мы производили для проекта заказчика


  • Статьи (обзорные, с инструкциями для путешественников и полезными советами, сборники интересных фактов, seo-статьи и др.).
  • Фоторепортажи, фотогалереи.
  • Новости.
  • Инфографика.
  • Видео.
  • Подкасты.
  • Тесты.
  • Опросы.


Каждый формат контента решает свои задачи, например:



  1. Откровенно попсовые материалы необходимы для трафика из соцсетей и рекомендательных систем.
  2. Сложные, аналитические материалы интересны серьезной и искушенной аудитории.
  3. Новости необходимы для разнообразия, для того, чтобы показать актуальность сайта.
  4. Опросы нужны, чтобы генерировать материал для написания аналитических статей.
  5. Тесты полезны для увеличения глубины просмотра страниц.
  6. SEO-статьи (на базе собранных ключевых запросов и СЯ) важны для трафика из поисковых систем.

Проблемы, с которыми мы столкнулись в ходе работы



1. Копирайтеры

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

Проблемы при поиске копирайтеров обычно следующие:

  • Очень трудно найти хорошего копирайтера, потому что таковыми себя считают все даже если они совершенно не умеют писать.
  • Есть такие, кто пишет интересно, но делает огромное количество ошибок, тем самым создавая много работы для редактора и корректора.
  • Есть такие, кто хотя и пишет грамотно, но неинтересно и скучно.
  • Мало кто умеет структурировать и оформлять тексты.
  • Некоторые пишут очень медленно, с малой производительностью.
  • Хорошие копирайтеры стоят дорого.


Поиск копирайтеров на проект производился нон-стоп.

На каждую вакансию мы получали очень много откликов: в течение первых суток после ее размещения откликались, в среднем, около 300 человек. Но в итоге 99% из них отсеивались.

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

2. Подбор иллюстраций к статьям и новостям

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

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

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


Раскрываем несколько небольших секретов

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

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


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

3. Ограниченность функционала сайта

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

В результате, мы расширили функционал сайта, добавив в него:

1. Возможность использовать в статьях:

  • фотогалерей,
  • видео,
  • аудиофайлов.


2. Несколько RSS для трансляции анонсов контента на разные площадки.

3. Настройку автопубликации контента в соцсети.

Расшаривания контента


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

Поэтому мы составили план по расшариванию контента и список площадок.

Последние подключали и развивали постепенно. На текущий момент список площадок, куда транслируется контент проекта следующий:

  • Facebook.com.
  • Vk.com.
  • Twitter.com.
  • Ok.ru.
  • Инстаграм.
  • Телеграм.
  • Яндекс.Дзен.
  • Пульс mail.ru.
  • Subscribe.ru.
  • Livejournal.com.
  • Pinterest.
  • Google Discover.
  • GoogleNews.
  • Flipboard.com.


Площадки для подкастов:

  • Яндекс.Музыка.
  • Google Подкасты.
  • Apple Подкасты.
  • Vk.com.
  • YouTube.
  • Anchor.
  • Pocket Casts.
  • RadioPublic.
  • Spotify.
  • Breaker.
  • Overcast.fm.


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

Бюджет на производство контента


Начинали примерно с бюджета 60 000 руб. в месяц (производилось около 20 статей).

Сейчас бюджет на контент проекта составляет около 200 000 руб. в месяц (производится 50-60 единиц контента в месяц).

Кто-то скажет: дорого. Но пусть эта сумма вас не пугает ;)

Читайте дальше, и поймёте, почему заказчик с легкостью расстается с этой суммой на производство контента.

Результат контент-продвижения


Много слов в этом пункте не будет, мы просто покажем скрины статистики из Яндекс. Метрики. Выводы, думаем, очевидны.

Скрины виджетов из Яндекс.Маркета

По ним мы ведем постоянный мониторинг результативности нашей работы.

На виджетах хорошо видна положительная динамика развития проекта.




Динамика общего трафика




Динамика брендового трафика

Контент-маркетинг привел к росту узнаваемости бренда и соответственно трафик по брендовым запросам вырос.




Динамика прямых заходов




Что с SEO?



По высокочастотным коммерческим словам, хоть и наблюдается постоянный рост позиций, но пока первых страниц поисковой выдачи мы не добились. Зато тщательно проработанное семантическое ядро, анализ НЧ-запросов и производство соответствующего контента позволили получить отличную динамику трафика из поисковых систем. (По SEO мы тоже планируем написать отдельный кейс).

Динамика трафика из поисковых систем

На графике виден стабильный рост, причем, лучше всего вырос трафик из Гугла.




Ссылки

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

В самом начале работы на домен сайта заказчика было примерно 1 тыс. внешних ссылок, на текущий момент их уже около 28 тыс. (!)

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




А что же с продажами авиабилетов?



Динамика покупок авиабилетов с прямых заходов




Динамика покупок авиабилетов из поисковых систем




Динамика покупок авиабилетов с брендовых запросов




Продажи билетов на сайте заказчика за 2 года выросли многократно.

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

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




Кризис


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

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

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


Вишенка на торте ;)


Побочный эффект монетизация трафика и окупаемость вложений в контент


У контент-маркетинга есть приятный побочный эффект заработок от продажи рекламы.

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

Продуктовый дизайнер правила эксплуатации

23.09.2020 14:17:26 | Автор: admin


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

Один из видов дизайнеров достаточно нового направления продуктовый.
В статье именно о нем я и хочу поговорить.

Ударю по теории и практике.

В теории хочу разобраться кто это такой и что от него хотят.
На практике описать процесс работы этого самого дизайнера над тем самым продуктом.

Поехали!




Часть первая. Теоретическая.
Кто такой, сколько стоит и чего ожидают


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

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

Вот что говорят курсы.

Нетология обещает зарплату от 120 тыщ. рублей
UX/UI дизайнер, дизайнер продукта одна из самых востребованных digital-профессий с широкими возможностями для роста и высокой заработной платой
Она сочетает в себе аналитику и творчество, инженерный подход и нестандартность решений. Грамотная работа дизайнера увеличивает прибыль клиента и улучшает взаимодействие пользователя с продуктом.

Skillbox приманивает зарплатой от 80 тысяч.
Продуктовый дизайнер отвечает за создание и развитие продукта: от идеи до выхода на рынок.
Вы научитесь продумывать бизнес-стратегию, работать с IT-командой, проводить исследования и проектировать дизайн-системы.

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

Вообщем достаточно размыто все в описаниях.

Теперь кинем взор на hh.ru и посмотрим, чего же реально ждут работодатели от человека, именуемого продуктовый дизайнер.

Действовала я топорно и без изысков: вбила в поисковую строку Продуктовый дизайнер и выписала часто встречающиеся требования.

Хозяйке на заметку: в вакансиях уровень зарплат часто не указывают, поэтому реальную картину понять достаточно тяжело.

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

Ну и погнали теперь по общим требованиям:
  • Опыт работы в дизайнерских и около того программах (Sketch, Zeplin, Figma, InVision, Adobe Photoshop и пр.);
  • Опыт работы с web, iOS и Android (потому что есть шанс, что будешь и там, и тут);
  • Разбираться в современных трендах дизайна;
  • Красиво визуализировать что дадут. А дать могут не только сложные и интересные фичи, но и баннеры, лендинги, иконки или иллюстрации. Отсюда, соответственно, вытекает знание основ композиции, типографики, и прочих таких необходимых простому дизайнеру штук;
  • Шарить в паттернах человеческого поведения. Быть в курсе того, что в мире проектирования интерфейсов твориться, что бы не только спроектировать, но и свою гипотезу выдвинуть, а чужую аргументированно задвинуть. На основе чего ты будешь выдвигать и задвигать это уже тебе либо скажут, либо сам придумаешь;
  • Быть ux-аудитором проверить то, что уже есть и исправить это в лучшую сторону, естественно;
  • Бодро отслеживать конкурентов, постоянно держа руку на пульсе;
  • Уметь общаться с пользователями. Это про проведение разного рода исследований и тестирований;
  • Уметь дизайн-систему если не создать, то руку к уже готовой приложить;
  • Где-то надо будет заняться еще и аналитикой (тут в зависимости от ситуации: либо понимать, что тебе говорит и показывает аналитик, либо быть тем самым аналитиком);
  • Грамотно писать тексты, так что местами надо будет совмещать роль и ux писателя;
  • Уметь быстрого прототипировать. Что бы идеи показать, проверить, оттащить пользователю на тест;
  • Понимать что frontend могет, а чего не могет. А так как сейчас frontend могет практически все, только дай ему время и вдохновение, то лучше понимать время, которое займет у разраба твой дизайнерский или интерфейсный креатив; Не забываем следить за качеством того, что все-таки front накреативит в итоге по твоим макетам;
    Кстати, про креатив. Этот свой креатив лучше всего совмещать с логическим мышление на одних плечах;

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

Вообщем, требования достаточно обширные. Где-то больше, где-то меньше.
Надеюсь основное направление понятно.

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



На самом деле все у всех по-разному.

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

Но это лично мой опыт. Может у кого-то совсем и не так.

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

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

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

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

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

Потому что делать все равно надо.

Ну а как?

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



Часть вторая. Практическая.
Основана на реальных событиях.


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

И об этих светлых пятнах и будет мой рассказ.

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

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

Итак

Сбор требований с заказчика


Требования можно собирать от Product Owner, заказчика, или другого ответственного лица.

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

Требования надо собирать тщательно, не оставляя ни одного белого пятна.

По хорошему, этим должен заниматься бизнес-аналитик. Узнал, записал, принес, сделал Чмоки и махнул ручкой на прощание.

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

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

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

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


Это уже другая сторона медали.

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

Посидеть и посмотреть как он работает с тем, что уже есть.
Спросить что устраивает, а что нет. А как хотелось бы. Что важно при совершении определенного действия, принятия решения и прочее.

Даже если делаем то, чего еще нет, все равно они каким-то образом решают эти задачи.

Потыкав палкой в обе стороны, уже имеешь более-менее внятную картинку с которой можно работать.

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

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

Схема пути пользователя


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

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

А я брала и раскладывала весь пользовательский путь употребления какой-то функцией от точки А до Б, от Б до С и так далее.
Так как часто приходилось делать то, чего еще нет, то реальные проблемы, радости и прочее передать не могла.

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

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

Когда весь путь чист, как слеза младенца, можно уже и к прототипу приступать.

Прототип первый: бумажный


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

Бумажки можно разложить в ряд и оценить логику и понятность будущего продукта.

На бумажках можно даже выписать какие-то моменты, которые нужно еще подумать или сразу выписывать возникающие вопросы, которые нужно будет уточнить у разработки, например.

Прототип второй: динамический


Я его делаю в Axure.

Честно, пробовала в других программах, но мне элементарно не удобно, особенно когда будет достаточно большое количество экранов.

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

Не скажу, что я его прям дизайню, но какие-то важные акценты и цвета делаю.

Тестирование прототипа


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

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

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

Не скажу, что все проходит гладко и правильно.

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

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

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

Это точно лучше, чем ничего.

Показ прототипа разработке


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

Тадам! Финишная прямая: дизайн


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

Передача в разработку


Раньше описывала сценарии в формате user story.
Звучало это примерно так:
Я, как ., хочу
Далее описывалась сама функция, действия с ней пользователем, дополнительные возможности и пр.

Оказалось, что иногда получается много и никто это читать не желает, поэтому стала лепить примечания в самом прототипе и раскладывать в miro путь уже надизайненными экранами.

Оказалось, что разработчикам так работать значительно удобней.

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



Заключение


Повторюсь, что это мое виденье и мой опыт.

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

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

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

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

Человек и кино. Исследования

30.09.2020 00:19:15 | Автор: admin


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

Гипотеза моя, в рамках планируемого проекта, провалилась. Исследования остались.
Решила поделиться, вдруг кому пригодится или просто будет интересно почитать.

Итак.

Вводные данные


Основные цели исследования:

  1. Выяснить, сколько времени, в среднем, человек тратит на поиск фильма для дальнейшего просмотра;
  2. Как должен работать идеальный ресурс рекомендации фильмов.

Траты:

Время: неполных 2 дня (написать вопросы, отправить опросы, дождаться ответов, свести все в единую таблицу).

Деньги: 0 рублей 00 копеек

Аудитория:

Всего опрошено 22 человека.

Любители кино, которые смотрят фильмы достаточно регулярно.

Мужчин 12;
Женщин 9;
Пол не указан 1

Средний возраст:

30-35 лет.
Самый старший участник опроса 63 года.
Самые младшие 12 и 13 лет.

Вопросы:


  1. Как ты ищешь, выбираешь фильмы для просмотра?
  2. На каком ресурсе смотришь? Почему выбрал именно его?
  3. На что ориентируешься при выборе фильма?
  4. Сколько времени тратишь на поиск фильма, перед тем, как его смотреть?
  5. Как ты думаешь, как должен работать идеальный ресурс по рекомендации фильмов? Если такой есть назови

Результаты:


1. Как ты ищешь, выбираешь фильмы для просмотра?


Первое место: в этой номинации уверенно лидировали рекомендации знакомых 10 голосов.

Второе место (8 голосов) просмотр обзорных роликов на YouTube или с помощью запроса Лучшие ... в поисковой строке Google.

Третье место поделили между собой всякие группы о кино в ВК и Telegram (4), киношные ресурсы типа ivi и КиноПоиска (4), а также категория Другие (4 голоса)

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

2. На каком ресурсе смотришь? Почему выбрал именно его?


По итогу вариантов ответом были сформированы такие категории: Ivi, КиноПоиск, YouTube, Торренты, Другие (платная версия), Другие (бесплатная версия).

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

Второе место поделили между собой онлайн-кинотеатр Ivi и другие платные ресурсы по 3 голоса

Третье место у торрентов 2 голоса

Хочу обратить внимание, что этот вопрос остался без ответа у 7 участников.

3. На что ориентируешься при выборе фильма?


9 голосов описание фильма.
8 голосов рейтинг.
по 4 голоса актеры, трейлер, жанр и другое.

4. Сколько времени тратишь на поиск фильма, перед тем, как его смотреть?


До пяти минут 8 человек.
Не смогли ответить на вопрос 5.
До 30 минут 4.

5. Как ты думаешь, как должен работать идеальный ресурс по рекомендации фильмов? Если такой есть назови.


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

Участники разделились на три лагеря.

Лагерь первый ориентировался, в качестве примера, на что-то уже знакомое.

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

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

Собственно, третий лагерь озвучил как раз мою задумку, ради которой и закрутилось это исследование.

Итоги


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

И время экономится, и хорошее кино находится.

После проведения опросов поняла, что малой кровью, как планировалось сделать изначально, отделаться не получится. Не пойдет человек.

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

Вот такие мои итоги.

Для тех, кто хочет подробностей: вот она, ссылка на табличку

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

Какие ошибки совершает аналитик в первые полгода работы и как их избежать

19.05.2021 14:18:09 | Автор: admin

Хайди хо, Кайл!

Меня зовут Диана и я бизнес-аналитик в компании Surf. В прошлом году я закончила бакалавриат факультета компьютерных наук в ВГУ: это дало мне базовые теоретические знания. Однако теория мало применима без практики: теперь набиваю шишки в настоящих проектах.

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

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

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

Не бойтесь задавать больше вопросов и просить уточнений

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

Лучше задать больше вопросов, чем что-то упустить. Например, когда работаешь над проектом, важно уточнить:

  • На чьей стороне будет реализована логика: фронта, middleware, бэка?

  • Как определять нужное состояние элемента? Как и где получать и обрабатывать нужные параметры?

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

  • Касаются ли вашей стороны эти требования или от вас никаких доработок и не потребуется?

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

Проверяйте и перепроверяйте выполнение договорённостей

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

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

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

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

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

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

Пример из жизни

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

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

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

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

Уточняйте, как сделать проще

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

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

Френдли ремайндер

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

Будьте внимательным к потенциально проблемным требованиям

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

Уточните (если нужно, несколько раз), правильно ли вы поняли, что ваша задача просто добавить картинку котика на экран. Может оказаться, что добавить нужно обязательно чеширского кота, а ещё он должен улыбаться в момент, когда вы моргаете. Я специально привела утрированный пример.

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

Важно быть начеку и проверять, не противоречат ли новые требования уже реализованной функциональности.

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

Как определить, что перед вами задача-оборотень, которая может превратиться из человечной в дикую? По количеству непоняток. Берегитесь, если:

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

  • Не очевидна инициализация флоу и переход между экранами.

  • Нет четкого понимания логики.

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

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

Пример

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

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

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

_______

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

Вот и всё, мои маленькие хоббиты. Я поделилась с вами своей мудростью, теперь вы сами по себе. Не дрейфте, не теряйтесь, будьте настойчивы и внимательны. В добрый путь!

Подробнее..

Поговорим по-красному?

23.10.2020 18:08:20 | Автор: admin

Вы совершили ошибку. Все совершают ошибку. Или не совершали. Или у руководства с утра просто овсянка в сапоге.


Доброе утро, сэр
  • Бэрримор, что у меня хлюпает в сапоге?
  • Овсянка, сэр!
  • Но что она там делает?
  • Хлюпает, сэр!

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


Причин для поговорить по-красному может быть множество. За последний год я их пронаблюдал несколько. И сразу могу сказать win-win тут и не пахнет. И бирюзовостью тоже. Agile тем более. Но встречается такое в наших полях и просторах часто. К чему это может привести?



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


Через три месяца уволили Нияза, великолепного переводчика человека, который привёл меня в компанию.


Говорил мне папа в 5 лет: Не верь в сказки


Полная дискредитация руководителя в глазах подчинённого


Так уж вышло, что пришлось испытать на собственном примере. На одной из предыдущих работ название называю не из-за NDA, потому что эта бумажка юридически ничтожна в юридических границах Российской Федерации, а потому что название ничего не придаст к сути рассказа генеральный директор внезапна(!) осознал, что я выполняю все поставленные задачи, но получаю слишком много. Тогда я, кстати, вывел блог компании на 3 место в Хабре с около 30 или 40, точно уже не помню.


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


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


Я слушал примерно 5 минут. После этого очень мягко и корректно, только литературными словами объяснил: Уважаемый ...., если мы решили поговорить по-красному, то теперь мой черёд. Говорить со мной в таком тоне и даже с такими словами может крайне ограниченный круг лиц. Во-первых, это очень близкие друзья и я к ним прислушаюсь. Я тоже могу ошибаться, как любой человек. Во-вторых, это люди, которых я очень уважаю. Это три человека. Полковник ВВС в запасе, полковник ГРУ в запасе и подполковник Вымпела в запасе за их невероятную тяжёлую и мужественную службы стране, за военный опыт и за жизненный опыт. Кроме того, я готов выслушать по-красному моих однополчан, когда я работал военным журналистом, и когда мы вместе чудом пережили 2 миномётных обстрела 120-мм минами. Всё. А вам, уважаемый ...., я права говорить со мной по-красному не давал. И вы его даже за всю жизнь не заслужили. Весь страшномосковский риск, который у вас в жизни был, это подвернуть ногу, вылезая с кожаного кресла внедорожника. И когда вы со мной пытаетесь говорить по по-красному, то вызываете даже не обиду или раздражение, а веселье и хихиканье. Про себя, конечно же, потому что я вежливый человек и мажоров в жизни навидался.


Больше со мной по-красному говорить не пытались. Говорили с другими и не раз. Доводили до слёз девушек и увольняли прямо за столом ресторана после завершение конференции.


Минус этой ситуации: Руководитель больше не вызывал у меня уважения. Обычный московский рвач-мажор. Я скептически относился к его инициативам и зажигательным воодушевляющим спичам. Мне он был просто неприятен, как человек. Мне стало всё равно, что будет с его компанией и с его продуктом. Сотрудник оказался полностью демотивирован работать даже на 110%. Я выполнял необходимые задачи. Я обеспечивал тот результат, что требовалось. Но не больше. Я больше не горел идеей.


Профессиональное выгорание


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


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


На словах в компании Agile. Открытость. Прозрачность. Доверие. Blameless Culture.


На деле все животные равны, но некоторые животные равнее других(с)Джордж Оруэлл.


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


Потеря ценного сотрудника


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


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


Минус этой ситуации: Компания лишается сотрудника, который может принести значительную пользу и прибыль. А также теряет репутацию, потому что сарафанное радио никто не отменял.


Agile превращается в карго-культ


Руководство получает новые игрушки: дейли, грумминг, планирование, демо, ретро. Все ходят строем на эти мероприятия. Пропустить хоть одно из них это неуважение команды.


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


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


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


А вы встречались с таким по-красному"? И как поступили? Нашли решение win-win?

Подробнее..

3 пути к возрождению организации

19.04.2021 00:19:54 | Автор: admin

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

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

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

Начнем со знакомством с философией трех путей:

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

  • Второй Путь - это движение по дороге улучшений за счет построения циклов обратной связи.

  • Третий Путь пропагандирует культуру постоянного эксперимента. Движение дорогой проб и ошибок позволяет организации расти и развиваться.

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

О них дальше и поговорим.

Визуализируйте всю работу

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

  • бизнес проекты - тип работы, которая создает ценность для конечного пользователя и/или конкурентное преимущество организации;

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

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

  • незапланированные работы - три предыдущих типа работ мы планируем, в то время как четвертый появляется против нашей воли и ставит под сомнение все наши планы. Зачастую они появляются после "срочных" изменений.

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

Выявляйте ограничения

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

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

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

Устраняйте ограничения

Горы незавершенной работы указывают не только о наличии ограничений, но и увеличивают время нахождения работы в процессе. Одним из способов решения данной задачи является сократить количество новых работ, в которых задействовано ограничение. Вторым способом является расширение ограничения. Каждый производственный участок можно охарактеризовать 4 вещами: машиной, человеком, методом работы и измерениями. Соберите больше информации об ограничении, и попробуйте наиболее доступный вам вариант для его расширения. Не пытайтесь улучшать систему вне ограничения, это дает иллюзию улучшений, но не решает реальную проблему. В своей практике, я первым делом начинаю решать задачу первым методом. Если возникает ограничение в производстве, то намного быстрее сфокусироваться на том, что перед ним - генерации и проверке идей. Только убедившись, что в работу идет самое ценное я перехожу к методу расширения ограничения. Второй метод не только дороже, но и дольше. Найм и обучение человека, который потенциально поможет расширить ограничение, займет от нескольких месяцев до полугода, а количество работ в процессе вы можете ограничить за недели, иногда и быстрее.

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

Устраняйте движение против потока

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

Наладьте обратную связь

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

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

Экспериментируйте

Развитие технологий и глобализация открыла новые возможности для бизнеса. Сегодня маленький стартап из Израиля или Беларуси, может конкурировать с гигантом из США или Европы за аудиторию. Пользователь становится более избирательным, а конкуренты не дремлют. Если вы будете довольствоваться тем, что есть, то очень быстро вас догонят и перегонят. Эксперименты - основа основ для развития. Как сказал Эдисон: "Каждая неудавшаяся попытка это еще один шаг вперед". Чем больше компания экспериментирует тем выше ее шансы найти нужный подход к аудитории и монетизировать его. Это и есть ключ к третьему пути.

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


Подробнее..

Как я пробовал внедрять DDD. Тактические паттерны

10.06.2021 14:04:32 | Автор: admin

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


Поначалу мне попали в работу легаси проекты, архитектура которых была Transactional Script или Table Module. Модули требовали рефакторинга, решения тех.долгов, встал вопрос о целесообразности рефакторинга и альтернативных реализаций. Как инженер, я решил, что единственный верный шаг прокачать себя, а затем и команду, теоритически, а потом предпринимать стратегические шаги. Если с TS и TM архитектурами я был хорошо знаком, то шаблон Domain Model был знаком только в самых общих чертах по книге Мартина Фаулера. На фоне общения на конференциях, чтения матёрых книг про рефакторингу, SOLID, Agile, пришло понимание почему именно изучение подобных архитектур оправдано: в Enterprise есть смысл стремиться к максимально адаптируемому к изменениям ПО, а для доменной модели изменения требований стоят несравнимо дешевле в реализации. И меня напрягало, что как раз доменные модели я если и применяю, то понаитию, бессистемно, невежественно. Так началось моё знакомство с предметно-ориентированным проектированием.


В этой первой части, о том какие наработки удалось получить команде.


Тактические паттерны


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


Доменная модель


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


  1. Абстрактная модель. Публичные интерфейсы модели, которые могут быть доступны в других слоях. Сами интерфейсы пишутся так, чтобы они наследовали интерфейсы из нашего Seedworks, что позволяет избежать зоопарка в различных проектах. Абстрактная модель первое с чего начинается любой сервис, т.к. содержит в себе ОБЩЕУПОТРЕБИМЙ ЯЗК.
  2. Реализация модели. Internal реализация агрегата, содержатся необходимые проверки, скрываются фабрики, бизнес-методы, утверждения и т.д.

Реализация агрегата


Команда рассматривала следующие способы реализации агрегата:


  1. Свойства с модифицированными set'ерами, в которых сокрыта логика обнаружения изменений. Код получается неоправданно усложнённым, и не совсем понятно зачем. Мы имели такую реализацию, когда ещё оперировали анемичной моделью (вспоминаю как страшный сон).
  2. Aggregate Snapshots. Механизм делает регулярно или по триггеру снимки агрегата и, если что-то поменялось, регистрируется событие.
  3. Иммутабельные агрегаты, порождающие через бизнес-методы новую версию агрегата. В нашей команде прижился 3й вариант он сулит самые большие перспективы для распределённой системы.

Итак, строение агрегата.


  • Анемичная модель. Анемичных модели у нас две: обычная, и "дефолтная", с пустыми объект-значениями и корнем. При этом анемичная модель условная часть агрегата, существующая только для организации жизненного цикла данных, т.е. в репозитории, фабриках.
    • Идентификаторы. Мы используем составной ключ <guid, long>. Первая часть идентифицирует агрегат, вторая его версию.
    • Корень агрегата. Обязательная сущность, вокруг которой и строится ограниченный контекст. С этим элементом у нас были проблемы, мы ожидали что корень будет иммутабельным на всём протяжении жизненного цикла агрегата, однако, практика показала другое, нежели в книгах. Позже слышал на DDDevotion от Константина Густова то же самое.
    • Объект-значения. Простой иммутабельный класс: конструкторы закрыты, фабричные методы открыты.
  • Бизнес-методы. В нашей реализации составной объект, состоящий из предусловий и постусловий. Результат выполнения операции усложнённая монада Result или сложная структура, возвращающая две анемичных модели и результат операции. Результаты операций на данный момент делим на:
    • Успешные.
    • Ошибочные по бизнес-проверкам, которые могут порождать новую версию агрегата, однако, могут иметь место проблемы с постусловиями.
    • Фатальная проблема, когда предусловие говорит о том, что данная операция не может быть выполнена.

Доменные сервисы


Этот слой ответственен за работу с агрегатом. Состоит двух механизмов:


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

Сначала мы пытались реализовать поиск через провайдер с применением спецификации, однако, отловили проблемы с EF. Эти проблемы застали думать о CQS. Теперь CQRS+ES у нас из коробки, т.е. доменные события отражаются на материализованных представлениях, и, в свою очередь, с их помощью происходит поиск нужного агрегата. В случае если агрегат не найден в мат.представлениях, провайдер соберёт агрегат с пустой моделью это удобно тем, что бизнес-методы всегда остаются внутри агрегатов.


Слой приложения


Слой приложений довольно обыденный. Где-то свои обработчики, где-то на основе MediatR, но, в любом случае, всем командам ограниченного контекста надлежит получить из DI-контейнера провайдер агрегатов, а затем в обработчике из него (что?) определённую версию агрегата, у которой уже вызывается бизнес-метод.


Слой сервисов


С сервисами всё интересно. По умолчанию, мы продолжаем использовать .NET Core Web API, т.е. REST, протокол. Однако, REST это про архитектуры TableModule и нельзя использовать глаголы PUT, DELETE для модифицирования агрегата. Контроллеры наших микросервисов повторяют методы агрегата, используя глагол POST, ведь для стратегических паттернов нужны идемпотентные операции. В итоге получается дисфункция использования контроллеров. Возможно, следует использовать gRPC.


Инфраструктурный слой


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


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


Как это выглядит в итоге


С одной стороны:


Описание Зарисовка
Гексогональная архитектура микросервисов, декомпозированных по субдомену. image
Команда над доменной сущностью порождает новый объект (версию). image
Сравнение версий агрегата и метаданные команды (источник доменного события). image
Для распространений изменений используется ШДС, что открывает возможности для CQRS и ES. image
Версионирование команд и агрегатов должны помочь избежать блокировок и перепроверок при помощи оптимистичных блокирок. Появлется возможность ветвлений-сессий. image

С другой стороны:


  1. Тактические паттерны освоены костяком команды. Каждый может вести свою команду, распространять подход дальше.
  2. Наработки позволяют начинать работу с контестом даже если единый язык беден, оставив от модели лишь корень. По мере уточнения общеупотребимого языка, модель будет расширяться.
  3. Из всех взятых в работу ограниченных контекстов генерируются доменные события пригодные к использованию в смежных ограниченных контекстах.
  4. Предметная сложность полностью в модели. Даже инфраструктурных сложностей нет как таковых понятная работа по материализованным представлениям, обработчикам слоя приложения. Вместе с решением технической сложности, появляется soft-slills сложности.

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




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

Подробнее..

Иной подход к коммуникации удаленных команд

19.04.2021 20:16:49 | Автор: admin

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

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

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

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

Toolkit больше не нужен

Toolkit означает - в каждой команде свой хаос. Объясню почему. Когда формируется новая команда, каждый её юнит привносит свои знания. Со временем появляется набор инструментов и практик.

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

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

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

Живой пример

Frontend-разработчик Павел пришёл в новый коллектив. В прошлой команде дизайнер рисовал интерфейсы в Sketch (но у паши Винда и он использовал Lunacy), правки доносил через Google Docs, а бизнес логику показывал через Zoom.

А в новой команде используют Figma и Miro. Часть бизнес-логики показывают, через кликабельный прототип. Правки присылают в Телеграм, Slack, либо ставят в задачи в JIRA (но переписка как правило ведётся в мессенджерах).

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

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

Обзор возможностей

Конкретика

Наш сервис решает ваши задачи конкретным способом, поэтому 1 раз изучив, можно использовать эти знания в любой команде. Тем более, что сервис будет интуитивно понятен всем, кто работал с PowerPoint, Miro и Figma.

Интерфейс модуля CaseTrackerИнтерфейс модуля CaseTracker

Накапливаемый опыт

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

А при стандартном подходе всё теряется, разбросано по мессенджерам, таск-трекерам, доскам, каталогам, документам и прочим местам хранения данных.

Всё в одном месте

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

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

Бизнес-логику теперь проще донести

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

Как водится, это видео полетит в мессенджер и там же будет по нему переписка. Либо в JIRA, в виде задачи, но опять же, часть вопросов будет в комментариях к задаче, а часть в переписке в мессенджерах или ещё хуже - при созвоне (половина забудется). И потом концов не соберёшь.

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

Обсуждения с командой

Если всё же есть время созвониться, то можно создать митинг-комнату, в которую в любой момент может зайти кто-то из команды (если роль позволяет). Для того, кто не успел, коллеги сделают запись. Эту запись можно так же комментировать и редактировать, как описано выше.

Итог

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

Пишите в комментариях: вы узнали себя в озвученных проблемных кейсах, наш сервис помог бы вам упростить взаимодействие с командой?

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

Для первой тысячи мы откроем premium-доступ на целый год бесплатно - после запуска MVP.

Для связи со мной Телеграм. Подробнее о сервисе в моём инстаграм.

Подробнее..

Анимация и экспорт. На примере игры Intravenous. Часть 1

09.02.2021 16:13:11 | Автор: admin

Сказ о том, как делать не стоит. Или, как я дважды сгорал на работе

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

Но, именно данный заказ натолкнул меня на мысль, что подобным опытом стоит поделиться. Дабы, не знакомые со сферой, знали, как работает внутренняя кухня, а коллеги, как делать не стоит и почему. К тому же, перспектива Top-Down специфическая и материалов по ней практически не существует. Когда я начинал работу, никакого опыта с top-down перспективой, кроме игровой, у меня не было, что подогревало интерес.

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


Promo-art для проектаPromo-art для проекта

Проект выполнен в жанре: Top Down Stealth - Action (уникальная смесь из серий Splinter Cell и Hotline Miami).

Движок: Love2D
Арт/Дизайн/Анимации выполнены в: Adobe Photoshop ( :) )
Художественное направление: Pixel art

Проект находится в Steam, и ознакомится с ним можно по данной ссылке: Intravenous

Скриншот из ранних версийСкриншот из ранних версийСкриншот из демо-версииСкриншот из демо-версии

Когда со мной связался заказчик (программист - Роман Гребенков), он уже имел на руках прототип с работающими механиками вроде взаимодействия с дверьми, телами врагов, подбора предметов и прочего. Выглядело крайне многообещающе.

Я изготовил для проекта UI (редизайн/арт), эффекты, персонажей, анимации, тайлсеты, объекты, портреты, promo-art.
В общем, практически всё, что вы увидите в игре. Но в данной статье, речь пойдёт именно про анимации, т.к. они стали "камнем преткновения" всей разработки.


Немного о перспективе

Enter The Gungeon - хороший пример перспективы 3/4Enter The Gungeon - хороший пример перспективы 3/4

Существует распространённое заблуждение, что "top-down" - это любой угол поворота камеры, в том числе несколько видов изометрии и, так называемая, перспектива 3/4.

Скетчи персонажей для освоения top-down перспективыСкетчи персонажей для освоения top-down перспективы

Связано это с тем, что у ряда перспектив, не существует какого-то объединяющего понятия/термина отличного от "вида сверху" т.е. "Top-Down".
Отсюда и возникающие недопонимания при обсуждении того или иного проекта.

"Top-Down" (топ-даун) - это перспектива, камера в которой привязана исключительно над головой персонажа.
Примеры: GTA 1/2, Darkwood, Hotline Miami


Анимации

Скетчи персонажей в пикселяхСкетчи персонажей в пикселях

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

Первые потуги анимации в top-down перспективеПервые потуги анимации в top-down перспективе

Список анимаций для всех персонажей включал в себя:

  • 5 видов основного оружия (Дробовик, Обрез, MP5, UZI, AK103, M4);

  • 5 видов второстепенного (Glock19, HS2000, P89, SW457, VP9);

  • 5 видов уникальных приспособлений (Тазер, Переносной ЭМИ глушитель, Светошумовая граната, Осколочная граната, Пустые магазины);

  • Ближний бой на всех видах оружия, в том числе и рукопашный;

  • Выбивание двери;

  • Idle анимации;

  • Анимации смерти;

  • Подбор и взаимодействие с предметами;

Наброски анимацийНаброски анимаций

Уникальные для персонажа игрока:

  • Перенос тел;

  • Оглушение или добивание персонажей;

  • Использование отмычки;

  • Лаз через 2 вида препятствий;

  • Движение ползком;

  • Бег;

Обрез. Умелый.Обрез. Умелый.

Помимо этого, существует 3 степени умения обращения с оружием (что увеличило список анимаций втрое!), которые мы условно назвали:

- Умелый; (персонаж игрока, профессиональные военные)
- Не умелый; (киллеры, наёмники)
- Абсолютно не умелый; (гангстеры, шпана)

Обрез. Неумелый.Обрез. Неумелый.

Все 3 степени отличаются геймплейно:

- точностью при стрельбе;
- скоростью перезарядки;
- скоростью реакции на события;

Что отражается визуально, через:
- наличие лишних телодвижений при перезарядке;
- положение персонажа (стойку);

Обрез. Абсолютно неумелый.Обрез. Абсолютно неумелый.

Список анимаций на каждого персонажа достигал значения 200+. Т.к. каждая анимация, даже в которой было изменён исключительно спрайт пистолета был уникальным.

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

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


Шаблон

Анимация падения и подъёмаАнимация падения и подъёма

Шаблон персонажа включал в себя:

- Голову;
- Тело;
- Руки;
- Оружие;
- Дополнительные слои (ладони/детали);
-
Ноги/нижняя половина тела (отдельно);

Из которых покадрово собирался цикл анимации.


Экспорт

Существует 2 пути экспорта шаблонных анимаций.

Способ 1:

  • Все части шаблона - отделены (слоями);

  • Оружие легко заменяется (если позволяет анимация);

  • Одежда кладётся поверх слоёв в игре;

Pixel art со скелетной анимациейPixel art со скелетной анимацией

+ Упор делается на сборку составляющих внутри движка игры;
+ Гибкость, возможность осуществлять исправления, буквально, на лету;
- Требователен к инструментарию движка;

Не совсем корректный, но отличный пример: Garage: Bad Trip.
(На самом деле, она известна своей скелетной анимацией скрещенной с Pixel-art графикой, и даже существует статья на эту тему, но я её не нашёл) ("Пес-песа" - тебя помнят!)

Способ 2:

  • Все части шаблона склеены (монолитный слой);

  • Оружие заменяется исключительно в исходнике (PSD/GIF файле);

  • Одежда склеивается вместе с частями шаблона;

Spritesheet персонажа из Hotline MiamiSpritesheet персонажа из Hotline Miami

+ Упор делается на финализацию работ перед отправкой;
+ Лёгкий импорт в движок игры;
- Многократно возрастающий объём работы;
- РУТИНА;
- Не подходит проектам, в которых используется большой размер спрайтов;

Отличный пример: Hotline Miami

Как вы уже понимаете, нами был выбран 2 вариант. Почему?
На это повлиял целый ряд причин:

  • Отсутствие инструментария для анимации (игра разрабатывалась на Love2D);

  • Необходимость разгрузки программиста от лишней работы (переизбыток задач);

  • Тримминг текстур (упаковка кадров анимации в spritesheets);

  • Малый размер спрайтов;

А теперь поподробнее.

  • Заказчику было необходимо добиться максимальной производительности, чтобы проект смог быть запущен на устройстве любой мощности;

  • Разработка инструментария для анимаций не рассматривалась вовсе, т.к. эти силы разумно было бросить на встроенный level-editor (редактор уровней) и проработку ИИ (искусственного интеллекта) врагов;

Тримминг кадров анимации и упаковкаТримминг кадров анимации и упаковка

Продолжение в части 2.

Подробнее..

Модуляризация iOS-приложения Badoo борьба с последствиями

21.01.2021 20:07:17 | Автор: admin

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

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

В этой статье я расскажу:

  • как мы не потерялись в сложном графе зависимостей;

  • как спасли CI от чрезмерной нагрузки;

  • что делать, если с каждым новым модулем приложение запускается всё медленнее;

  • мониторинг каких показателей стоит предусмотреть и почему это необходимо.

Сложный граф зависимостей

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

Так выглядел граф зависимостей Badoo к моменту, когда у нас было около 50 модулей:

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

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

  2. Сложности визуализации порождают сложности отладки. Найти фундаментальные проблемы в сложном графе зависимостей крайне непросто.

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

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

Основные характеристики утилиты:

  • это консольное Swift-приложение;

  • работает с xcodeproj-файлами с помощью фреймворка XcodeProj;

  • понимает сторонние зависимости (мы не очень активно и охотно принимаем их в проект, но некоторые всё же используем; загружаются и собираются они через Carthage);

  • включена в процессы непрерывной интеграции;

  • знает о требованиях к нашему графу зависимостей и работает в соответствии с ними.

Последний пункт объясняет, почему не стоит надеяться на появление подобных утилит с открытым исходным кодом. Сегодня не существует универсальной хорошо описанной структуры проектов и их настроек, которая подойдёт всем. В разных компаниях могут отличаться различные параметры графа:

  • статическая или динамическая линковка;

  • инструменты поддержки сторонних зависимостей (Carthage, CocoaPods, Swift Package Manager);

  • хранение ресурсов в отдельных фреймворках или на уровне приложения;

  • и другие.

Поэтому, если вы смотрите в сторону 100+ модулей, на каком-то этапе вам, скорее всего, придётся задуматься о написании подобной утилиты.

Итак, для автоматизации работы с графом зависимостей мы разработали несколько команд:

  1. Doctor. Команда проверяет, все ли зависимости корректно связаны и встроены в приложение. После исполнения мы либо получаем список ошибок в графе (например, отсутствие чего-либо в фазе Link with binaries или Embedded frameworks), либо скрипт говорит, что всё хорошо и можно двигаться дальше.

  2. Fix. Развитие команды doctor. Эта команда в автоматическом режиме исправляет проблемы, найденные командой doctor.

  3. Add. Добавляет зависимость между модулями. Пока у вас простое небольшое приложение, добавление зависимости между двумя фреймворками кажется простой задачей. Но когда граф сложный и многоуровневый, а вы работаете с включёнными явными зависимостями, добавление нужных зависимостей становится задачей, которую вы не захотите из раза в раз делать руками. Благодаря команде add разработчики могут просто указать два названия фреймворков (зависимый и зависящий) и все фазы сборки заполнятся необходимыми зависимостями в соответствии с графом.

Впоследствии скрипт создания нового модуля по шаблону также стал частью утилиты deps. Что мы получили в итоге?

  1. Автоматизированную поддержку графа. Мы находим ошибки прямо в pre-commit hook, сохраняя стабильность и правильность графа и давая возможность разработчику в автоматическом режиме эти ошибки исправлять.

  2. Упрощённое редактирование. Добавить новый модуль или связи между модулями можно одной командой, что сильно упрощает их разработку.

Непрерывная интеграция не справлялась

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

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

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

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

Очевидным решением было перестать собирать и проверять всё и всегда. Нужно было, чтобы CI проверял только то, что нужно проверить. Что не сработало:

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

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

  3. Разработчик указывает, что проверять. Этот эксперимент завершился быстрее всех буквально за пару дней. Благодаря ему мы узнали, что разработчики бывают двух типов:

    1. Те, кто на всякий случай проверяет всё.

    2. Те, кто уверен, что не мог ничего сломать.

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

В итоге мы вернулись к идее автоматизации вычисления изменений, но немного с другой стороны. У нас была утилита deps, которая знала про граф зависимостей и файлы проекта. А Git позволяла получить список изменённых файлов. Мы расширили deps командой affected, с помощью которой можно было получить список затронутых модулей, исходя из изменений, отражаемых системой контроля версий. Ещё более важно то, что она учитывала зависимости между модулями (если от затронутого модуля зависят другие модули, их тоже необходимо проверить, чтобы, например, в случае изменения интерфейса более низкого модуля верхний не перестал собираться).

Пример: изменения в блоках Регистрация и Аналитика на нашей схеме указывают на необходимость проверить также модули Чат, Sign In with Apple, Видеостриминг и само приложение.

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

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

  1. Мы проверяем в CI только то, что действительно было затронуто прямо или косвенно.

  2. Продолжительность CI-проверок перестала линейно зависеть от количества модулей.

  3. Разработчик понимает, что его изменения могут затронуть и где нужно быть осторожным.

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

Ждём завершения Е2Е-тестов

Для приложения Badoo у нас есть более 2000 сквозных (end-to-end) тестов, которые его запускают и проходят по сценариям использования для проверки ожидаемых результатов. Если запустить все эти тесты на одной машине, то прогон всех сценариев займёт около 60 часов. Поэтому на CI все тесты запускаются параллельно насколько это позволяет количество свободных агентов.

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

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

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

Подобное решение едва ли можно назвать оптимальным, но всё же преимущества от его внедрения были ощутимы:

  1. Нагрузка на CI существенно снизилась. Чтобы не быть голословным, привожу график времени, которое задача на прогон сквозных тестов провела в очереди:

  2. Уменьшился шум инфраструктурных проблем (меньше запусков тестов меньше падений из-за зависших агентов, сломавшихся симуляторов, недостатка места и т. д.).

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

Медленный запуск приложения

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

В середине графика видно резкое снижение времени. Причина переход на статическую линковку. С чем это связано? Инструмент динамической загрузки модулей dyld от Apple выполняет трудоёмкие задачи не совсем оптимальными способами, время исполнения которых линейно зависит от количества модулей. В этом и была основная причина замедления запуска нашего приложения: мы добавляли новые модули dyld работал всё медленнее (на графике синяя линия отражает количество добавляемых модулей).

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

Стоит сказать, что статическая линковка несёт с собой и ряд ограничений:

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

  2. После перехода на статическую линковку нужно хорошенько протестировать приложение на предмет рантайм-падений. Чтобы исправить многие из них, вам просто придётся использовать не самые оптимальные параметры оптимизаций. Например, почти для всех Objective-C-модулей придётся включить флаг -all-load. Отмечу ещё раз, что решение всех этих проблем с вынесенными xcconfigами (про xcconfig в первой части) не было таким мучительным, каким могло бы быть.

Итак, мы побороли две основные проблемы, вынесли ресурсы в отдельные бандлы, поправили конфигурации сборки. В результате:

  • количество модулей в приложении перестало влиять на скорость его запуска;

  • размер приложения уменьшился примерно на 30%;

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

Цифры подскажут, куда двигаться дальше

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

  • автоматизация работы с графом зависимостей: следите за графом, сделайте так, чтобы было легко понять, что от чего зависит и где на графе узкие места;

  • уменьшение нагрузки на CI за счёт фильтрации проверяемых модулей и умных тестов: не попадайтесь в ловушку прямой зависимости продолжительности CI-проверок от количества модулей;

  • статическая линковка: скорее всего, вам придётся перейти на статическое связывание, так как уже к 50-60 модулям регресс в скорости запуска приложения станет заметен не только вам, но и вашим менеджерам.

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

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

Поэтому у нас есть график среднего времени сборки наших приложений на компьютерах разработчиков:

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

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

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

Кроме того, мы стали понимать, какое оборудование ещё подходит для работы над нашим проектом, а с каким пришло время прощаться.

Например, видно, что iMac Pro 5K 2017 года выпуска не лучшее железо для сборки Badoo, в то время как MacBook Pro 15 2018 года ещё вполне неплох.

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

Измеряем время сборки

Чтобы получать данные о продолжительности сборки на компьютерах разработчиков, мы создали специальное macOS-приложение Zuck. Оно сидит в статус-баре и следит за всеми xcactivitylog-файлами в DerivedData. xcactivitylog файлы, которые содержат ту же информацию, которую мы видим в билд-логах Xcode в непростом для парсинга формате от Apple. По ним можно понять, когда началась и закончилась сборка отдельного модуля и в какой последовательности они собирались.

В утилите есть white- и black-листы, так что мы отслеживаем только рабочие проекты. Если разработчик скачал демо-проект какой-то библиотеки с GitHub, мы не будем отправлять данные о её сборке куда-либо.

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

P. S. Мы дорабатываем Zuck, чтобы выпустить его в open source.

В целом измерение локального времени сборки даёт важные результаты:

  • мы измеряем влияние изменений на разработчиков;

  • имеем возможность сравнивать чистые и инкрементальные сборки;

  • знаем, что надо улучшить;

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

Далее я приведу краткую сводку метрик, за которыми нужно следить, если вы начали двигаться в сторону модуляризации:

  1. Время запуска приложения. Последние версии Xcode предоставляют эту информацию в разделе Organizer. Метрика быстро укажет на появившиеся проблемы.

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

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

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

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

Заключение

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

  1. Всего сейчас у нас работают 43 iOS-разработчика.

  2. Четыре из них в Core-команде.

  3. Сейчас у нас два основных приложения и N экспериментальных.

  4. Около 2 миллионов строк кода.

  5. Около 78% из них находятся в модулях.

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

В двух статьях я рекламировал вам модуляризацию, но, конечно, у неё есть свои минусы:

  • усложнение процессов: вам придётся решить ряд вопросов в процессах как вашего департамента и рядовых iOS-разработчиков, так и во взаимодействии с другими департаментами: QA, CI, менеджерами продуктов и т. д.;

  • в процессе перехода на модуляризацию вскроются проблемы, которых вы не ждали, всё не предусмотреть: возможно, потребуются дополнительные ресурсы и других команд;

  • всё, что вы построите, будет нуждаться в дополнительной поддержке: процессы, новые внутренние инструменты кто-то должен будет за это отвечать;

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

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

О плюсах модуляризации уже было сказано, но я повторюсь:

  • гибкое масштабирование iOS-разработки: новые команды начинают работать в своих модулях, подход к созданию и поддержке которых унифицирован;

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

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

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

Подробнее..

Почему тестировщиков джун, мидл и сеньор не существует. Или как мы уже 10 лет работаем без грейдов

03.09.2020 20:17:52 | Автор: admin


Привет, Хабр! Меня зовут Женя. Десять лет назад я стартанул агентство аутсорс-тестирования Кавычки. У нас в компании нет и никогда не было деления тестировщиков на джунов, мидлов и сеньоров. Хотя были попытки. Расскажу, почему так получилось и как можно жить без грейдов.

Спойлер: жить не тужить

Disclaimer


Многие IT-компании используют грейды (они же градации, ранги, классификации и т. д.) такой способ поиска, оценки и мотивации людей. Окей, система выглядит вполне логичной. Если ты мидл ты должен знать вот это, уметь вот это, а твоя зарплатная вилка вот такая. И было бы всем счастье, если бы это действительно работало.

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

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

Откуда ноги грейды растут или немного лирики


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

image
Непонятная схема или пример подстановочных таблиц (по Hay Job Evaluation and Profile Method)

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

В IT система грейдов по классике состоит из трехуровневой модели джун, мидл и сеньор. Правда, встречаются и более замороченные варианты: джуниор+, мидл+, мидл++ для знатных приверженцев грейдов. Часто компании формируют необходимый перечень навыков и подстраивают грейды под себя. Как итог на рынке много джунов, мидлов и сеньоров, но все они разные. И из-за этого и появляются запросы на грейд уровня + или ++. Потому что хрен ты сможешь оценить специалиста точно в указанные рамки. И вот здесь начинается Адъ и Израиль.

Что не так с грейдами


Первое, чо я понял их не существует

Когда я начал нанимать ребят в штат, то все чаще сталкивался с одной и той же ситуацией. На собеседование приходит человек с большим опытом на прошлом месте он был на позиции сеньор. Он хочет за свою работу высокую з/п, ведь он сеньор. Тогда я прошу его рассказать, за что он хочет такие деньги, что он умеет? В итоге понимаю, что знаю гораздо больше, но работаю за меньшие деньги. И опыт на тот момент у меня был небольшой около 5 лет. Тогда кто я, если обладаю большим объемом знаний, чем сеньор в тестировании? Может быть, дурак, который дёшево себя продает? Или, получается, что объективных градацией для меня просто не существует. Возможно, уровень сеньор должен определяться тем, что человек может решить любую задачу, потому что он не только имеет опыт, но и склад ума к solving problems. Посмотрим на это ниже.

Но я же мидлили нет?

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



Что мы получаем:

  • Система грейдов негибкая и необъективная

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

  • Грейд ничего не говорит о настоящем уровне знаний

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

  • Грейды ограничивают

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

  • Грейды всех путают

При поиске работы многие люди осознанно выбирают вакансии не по уровню знаний и навыков, а по размеру зарплаты, которая как бы соответствуют их грейду. Итог: разочаровываются обе стороны.



Окей, тогда как оценивать работу


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

По каким параметрам оценивать сотрудника:

  • количество задач, которые он может взять;
  • уровень сложности, неопределенности и стоимость этих задач;
  • востребованность навыков, которыми он владеет;
  • общая прибыль компании.

Как это работает у нас: мы предоставляем клиенту команду тестировщиков на проект. Поэтому на собеседовании мы смотрим на навыки тестировщика и сопоставляем, на каких проектах можем их применить и под какие задачи. У нас есть диапазон з/п, в разрезе которого мы готовы обсуждать оклад. В этом диапазоне мы и определяем фикс в зависимости от проектов, на которых тестировщик сможет работать.

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

А что с мотивацией и ростом


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

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

  • Чтобы увеличить з/п, нужно постоянно учиться, прокачивать навыки.

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

  • Чтобы увеличить з/п, должна быть возможность взять новый проект или более сложный.

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

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

Как-то все слишком красиво, где боль


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



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

Что еще важно или история про понты


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

Сказал а, говори б. Окей, вот история из жизни:

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

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


Занавес.

Ну вот как работать с человеком, который будет делать только то, что ему нравится? Как он будет развиваться и узнавать что-то новое? Какая мне разница сеньор он или не сеньор, если он не может сделать то, что нужно проекту?

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

Как стать тестировщиком или что я узнал за время становления на этот путь?

16.01.2021 16:12:10 | Автор: admin

Привет Хабр! В этот пост я хочу вынести опыт на тему начинания в сфере тестирования. Здесь не будут описаны техники и правила - это уже давно есть не только на Хабре и полно учебных курсов как платных, так и бесплатных.

Картинка взята с Я.ДзенКартинка взята с Я.Дзен

Я захотел стать тестировщиком

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

Я решил стать тестировщиком

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

Картинка взята с blog.noveogroup.comКартинка взята с blog.noveogroup.com

Правда, в просто потребляйте информацию есть огромная проблема. Она заключается в том, что многие ресурсы в каких-то вопросах дают разные ответы. Я бы посоветовал так - изучите информацию на основе какого-то авторитетного определённого ресурса и далее на собеседованиях говорите: согласно {наименование_ресурса} я понимаю так... и тому подобное. Авторитетным ресурсом можно использовать книгу или сайты testbase.ru, software-testing.ru, а если есть желание, то можете изучать с помощью силлабуса ISTQB.

Инструменты

С чего начать? С Linux? Или Java? А может Docker?

Меня взяли в опытную команду без знаний всего что выше. На момент собеседований я что-то понимал и мог отвечать, но в команду взяли из-за софт скиллов и амбиций. Грубо говоря, меня взяли лишь за то какой я человек, подойду ли по ценностям команде и имею ли представления о работе; остальное (хард скиллс) я смогу получить уже в команде. Команде/компании дешевле научить работе с инструментами, чем исправить характер человека.

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

Опыт

Если всё замечательно с софт скиллами, выполняйте любые задачи для набивания руки. Пишите тест-кейсы к сайту 2ГИС, пишите код для автотестов на главной Яндекса. Неважно где писать, важно чтоб хоть что-то было и это важно для джуна самого.Будут ли рассматривать ваши наработки? Скорее всего, нет.

Хочтите чтоб кто-то проверил? Попробуйте написать в телеграм чат QA_Junior.

Резюме

Фото прекрасного резюме взял с okiseleva.blogspot.comФото прекрасного резюме взял с okiseleva.blogspot.com

Главное, указать именно релевантный опыт, умение работать с инструментами, знание технологий и описать всё ёмко. Если 10 лет работали в продажах и 2 года водителем, то об этом стоит написать в резюме, чтоб указать что работал, а не сидел на печи: 12 лет не релевантного опыта.

Собеседование

Прежде, чем идти на собеседование, учтите несколько фактов:

  • Тестировщик - это лицо помогающее бизнесу сэкономить денежные средства. Да-да, тестировщик помогает заработать больше и снизить риски потери денег бизнесу;

  • Тестировщик не бог и у него нет никакого права решать не выпускать продукт - мы тестировщики и наша задача протестировать да рассказать о результатах тестирования людям выше;

  • Тестировщик не нашёл/нашёл мало багов - это ничего не говорит об опыте сотрудника или качестве проверки продукта, качестве самого продукта;

  • Тестирование - это информация. Не более.

Задача тестировщика предоставить информацию о соответствии критериям качества, о проблемах, о рисках, о способах сделать лучше (если есть такие идеи) или снять боль с команды/пользователей. Но ключевое слово: предоставить информацию - автор телеграм канала Shoo and Endless Agony в чате QA juniors

Ссылки

Для ознакомления с работой тестировщика можно прочитать эту статью. Мне статья понравилась;

Обзор развития карьеры

Если уже решили стать тестировщиком, то есть курс от mail.ru, а точнее от Алексея Петрова (pifagor_mc), очень понравилась подача материала и это первое что следует посмотреть для становления;

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

Что должен уметь начинающий специалист расписано здесь в разделе С чего начать.

Ольга Назина (Киселёва) представляет примеры хорошего резюме. Очень многое можно в её блоге почитать про тестирование в целом;

Арсений Батыров, который составил резюме из предыдущей ссылки, рассказывает про составление резюме.

*В данном предложении моё мнение - это изучить инструменты более важнее для перспективы трудоустройства, чем трата времени на изучение работы маршрутизации в сети интернет или чем отличается WWW от интернет и прочее. НО! Первое, замечательно будет знать будущему тестировщику веб-сайтов принципы клиент серверной архитектуры - любые знания будут иметь вес для специалиста. Второе, со временем специалист познает основы, допустим, что такое API и чем отличается от UI во время изучения Postman.

Подробнее..

Recovery mode Как компании выбрать инструменты для дата-инженеров и не превратить всё в технологический зоопарк опыт PROFI.RU

21.08.2020 12:12:17 | Автор: admin
Редактор Нетологии побеседовала с тимлидом команды BI в Profi.ru Павлом Саяпиным о том, какие задачи решают дата-инженеры в его команде, что за инструменты для этого используют и как же всё-таки правильно подойти к выбору инструментария для решения дата-задач, в том числе нетипичных. Павел преподаватель на курсе Дата-инженер.

Чем занимаются дата-инженеры в Profi.ru


Profi.ru это сервис, который помогает встретиться клиентам и специалистам самых различных сфер. В базе сервиса более 900 тысяч специалистов по 700 видам услуг: репетиторы, мастера по ремонту, тренеры, мастера красоты, артисты и другие. Ежедневно регистрируется более 10 тысяч новых заказов всё это даёт порядка 100 млн событий в день. Поддерживать порядок в таком количестве данных невозможно без профессиональных дата-инженеров.

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

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


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


Место процесса Data Quality в общей структуре хранилища данных

Важное значение отводится пояснительной документации по работе с данными. Это упрощает работу и дата-инженера (не отвлекают вопросами), и пользователя данных (может сам найти ответы на свои вопросы). В Profi.ru такие документы собраны на внутреннем форуме.

Под удобством подразумевается в том числе скорость получения данных. Скорость = доступность в одном шаге, клике дашборде. Но на практике всё сложнее.

Тот же Tableau с точки зрения конечного пользователя дашборда не позволяет вывести все возможные измерения. Пользователь довольствуется теми фильтрами, что сделал разработчик дашборда. Это порождает два сценария:

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

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

Аккумулируют данные со всех источников в одном месте


Источники данных могут быть внутренними и внешними. Например, у кого-то бизнес зависит от погодных сводок, которые нужно собирать и хранить, от внешних источников.

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

Делают дашборды


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

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

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

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


Пример продакт-дашборда Profi.ru (один из листов). В целях конфиденциальности информации названия метрик и осей скрыты

Примеры реальных задач


Задача 1 перелить данные из исходных (операционных) систем в хранилище данных или ETL


Одна из рутинных задач дата-инженера.

Для этого могут использоваться:

  • самописные скрипты, запускаемые по cron или с помощью специального оркестровщика типа Airflow или Prefect;
  • ETL-решения с открытым кодом: Pentaho Data Integration, Talend Data Studio и другие;
  • проприетарные решения: Informatica PowerCenter, SSIS и другие;
  • облачные решение: Matillion, Panoply и другие.

В простом исполнении задача решается написанием YML-файла строк на 20. Занимает это минут 5.

В самом сложном случае, когда нужно добавить новый источник например, новую БД, может занимать до нескольких дней.

В Profi эта простая задача при отлаженном процессе состоит из следующих шагов:

  • Выяснить у заказчика, какие нужны данные и где они лежат.
  • Понять, есть ли доступы к этим данным.
  • Если доступов нет, запросить у админов.
  • Добавить новую ветку в Git с кодом задачи в Jira.
  • Создать миграцию на добавление данных в якорную модель через интерактивный Python-скрипт.
  • Добавить файлы прогрузок (YML-файл с описанием того, откуда данные берутся и в какую таблицу записываются).
  • Протестировать на стенде.
  • Залить данные в репозиторий.
  • Создать pull request.
  • Пройти код ревью.
  • После прохождения код-ревью данные заливаются в мастер-ветку и автоматически раскатываются в продуктив (CI/CD).

Задача 2 удобно разместить загруженные данные


Другая частая задача разместить загруженные данные так, чтобы конечному пользователю (или BI-инструменту) было удобно с ними работать и не приходилось делать лишних движений для выполнения большинства задач. То есть построить или обновить Dimension Data Store (DDS).

Для этого могут применяться решения из 1-й задачи, так как это также ETL-процесс. В самом простом варианте обновление DDS осуществляется с помощью SQL-скриптов.

Задача 3 из разряда нетипичных задач


В Profi зарождается стриминговая аналитика. Генерируется большое количество событий от продуктовых команд записываем их в ClickHouse. Но там нельзя вставлять записи по одной в большом количестве, поэтому приходится объединять записи в пачки. То есть писать напрямую нельзя нужен промежуточный обработчик.

Используем движок на базе Apache Flink. Пока порядок действий такой: движок обрабатывает входящий поток событий складывает их пачками в ClickHouse на ходу считает количество событий за 15 минут передаёт их сервису, который определяет, есть ли аномалии сравнивает со значениями за аналогичные 15 минут с глубиной в 3 месяца если есть, кидает оповещение в Slack.


Схема для фронтовой аналитики (часть загрузки)

Фреймворк Apache Flink гарантирует доставку как минимум один раз. Тем не менее появляется вероятность дубликатов. В случае с RabbitMQ это можно решить, используя Correlation ID. Тогда гарантируется единичная доставка целостность данных.

Считаем количество событий опять же с помощью Apache Flink, выводим через самописный дашборд, написанный на NodeJS, + фронт на ReactJS. Быстрый поиск не дал похожих решений. Да и сам код получился простым написание не заняло много времени.

Мониторинг скорее технический. Смотрим аномалии, чтобы на ранних стадиях предотвращать проблемы. Какие-то существенные глобальные метрики компании в мониторинг пока не входят, поскольку направление стриминговой аналитики находится на стадии формирования.

Основные инструменты дата-инженеров


С задачами дата-инженеров более-менее понятно, теперь немного об инструментах, которые используются для их решения. Конечно, инструменты в разных компаниях могут (и должны) отличаться всё зависит от объема данных, их скорости поступления и неоднородности. Также может зависеть от пристрастности специалиста к какому-то одному инструменту только потому, что он с ним работал и хорошо его знает. В Profi.ru остановились на таких вариантах

Для визуализации данных Tableau, Metabase


Tableau выбрали давно. Эта система позволяет оперативно анализировать большие массивы данных, при этом не требует затратного внедрения. Для нас он удобен, красив и привычен часто в нём работаем.

Про Metabase знают немногие, между тем для прототипирования он очень хорош.

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

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

Инструментов очень много просто найдите свой :-)

Для хранения данных ClickHouse, Vertica


ClickHouse бесплатный быстрый инструмент для хранения продуктовых событий. На нём аналитики сами делают обособленную аналитику (если им хватает данных) или дата-инженеры берут агрегаты и перезаливают их в Vertica для построения витрин.

Vertica крутой удобный продукт для отображения конечных витрин.

Для управления потоками данных и проведения вычислений Airflow


Данные мы грузим через консольные инструменты. Например, через клиент, который идёт с MySQL, так получается быстрее.

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

Основной язык программирования Python


У Python намного ниже порог вхождения + в компании есть компетенции по этому языку. Другая причина под Airflow DAGи пишутся на Python. Эти скрипты просто обёртка над загрузками, основная работа делается через консольные скрипты.

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

Подход к выбору дата-инструментов что делать, чтобы не разводить технологический зоопарк


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

Технологический зоопарк это инструменты, которые выполняют одни и те же функции. Например, Kafka и RabbitMQ для обмена сообщениями или Grafana и Zeppelin для визуализации.


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

Также многие для личных целей могут использовать разные ETL-инструменты. В Profi как раз такая ситуация. Основной ETL на Airflow, но кто-то для личных прогрузок использует Pentaho. Они тестируют гипотезы, и через инженеров эти данные им прогонять не нужно. В основном инструменты самообслуживания используют достаточно опытные специалисты, которые занимаются исследовательской деятельностью изучают новые пути развития продукта. Набор их данных для анализа интересен в основном им, к тому же, он постоянно меняется. Соответственно нет смысла заносить эти прогрузки в основную платформу.

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

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

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

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

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

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

Выбор инструмента наполовину прыжок веры, наполовину личный опыт. Нет полной уверенности, что инструмент подойдёт.

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

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

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

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

Если говорить о подходе к выбору, то в Profi придерживаются таких принципов:

  • Не принимать решение в одиночку. Когда человек что-то выбирает, он автоматически убеждён в своей правоте. Другое дело убедить других, когда нужно привести серьёзные доводы в защиту. Это помогает в том числе увидеть слабые стороны инструмента.
  • Советоваться с главным специалистом по данным (диалог по вертикали). Это может быть главный дата-инженер (Chief Data Engineer), руководитель BI-команды. Топы видят ситуацию более широко.
  • Общаться с другими командами (диалог по горизонтали). Какие инструменты они используют и насколько удачно. Возможно, инструмент коллег может решить и ваши задачи и не придётся устраивать зоопарк решений.


Внутренние компетенции как эффективная замена внешнему поставщику услуг


Подходом к выбору инструментов можно считать и использование внутренних компетенций компании.

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

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

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

В Profi внедрение BI было in-house. Основная сложность была в том, что бизнес хотел запустить BI быстро. Но на построение такого проекта требовалось время: нарастить компетенции, залить данные, построить удобную схему хранилища, выбрать инструменты и освоить их.

Основная горячая фаза, когда всё строилось и кристаллизовывалось, длилась где-то год. А развивается проект до сих пор.

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

С большой болью мы переделывали большую часть проекта, которую пришлось тогда сделать по-быстрому.

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

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

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

Если кто хочет поделиться решением третьей задачки из описанных выше welcome :-)
Подробнее..

Категории

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

  • Имя: Макс
    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