Новиков > путь в Big Tech – Telegram
Новиков > путь в Big Tech
184 subscribers
94 photos
192 links
От зеро-кодинга на стройке до написания высоконагруженных сервисов в Big Tech. 

Пишет SWE в Avito.ru (backend), в прошлом: .NET developer и сертифицированный специалист по использованию BIM.

Написать автору: @nvkv_ai

Книги: https://boosty.to/time2code
Download Telegram
Новиков > путь в Big Tech pinned «Так как уже полноценно занимаюсь коммерческой разработкой ПО, то считаю верным подвести итог своего обучения (инженер -> программист). 👨‍💻 2.5 года потребовалось, чтобы с нуля зайти в бэкенд разработку на популярный язык программирования на позицию middle…»
Январь 2023:

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

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

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

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

#результаты
Личный бренд [Часть 1]

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

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

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


#бренд
Личный бренд [Часть 2]

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

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

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

Есть некоторые идеи по развитию профиля, в общем, stay tuned ;)

#бренд
Не прошло 1 дня, как моя статистика на Гитхабе частично отвалилась.

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

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

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

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

#инструменты
Февраль 2023:

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

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

Познакомился с крутейшим инструментом для создания заметок - Obsidian, а также системой Zettelkasten // обязательно сделаю пост о том, как адаптировал ее под себя

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

Занял с командой 2-е место в финале антихакатона с проектом, в который мало кто верил по началу. Выступил с питчингом проекта в 2-х номинациях в качестве спикера.

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

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

Втянулся в занятия английским - занимаюсь дважды в неделю с ДЗ, present perfect continuous'ами и прочими радостями.

⭕️ Напоминание будущему себе: займись уже серьезным программированием!

#результаты
🔥1
Новиков > путь в Big Tech
Резюме: - Александр - 26 лет - Инженер - Санкт-Петербург
Пролетело 3 года! Хочется отметить основные вехи, чтобы зафиксировать достигнутое и двигаться дальше:

2020 год
👷‍♂️ Весной я решил поменять свою жизнь и стать программистом. Я был ведущим инженером и придумал как делать свои задачи быстрее при помощи C#. Это был мой первый ЯП, с которого я начал.

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

* * *

2021 год
👷‍♂️+👨‍💻 В начале весны мне официально обновили должность в трудовой, за которой потянулись и новые задачи.

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

👨‍💻 Ближе к лету мне удалось трудоустроиться официально инженер-программистом в новой компании! На старом месте меня тяготило, что остается инженерная рутина + не было полноценной команды и серьезных задач в программировании.

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

* * *

2022 год
👨‍💻 Мне нравится чем я занимаюсь, но не покидает ощущение, что за мной тянется шлейф инженера в строительстве...

🚪 В начале весны принимаю судьбоносное решение уйти из компании в никуда и максимально погрузиться в обучение. Меняю стек с .NET на Go.

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

* * *

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

#результаты #карьера
👍3
Новиков > путь в Big Tech pinned «Пролетело 3 года! Хочется отметить основные вехи, чтобы зафиксировать достигнутое и двигаться дальше: 2020 год 👷‍♂️ Весной я решил поменять свою жизнь и стать программистом. Я был ведущим инженером и придумал как делать свои задачи быстрее при помощи C#.…»
Постепенно возвращаюсь к решению Литкода.

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

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

#процесс #алгоритмы
Почему я стал меньше писать кода?

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

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

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

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

Очевидно, что весь фокус смещается с вопроса "как написать фичу?" на вопрос "где написать?". И на вычитку всего проекта и поиск подходящего места с учетом разделения ответственности и всех лучших практик проектирования может уйти много времени. У меня уходило несколько дней только для того, чтобы разобраться в каком сервисе и в каком файле я должен буду добавить 1 строку кода!

Вот так и получается, что для добавления ифчика и закрытия 1 задачи может уйти полспринта. Пример решения заурядной задачи:
1) знакомство с кодовой базой сервиса и поиск места для нового условия;
2) добавление нового юнит-теста на свой ифчик;
3) деплой в дев-окружение;
4) тестирование QA (при необходимости)
5) код-ревью от ответственных сервиса или всех заинтересованных;
6) выкатка в продакшн с последующим мониторингом и готовностью быстро откатить изменения.

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

#опыт
👍1
Практика

На скриншоте представлены взаимосвязи между некоторыми файлами .go в одном из микросервисов компании (кажется их чуть больше тысячи на текущий момент). Каждый файлик содержит от 100 до нескольких тысяч строк кода.

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

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

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

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

#инструменты #практика
Март 2023:

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

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

Очередной раз попал в Высшую Школу Программирования Сергея Бобровского (в августе 2022 получил "пожизненный" бан за просроченный дедлайн - сделал серьезные выводы из этого). Спустя полгода удалось попасть под амнистию и записаться на курс по парадигмам программирования, которым сейчас активно занимаюсь в фоне.
// Знаю, что Школа может показаться очень специфичной, но мне она помогла с развитием правильного программистского мышления в начале пути и уверен, что поможет заложить необходимую базу - концентрат айтишного образования.

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

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

#результаты
Апрель 2023:

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

Закончил курс в ВШПСБ по парадигмам программирования. Познакомился с мультипарадигменным языком Julia и углубился в проблемы параллелизма и нюансы атомарности.

В рамках ВШПСБ приступил ко второму курсу по парадигмам программирования (изучаю декларативную модель). Также получил задание подтянуть свои знания по стеку HTML/CSS/JS + веб-фреймворк Gin, с помощью которых нужно будет сделать в мае-июне дипломный проект.

Познакомился с протоколом odata, с помощью которого реализую небольшой заказной проект.

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



📌 С данного момента планирую коммититься на определенный объем работы в грядущем месяце

Планы на май:
🔖 Пройти курс по верстке HTML / CSS (до 14 мая)
🔖 Пройти курс по JS (до 14 мая)
🔖 Освоить веб-фреймворк Gin для Go на базовой уровне (до 14 мая)
🔖 Реализовать первую версию заказного проекта (odata) и передать Заказчику в тестирование
🔖 Пройти не менее половины второго курса по парадигмам программирования
🔖 Наметить планы по дальнейшему развитию, как инженера-программиста, на промежутке 3/6/12/36 месяцев

#результаты
Начал делать "дипломный" проект в ВШПСБ. Он идет бонусом к основному курсу, который прохожу по декларативной модели, и состоит из 25 заданий (основные боли в бэкенд разработке). Тема: автопарк, регистрация и учет автомобилей.

Проект нужно успеть выполнить в течение 50 дней, то есть на каждое задание 1-3 дня. Для простоты будем нумеровать их как "День N".

Вся разработка открыта и будет здесь.

#проект
День 1

Задание
:
1. Создать основную модель Vehicle (автомобиль) без марки и тех. характеристик.
2. Сделать веб-интерфейс, чтобы можно было посмотреть список машин в базе.

Ход работы:
1. Создал структуру проекта в соответствии с общепринятым стилем.
2. Подключил БД (PostgreSQL), которую предварительно развернул через Docker.
3. Создал основные модельки для БД + метод получения всех моделей из базы.
4. Написал файлы миграций (для создания всех таблиц в БД), но пока запускал их руками без создания какого-либо механизма миграций.
5. Завел Changelog, который помогает быстро просмотреть всю историю изменений в удобном формате.
6. Написал первый в своей жизни динамически формирующийся *html-файл для отображения всех моделей из базы и даже подключил Bootstrap!

Подумать:
1. Как лучше всего писать файлы-миграций и автоматически их применять при деплое проекта.
2. Как в Go организуются файлы html/css, которые используются для отображения различных страниц.

Результат на скриншоте.

#проект
День 2

Задание
:
1. Добавить отдельную модель брендов (имя бренда, тип (легковой, грузовой, автобус, ...), 3-4 другие хар-ки - бак, грузоподъёмность, кол-во мест).
2. Привязать её к основной модели Vehicle.
3. Сделать вьюшку для просмотра брендов (аналогично первой).

Ход работы:
1. Добавил отдельную модель для брендов (тип машины почему-то решил енамом делать - также как и цвет).
2. Бренд привязал через внешний ключ в модели Vehicle "Model ID" (связь один ко многим).
3. Пришлось пересоздавать БД, так как основная табличка обновилась (когда появятся миграции, то с этим проблем вообще не будет).

Подумать:
1. Как лучше проектировать БД с учетом множества связей и нормальных форм.
2. Сейчас получение моделей сделано немного костыльно, поэтому лучше переписать все, используя контроллеры.

Результат на скриншоте.

#проект
Дисциплина x Мотивация

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

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

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

Уже несколько лет пытаюсь нащупать идеальное соотношение work-life-balance, но пока с переменным успехом, в современном мире очень сложно держать концентрацию - слишком много отвлекающих факторов. Но я стараюсь.

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

Наверстываю упущенное:
1
День 3

Задание
:
Добавить в UI максимально простой CRUD: редактирование, добавление, удаление автомобилей.

Ход работы:
1. Добавил новый эндпоинт '/api/v1/vehicles/admin', на котором доступны все основные операции над автомобилями (vehicle).
2. Добавил редирект с основной вьюшки '/view/vehicles' через кнопку "admin" на новый эндпоинт из п.1 (так как верстку еще осваиваю, то мне оказалось проще все разместить на отдельном экране, чем компоновать круды вместе с основным view всех авто).
3. Удивился сколько рутинной работы требует верстка простого блока с добавлением новой модели... (валидация полей, обработка ошибок, вывод понятных пользователю сообщений о некорректном вводе или успешной операции, логирование и пр.).

Подумать:
1. Как применяется паттерн MVC в Go (лучшие практики).
2. Как организуется компонентная верстка.
3. Как можно улучшить свой проект и учесть все детали из п.3 выше (в первую очередь - обработка ошибок).

Результат на скриншоте.

#проект
День 4

Задание
:
Сделать выбор бренда выпадающим списком названий.

Ход работы:
1. Выпадающий список - это фактически метод получения необходимых опций из БД и представление его в HTML.
2. За получение всех моделек у нас отвечает уже существующий метод контроллера "models.Provider.FetchAllModels", поэтому нужно лишь подобрать подходящий элемент управления, которым стал select, опции которого создаем итерируясь по результатам провайдера.
3. Еще сделал список цветов выпадющим списком, но так как для них нет таблички, то он пока хардкодом.
4. Также немного отрефакторил существующую структуру и поправил компоновку.

#проект
День 5

Задание
:
Добавить REST API, по которому (по отдельному url) будет выдаваться список всех машинок в формате json (пока без авторизации и прочего).

Ход работы:
1. Так как основной ендпоинт по выдаче машинок у меня был уже готов (я с него начинал и уже им обогощал HTML-файлик для создания view), то осталось только его оформить в соответствии с REST.
2. Добавил json-тэги для внутренних моделек, чтобы json отображался красивее + настроил округление дат до секунды.

Подумать:
Как еще можно улучшить проект согласно лучшим практикам использования JSON API.

#проект