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

Всем доброго дня
Долго думал писать этот пост или нет. Всю свою сознательную жизнь у меня в голове была цель в 100 тысяч рублей зарплаты за адекватную работу. И вот в этом году я эту планку преодолел, вышел на уровень официальной зп, при рабочей неделе 5/2, в 130т.р. С одной стороны я выполнил свою маленькую цель, к которой стремился, ведь всего лишь 4 года назад моя зп была 20 т.р.
А с другой стороны, ну получаю я две средние зп по региону, ну и что изменилось?
Купить новый автомобиль я не могу в виду сумашедших цен, брать кредит под 20 процентов за 10 летний а/м на 5 лет? Ну тоже такое себе удовольствие
О недвижимости вообще молчу, однакомнатные квартиры по 4-5 миллионов, дома в частном секторе за эти же деньги
Заводить семью и рожать детей?
Слетать в отпуск за границу раз в год?
И по итогу, моё поколение попало в очень интересную ситуацию, а мне нет и 30, тот возраст, когда ничего не доступно, даже при условии хорошей работы. Возможно в нашей стране дальше будет лучше, но с этим временем уйдёт и молодость, и здоровье, и желание.
Пост просто, чтобы выговориться, благодарю.
Хеллоу, ребят. Обратились ко мне граждане одни, с целью сделать новую каретку для какого-то специализированного станка. Ну типа они уже обращались к какому-то профессионалу, а получилось не очень. Давай, говорят, может ты попробуешь... Ну давай, попробую. Чо нет-то?
Для затравочки - что получилось:
А теперь, как оно, собственно сделано. Сперва, отпилил на ленточке кусок бревна. Это была ось от вагона, если я правильно понял. Диаметр 190мм. Хорошая такая.
Потом на токарнике ободрал ржавые корки и заторцевал как чисто.
Потом ещё отпилил кусок от неё и после непродолжительных ласк на плоскошлифе, чтобы сделать нужные плоскости перпендикулярными, параллельными и чистыми - ставлю на эрозию.
Полученную заготовку поставил на шлифер чтобы дать плоское и профильное шлифование. Предварительно, ессесно, обкатав по индикатору.
Потом было ещё пара переворотов на эрозии, подшлифовка промежуточная и всё такое.
Ну и, собсна, вот - неповторимый оригинал, к которому я стремился... Тут работа мастера - оно понятно. Такого не достичь.
И то, что получилось на выходе у меня.
А оригинал, непосредственно, выглядел вот так:
Как-то так, мальчики и девочки. Если кому интересно вот это всё тоже самое, только в режиме онлайн прям - в профиле телегоканал имеется.
Всем привет. Мой предыдущий пост, как мне кажется, получил огромный отклик. Его добавили в сохраненное только на Пикабу более 5000 человек, более 1500 репостов в ВК и более 750 комментариев, которые разворачивались в дискуссии. А также на меня подписалось около 300 человек. Тема, как выяснилось, оказалась актуальной, и интересной людям.
Я обещал ответить на вопросы, дать комментарии и поделиться ссылками и материалами, которые помогли именно мне. Обещал – отвечаю и делюсь :)
Ещё раз хочу подчеркнуть, всё что будет ниже - является сугубо моим личным мнением и опытом. Это не будет являться гайдом «как войти в айти с двух ног за 3 месяца». Моё мнение + возможно, рекомендации. Я могу быть где-то не прав, буду рад если более опытные коллеги меня поправят.
Курсы
Весь мой негатив в сторону курсов был направлен на распиаренные и разрекламированные курсы на всем известных площадках. Те самые, которые пестрят лозунгами «Легче всего попасть в IT через тестирование, мозгов не надо, 10 месяцев и мы тебя устроим на работу». Есть определенный процент людей, которые успешно заканчивают такие курсы и находят работу, повторюсь, среди моих друзей и знакомых таких людей нет.
В самом начале пути я почти купил курс на ЯП за ~75к на системного аналитика. Но ознакомившись с программой курса я понял, что 70% из предлагаемого я уже знаю и делал, остальные 30% смогу добить в бесплатных источниках. Около двух месяцев мне настырно названивали и пытались впарить (другого слова не подобрал) этот курс. Агрессивный маркетинг только усилил мою негативную позицию.
Я ничего не имею против платных и полезных курсов, и мне не жалко заплатить за повышение своей квалификации, часть таких курсов также оплачивает мой работодатель. Но они не имеют ничего общего с ЯП, ГБ и прочими. Рекламировать платные узконаправленные курсы не вижу смысла, когда они вам понадобятся – вас или на работе отправят учиться или вы уже сами будете знать чему и где вы хотите подучиться.
Образование.
Высшее образование (ВО) по моему мнению не является обязательным фактором при устройстве на работу, за исключением, наверное, сферы информационной безопасности, госконтор, и личного желания отдельных личностей видеть кандидатов с ВО. Бизнесу нужно чтобы твои знания превращались в его деньги. Если ты сможешь сделать это без корочки – работодателя не будет волновать её наличие. Я знаю людей, которые с зарплатами от 200 до 400 работают в IT-блоках крупных банков и не имеют высшего образования.
Про качество образования можно много рассуждать, но все мои знакомые кто заканчивал профильные ВУЗы отмечали лишь то, что полученные знания им не пригодились. Всему, чему нужно было научиться – они научились на работе. У кого-то уже был диплом, кто-то специально пошел получать ВО для того, чтобы иметь возможность уехать на ПМЖ в другую страну.
Про то что ВО бесполезно, я не говорю. Некоторые работодатели более лояльно относятся к кандидатам с ВО. В Университетах мы учимся учиться и выполнять бестолковые задачи в сжатые сроки. Но поступать в ВУЗ и учиться там 5 лет только для того, чтобы сменить сферу деятельности на IT – сомнительная затея.
Материалы, книги, курсы и полезные ссылки
Теперь же, по просьбам подписавшихся на меня людей делюсь тем, что помогло именно мне. Это не реклама, не гайд, это мой личный опыт.
Для того чтобы погрузиться в мир единичек и ноликов, было бы очень полезно понять почему именно 1, почему именно 0, и как оно всё работает. В этом помогает разобраться книга Чарльза Петцольда «Код: Тайный язык информатики». Купил бумажное издание, прочитал 2 раза. Мне очень нравится. https://www.litres.ru/book/charlz-petcold/kod-taynyy-yazyk-informatiki-48447357/
Стоит обратить внимание на канал Kontur Academy. Половину курсов на канале я точно просмотрел. Есть как базовые вещи, так и продвинутые @konturacademy1485/
По сетям мне понравился курс Андрея Созыкина. На канале также каждый сможет найти для себя что-то полезное @AndreySozykin/playlists
Перечень ссылок на общие темы хотелось бы закончить одной из самых полезных для меня ссылок. Букварь по дизайну систем - https://github.com/donnemartin/system-design-primer . Там и про сети, и про балансировку, и про микросервисную архитектуру и еще про много чего полезного.
Я не владею английским на достаточно хорошем уровне, который позволял бы мне читать всю техническую документацию и статьи без переводчика, поэтому пользуюсь расширением для Chrome “DeepL”.
Программирование
Для начала нужно для себя понять, чем вам хотелось бы заниматься. Писать мобильные приложения? Игры? Делать сайты? От этого будет зависеть выбор первого языка. Я начал со Swift. Даже купил б/у макбук для этих целей.
Swift. Книга Василия Усова «SWIFT. Основы разработки приложений под iOS, iPad OS, MacOS» - https://www.litres.ru/book/vasiliy-usov/swift-osnovy-razrabotki-prilozheniy-pod-ios-ipados-i-macos-pd-24426226/
HTML, CSS, JavaScript. Мне понравился канал Богдана Станчука. Почему-то именно он вызвал у меня доверие. Прошел видеокурсы HTML – 3 часа, JS – 11 часов. Есть информация и про Git и про Docker и 10 часовой курс по Python. Да и в целом достаточно большая концентрация полезностей на одном канале @Bogdan_Stashchuk
Python. Прошел курс https://stepik.org/course/58852/promo .
Советы, которые мне давали опытные разработчики примерно были одинаковыми:
Практики должно быть больше, чем теории, не нужно пытаться всё сразу выучить
Стараться постепенно изучать и само программирование. ООП, алгоритмы и т.д.
Пет-проект обязателен. Не нужно писать калькулятор в качестве пет-проекта. Ваш проект должен быть полезным. Если это приложение для мобилок – напишите то, чем будете пользоваться сами или порекомендуете друзьям. Планировщик заданий, менеджер паролей, может быть даже интернет-магазин. По мере обучения вы будете дорабатывать и улучшать свой проект. Я до пет-проекта так и не дошел.
Тестирование
Чтобы поступить на курс по тестированию (о нём в конце) мне хватило книги Романа Савина «Тестирование ДОТ КОМ». Кто-то считает эту книгу достаточно сомнительной, но мне хватило. Плюс смотрел канал Лёши Маршала, там есть отдельный плейлист «Тестировщик с нуля» @leshamarshal/playlists . В целом, на ютубе достаточно много такого контента, не думаю, что когда вам будут рассказывать о базовых вещах информация будет кардинально различаться. Выбирайте того, кого вам будет непротивно слушать.
Одним из лучших бесплатных курсов для QA я считаю The 100-Year QA-Textbook https://mentorpiece.education/textbook/ Узнал о нём примерно через год после того как нашёл работу, прошел большую часть для интереса и расширения кругозора. Есть версия на русском, но она неполная, дополняется по мере перевода. Это полностью структурированная информация начиная с базы (сети, sql, linux, HTTP, REST, API) заканчивая техниками тест-дизайна и работой с Docker. Создатели этой книги где-то даже говорили, что «всю эту информацию можно брать и продавать на своих курсах, только указывайте автора». Не исключено, что на курсах за 100+ тысяч вы будете учиться именно по этой книге.
Аналитика
Так как я рассматривал только системную аналитику – книга Карла Виггерса и Джой Битти «Разработка требования к программному обеспечению» https://www.chitai-gorod.ru/product/razrabotka-trebovaniy-k-programmnomu-obespecheniyu-2427772
Просто были сохранены в закладках эти ссылки про BPMN и UML. Поиск информации на эти темы не должен у вас вызвать трудности.
Техническое писательство
Не сильно много информации в интернете на эту тему, выделить могу только Семёна Факторовича. Канал на ютуб @documentatio/streams
Платные курсы я пока не проходил, но планирую https://documentat.io/courses/advanced-techwriting/
Бесплатные курсы
Я сам заканчивал курс QA: https://team.cft.ru/start/school
Вам на выбор: JAVA, ML, Support, QA, Android, ИБ, Аналитика, автотестирование и другие курсы.
Лучших студентов принимают на работу. Перечень доступных городов ограничен, и зависит от направления. Но вы же можете в анкете указать город, который подходит?)
10 из 40 учеников нашли работу. Причем половина из них – в других компаниях и городах. Лично знаю нескольких разработчиков, закончивших эти курсы и получивших работу в других компаниях. И это было абсолютно бесплатно и супер полезно.
Знаю существуют подобные бесплатные школы и от ВК, и от OZON, и в Альфа-Банке что-то есть. Но я ничего про них не знаю, поэтому и рассказывать не буду.
Простыня текста, по-моему, получилась еще длиннее, чем в прошлый раз, что-то наверняка упустил, о чем-то забыл рассказать, а что-то рассказал, но криво. Мог бы еще поделиться положительным опытом в создании резюме, если это будет кому-то интересно. Если вы хотите, чтобы именно я ответил вам в комментариях, пожалуйста тегайте через @. В прошлый раз я заблудился в сотнях комментариев и, к сожалению, не всем смог ответить :(
Добавлю от себя кой-чего, как человека, находящемся на среднем звене "пищевой цепочки", но с этим имеющего богатый опыт работы с новичками, как совсем юными, так и уже в виде состоявшихся на прошлых местах дядек (даже бывшие военные были).
Самое главное, но не самое первое, что должен сделать для себя падаван, - это изучить академисческую теорию. Да, сука, без нее ника и никуда, если вы, конечно же, хотите что-то там зарабатывать:
Если вы идете менеджеры, то тут общая литература - менеджмент проектов (но и разработку бы хорошо изучить хотя бы на уровне "чайника", дабы не возникало вопросов в стиле "Хули 4 дня на изменгение цвета кнопки?!".
Если идете в аналитики, то тут хорошо автор предыдущего поста описал, но аналитика бывает двух вариантов:
Аналитика данных - тут, да, БД учить, OLAP/OLTP, СУБД и тд. Хорошо бы еще теорию данных в целом подучить.
Аналитика проектов - это следующий этап развития PO/PM:
Бизнес-аналитка - вы думаете, как сделать систему лучше.
Системный анализ - вы думаете, как заставить системы лучше взаимодействовать.
Если идете в QA, то:
Есть ручное тестирование - с этого нужно начинать, т.к. это позволит въехать в область впринципе: кейзы, сценарии, уровни тестирования и тд.
Автотестирование - это уже разработка, ибо нужно писать код для автотестов разного уровня: функциональные, интеграционные, приемочные, и тд.
Есть еще целая сфера DevOps:
DBA - это специализация на конкретных БД, причем, не только на ее администрировании, но и на использовании, поэтому нужно не только знать саму СУБД, но и теории данных, SQL/noSQL нотации конкретной СУБД, механизмы отказоустойчивости и масштабирования.
Просто DevOps, которые раньше назывались "админами": тут нужно знать теории сетей и операционных систем, знать современные технологии базирования проектов: контейнеры, оркестраторы, CI/CD системы (для них, кстати, тоже нужен хотя бы один язык, часто: Питон или Ruby).
Т.н. "сетевики": персонал, специализирующийся на работе с сетями передачи данных. Тут, имхо, вряд ли можно попасть "после 30-ти".
Разработка. Тут нужно начинать с изучения компилируемых и интерпретируемых языков, их разницы. Почему-то сейчас считается, что "войти в Питон" или "войти во фронт" за полгода реально. Реально, на позицию стажера. А где вы видели позиции стажера? Я видел один раз в жизни. Поэтому нужно выбирать специализацию в ней развиваться, затарившись тонной литературы, начиная с теории данных, заканчивая, например, в случае C/C++ теорией компиляторов.
Бекенд. Это "прослойка" между системами хранения данных и фронтами (мобильным приложение, сайтом или другим бекендом). Тут - оболие всего и вся: РНР, Питон, Go, Rust, Ruby и тд. В обоих видах языков свои плюсы и минусы. Суть бека состоит в том, что нужно знать часто минимум два языка. Например: PHP + Go, Python + Rust и тд. Т.е. связка интерпретируемого и компилируемого языка.
Прикладная разработка. Тут выбор меньше: C/C++, .Net, может, что-то еще. Хотя современные приложения могут быть написаны и на Питоне.
ERP-разработка: 1С, SAP, Axapta и тд. Обычно в такие сферы приходят случайно. Никто в здравом уме "после 30-ти" не сунется в ту же SAP или 1С.
Game Dev. Тут все понятно: берете навыки, полученные ранее, в C++, например, и изучаете какой-нибудь Unreal Engine 4/5. Сложно, долго, но можно приятно устроиться. К сожалению, в Game Dev не зайти просто на знании языка, ибо нужны специализированные знания.
Embeded-разработка. Тут выбор еще меньше: в основном, только C/C++. Очень узкая, но очень хорошо оплачиваемая сфера. Более не скажу ничего.
AI-системы. Тут просто. Есть Питон с Keras/PyTorch, построенные на TensorFlow, и есть всякие интерпретации в других языках для использования. Тут - кроме разработки нужна еще, как минимум, линейная алгебра. НО! Это очень перспективная сфера, куда можно и "после 40" зайти.
SRE. Отдельная каста супер высокооплачиваемых инженеров. Попасть "после 30" и тд - невозможно, ибо нужен огромный опыт и знания во всех областях сразу.
Так вот, самое главное - нужно учить теорию. Параллельно ли, изначально ли - неважно. Без теории 3/4 перечисленного выше - просто закрыто будет. Остальная четверть ограничится уровнем стажера. Теория написания кода, теория данных, теория информации, теория сетей, комплияторов, тестирования, анализа данных, теория баз данных - огромная сфера знаний.
Готовы ли вы тратить тонную времени? Вам решать. Причем, нужно сразу понимать, что, даже изучите вы, например, пытясь "войти в разработку" книги "банды четырех", не гарантирует вам ни-че-го просто потому, что тем же "'эйчарам" нужны конкретные навыки использования конкретных инструментов, а все остальное - это остальное (это отдельная огромная тема противостояния "эйчаров" и специалистов).
Идеальный способ "вхождения в айти" - это найти ментора. Не курсы, не школы и тд, а конкретного человека, который будет помогать и направлять вас на этом ебучем дремучем пути к льготной ипотеке.
P.S. На моем личном опыте есть печальная статистика: чем страше человек есть, пытаясь "войти", тем хуже из него спец при прочих равных. К сожалению, это так.
Всем привет.
Небольшое предисловие. Я осознаю, что этим постом я вступаю на охрененно тонкий лёд. Если уж к моему предыдущему посту были претензии за то, что я посмел использовать HTTP 404, то уже интересно, какие комментарии последуют после выхода этого поста, в любом случае - you are welcome!
Но тут стоит уточнить, что все те подходы (разные), по которым мы проектируем сервисы - они разные как раз потому, что нет единых mandatory правил к архитектуре приложений, которым если не следуешь - твоя система ломается и больше никогда в жизни не заработает, даже если ты исправишь ее. Есть лишь РЕКОМЕНДАЦИИ, а их многие интерпретируют по-разному и это тоже нормально. Для кого-то свойственно не использовать коды ошибок вообще и передавать их в теле ответа с HTTP 200, для кого-то нет. Ни один из этих подходов не является не правильным.
И нет никаких технических ограничений в принципе. Ты можешь спокойно использовать метод GET для удаления объекта, если ты его так напишешь (не делайте так) или использовать метод PUT, вместо POST, для создания объекта (так уже можно, если понимаешь почему). Главное, чтобы ты понимал как эти тонкости реализации правильно применять. Если сомневаешься - используй методы по классике, хуже от этого он работать не будет.
Да, можно уже прям сейчас кидать тапками.
Теперь уже к основному телу сабжа. Сейчас расскажу про ряд лучших практик, которые можно применять. @VRock, ты как раз спрашивал по поводу конвенции о наименовании ресурсов, тут про это тоже будет.
1. Имя endpoint'а - это существительное, а не глагол. Это одна из самых распространенных ошибок, которые я когда либо встречал (и сам совершал, естественно). Например, было в моей практике и такое - POST /generateMultipleDocument.
Тут важно понимать, что метод - это уже глагол и еще раз дублировать его в наименовании эндпоинта не нужно.
В идеале, в данном варианте будет POST /documents
Не везде от этого можно избавиться, но в большинстве случаев всё-таки можно, если потратить время на придумыванием вариантов (опять же - по факту нейминг ни на что, кроме красоты и структурированности вашего проекта не влияет. А на сколько это важно - решать вам или вашей команде).
1.1. Используйте множественное число. В большинстве случаев, при проектировании методов, работающих с вашим ресурсом - эти методы будут работать не с единственный экземпляром этого ресурса, поэтому название эндпоинта должно быть во множественном числе.
Если же нужно указать, что из всего массива экземпляров ресурса вам нужно получить\обновить\удалить какой-то конкретный, то помещайте идентификатор этого ресурса в URL, передавая его в path.
Например, вот так:
/documents
/documents/
Вместо:
/document
/document/
1.2. Используйте "/" для обозначения иерархии и в принципе используйте вложенность ресурсов.
Например, если мы именуем наш ресурс, как users//playlists//songs - это значит у мы хотим работать со всеми песнями, конкретного плейлиста конкретного пользователя. И сразу понятна иерархичность этих ресурсов.
1.3. Не используйте "/" как закрывающий символ вашего URI.
Вариант users//playlists//songs сильно лучше, чем users//playlists//songs/
1.4. Используйте "-" для разделения составных слов.
Заглавные буквы использовать нельзя, поэтому привычный lowCamelCase нам не подойдет. Если писать всё слитно - очень не читабельно.
Поэтому вместо /applications//creditcardhistory, куда лучше использовать /applications//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.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.
Всем привет.
UPD. Опять получился длиннопост с большим количеством текста в формате моих пояснений - простите, но не представляю как по-другому можно что-то объяснить, вроде стараюсь не графоманить.
В этом посте, наконец, приведу один из примеров того, как может быть написано техническое задание (кто-то может придраться, что это не ТЗ, а какой-то другой вид документа - да, возможно, но как-то сформировалась привычка для упрощения, что ТЗ - это любой документ, в котором описывается техническая постановка задачи, которую разработчик должен реализовать), в котором описываются требования к методу получения информации по конкретному объекту.
Шаблонов, на самом деле много и от команды к команде отличаются. Где-то СА просто пишут, что "метод должен получать объект User из базы Users и дальше отдавать его вызывающей стороне" - и это вся постановка. В каких-то командах упарываются и пишут ТЗ на микросервис целиком, в связке статьи в git в формате asciidoc + swagger (yes, I like it и отдельно про это тоже расскажу).
Но в большинстве случаев принято что-то среднее между этими крайностями - системному аналитику важно описать следующее:
То, какие данные метод получит на вход и правила валидации для них;
То, что метод должен сделать с этими данными, т.е. какую бизнес-логику выполнить;
То, что метод должен вернуть в ответ вызывающей стороне.
Допустим, нам нужно описать какой-нибудь метод, который получает любую бизнес-сущность по ее идентификатору.
Один из шаблонов, позволяющий это описать выглядит так (к сожалению, приходится скриншотом, потому что пикабу не умеет в таблицы (или я не умею в таблицы на пикабу)):
Если кто хочет посмотреть "вживую" или попользовать шаблон - вот ссылка на страницу моего конфлю (вроде должна работать).
Теперь по шагам:
Описание метода. Что он делает, для чего предназначен. Можно описать что-то конкретное, если сервис работает как-то специфично, такую краткую выжимку, что сторонним людям не приходилось анализировать его целиком;
URI или URL метода. Состоит из одного из типовых глаголов плюс сам путь, по которому данный метод будет доступен. Про всякие best practices нейминга расскажу отдельно, в комментариях под предыдущим постом спрашивали;
Разрешения или Permissions. Если у вас есть ролевая модель и вам нужно разграничить доступ к каким-либо ресурсам среди пользователей с разными ролями - то вступает в дело данная строка таблицы. В ней нужно перечислить те роли, у которых есть доступ до данного метода;
Параметры запроса, который должны (или могут) быть переданы на вход данного метода. Т.к. у нас очень простой метод, то у нас их нет. Единственный атрибут в виде идентификатора пользователя ( ) передается напрямую в ссылке. Т.е. пример запроса будет просто выглядеть вот так: GET /users/22 - дай мне пользователя с идентификатором 22.
Пункт больше для удобства, в случае, если у вас большая система и много взаимодействующих компонентов. Описываете, кто будет дергать ваши метод. Как минимум это нужно для того, чтобы потом, когда вы будете дорабатывать их - было понятно влияние. В данном случае, если вдруг метод поменяется мажорным образом, добавится какой-нибудь новый обязательный параметр - вы не забудете доработать еще и фронт.
Параметры ответа. Все варианты того, что ваш метод вернет вызывающей стороне после выполнения своей внутренней логики. Перечисляем как успешные коды ответа и всё их содержимое, так и ошибочные.
Непосредственно описание бизнес-логики метода. Т.е. что метод должен сделать с атрибутами, переданными на вход, и что должен вернуть.
Теперь немного про описание самой логики работы любого сервиса. Кому-то может показаться это сложным, но на самом деле все немного проще. Вам просто логически нужно представить у себя в голове, что должен вообще в принципе сделать ваш метод и попытаться придумать - как он должен это сделать.
На этом примере - у вас стоит бизнесовая задача (например): есть админка со списком пользователей, администратор нажимает на какую-то конкретную карточку пользователя, с целью просмотреть всю информацию по нему - в этот момент, как раз фронт откроет отдельную экранную форму и вызывает наш метод, передавая туда идентификатор искомого пользователя (который он ранее получил из другого метода, который получает массив пользователей, что-то вроде GET /users), чтобы получить всю нужную информацию для отображения.
Далее представляем что наш метод должен сделать, чтобы вернуть информацию по этому пользователю. Самое логичное - надо сначала найти его. Для этого нужно залезть в таблицу с пользователями и найти такого пользователя, у которого идентификатор будет совпадать с тем, что нам передали в запросе. Нашли - круто, не усложняем и возвращаем успешный успех фронт с передачей в теле ответа всей необходимой информации.
А что делать если не нашли? Вообще, технически такого быть не должно, потому что это значит, что у фронта устаревшая или недостоверная информация и нужно с этим разбираться - откуда он взял идентификатор, которого не существует? Но представим, что после того как админ открыл страницу со списком пользователей и до того, как перешел в карточку конкретного - другой админ удалил ее. В этом случае надо вернуть ошибку, что такой объект не найден.
Ну и всегда (по моему мнению), во всех методах нам нужно валидировать входящий запрос до того, как начать основную бизнес логику. Потому что зачем нам это делать и тратить драгоценное время и ресурсы, если мы заранее знаем, что запрос не валиден? Т.е. как минимум нам нужно проверить rq на соответствие контракту, что все обязательные атрибуты пришли и пришли в корректном формате. Как максимум выполнить еще всякие кастомные валидации, по типу тех же проверок на роли.
Также заранее поясняю, что в ответе ссылка на объект User (пользователь) ведет на описание атрибутивного состава объекта (в моем примере в конфлю нет, потому что я этого не сделал, но на боевых задачах - да), поэтому не нужно расписывать и дублировать этот объект еще и тут. Однако, если вам нужно передать не весь объект, а только его часть, например, не возвращать на фронт какие-то пароли пользователей или другие конфиденциальные данные, чтобы их не "схачили" - то нужно отдельно это указывать.
И еще поясню немного про пункт 1.b - особенно внимательные наверняка про него что-нибудь скажут. Пока писал, подумал, что можно использовать этот метод не только для админа, но и переиспользовать его на случай, когда обычный пользователь хочет получить информацию по себе же, например, когда открывает свой профиль. Вместо того, чтобы делать отдельный метод - просто разграничиваем права. Если он захочет запросить информацию о ком-то другом (если фронт подведет), то ему вернется болт.
P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.
P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.
Женщина 32 лет
— Сейчас я вам расскажу, как можно посетить шестнадцать стран за пять лет, взобраться на Эльбрус и Монблан, а затем чуть не утопиться с горя от одиночества.
— Внимательно слушаю, - с интересом записывая ее эмоции, ответила я.
— Мне повезло родиться в семье, где оба родителя владели сразу несколькими языками. Мама работала преподавателем английского и немецкого языков, а папа трудился во французской дипмиссии. Не знаю, сговаривались ли они, но факт в том, что меня с пеленок учили одновременно всем этим языкам, отчего у знакомых людей порой возникал разрыв шаблона.
— Из-за удивления увидеть ребенка, свободно изъясняющегося на четырех языках?
— Это вы описали только первый этап, - неожиданно звонко рассмеялась клиентка. – Потом у них вообще срывало крышу, когда я начинала использовать в одном предложении комбинации из самых разных иностранных слов.
— Могу себе представить, - улыбнулась я, – Наверное, вы с детства мечтали о карьере переводчика или дипломата?
— Вообще, начитавшись книг Майн Рида и Луи Буссенара, я грезила о путешествиях и неважно в каком образе. Потому-то никак не могла решить какой профессией овладеть. Мама отговаривала меня от поступления в иняз, боялась, что я помру с голоду, а папа все мечтал о моем поступлении в МГИМО, но это было нам не по карману, плюс пришлось бы ехать в Москву.
— И как вы же поступили?
— Вы не поверите, но все решил случай – я совершенно дурацким образом поскользнулась и упала, потеряв сознание. Добрые люди не прошли мимо, вызвали скорую и меня доставили в больницу, где почти сразу же прооперировали. Когда я пришла в себя, то увидела гипс на ноге и престарелую медсестру. Она частенько заглядывала ко мне - мы как-то раз разговорились и я узнала, что моя новая знакомая после учебы исколесила весь Союз и даже несколько раз бывала заграницей в составе исследовательской экспедиции. И тут я поняла, что вот оно – решение!
— Стать медсестрой?
— Voyages et Aventures de Mademoiselle Friquette, – продекламировала женщина и тут же пояснила. - В детстве я зачитывалась книгой о подвигах француженки Фрикетт, только недавно ставшей медсестрой и отправившейся в большой мир помогать страждущим. Мама с папой были в шоке от такой неожиданной новости – ведь я никогда не интересовалась медициной, но мне удалось уговорить, сказав, что позабочусь о них, если они заболеют.
— Хитрый ход.
— А то! – снова рассмеялась клиентка. – В итоге, я выучилась, причем, неожиданно для меня самой эта профессия оказалась весьма интересной. А потом, стоило только закончится обучению, я отыскала компанию альпинистов, которые собирались покорять Эльбрус и предложила свою кандидатуру. Они как раз искали кого-нибудь вроде меня, но поставили условие что я должна буду подготовиться к восхождению, поэтому пришлось быстренько привести себя в форму.
— И вы действительно отправились на Эльбрус?! Вот так, без опыта и полноценной подготовки?
— Если честно, меня оставили задолго до вершины с еще парочкой ребят – все-таки кислородное голодание дело нешуточное. Но когда после этого мы отправились на гору Народную – это высочайший пик Уральских гор, то дошла до самого конца. С тех пор я умудрилась скататься с этими ребятами по шестнадцати странам и взобраться на целую кучу вершин. Было много интересных и захватывающих дух моментов, страшных травм и даже одна смерть.
— Да уж, нелегкое это дело – заниматься альпинизмом.
— И не говорите, - сразу посерьезневшим голосом ответила женщина. – Но вот в чем дело: чем больше километров я оставляла позади себя, тем скучнее все это становилось. Никогда бы не подумала, что скажу нечто подобное, но горы наскучили мне, как, впрочем, и сами путешествия. Причем не только мне одной – однажды один из старших ребят позвонил и сказал, что они решили разбежаться. Я была ошарашена, но понимала, что это рано или поздно должно было случиться.
— Но вы все же очень скучали по своим товарищам?
— Ужасно скучала – мы же через столько всего прошли вместе! Но мы, видимо, переросли все это, хотя некоторые так и продолжили свои восхождения. Я пару раз пыталась собрать всех, придумать какую-то новую цель, но все было тщетно. Тогда мне подумалось что можно найти альтернативное занятие и записалась в плаванье с одним знакомым, в ходе которого выяснилось, что у меня морская болезнь и что единственный кого нужно лечить на борту – это ваша покорная слуга. В довершении ко всему, во время одного из приступов тошноты я свалилась за борт, но, по счастью, умудрилась схватиться за забытый матросами веревочный трап. После этого я решила, что ноги моей не будет на кораблях и снова вернулась домой.
— И теперь вы не можете решить, что делать дальше?
— Я бы собрала свою экспедицию куда-нибудь, но ребята, которые спонсировали наши предыдущие походы, наотрез отказались это делать – у них теперь были другие интересы. Впрочем, как я уже говорила – мне и самой уже поднадоели путешествия. Вот только кроме них я ничего не умею и не могу представить, что буду работать в поликлинике и заполнять карточки для больных людей. Это хорошее дело, но совершенно не мое.
— А что - ваше?
—В лютый мороз, на пронизывающем ветре, пытаться оказать первую помощь серьезно раненному альпинисту. Мое – это, когда у половины группы начались жуткие головные боли, пытаться найти способ им всем помочь, пока они не померли в полусотне километров от ближайшего населенного пункта. Только тогда я чувствую себя на своем месте…
По нашему городку я перемещаюсь глядя прямо перед собой или внимательно разглядывая флору вокруг. Потому что секс-шоп у нас на район и окрестности один и нет-нет, да увидишь знакомое лицо. А люди напрягаются, им кажется что я сейчас кинусь здороваться, спрашивать как дела и интересоваться подошло ли. Поэтому покер-фейс и шпарим по своей траектории, решительно не узнавая никого вокруг. Так что если я мимо пролетела, то это исключительно из вежливости и нежелания ставить в неудобное положение, а не потому что я хамло невоспитанное.
Ну и разумеется, это не то, что вы подумали. Конечно же, многие уже в секс-шоп дверь с ноги открывают и воспринимают всё, что там находится как часть обычной жизни. Таких людей не мало и это здорово. Но для многих даже зайти в такой магазин - это ужас и катастрофа, ну или очень шокирующий момент. И вот решаются они переступить порог, морально подготовившись и выдохнув, а там внезапно такое на стенах висит, что обратно полностью деморализует. Особенно не просто людям старой закалки, зачастую для них это вынесение своих внутренних табу на публику.
Так вот, для тех, кто искренне считает, что работа в секс-шопе - это "резиновые хуи" по стенкам развесить, а потом их на кассе пробить, то тут вы глубоко ошибаетесь. Секс-товароведение это важная, но не самая глобальная часть работы. Основное тут всё-таки психология и сексология, потому что нужно умение разговорить любого человека. И не просто разговорить и успокоить, а чтобы он смог рассказать тебе то, что не расскажет жене, мужу или кому-нибудь ещё. По сути абсолютно постороннему человеку, а иногда ещё и противоположного пола. Теперь на секундочку тест - попробуйте вывести на такую беседу того, кто в принципе о сексе, игрушках или своих проблемах рассказывать не хочет или страшно стесняется. Любого, потому что это именно те самые "люди с улицы", которые ходят и вокруг вас тоже.
Заходят молчуны, которые кроме "ага" ничего не скажут. Ты будешь плясать танцы с бубнами и подбирать подход, видеть что ему интересно и говорить за двоих, рассказывать общую и факультативную информацию, но человек будет молчать как партизан. Ясное дело, если ты видишь, что только посмотреть зашли и общаться не расположены, тут нефиг вокруг танцы плясать и мешать размышлять о жизни. Мне в сторонке постоять - раз плюнуть. Но ведь иногда точно что-то нужно, но сознаться безумно сложно.
Есть паникёры и тревожники. Они заходят уже в панике, она нарастает и при не правильном общении переходит в истерику. Потому что нервы, потому что опять впарят и напаяют, потому что человек по жизни такой. Пугает всё - от двери в магазин, ассортимента и мысли о выборе, до финального этапа покупки. Отнюдь не редкий случай, в этом случае работаешь психологом от души. Вот тут ни в коем случае не хочу никого обидеть, но навыки общения с людьми с ОКР и расстройствами аутистического спектра в этом случае пригождаются как никогда. Потому что механизм нарастания паники примерно похож и методы по снижению её уровня - тоже. Спокойно, плавно, объясняя каждый шаг и все нюансы, давая время передохнуть или свериться с интернетом.
Покупатели в возрасте, для них даже зайти в секс-шоп - уже стресс. Зачем они приходят? Да потому что возрастные вопросы возникают, или спутника жизни нет, а радостей ещё хочется. Или спутник есть, но физиологически организм не справляется. Например, из-за заболеваний или возрастных изменений у мужчины нет эрекции. Насколько просто мужчине в любом возрасте зайти вот так всё выложить? Да нифига не просто. Или женщине пенсионного возраста зайти выбрать фаллоимитатор или вибратор. Вы думаете, что в таком возрасте уже ничего не интересно? Вот тут снова ошибаетесь, зачастую интересно, но найти партнёра уже сложнее. Представьте дискомфорт, который люди испытывают, задавая такие вопросы.
Рассказчики подробностей. Тут держите меня семеро - ты будешь знать всё, в подробностях и мелочах. Это не те, кто почувствовав себя более уверенно и разговорившись, начинают рассказывать всё. Иногда подробности вносят коррективы в выбор или вообще приходится предлагать обратиться сначала к врачу. Например, если выяснится, что недавно операция была где-нибудь "прямо там". Но иногда заходят и просто рассказывают много всего интересного, чисто чтобы рассказать в процессе покупки. Я вас уверяю, мы слышали такое, что задорное и бородатое "какого хуя вам надо?" - это даже не детский сад, а вообще мимо. Очень редко среди таких людей попадаются те, по которым сразу чувствуется, что человек опасен. Система охраны у нас отлажена, но умение разрулить напряжённые ситуации в спокойном ключе очень важно.
Работа с группой покупателей. То есть, иногда это всё вместе, но сразу много. Зашедшие одновременно и косящиеся друг на друга, потому что свидетелей никому не хочется. Мало того, что начальный дискомфорт - продавцу изложить, так тут ещё и очередь собралась. А работаешь с одним человеком иногда не пять минут, а от души и с полчаса-час, бывает и дольше. Или группа зашедших вместе и разбегающихся по всем интересным углам с одновременными вопросами. Экскурсоводы, вы волне постов были? Скажите же, прикольное мероприятие - собрать всех обратно в группу, не упустить ни один вопрос и объединить изложение в единую картину. Но с нюансом, что всё про секс и игрушки для него.
Люди с ДЦП, глухонемые, плохоговорящие (не знаю, насколько это деликатное обозначение, но стараюсь как могу), с аутизмом, ОКР, паническими атаками, остальное вписать по желанию - все они иногда заходят в секс-шоп и к каждому нужно подобрать максимально деликатный подход.
Оглянитесь вокруг. Все люди, которые вас окружают, встречаются вам на улицах и в магазинах, на работе и дома (не удивляйтесь, иногда вы и не знаете, что партнёр заходит в секс-шоп) - это те самые наши гости, каждый со своим характером и комплексами, проблемами и вопросами, нерешительностью, дружелюбием или склонностью к скандалам. Так что если интересно - попробуйте, чисто ради эксперимента, выяснить интимные вопросы у рандомного незнакомого человека и найти способ их решить. В режиме 10-12 часов, в каждом моменте сохраняя деликатность, дружелюбие и спокойствие.
Так что секс-шоп это не только про "резиновый хуй", но и про него тоже.
P.S. Это не про важность работы. Люди, чьи лица я увидела на Пикабу в волне профессий - вы прекрасны. Весёлые и уставшие, чумазые после смен, в аккуратных халатах или рабочей робе, вы все стали не просто буквами в постах и комментариях. Внезапно вы все стали живыми, настоящими и теми, кто и есть наша страна. Спасибо за эту волну и за то, что вы есть.
Собственно, на Пикабу уже давно сдеанонен, поэтому вот.
Доктор травматолог-ортопед. Помогаю чиниться Пикабушникам)
Подробности ищите в ранних постах!
Всем волна!
В сфере айти я отработала столько, сколько приличные люди не живут и зарплата бывала разная, но маленькой её не назовёшь в любой период. Не то чтобы чёрная икра мазалась на крутоны с двух сторон поверх красной, но о деньгах можно было особо не думать. Плюс не только дизайнер настолько широкого профиля, что даже в объектив не влезает, а вполне себе аналитик и в программирование тоже делала на факультативной основе. Особо в эту область я не совалась, но понимать внутренний мир происходящего это сильно помогало. Потому что мало нарисовать красивую картинку, нужно ещё понимать как её на реальность натянуть без костылей.
И вот, за три года до финала головокружительной карьеры дизайнера, к нам в отдел заглянул местный директор со словами: "В Московской головной конторе доели очередного дизайнера сейчас дизайнера нет, просят из наших кого-нибудь. Матёрого и с опытом отсюда и до горизонта." Дизайнеров в Москве изводили со страшной скоростью и в промышленных масштабах. Эдакий расходный материал, за круговоротом которого мы из нашего Новосибирска наблюдали со спортивным интересом.
Начальник дизайнерского отдела задумчиво смотрел на меня, остальные дизайнеры пригнулись за мониторы. Попытка прикинуться уборщицей провалилась с треском, и со словами "это на месяц, пока нового не найдут" меня назначили дистанционно любимой женой в Москву. Выдыхаться как дизайнер я уже начинала, но отказываться от приятной зарплаты ещё была не готова. Головной офис сразу приступил к воспитанию, объяснив кто тут главный, а у кого ручки из жопки и вместо головы глиняный горшок.
Месяц превратился в два и плавно растянулся на три года. Одной рукой верстая полиграфию, второй отдизайнивая соцсети, третьей разрабатывая интерфейсы и немного залезая в 3D моделирование, я радовалась что дистанционно откусывать голову дизайнеру получается не очень эффективно. Москва кипела трудовым энтузиазмом как после окончания нашего рабочего дня, так и по выходным. Появляться на работе в чётко установленное время было не обязательно, но иное не одобрялось, отбой мог наступить уже вместе с головной конторой, разница во времени составляла четыре часа. Постепенно поверх уже накопившегося выгорания накрывало глобальным отвращением к IT в целом. Тошнило от мониторов, векторов и прочих фотошопов в сумме, но два уже не мелких, но ещё слегка несовершеннолетних дитятки дома хотели кушать и учиться.
К моменту, когда московский офис нашёл дизайнера, я выдохлась окончательно. Впрочем, того дизайнера они тоже успешно и быстро истребили, но всё уже начало накрываться глобальным коронным катаклизмом с сокращением конторы до минимальных размеров. И вот тут наступил момент, о котором я буду вспоминать как об одной из ключевых развилок в жизни. Узнав, что я осталась без дела, мне позвонила знакомая, с которой мы работали раньше и сказала что меня очень хотят видеть на должности аналитика в Сбере. Сказать что я присела от изумления на задницу, не сказать ничего. Корками о высшем образовании я так и не разжилась и вообще - где я, а где банковские системы.
"Хорошие аналитики на дороге не валяются, мы готовы вложиться в обучение." - с этими словами меня ждали на собеседовании. Времени на подумать давалось неделя, осознавая размеры зарплаты в Сбере, одновременно я понимала, что в офисе за монитором повешусь за любую зарплату и очень быстро. Логически взвешивать "за" и "против" не имело смысла - такие предложения с неба пачками не падают и на дороге не валяются. Отловив бывшего мужа, работающего в Сбере начальником одного из IT-отделов, я крепко взяла его за пуговицу пиджака и изложила факты. Он не удивился, времени привыкнуть к неожиданным манёврам в моей жизни у него было предостаточно.
Отговаривать или убеждать он не стал, но кратко изложил суть работы. Общались мы регулярно, его график и нагрузки я знала, и вполне могла представить, что будет. Дети уже подходили к совершеннолетию, по моим понятиям после этого подножный корм им следовало добывать самим, с моей поддержкой на стартовом этапе. Небольшая подушка безопасности имелась, но понимания чего я хочу не было абсолютно. Но при одной мысли о том, чтобы снова двинуть в сферу IT в любом качестве, в душе поднимался яростный протест и понимание, что лучше застрелиться сразу.
Только идиоты отказываются от таких предложений, я была идиотом и сделала шаг от тёплого и очень сытного офиса в никуда. Понимала ли я от чего отказываюсь? Однозначно да. Знала ли, что ждёт впереди? Нет. Там ждали пара-тройка лет с местами полуголодным существованием, дети выросли окончательно и отправились искать своё пастбище, а я пыталась найти своё место вне IT, абсолютно не представляя где оно. Пожалела ли о принятом тогда решении? Ни разу. Я фрилансила, варила пиво, сыр, делала конфеты, и даже работала продавцом в разливайке, пока не наткнулась на кратко промелькнувшее "требуются продавцы-консультанты в секс-шоп".
Наверное, тут должно быть писец какой мотивирующий финал с призывом выйти из зоны комфорта и побежать по просторам, вдыхая ветер свободы и распевая чакрами. Но мы же тут все взрослые люди и понимаем, что ветер свободы в реальном мире вполне может оказаться полной жопой. Было время безнадёги, сменяясь временем подъёмов. Был приобретён вагон навыков, которые не появляются в той самой зоне комфорта, просто потому там что нет смысла морщить мозг и выкручиваться. В секс-шопе меня иногда удивляет то, что это считают работой, потому что мне реально в кайф, а в свободное время я могу заниматься своими проектами, которые тоже приносят немало удовольствия. И, как я надеюсь, будут удачными в материальном плане. Бэкграунд, приобретённый путём лихих прыжков по граблям за этот период для меня бесценен, хоть и дался немалым трудом.
P.S. Для интересующихся, как могла здравомыслящая мать обречь малышей на такой дауншифтинг, отвечу - на них платились алименты, предусмотрительно частично откладываемые и присоединённые к тому, что отложила сама. Этого хватило какое-то на время даже после их совершеннолетия, пока они талантливо валяли дурака, то принимаясь учиться, то бросая эту затею. Экономила я лично на себе, пока не выгребла из смутного времени неопределённости.
P.S. Пусть моя работа - не крутить баранку лично, но логистика - это тоже труд, заслуживающий внимания. Я бесконечно благодарна нашим замечательным водителям, и считаю, что они настоящие молодцы. А то я смотрю, некоторые всерьёз думают, что я вожу автовоз. Нет, но очень мечтаю побывать в рейсах как экспедитор, и надеюсь скоро это сделаю😊
Изготовление сценического оборудования (фермы , арки , крепежи и прочее).
Восхитительно, какие разнообразные профессии представлены на Пикабу, особый привет всем коллегам, занятым в строительной сфере.
Радует видеть в ленте Ваши усталые и счастливые лица, потому присоединяюсь:
инженер, архитектор, специалист зоологического планирования.
Самые лучшие моменты в работе - выезды на объекты.
Мужчина 35 лет
— Мой отец - очень тяжелый человек: как он решил, так и будет. Если кто-то пытался сопротивляться - применял любые методы, чтобы заставить делать как он хотел. Собственно говоря, у него имелось определенное представление о том, как я должен был жить и он всеми силами удерживал меня в «нужном» направлении.
— Полагаю, им двигали самые благие намерения.
— В этом сомневаться не приходится: он всегда хотел, чтобы я крепко стоял на ногах, обзавелся семьей и мог противостоять жизненным невзгодам, - нахмурившись, ответил клиент. - Поэтому он отправил меня получать рабочую профессию – сварщика. Еще тогда он предвидел, что такие специальности станут дефицитными.
— Действительно мудрое решение. А что по этому поводу говорила ваша мать?
— Она всегда поддерживала мужа, - глухо произнес Дмитрий. - Не помню ни одного случая, когда бы она говорила что-то поперек него, даже когда мы оставались одни. Наверное, поэтому я всегда был на нее обижен - пока другие ребята учились на юристов или программистов, я должен был по колено в грязи с красными глазами варить очередную трубу.
— Вы были рассержены на родителей и винили их за эту несправедливость.
— Именно так я и думал многие годы, - горько усмехнулся мужчина. - После училища, я попал в армию, нормально отслужил, вернулся и пошел работать в управление городским хозяйством. Работа была собачья, так что я бросил это дело и в конец разругался с отцом, дело даже до драки дошло. Плюнул на все и снова пошел в армию, на этот раз по контракту, отслужил весь срок, но понял, что это тоже не мое и, вернувшись обратно, крепко задумался о том, что же делать дальше.
— Но на этот раз у вас уже имелся довольно большой жизненный опыт.
— Только вот его не хватило на то, чтобы не наделать глупостей. Пришлось покататься по стране, работать в разных местах, прежде чем судьба дала мне еще один шанс: знакомый позвал с собой поработать вахтовым методом на севере. Терять мне было нечего, я и отправился, а там меня спросили, что умею, сказал, могу варить - так я снова стал сварщиком. Но теперь мне за это неплохо так платили, а заодно уважали - чего раньше не было.
— Возможно, дефицит квалифицированных рабочих стал еще больше?
— И это тоже, - кивнул Дмитрий. - Но думаю тут дело в том, что я возмужал - кто же будет с уважением относиться к юнцу, только выпустившемуся из лапшака? Я неплохо заработал, снова вернулся в Питер и открыл тут небольшую мастерскую. Это, конечно, не полет фантазии, но на хлеб с маслом хватает. Даже сумел найти себе хорошую женщину - пару лет назад она родила сына, и мы никак ему не нарадуемся. И все, потому что у меня есть хорошая профессия.
— Получается, ваш отец был прав?
— Марк Твен однажды сказал: "Когда мне было восемнадцать лет, мой отец был дурак дураком. После тридцати я заметил, что старик здорово поумнел". Так у меня та же самая история, вот только к тому времени как я это понял, его уже не стало, - в глазах мужчины стояли слезы. - Мы не общались целых десять лет, и я столько гадостей ему наговорил перед уходом, что теперь мне так горько…
— Уверена, несмотря на то что вы перестали общаться, он все равно гордился вами, - после этих слов Дмитрий закрыл лицо руками и беззвучно заплакал. - Вы стали именно таким человеком, каким он хотел вас видеть.
— А я даже не пришел к нему на похороны, - сквозь рыдания, выдавил он. - Мог прийти, но решил, что не хочу видеть никого из родственников. Но совсем недавно, когда у меня начались серьезные проблемы на работе, мне так не хватало его совета, его стойкости и жизненной мудрости, что я пошел к нему на могилу, сел на землю и стал разговаривать с портретом на памятнике. Изливал ему все, что накопилось в моей душе за все эти годы. Просил прощения и лил слезы как мальчишка…
— Вернуть его вы уже не сможете, но можете стать хорошим отцом своему собственному сыну.
— В том то и дело, что я такой же, как и мой отец: жесткий и непримиримый. Боюсь, что с моим ребенком повторится та же история и от этой мысли, мне становится еще горше.
— Не переживайте на этот счет — уже тот факт, что вы сейчас говорите со мной об этом, не даст вам допустить ту же ошибку. Никто из нас не идеален...
Всем привет.
Настала пора наконец закончить с прелюдиями и перейти к рассказу про один из самых важных навыков системного аналитика - REST. Больше важны навыки практического применения\проектирования, но и теория тоже важна. Как минимум для прохождения собеседования, потому что значительная часть вопросов приходится как раз на интеграцию и знание REST в том числе.
В следующем посте разбавлю серию только теоретических - практикой. Приведу шаблон того, как можно описывать API.
REST
Representational State Transfer (REST) в переводе — это передача состояния представления.
Сам по себе REST – это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Архитектурный стиль – это набор согласованных ограничений и принципов проектирования, позволяющий добиться определённых свойств системы.
И у него есть определенные принципы, которые важно понимать и применять при проектировании системы.
В рамках данного принципа самое важное - это отделение клиента и сервера. Клиент - это интерфейсная часть (уровень представления), сервер - это центральное звено системы, на котором реализованы все основные функции системы (наш backend). Более подробно рассмотрено в части 6 этой серии.
Это понятие означает, что сервер не должен хранить информацию о состоянии клиента, в том числе информацию о предыдущих запросах клиента, а клиент не должен знать ничего о текущем состоянии сервера.
Это не значит, что у них вообще нет состояния, но они не отслеживают состояние друг друга (что очень удобно, т.к. избавляет нас от необходимости держать постоянное неразрывное соединение между двумя системами).
Поэтому каждый запрос рассматривается индивидуально, как будто бы не было ничего до, и не будет после. Соответственно клиент в этом случае, обязан предоставить все необходимые данные для успешного выполнения запроса. Это, пожалуй, почти единственная логика, которая должна быть на клиенте.
Принцип гарантирует, что между клиентом и сервером существует общий язык (интерфейс), с помощью которого они будут понимать друг друга. Т.е. клиент посылает понятные серверу запросы, использую конкретные HTTP-методы, сервер посылает ответ в понятном клиенту формате.
Это достигается через несколько субограничений:
Идентификация ресурсов
В терминологии REST что угодно может быть ресурсом — HTML-документ, изображение, информация о конкретном пользователе - то, чему можно дать имя. Каждый ресурс должен быть уникально обозначен постоянным идентификатором. «Постоянный» означает, что идентификатор не изменится за время обмена данными, и даже когда изменится состояние ресурса. Если ресурсу присваивается другой идентификатор, сервер должен сообщить клиенту, что запрос был неудачным и дать ссылку на новый адрес.
Тут важно понимать, что в REST (в идеале, по крайней мере), ресурс может быть только существительным, а не глаголом. Потому что за "глагол", т.е. действие - отвечает конкретный метод.
2. Управление ресурсами через представления
Второе субограничение «унифицированного интерфейса» говорит, что клиент управляет ресурсами, направляя серверу представления, обычно в виде JSON-объекта, содержащего контент, который он хотел бы добавить, удалить или изменить. В REST у сервера полный контроль над ресурсами, и он отвечает за любые изменения.
Когда клиент хочет внести изменения в ресурсы, он посылает серверу представление того, каким он видит итоговый ресурс (а для этого, сервер сначала должен предоставить эту информацию клиенту). Сервер принимает запрос как предложение, но за ним всё так же остаётся полный контроль.
3. Самодостаточные сообщения
Самодостаточные сообщения — это ещё одно ограничение, которое гарантирует унифицированность интерфейса у клиентов и серверов. Только самодостаточное сообщение содержит всю информацию, которая необходима для понимания его получателем. В отдельной документации или другом сообщении не должно быть дополнительной информации.
В данных запроса должно быть указано, нужно ли кэшировать данные (сохранять в специальном буфере для частых запросов). Если такое указание есть, клиент получит право обращаться к этому буферу при необходимости.
Это нужно для того, что максимально ускорить обработку запроса от клиента. Для примера, если нам нужно часто получать информацию о пользователе (а сама информация о пользователе меняется достаточно редко, что важно), то мы можем закэшировать эту информацию.
Т.е. стандартный запрос выглядит условно так: Фронт -> микросервис адаптер к фронту -> какой-нибудь микросервис MDM системы пользователей -> база где лежат пользователи и потом обратный путь. Это не прям мгновенно всё происходит. Что мы делаем - например, наш фронт прислал запрос GET /user/121, мы проделали этот путь, описанный выше, но еще и сохранили эти данные в кэше на уровне микросервиса-адаптера. В следующий раз, когда фронт вызовет метод GET /user/121, наш путь будет намного короче и быстрее - всего лишь от фронта к нашему же микросервису в кэш и сразу обратно.
Тут есть множество нюансов, которые нужно учесть - но в целом полезный инструмент.
Система слоев предполагает наличие большего количества компонентов, чем клиент и сервер. В системе может быть больше одного слоя. Тем не менее, каждый компонент ограничен способностью видеть только соседний слой и взаимодействовать только с ним.
Но что самое замечательное, при добавлении новых слоев между клиентом и сервером - их не нужно дорабатывать. Т.е. не важно, если у нас архитектура выглядит как просто "Клиент" -> "Сервер", или "Клиент" -> "Прокси" -> "Балансировщик" -> "Несколько серверов" - их логика не меняется (тут разработчики могут меня поправить или дополнить, буду благодарен).
Что-то вроде того:
Еще есть отдельный принцип "Код по требованию", который подразумевает то, что клиент может получить с сервера прям "кусок кода" (условно), который ему необходимо выполнить у себя.
Звучит интересно, но честно, ни разу не сталкивался, поэтому не могу что-то детальное рассказать.
P.S.: В следующих постах расскажу про best practices, связанных с именованием эндпоинтов и прочими полезными штуками для проектирования своих апишек.
По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.
P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.
Всем привет.
В прошлом посте рассказал про HTTP в целом и много раз упоминал различные методы, но еще не рассказал что это такое - разбираемся.
Как я уже писал, метод - это название запроса, которое определяет то действие, которое будет совершаться в результате его выполнения.
Их всего 6 основных:
Метод GET предназначен для получения информации о каком-то конкретном ресурсе или массиве ресурсов. Он никак не изменяет эту информацию.
Похож на GET, но не возвращает тело ответа, а только стартовую строку и заголовки. Используется для получения метаданных, а также проверки и валидации ресурса.
Честно говоря - ни разу не приходилось использовать его на практике или даже просто видеть. Но могу предположить, что его можно использовать в том случае, когда нам нужно ткнуть какой-то ресурс палочкой и спросить - а ты вообще существуешь? Ну и, возможно, получить по нему какую-то метаинформацию.
Условно, можно вызвать HEAD /users/127 - мы получим в ответе HTTP 200, в том случае, если этот пользователь с идентификатором = 127 существует. И 404 - если нет.
Если же вызвать GET /users/127 - то мы получим HTTP 200 + тело ответа, в котором будет содержаться вся информации о пользователе с идентификатором 127 (ну тут смотря как реализовать, но по дефолту будет так).
Создает новый ресурс из переданных данных в запросе. Но это лишь по дефолту.
На самом деле POST самый универсальный метод и им возможно делать всё - и получать информацию, и создавать, и редактировать, и удалять, и запускать какие-то процессы. Тут важно понимать - почему именно так.
Например, мы можем использовать POST для поиска в том случае, если нам нужно зашифровать поисковые параметры в теле запроса, а не оставлять их в открытом виде в query-параметрах (прям в строке запроса). Либо использовать для поиска в том случае, если поисковых параметров слишком много и строка запроса получается слишком огромной - а у нее есть определенное ограничение по длине (очень больше, но всё-таки есть).
Можно использовать для запуска различных команд в оркеструющих микросервисах или коммандерах. Т.е. напрямую у нас никакой объект не создается, физических и лежащий в БД - но у нас создается (запускается) какой-нибудь бизнес-процесс.
Применений у этого метода очень много.
Изменяет содержимое ресурса по-указанному URI. PUT полностью заменяет существующую сущность.
Похож на PUT, но применяется только к фрагменту ресурса (заменяет точечно только часть ресурса)
Для понимания: Например, у вас есть объект user, у которого 5 атрибутов - Ф, И, О, дата рождения и пол. Если у вас поменялась информация о пользователе №5, например изменилась фамилия - и вы вызовете метод PUT /users/5, и передадите в теле запроса только фамилию, то на выходе у вас останется объект user с id = 5, и фамилией = тому, что вы передали в запросе. Все остальные атрибуты затрутся. Поэтому для обновления необходимо передавать все объект целиком, включая те атрибуты, которые не менялись.
Если же вы вызовете метод PATCH /users/5 с таким же запросом, то у вас обновится только фамилия, остальной объект останется не тронутым.
Логичный вопрос - а зачем тогда вообще использовать PUT? Ответ достаточно простой - он намного проще в реализации. Куда проще передать объект целиком ценой нескольких байт трафика и подменить его, чем обновлять каждый атрибут по отдельности, маппить их и т.д. Особенно если у вас какой-нибудь огромный объект, типа "Заявка на кредит", у которой под тысячу атрибутов, а вам нужно обновить 200 из них.
Тут разработчики могут меня поправить, но объясняли мне в свое время так.
Удаляет конкретный ресурс по-указанному URI.
Интересное: на самом деле нет никаких проблем с тем, чтобы заставить метод GET создавать какой-нибудь ресурс или заставить метод DELETE обновлять. Т.е. это не технические ограничение, это "лишь" концептуальная идеология того, как правильно (и для чего) использовать различные методы.
Чтобы на всех проектах, все участники разработки были в едином контексте. И когда вы будете видеть какой-нибудь метод, типа POST /loanApplication//offers - вы явно поймете, что это метод предназначенный для добавления новых офферов конкретной заявке на кредит.
P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.
P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.
Всем привет.
Сегодня рассмотрим такой важный протокол, как HTTP. Важный потому, что именно его используют в качестве протокола передачи данных современные технологии интеграции (REST, gRPC).
HTTP расшифровывается как HyperText Transfer Protocol, «протокол передачи гипертекста». Изначально этот протокол использовался для передачи гипертекстовых документов в формате HTML. Сегодня он используется для передачи произвольных данных - c помощью него можно передавать хоть JSON, хоть XML.
В основе HTTP - клиент-серверная структура передачи данных․ Клиент формирует запрос (request) и отправляет на сервер; на сервере запрос обрабатывается, формируется ответ (response) и передается клиенту.
HTTP не шифрует передаваемую информацию. Для защиты передаваемых данных используется расширение HTTPS (Hyper Text Transfer Protocol Secure), которое “упаковывает” передаваемые данные в криптографический протокол SSL или TLS. Но это совсем другая история)
HTTP запрос состоит из трех основных частей: строка запроса (request line), заголовок (message header) и тело сообщения (entity body). Тело сообщения не является обязательным параметром. Между заголовком и телом есть пустая разделительная строка.
В строке запроса указывается:
Метод – название запроса (определяет действие), одно слово из стандартного списка, заглавными буквами;
URI определяет путь к запрашиваемому ресурсу;
Версия – пара разделённых точкой цифр. Например: 1.0.
Пример HTTP запроса:
Заголовок запроса добавляет некоторую дополнительную информацию к сообщению запроса, которое состоит из пар «имя / значение», по одной паре на строку, а имя и значение разделяются двоеточием.
Обычно в заголовках передается какая-либо мета информация. Например, токен.
Последней частью запроса является его тело. Оно бывает не у всех запросов: запросы, собирающие (fetching) ресурсы, такие как GET, HEAD, DELETE, или OPTIONS, в нем обычно не нуждаются и тела запроса у них быть не должно (так реализовать метод можно, но это не правильно).
В то же время для методов POST, PUT, PATCH - тело использовать можно и нужно.
Структура ответа, в целом, идентична структуре запроса. Также есть строка статуса, заголовок и тело.
Стартовая строка ответа HTTP, называемая строкой статуса, содержит следующую информацию:
Пример строки статуса: HTTP/1.1 404 Not Found.
Более подробно про коды состояния и как их использовать расскажу как-нибудь в другой раз.
Пример ответа:
Заголовки ответов HTTP имеют ту же структуру, что и все остальные заголовки: не зависящая от регистра строка, завершаемая двоеточием (':') и значение, структура которого определяется типом заголовка. Весь заголовок, включая значение, представляет собой одну строку.
Тело присутствует не у всех ответов. Например, если мы вызываем метод DELETE, чтобы удалить какую-либо сущность, то в ответ нам вернется лишь строка статуса с HTTP-кодом 204.
Как правило тело ответа используется в том случае, когда нам нужно вернуть вызывающей стороне информацию о ресурсе. Например, если мы вызываем метод GET /users/25, то в ответе вернется полная информация о пользователе с идентификатором = 25.
P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.
P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.
Всем привет.
Сегодня продолжим погружаться в системный анализ, в его техническую часть.
Перед тем как начать изучать REST, API и все что с этим связано - нужно изучить, хотя бы верхнеуровнево, архитектуру, на базе которой строятся все современные приложения. Для этого рассмотрим клиент-серверную архитектуру.
Архитектура «клиент-сервер» определяет общие принципы организации взаимодействия в сети, где имеются серверы, узлы-поставщики некоторых специфичных функций (сервисов) и клиенты, потребители этих функций.
В клиент-серверной архитектуре одним из основных вопросов является вопрос о том, как разделить клиентов и серверы. Так, приложения типа клиент-сервер разделяют на три уровня:
уровень представления - на уровне представления обеспечивается взаимодействие с пользователем приложения с помощью пользовательского интерфейса. Его основное предназначение состоит в отображении информации (все формочки, кнопочки и т.д.) и получении информации от пользователя. Этот уровень может работать в веб-браузере или как графический пользовательский интерфейс компьютерного или мобильного приложения.
уровень бизнес-логики - центральное звено приложения, на котором реализованы все основные функции системы. Обрабатывается вся информация, собранная на уровне представления согласно бизнес-правилам для выполнения конкретных бизнес-целей системы. Кроме того, уровень приложения может добавлять, изменять и удалять данные, расположенные на уровне данных;
уровень данных - функции управления ресурсами. На данный момент в современных приложениях его роль зачастую выполняет реляционная (или нереляционная) система управления базами данных.
Т.е. система реализована таким образом, что собирает всю ту информацию, которую пользователь ввел на интерфейсном уровне, затем передает ее на уровень бизнес-логики, каким-то образом обрабатывает с учетом всех бизнес-правил и затем либо возвращает обогащенную информацию обратно, либо сохраняет ее в базу.
Клиент-серверная архитектура делится на двухзвенную и трехзвенную.
Двухзвенная архитектура
Двухзвенной (two-tier, 2-tier) она называется из-за необходимости распределения трех базовых компонентов между двумя узлами (клиентом и сервером). Двухзвенная архитектура используется в клиент-серверных системах, где сервер отвечает на клиентские запросы напрямую и в полном объеме, при этом используя только собственные ресурсы. Т.е. сервер не вызывает сторонние сетевые приложения и не обращается к сторонним ресурсам для выполнения какой-либо части запроса.
В двухзвенной клиент-серверной архитектуре используется так называемый «толстый» клиент, который выполняет отображение информации и обработку всех данных (порядка 80 % всех работ). Сервер осуществляет только хранение и предоставление данных (порядка 20 % работ).
Толстый клиент - это когда приложение напрямую запущено через условный .exe файл на вашем компьютере и работает в отдельном окне (всякие ERP\WMS системы, те же клиенты 1С и пр. не облачные штуки). Собственно их основной минус в том, что т.к. нет выделенного сервера - все функции реализуются на уровне клиента, который потребляет только те ресурсы, которые доступны компьютеру, на котором это приложение установлено.
А большинство офисных компьютеров, как известно, не отличаются большой производительностью, поэтому необходимость сформировать условный отчет даже из относительно небольшого количества данных заставляет их сильно задуматься. Это если не говорить о необходимость формировать или отображать какие-нибудь таблицы, состоящие из нескольких миллионов строк.
Трехзвенная архитектура
Собственно именно эти недостатки в большей степени послужили толчком к появлению трёхзвенной клиент-серверной архитектуры с отдельно выделенным сервером приложений.
Выглядит это всё схематично следующим образом:
Также в этой архитектуре мы уже можем позволить себе использовать "тонкий клиент", т.е. просто страницу в вашем веб-браузере или мобильное приложение. И с учетом этого, мы просто обязаны вынести из него всю логику (даже простейшую валидацию желательно перенести на уровень бизнес-логики, либо, как минимум, дублировать), потому что у него не остается почти никаких ресурсов для ее выполнения.
Всё, на что способен тонкий клиент - это отображать интерфейс, взаимодействовать с пользователем, посылать запросы на сервер по любому чиху и обрабатывать ответы от него. Ну и иногда, по мере какой-то острой необходимости, горящих сроков или чего-то в этом духе можно запихнуть в него какую-то логику, но стараемся этого избежать.
Но при этом мы получаем монструозный (в плане его мощностей) сервер, который способ обслуживать огромное количество клиентов одновременно, в многопоточном режиме обработки данных и выполнять необходимую бизнес-логику за какие-то доли секунд, даже при большом объем данных.
P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.
P.S. Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.