Серия «Карьера в IT. Системный аналитик.»

Завышение стажа в резюме в IT: работает или нет?

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

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

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

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

Как это работает?

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

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

Поэтому данный способ достаточно часто срабатывает в плюс и ты начинаешь получать офферы.

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

❕Однако, лично мое мнение в том, что не нужно перебарщивать. Я имею ввиду то, что если у вас совсем нет опыта - не нужно сразу устраиваться на миддла или сеньора, накручивая слишком большой опыт (такое, судя по некоторым историям, тоже реально).

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

Поэтому единственный совет - подходите ко всему разумно.

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

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

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

Показать полностью

Бонус. Как искать работу без релеватного опыта / Часть 1

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

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

Далее от ее лица.

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

(1) резюме могут закинуть по разным чатам и потом, чтобы найти работу, придется менять еще и фамилию (внутри одной сферы обычно тесно общаются и репутация дорога)

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

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

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

!(4) и что-то новенькое: hh.ru, на котором размещаются резюме, начал проверять точность информации и связываться с работодателями.

Поэтому поговорим о том, как можно привлечь внимание к себе, чтобы потом не уволили, как в этом случае:

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

(2) Использовать нетворкинг - знакомиться с людьми, которые работают в тех компаниях, куда вы хотите. Даже просто написать и попросить зарефералить. Теория с рукопожатиями тоже работает (у меня так много клиентов и знакомых нашли работу)

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

(3) Резюме должно быть продумано до мелочей, из самого базового:

➡️ название должности должно соответствовать названиям вакансий, т.е не "специалист", а максимально конкретно;

➡️на первом месте должен быть опыт по той вакансии, на которую вы хотите, даже если это учебный опыт;

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

(4) Брать из предыдущего опыта все навыки, которые могут быть полезны. Смена направления — это не начинать с нуля, всегда есть переносимые навыки. Например, опыт ведения коммуникации и работа в команде, который есть у всех, и другие soft skills. Успех поиска 50/50 зависит от hard и soft skills.

(5) Использовать сопроводительные письма и писать вдумчивые отклики на позиции (спам-рассылка скорее всего не даст результата). А вот резюме + нормальное сопроводительное можно отправлять не только на hh, но и напрямую в компании, даже если вакансии нет, вас могут добавить в базу и написать позже.

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

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

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

Показать полностью

Карьера в IT. Системный аналитик, не номерная часть. Подходы к степени детализации и проработки ТЗ системным аналитиком

❕Сегодня хочу поговорить на очень спорную тему, я бы даже сказал философскую. Отчасти из-за нее, возникает очень много непонимания между коллегами, работающими в одном и том же (казалось бы) "АйТи", но почему-то имеющих очень разное представление о процессах разработки и о том, что каждая роль команды должна выполнять. Особенно это часто всплывает в моих постах на этом ресурсе, в комментариях - это такой хороший срез из разных уголков нашего отечественного IT.

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

Давайте поговорим о том, какие есть подходы к написанию ТЗ и степени его проработки на примере описания тех же микросервисов\их методов.

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

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

Какие есть варианты написания ТЗ для данной задачи?

1️⃣Самый минимальный уровень детализации. Это когда системный аналитик просто ставит задачу на разработку Джире (ну или в рамках небольшой страничке в конфлю\ворде, в зависимости от того, как принято) и в постановке этой задачи пишет что-то вроде "Требуется реализовать процесс получения данных о пользователе и передачу ее с бэка на фронт по REST-запросу. Со стороны фронта требуется создать новую экранную форму приложения - "Личный кабинет" или "Профиль пользователя". Со стороны бэка требуется реализовать новый метод, который будет использовать фронт для запроса информацию по пользователю (и, скорее всего, перечисляет набор полей, которые должны передаваться на фронт в формате "Фамилия", "Имя" и т.д.)". Усё

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

2️⃣Вариант с немного лучшей детализацией. В этом формате системный аналитик уже пишет ТЗ в каком-либо формате, в рамках которого указывает, что: "Требуется реализовать новый метод GET /users/{id}, указывает полноценно параметры, которые данный метод должен потреблять на вход и параметры, которые он должен отдавать на выходе." Плюс может описать, также как в предыдущем пункте, верхнеуровневый сценарий взаимодействия с этим методом.

Уже чуть лучше и чуть больше полезной информации для разработчика, правда?

3️⃣Вариант с достойной реализацией. Этот вариант обычно используется на большинстве проектов ФинТеховских и я считаю его достаточным для того, чтобы написать хорошее, качественное ТЗ и разгрузить разработчика так, чтобы он не думал о деталях реализации, хотя бы алгоритмических и системных (то, к чему нужно стремиться со стороны СА, имхо).

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

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

4️⃣Более полноценный вариант придумать не могу =)

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

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

А если это все еще и использовать в связке с asciidoc-документацией, выкладывании ее в git- ммм, сказка просто. Как вспоминаю об этих процессах, наворачивается скупая слеза ностальгии - как же это было здорово! Жаль, что я встретил это ровно в одном проекте, а во всех последующих так и не смог продавить внедрение чего-то похожего.

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

А с какими процессами и подходами работаете вы?

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть огромное количество постов на тему софт-, хард-скиллов и про карьеру в целом - см. закрепленный дайджест.

Показать полностью

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

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

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

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

Более техническая часть собеса:

  1. Архитектурно-интеграционные вопросы:

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

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

    3. Что такое REST? Какие основные принципы у него есть? Какие методы есть в REST? В чем разница между GET и POST запросом?

    4. В каких местах (четырех) мы можем передать атрибуты в запросе? (Path, Body, Query, Header).

    5. Что вы знаете про концепцию CRUD?

    6. Что такое идемпотентность? Какие методы являются идемпотентными?

    7. Что такое синхронные и асинхронные интеграции? В чем между ними разницы? С помощью чего можно их реализовать?

    8. Можно ли реализовать асинхронную интеграцию через REST? (Вряд ли этот вопрос будут задавать, если вы не ответите на предыдущие. Это скорее со звездочкой и не обязательный)

    9. Что такое очередь сообщений? Как передаются сообщения через очередь? Какие очереди сообщений есть и в чем между ними разница? (Если расскажете про PUSH/PULL-стратегии - плюсик в карму обеспечен)

    10. Что такое гарантированная доставка сообщений и какими механизмами ее можно обеспечить?

    11. Какие вообще способы интеграции существуют? С какими из них приходилось работать? В чем их преимущества и недостатки? (Интеграция через обмен файлами, через общую БД, через веб-сервисы и обмен сообщениями)

  2. Базы данных:

    1. Что такое базы данных? Какими они бывают? С каким БД приходилось работать?

    2. Что такое ER-диаграммы? Приходилось ли их проектировать?

    3. На какой уровень оцениваете свой уровень владения SQL? С какими инструментами по работе с БД знакомы?

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

  3. Различные задачки:

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

  4. Небольшие оффтопные вопросы:

    1. Расскажите, что такое авторизация, аутентификация и идентификация? Чем они отличаются друг от друга? (почему-то один из самых любимых вопросов некоторых людей)

    2. Чем верификация отличается от валидации?

    3. Приходилось ли работать с JIRA\Confluence?

Конечно, так получается, что если вы знаете ответы на все эти вопросы, или больше 80-90%, то как будто бы вы уже не джун. Но чем лучше вы отвечаете, чем лучше вы соответственно подготовились - тем больше вам зададут вопросов (в нормальном интервью, а не шаблонном). Что очень сильно повысит ваши шансы получить оффер и выделиться среди других кандидатов.

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

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть огромное количество постов на тему софт-,хард-скиллов и про карьеру в целом - см. закрепленный дайджест.

Показать полностью

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

Всем привет!

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

Список тем и вопросов к ним:

  1. Методологии разработки ПО и жизненный цикл разработки ПО.

    1. Какие методологии разработки вы знаете? (Тут нужно рассказать про эджайл, водопад хотя бы. Можно и про остальные упомянуть, но обычно не требуется).

    2. В чем отличия между ними? Какие у них есть особенности?

    3. Расскажите про жизненный цикл разработки ПО. Какие этапы проходит задача\продукт до выхода в прод? (Лучше рассказывать своими словами, просто как понимаете)

    4. Расскажите про состав команды разработки - какие есть позиции и какие функции выполняет каждая из них? Какую роль выполняет системный аналитик? (Кстати, очень "забавно", но когда собесил людей на стажировку СА и даже некоторых джунов - много кто не смог толком ответить на последний вопрос. Т.е. люди банально даже не погуглили хоть чуть-чуть и не проходили по первым ссылкам гугла, чтобы немного подготовиться к собесу и понять куда они вообще идут. Про какую уж тут позицию СА можно говорить - не надо так)

  2. Требования.

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

    2. Какие качества требований вы знаете? Приведите пример требования, которое удовлетворяет всем качествам.

    3. Какие методологии сбора требований вы знаете? Какими из них пользовались?

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

    5. Вопрос со звездочкой. Как вы думаете, есть ли прямое влияние методологий разработки на требования? Какое? (Спойлер - есть)

    6. Какими инструментами для фиксирования требований вы пользовались? Какие в принципе существуют? (Тут есть достаточное разнообразие инструментов - от ворда и согласований ТЗ по почте до связки asciidoc + git. Дефолт - это jira\confluence)

    7. Как определить, что задача успешно вышла в прод? (Тут просто на рассуждение. Можно сказать, что признаки успешности - отсутствие инцидентов на проде, положительные фидбеки от пользователей, стабильность работы системы и вот это всё)

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

  3. Диаграммы.

    1. Какие нотации вы знаете? (UML\BPMN\IDEF0 и вот это всё)

    2. Какие виды UML-диаграмм вы знаете? Для чего они предназначены? (Тут тонкий момент, что если вас начнут спрашивать, а какие вы знаете типы стрелочек и когда какую применять - имхо это уже эребор и не нужно это знать наизусть. Я, например, не знаю, хотя регулярно это использую и обучаю - всегда можно за 30 секунду загуглить это. Но общую теорию по типам диаграмм надо знать)

    3. Что вы знаете о BPMN, для чего эта нотация нужна? Приходилось ли использовать на практике?

    4. В чем отличия между этими нотациями? Какие у них преимущества?

    5. Могут показать, как вариант, какую-нибудь схему и спросить что на ней нарисовано. Такой подход мне нравится.

  4. UC\US.

    1. Что такое пользовательские истории? Приведите шаблон, по которому они составляются и пару произвольных примеров.

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

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

Почти на все эти вопросы вы можете найти ответы в этой серии постов.

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

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

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

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

В следующей части перейдем к списку вопросов уже по хард-скиллам.

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.

Показать полностью

Карьера в IT. Системный аналитик, часть 8.3. Пример ТЗ для описания метода POST

Всем привет!

Я, наконец, смог оторваться от BG 3, поэтому продолжаем разбираться в системном анализе.

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

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

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

  • Получать список пользователей целиком или по заданным параметрам фильтрации;

  • Открывать карточку пользователя (детальную информацию по нему);

  • Редактировать ее по необходимости;

  • Удалять пользователя (или физически объект целиком, но это скорее редкость, или просто помечать его удаленным или неактивным);

  • Создавать нового пользователя.

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

  • GET /users

  • GET /users/{userId}

  • PUT /users/{userId}

  • DELETE /users/{userId}

  • POST /users

Т.е. по сути реализуем концепцию CRUD по отношению к ресурсу User.

То, как описать метод GET /users/{userId} мы рассмотрели в прошлый раз, сегодня рассмотрим метод POST /users.

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

Карьера в IT. Системный аналитик, часть 8.3. Пример ТЗ для описания метода POST Пост, Карьера, IT, Системный анализ, Обучение, Профессия, Поиск работы, Текст, Длиннопост, Системные требования, Техническое задание, Удаленная работа

Ссылка на конфлю кому нужно, пока он еще работает.

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

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

В рамках данного шаблона есть немного кастомных вещей, свойственных для моих проектов. Например, вот эта вот "Ссылка на userGroup", это означает FK на таблицу на таблицу USER_GROUP и связку с соответствующим объектом. А атрибут role с ссылкой в типе на ref.Roles это enum (справочник). Т.е. атрибут может принимать только одно из значений из списка:

Карьера в IT. Системный аналитик, часть 8.3. Пример ТЗ для описания метода POST Пост, Карьера, IT, Системный анализ, Обучение, Профессия, Поиск работы, Текст, Длиннопост, Системные требования, Техническое задание, Удаленная работа

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

С моделью данных разобрались, это нам поможет при описании метода в том числе.

Описание самого метода (ссылка на конфлю):

Карьера в IT. Системный аналитик, часть 8.3. Пример ТЗ для описания метода POST Пост, Карьера, IT, Системный анализ, Обучение, Профессия, Поиск работы, Текст, Длиннопост, Системные требования, Техническое задание, Удаленная работа
Карьера в IT. Системный аналитик, часть 8.3. Пример ТЗ для описания метода POST Пост, Карьера, IT, Системный анализ, Обучение, Профессия, Поиск работы, Текст, Длиннопост, Системные требования, Техническое задание, Удаленная работа

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

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

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

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

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

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.

Показать полностью 4

Карьера в IT. Системный аналитик, не номерная часть. Моё видение правильного workflow задачи на разработку

Всем привет.

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

В следующем посте разберу какой-нибудь чуть более сложный пример ТЗ для POST метода, заодно покажу один из шаблонов того, как можно описывать модель данных. И когда-нибудь созрею и расскажу про то, как мы использовали связку asciidoc + git для ведения документации.

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

Проработка задачи со стороны заказчика

Всё должно начинаться с ключевого лица в данном процессе - заказчика. Он должен сформулировать постановку задачи и ее цель (хотя бы попытаться). На одном из проектов бизнес-заказчики писали BRD (Business Requirements Document), в котором излагались ключевые требования к задаче, ее экономическое обоснование и различные пожелания к итоговому результату.

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

Бизнес-анализ

Дальше должен идти этап бизнес-анализа задачи, в результате которого должны появится качественные БТ (бизнес-требования), в которых детально описано то, как процесс нужно изменить, чтобы выполнить цели задачи. Как именно это будет описано - уже не важно, хоть через AS IS\TO BE, хоть простым русским языком.

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

Проработка архитектуры

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

Опять же, на одном из проектов был процесс, когда архитекторы системы оценивали КАЖДУЮ задачу и даже если она была небольшой, то не писали больших документов, а прям в JIRA писали краткое архитектурное заключение о том, какие процессы требуется доработать (и это было прям хорошо, заметно снизило количество кросскомандных недоработок).

Системный анализ

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

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

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

Разработка

Разработчику также много проще разрабатывать задачу, когда есть не только ТЗ, но и различные документы более верхнеуровневого характера (сужу по фидбекам коллег).

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

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

А вот тут интересно. Потому что хороший тестировщик не будет ориентироваться только на ТЗ - он еще просмотрит BRD, БТ - сверит то что там написано с тем, что написано в ТЗ, потенциально выявит недостаток требований или их некорректность (было такое на практике) и только потом уже приступит непосредственно к тестированию.

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

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

Заключение

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

Если же проект маленький или просто нет позиций PO\БА\АР и вот этого всего многообразия ролей, то вспоминаем что я говорил в самом начале серии постов про системного аналитика - что это человек, который может совместить в себе все эти роли и обязанности, проделать сбор требований, бизнес-анализ, архитектуру и системный анализ самостоятельно и потом выдать удобоваримое, комплексное ТЗ разработчику. И сначала это даже интересно, сильно прогрессируешь в компетенциях, но только сначала)

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

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.

Показать полностью

Угадайте звездного капитана юмористической команды «Сборная Красноярска» по описанию одного из участников

Ну что, потренировались? А теперь пора браться за дело всерьез.

Показать полностью

Карьера в IT. Системный аналитик, часть 8.2. Best Practices, которые стоит использовать при проектировании REST API

Всем привет.

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

Но тут стоит уточнить, что все те подходы (разные), по которым мы проектируем сервисы - они разные как раз потому, что нет единых mandatory правил к архитектуре приложений, которым если не следуешь - твоя система ломается и больше никогда в жизни не заработает, даже если ты исправишь ее. Есть лишь РЕКОМЕНДАЦИИ, а их многие интерпретируют по-разному и это тоже нормально. Для кого-то свойственно не использовать коды ошибок вообще и передавать их в теле ответа с HTTP 200, для кого-то нет. Ни один из этих подходов не является не правильным.

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

Да, можно уже прям сейчас кидать тапками.

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

1. Имя endpoint'а - это существительное, а не глагол. Это одна из самых распространенных ошибок, которые я когда либо встречал (и сам совершал, естественно). Например, было в моей практике и такое - POST /generateMultipleDocument.

Тут важно понимать, что метод - это уже глагол и еще раз дублировать его в наименовании эндпоинта не нужно.

В идеале, в данном варианте будет POST /documents

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

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

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

Например, вот так:

/documents

/documents/{documentId}

Вместо:

/document

/document/{documentId}

1.2. Используйте "/" для обозначения иерархии и в принципе используйте вложенность ресурсов.

Например, если мы именуем наш ресурс, как users/{id}/playlists/{id}/songs - это значит у мы хотим работать со всеми песнями, конкретного плейлиста конкретного пользователя. И сразу понятна иерархичность этих ресурсов.

1.3. Не используйте "/" как закрывающий символ вашего URI.

Вариант users/{id}/playlists/{id}/songs сильно лучше, чем users/{id}/playlists/{id}/songs/

1.4. Используйте "-" для разделения составных слов.

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

Поэтому вместо /applications/{id}/creditcardhistory, куда лучше использовать /applications/{id}/credit-card-history.

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

Например:

host/v2/documents вместо host/v1/documents после внесения мажорной доработки.

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

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

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

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

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

3. Используйте пагинацию.

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

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

4. Используйте коды ответов HTTP правильно и эффективно.
Их достаточно много (https://developer.mozilla.org/ru/docs/Web/HTTP/Status) и их можно использовать по назначению. Все знать и использовать не обязательно, но вот примеры их использования

Использовать 201 "Created", вместо 200 "OK", в случае если вы в POST действительно создаете какой-то ресурс. Используется только в POST (ну и в PUT, в ряде частных случаев).

Использовать 204 "No Content", вместо 200 "OK" для DELETE. Это ответ на успешный запрос и он не будет возвращать тело, что и не нужно для данного метода.

Не забывайте использовать 401 "Unauthorized", 403 "Forbidden" и 404 "Not found" вместо безликого 400 "Bad Request", когда это уместно. Как правило 400 кодом пользуются когда нужно ответить на какую-то ошибку валидации или в случае возникновения бизнесовой ошибки, которую вы заранее можете предсказать (очень настоятельно рекомендую хотя бы дополнять код ответа еще и кодом бизнесовой ошибки в этом случае и желательно ее текстом (error.code и error.message соответственно).

Для валидации желательно тоже).

А для всего остального можно и специальные коды использовать.

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.

Показать полностью
Отличная работа, все прочитано!