Что я хотел бы знать о коммерческой разработке до того, как попал в нее
Всем привет, меня зовут Антон, и я Junior Full Stack Developer в компании Binary Studio. Когда я начинал свою карьеру в IT, то понял, что мое представление о разработке немного отличается от реальности. Поэтому я и решил написать эту статью: чтобы люди, которые хотят попробовать себя в этой отрасли, стали немного лучше понимать, что она из себя представляет и во что нужно инвестировать свое время.
Программирование меня заинтересовало на первом курсе университета, когда нам преподавали C#. Мне понравился этот язык, и я решил изучить его получше в надежде получить офер заветного Junior .NET Developer. Постепенно освоил синтаксис, ООП, перешел к конкретным технологиям и написал несколько pet projects. Но назвать себя разработчиком в тот момент я еще не мог. В чем же причина?
Чем разработчик отличается от человека, который просто пишет код
Для начала нужно разобраться с целями коммерческой разработки. По моему мнению, единственная ее цель — предоставлять программное обеспечение, которое помогает оптимизировать или оцифровывать процессы бизнеса. Звучит немного заумно, поэтому рассмотрим конкретный пример.
Допустим, мы решили оставить распиаренное IT уже на этапе этой длинной статьи и попробовать себя в продаже новогодних елок. Возникает вопрос обработки заказов. Можно набрать большой штат сотрудников, а можно создать приложение, в котором пользователи смогут оформить покупку сами. И тогда нам не нужно содержать отдел для обработки заказов. Мы как владельцы счастливы, ведь теперь тратим меньше, а значит, зарабатываем больше, а все из-за такого хорошего приложения.
Теперь попробуйте, исходя из описанного примера, дать ответ на вопрос: а какая цель разработчика в этом процессе? Разрабатывать приложение по каждой букве принципа SOLID? Писать самый оптимизированный код в мире? Может, мы как заказчик хотим видеть трендовые технологии на нашем проекте? Очевидно, нет. Мы хотим продавать еще больше елок, зарабатывать еще больше денег и добиться монополии в своей отрасли. Поэтому, как писал Жак Фреско: «Разработчик решает в первую очередь проблемы бизнеса, а уже исходя из них технические задачи».
Девелопер должен смотреть шире технических задач:
- Необходимо понимать предметную область проекта. В нашем случае — какие елки компания поставляет, этапы оформления покупки и так далее.
- Нужно видеть конечный продукт разработки. Зачем клиент запрашивает новый функционал, как он сделает приложение лучше.
Здесь добавлю несколько ремарок. Конечно, разрабатывать по SOLID, писать оптимизированный код и быть в тренде технологий хорошему разработчику все так же необходимо. Я лишь хочу сказать, что без понимания конечного продукта даже очень хорошей технической базы будет мало. Также описанные выше обязанности частично берут на себя Project Manager и Business Analyst. Они конвертируют запросы бизнеса в конкретное ТЗ для разработчиков. Но даже в таком случае необходимость понимать предметную область и цели проекта никуда не пропадает.
Какими качествами должен обладать хороший разработчик
Исходя из задач, возложенных на разработчика, я выделяю для себя список качеств, которые помогают выполнять их хорошо.
Понимание того, чего хочет клиент
Как мы уже обсуждали, заказчик не хочет, чтобы вы писали код, он хочет, чтобы вы делали его продукт лучше. Поэтому, прежде чем засучить рукава и начать программировать, я бы сначала разобрался, какую проблему бизнеса решает функционал. Возможно, ее удастся решить, не написав и строчки кода.
Также следует помнить, что иногда клиент сам не до конца понимает, как запрашиваемая фича влияет на конечный продукт. В моей практике были случаи, когда в ходе работы я видел, что мой функционал может сломать уже существующий. Или что он уже реализован, но в другом модуле приложения. Таким моментам следует уделять особое внимание, дополнительно обсуждая их с заказчиком.
Умение презентовать свою работу
Огромную роль играет не только то, что вы делаете, но и как вы это презентуете. Совсем уж элементарный пункт, да? Из своего опыта могу сказать, что это далеко не всегда так. Если вы работали над функционалом, польза которого не видна здесь и сейчас (например, написали сервис для вызова удаленных процедур, обертку над библиотекой, интегрировали в проект новую технологию), то объяснить человеку без технического бэкграунда, зачем вы этим занимались — отдельный вид задач.
Я развил это качество в Binary Studio Academy. По ходу работы над проектом наша команда представляла свои результаты условному заказчику, который задавал много вопросов, делал замечания и вносил правки в конечный функционал. Это научило меня смотреть на задачи шире, понимать, какую пользу в итоге они принесут конечному пользователю.
Способность работать в команде
Как я считаю, одно из самых важных качеств вообще. Под ним я подразумеваю уважение к работе и подходам ваших коллег, адекватную реакцию на просьбы, умение признавать свои ошибки и правильно реагировать на ошибки других. Проще говоря, нашумевшие soft skills.
С этим пунктом мне помогла опять-таки академия, так как разработка проектов ведется в командах. Не последнюю роль сыграл и мой университет: у нас достаточно часто были лабораторки на несколько человек. Хоть звучит это и не очень впечатляюще, но при желании можно извлечь пользу и из таких занятий.
Умение разбираться в чужом коде
Даже если предположить, что вы работаете на новом проекте, вам все равно придется иметь дело с кодом коллег. А если проект разрабатывают уже несколько лет? В таком случае умение быстро разбираться в существующем функционале — огромный плюс для инженера.
Я развивал этот навык следующим образом: когда начинал изучать новую технологию, то смотрел популярные репозитории, в которых она используется. Таким образом можно убить двух зайцев одним выстрелом: посмотреть, как то, что вы изучаете, применяется на практике, и научиться разбираться в коде, написанном другими инженерами.
Немного о hard skills
Цель разработчика — делать бизнес заказчика лучше. Если то, что вы реализовываете, не улучшит бизнес, то, скорее всего, это не нужно. Но из этого следует вопрос: а какой тогда смысл писать хороший код? Если код, написанный на коленке, дает тот же результат и приносит бизнесу ту же пользу, что и хорошо спроектированный, зачем тратить время и ресурсы попусту?
Зачем писать код по стандартам
Какую пользу разработка по стандартам несет для бизнеса? Ведь если пользы нет, то нет и смысла использовать эти стандарты.
Дело в том, что плохо написанный код невероятно тяжело поддерживать (спасибо, Капитан Очевидность). Инженеры вместо того, чтобы работать над новым функционалом, будут неделями разбираться с уже существующим, бороться с side effects и молиться, чтобы их фича не сломала половину приложения. На задачи будет выделяться намного больше времени, а время, как известно, — деньги. Вряд ли какой-либо бизнес хочет их терять.
Как научиться писать хороший код
По моему мнению, важно понимать, что качество кода растет постепенно. Не бывает такого, что сегодня вы пишете плохо, а завтра, прочитав какую-то статью/освоив новый подход, начнете писать хорошо. Это процесс долгий и непрерывный, нужно запастись терпением.
Ниже я перечислю то, что сильно помогло мне улучшить свой код:
- Изучение SOLID, KISS и DRY. Эти наборы правил увеличили качество кода в разы. Некоторые из них достаточно непростые, поэтому советую сразу пробовать применять их на практике.
- Постоянное изучение обновлений языка программирования, технологий, которые использую. С каждой версией разработчики добавляют что-то, что делает код потенциально чище. Так что быть в тренде нужно обязательно.
- Много практики. Для себя я не ставил цель программировать по 25 часов в сутки: лучше меньше, но регулярно. Также развивает навык разработка в команде с другим человеком, частые code review и дискуссии на тему, как лучше реализовать логику приложения.
MythBusters
Перед тем как закончить статью, я бы хотел рассказать о нескольких стереотипах, в которые верил до начала работы в IT.
Работа в большой компании = хорошая работа
Как мне кажется, один из самых распространенных мифов. Конечно, я не утверждаю, что работать в большой компании плохо. Я имею в виду, что нужно оценивать конкретные вакансии: с какими технологиями будете работать, какие будут обязанности, на какой проект вас берут и так далее. Известное имя — это не всегда гарант хорошей работы.
Вера в best practices
Когда я начинал изучать программирование, то верил, что существует подход, благодаря которому можно разрабатывать системы идеально. К сожалению, это миф. В конечном итоге все зависит от конкретной задачи, возможностей языка, особенностей проекта, сроков... Список можно продолжать долго. Как тогда определить, когда какой подход использовать? С этим поможет только практика.
Технологии ради технологий
Начинающему инженеру всегда хочется работать с новыми технологиями, и ничего плохого в этом желании нет. Пробовать новые языки, фреймворки и подходы в своих pet projects можно (и нужно) сколько угодно. Но если вы предлагаете внедрить в коммерческий проект новую технологию, то ответственным за это решение будете вы. Поэтому важно использовать не что-либо самое новое или лично вам интересное, а то, что подходит под конкретную задачу.
Итог
Еще раз подчеркну главную мысль статьи: разработчик решает в первую очередь проблемы бизнеса, а уже исходя из них технические задачи. Если вы можете помочь бизнесу, не написав ни строчки кода — сделайте это.
Изучайте новые технологии и подходы, но оценивайте критически их полезность перед тем, как интегрировать в свой проект, ведь за их использование будете ответственны вы.
Развиваясь как инженер, не стоит забывать о soft skills: они помогут в общении с коллегами и заказчиком. Недостаточно быть хорошим программистом, важно уметь работать в команде, понимать, чего хочет клиент, и уметь презентовать свою работу. Всегда помните, что обязанности разработчика выходят за рамки технических.