Кто такой software engineer
Профессия Software Engineer: как создавать программы, которыми пользуются миллиарды людей
Нурсултан Джубатыров, 24 года, родной город — Актау, Software Engineer в WhatsApp, Facebook, @de_troit23
О выборе профессии
Я работаю Software Engineer в WhatsApp, Facebook. Программированием увлекся в седьмом классе и уже 11 лет связан с этой сферой.
Окончил Казахско-турецкий лицей, а с прошлого года — выпускник Назарбаев Университета. Сразу после окончания учебы начал работу в Facebook в Лондоне. Там попал в команду WhatsApp.
Чтобы устроиться в Facebook, прошел техническое интервью по Skype, затем три интервью в офисе в Лондоне. Успешно себя показал, к тому же у меня был опыт работы. Я стажировался в Bloomberg в Лондоне и год проходил стажировку в ETH в Цюрихе.
Моя специальность востребованная. Технологии развиваются ежедневно. Все больше людей становятся пользователями компьютеров и мобильных устройств.
Software Engineer создают с нуля новые продукты, которыми пользуются люди во всем мире
Сегодня жизнь без телефонов почти невозможна. Отсюда возникает спрос на программы и приложения, а значит и на тех, кто их создает.
Программист — интересная и современная профессия. Software Engineer создают с нуля новые продукты, которыми пользуются люди во всем мире.
Об условиях работы
Software Engineer создает, пишет и поддерживает программы. В моем случае это WhatsApp — мессенджер с двумя миллиардами активных пользователей ежемесячно. Наша команда называется Internal Infra. Мы отвечаем за внутренние системы, поддерживающие WhatsApp и whatsapp.com.
Большую роль Software Engineer уделяет поддержке программы. Нужно не только ее создать, но и обеспечивать, чтобы все работало, как задумывалось, не ломалось. Если появляются новые баги — ошибки, сбои, специалист исправляет их.
Software Engineer создает, пишет и поддерживает программы
Работа в компании имеет карьерный рост. Обычно это new grad engineer, дальше middle software engineer, а затем senior SWE. Для каждого уровня есть требования: умение общаться с другими командами, понимание продукта, технические навыки и другие.
Для продуктивной работы нужны не только технические знания. Важно уметь работать с людьми, думать критически, быстро адаптироваться и учиться. Также полезна способность глубоко сфокусироваться на задаче.
Как стать Software Engineer
Software Engineer принимают на работу исходя из навыков и знаний, а не ценности диплома. Чтобы стать хорошим программистом, советую выбирать хороший университет, где могут дать глубокие знания. Не обязательно вуз должен быть зарубежным.
В Казахстане это Назарбаев Университет. Там хорошо развито комьюнити программистов, выпускниками вуза интересуются большие компании. К примеру, 7- 8 марта в университете пройдут соревнования по программированию среди девушек CodeW. Представители Facebook приедут как спонсоры этого мероприятия. Будут воркшопы, сессии от инженеров компании.
Заработная плата зависит от места работы
Работа в большой компании дает различные привилегии: бесплатные еда и проезд, акции компании, бонусы, оплата фитнеса, ноутбук, телефон и другие вещи, которые облегчают жизнь. В компаниях, где меньше подобных плюсов, зарплата выше.
О преимуществах и нюансах
Создание продукта, которым пользуются миллионы людей каждый день, дает уникальное чувство. Оно мотивирует придумывать новое и интересное для пользователей. Хочется приносить пользу.
WhatsApp стал неизменной частью жизни людей по всему миру. Мне приятно работать в этой компании. Я реализую разные идеи, пишу техническую часть и вижу, как этим пользуются.
Сложность работы — большая ответственность. От качества исполнения работы зависит многое: насколько приложение уязвимо от хакеров, насколько люди довольны продуктом.
Я быстро учусь и все больше развиваю технические навыки. В планах продолжать работать и жить счастливо с семьей.
20 вещей, которые я узнал за 20 лет работы инженером-программистом
Наткнулся на любопытный материал, в котором автор систематизировал и записал свой опыт инженера-программиста в 20 тезисов. Я работаю в коммерческой разработке ПО больше 25 лет, и этот текст отозвался во мне практически каждой буквой — большинство советов я тоже регулярно практикую, не облекая их в формат ёмких афоризмов. В общем, решил сделать перевод.
Особенно отзываются пункты «стройте компактные системы» и «лучший код — это отсутствие кода». Последний совет я превращаю в цитату из какого-то второсортного фильма про самураев: «Лучшая победа — та, которую ты одержал, не доставая меч из ножен» (думаю, сослуживцы за моей спиной уже закатывают глаза). И, конечно, бесконечные разговоры про легендарных 10x-программистов постоянно хочется прервать советом не связываться с 0,1x-программистами (которые реально существуют, в отличие от 10x).
Дисклеймер от автора оригинальной статьи
Учиться на чужом опыте и ошибках очень важно, но мы часто забываем, что большинство советов имеют контекст, который далеко не всегда учитывается.
«Вам просто нужно повысить цены» — говорит компания, которая 20 лет работала в бизнесе, выставляя поначалу низкие цены для привлечения клиентов.
«Вам нужно внедрять микросервисы» — говорит компания, которая построила монолит, набрала тысячи клиентов и перешла на микросервисы, когда столкнулась с проблемами масштабирования.
Без понимания контекста советы бессмысленны или, что ещё хуже, вредны. Если бы эти компании последовали собственным рекомендациям в начале пути, они, скорее всего, навредили бы сами себе.
Для понимания контекста расскажу, откуда берутся советы в этой статье. Первую половину карьеры я работал инженером-программистом в небольших компаниях и стартапах, потом перешёл в консалтинг и работал в нескольких действительно крупных компаниях. Затем основал Simple Thread, которая выросла из команды 2 человек до 25. 10 лет назад мы работали в основном с малым и средним бизнесом, сейчас — со средним и большим.
Советы в этой статье от человека, который:
почти всегда работал в небольших командах, где приходится делать много, имея очень мало;
ценит работающие решения выше конкретных инструментов;
постоянно начинает новые проекты, но поддерживает ряд систем;
ценит производительность инженера выше большинства других критериев.
Мой опыт за последние 20 лет сформировал отношение к разработке и убедил меня в некоторых утверждениях, которые я оформил в виде списка. Надеюсь, он вам будет полезен.
1. Я все ещё многого не знаю
«Как ты можешь не знать, что такое BGP?» или «Ты никогда не слышал о Rust?» — некоторые из нас не раз слышали подобное.
Причина, по которой многие любят разработку, заключается в том, что мы учимся всю жизнь. И в создании софта есть огромные области новых знаний, которые с каждым днём только растут. Можно десяток лет работать программистом и всё равно иметь огромный пробел в знаниях по сравнению с кем-то, кто также провёл десятилетия в, казалось бы, аналогичной роли.
Чем раньше вы это поймёте, тем быстрее сможете избавиться от синдрома самозванца и с удовольствием учиться у других.
2. Самое сложное в разработке — сделать продукт, который действительно нужен
Знаю, что это уже стало клише, но многие инженеры скептически относятся к данному пункту, поскольку считают, что он обесценивает их труд. Чушь, на мой взгляд. Напротив, этот момент помогает подчеркнуть, в насколько сложной и иррациональной среде нам приходится работать, ведь именно эти аспекты так усложняют нашу деятельность.
Можно разработать самую технически впечатляющую вещь в мире, а потом никто не захочет её использовать. Такое случается постоянно. Проектирование софта часто связано со слушанием — нам приходится быть сразу инженером-программистом, экстрасенсом и антропологом.
Инвестиции в процесс проектирования (с помощью UX-специалистов или путём самообразования) принесут огромные дивиденды. Ведь как реально подсчитать стоимость разработки неправильного ПО? Это гораздо больше, чем просто потерянное время инженера.
3. Лучшие инженеры-программисты думают как дизайнеры
Великие инженеры-программисты глубоко задумываются о пользовательском опыте. Они могут не думать об этом в терминах вроде внешнего или программного API, UI, протокола или любого другого интерфейса. Великие инженеры думают о том, кто будет его использовать, почему он будет использоваться, как он будет использоваться и что важно для пользователей. Учет потребностей конечного потребителя — это залог хорошего пользовательского опыта.
4. Лучший код — это отсутствие кода или код, который не нужно поддерживать
Всё, что нужно сказать: кодеры будут кодить. Если спросить человека любой профессии, как решить ту или иную проблему, он выберет то, что у него хорошо получается. Это просто человеческая природа. Большинство инженеров-программистов всегда будут склоняться к написанию кода, особенно когда нетехническое решение не очевидно.
То же самое относится к коду, который не нужно поддерживать. Инженерные команды часто хотят изобрести колесо, когда оно уже существует. Здесь нужно соблюдать баланс, есть много причин для развития собственных разработок, но остерегайтесь токсичного синдрома «изобретено не здесь».
5. Программное обеспечение — это средство достижения цели
Основная работа любого инженера-программиста — предоставление ценности. Немногие разработчики понимают это, ещё меньше тех, кто это осознает. А ведь осознание приводит к другому способу решения проблем и другому взгляду на инструменты.
Если вы действительно верите, что выбор ПО зависит от цели, то будьте готовы найти «правильный инструмент для работы», который может и не являться софтом.
6. Иногда нужно перестать точить пилу и просто начать пилить
Некоторые сразу бросаются в проблему и начинают писать код. Другие — начинают исследовать и попадают в аналитический паралич. В таких случаях установите дедлайн и начните изучать решения. Вы гораздо быстрее узнаете что-то, когда непосредственно станете решать задачу.
7. Если у вас нет представления о границах возможного, вы не сможете спроектировать хорошую систему
С этим я часто сталкиваюсь, поскольку мои обязанности уводят меня все дальше и дальше от повседневной разработки ПО. Следить за командой разработчиков — огромный объём работы. И если вы не понимаете, на что способна ваша команда, то сможете разрабатывать решения только для самых простых проблем. И опасайтесь тех, кто давно не писал никакого кода.
8. Каждая система в конечном счёте отстой, смиритесь с этим
У Бьерна Страуструпа есть цитата: «Есть только два вида языков: те, на которые все жалуются, и те, которыми никто не пользуется». Это можно распространить и на большие системы. Не существует «правильной» архитектуры, вы никогда не закроете весь техдолг, не разработаете идеальный интерфейс, ваши тесты всегда будут слишком медленными.
Это не оправдание тому, чтобы не делать что-то лучше, а наоборот, способ дать вам перспективу. Меньше беспокойтесь об элегантности и совершенстве, стремитесь к постоянному улучшению и созданию пригодной для жизни системы, в которой вашей команде нравится работать и которая стабильно приносит пользу.
9. Никто не спрашивает «почему» в достаточной степени
Используйте любую возможность поставить под сомнение предположения и подходы, которые «всегда делались так, как надо». В команде появился новый сотрудник? Обратите внимание, где он запутался и какие вопросы задаёт. Поступила заявка на новую функцию, которая не имеет смысла? Убедитесь, что вы понимаете цель и то, что требует эту функциональность. Если не получаете чёткого ответа, продолжайте спрашивать, пока не поймёте.
10. Сосредоточьтесь на том, чтобы избежать 0,1х-программистов, а не найти 10х-программистов
10x-программист — это глупый миф. Идея о том, что кто-то может сделать за 1 день то, что не менее компетентный, трудолюбивый, и такой же опытный программист может сделать за 2 недели, глупа.
Я видел программистов, которые пишут в 10 раз больше кода, а потом вам приходится исправлять его в 10 раз дольше. Кто-то может быть 10х-программистом только в том случае, если вы сравниваете его с 0,1x-программистом — тот, кто тратит время, не просит обратной связи, не тестирует свой код, не рассматривает крайние случаи и так далее. Нужно заботиться, чтобы не допустить 0,1x-программистов в команду, а не искать мифического 10x-программиста.
11. Одно из главных отличий между сеньором и джуном — свое мнение о том, как все должно быть
Ничто не беспокоит меня больше, чем сеньор, не имеющий никакого мнения о рабочих инструментах или о том, как подходить к созданию программного обеспечения. Лучше высказать мнение, с которым я буду категорически не согласен, чем не иметь мнения вообще.
Если вы используете инструменты, но ненавидите их, вам нужно изучить больше. Попробуйте другие языки, библиотеки и парадигмы. Существует мало способов повысить уровень своих навыков быстрее, чем активный поиск того, как другие решают задачи с помощью инструментов и методов, отличных от ваших.
12. Людям не нужны инновации
Люди много говорят об инновациях, но обычно они ищут дешёвые преимущества и новизну.
Если вы действительно привносите новшества и меняете то, что людям привычно — ждите отрицательных отзывов. Но если верите в то, что делаете, и знаете, что это действительно улучшит ситуацию, приготовьтесь к долгой битве.
13. Ваши данные — самая важная часть системы
Я видел много систем, в которых целостность данных держалась в основном на надежде. Любое отклонение от идеального сценария в такой системе, и мы получаем частичные или грязные данные, а работа с такими данными в перспективе превратится в кошмар.
Важно помнить, что данные скорее всего сильно переживут вашу кодовую базу. Приложите усилия, чтобы всё хранилось в порядке, и это окупится.
14. Ищите технологических акул
Старые технологии, которые остались на плаву, — это акулы, а не динозавры. Они настолько хороши, что пережили быстрые изменения, которые постоянно происходят в мире технологий. Заменяйте их только в том случае, если у вас есть очень веская причина. Эти инструменты не будут модными и современными, но позволят выполнить работу без множества бессонных ночей.
15. Не путайте скромность с невежеством
Есть много программистов, которые не высказывают мнения, если их прямо не спросить. Если кто-то не высказывает своё мнение вам в лицо, это не значит, что ему нечего добавить. Иногда самых громких хочется слушать меньше всего.
Поговорите с окружающими, запросите фидбек и советы.
16. Программисты должны регулярно писать
Инженеры-программисты должны регулярно вести блог или дневник, писать документацию и вообще делать всё, что требует от них высокого уровня навыков письменного общения. Письмо помогает думать о проблемах и более эффективно общаться с командой. Это один из важнейших навыков, которым должен овладеть любой программист.
17. Рабочие процессы должны быть минимально энергозатратными
Сейчас все хотят быть agile, но «agile» — это создание вещей небольшими порциями, обучение, а затем итерация. Если кто-то пытается вложить в это гораздо больше, значит, он что-то продаёт. Для этого необязательно переставать помогать сотрудникам или отказываться от отчётности, но вы когда-нибудь слышали, чтобы люди из ваших любимых IT-компаний и масштабных опенсорс-проектов хвалились тем, какой у них клёвый Scrum? Процессы должны оставаться лёгкими и гибкими до тех пор, пока не появится потребность в большем. Доверьтесь своей команде, они всё сделают.
18. Инженеры-программисты, как и все люди, должны чувствовать ответственность
Если вы отвлечёте кого-то от результатов его работы, то он будет меньше заботиться о ней. Это почти тавтология и основная причина, почему кросс-функциональные команды работают хорошо, и почему DevOps стал таким популярным. Дело не только в передаче обслуживания и неэффективности, а в том, чтобы управлять всем процессом от начала до конца и нести прямую ответственность за предоставление ценности.
Дайте группе увлечённых людей полную ответственность за проектирование, создание и выпуск софта (или чего-то ещё) — произойдут удивительные вещи.
19. Собеседования не помогут определить, насколько хорошим членом команды будет человек
Собеседования лучше проводить, чтобы понять, кто такой человек и насколько он заинтересован в нужной области знаний. Пытаться выяснить, насколько хорошим членом команды он будет, — бесполезное занятие.
То, насколько человек умён или осведомлён, также не является хорошим показателем, каким членом команды он станет. Никто не скажет вам на собеседовании, что он будет ненадёжным, жёстким, напыщенным или никогда не будет приходить на собрания вовремя. Некоторые ищут «сигналы» для таких вещей, вроде «Если они спрашивают об отгулах на первом собеседовании, значит, они точно не будут ходить на миты!», но это все ерунда. Если вы опираетесь на подобное, то просто гадаете и отбрасываете хороших кандидатов.
20. Стремитесь к созданию более компактной системы
Есть много факторов, которые будут подталкивать вас к созданию большой системы. Распределение бюджета, невозможность решить, какие функции следует сократить, желание создать «лучшую версию». Все эти вещи очень сильно подталкивают к тому, чтобы сделать слишком много. Нужно бороться с этим.
В процессе разработки вы узнаете так много нового, что в результате итераций получите гораздо более крутой результат. Для многих это крайне трудно.
Ваша история
Вот и всё: 20 лет разработки программного обеспечения превратились в 20 мудрых пунктов. Если согласны или не согласны с мыслями в статье, или если есть, что добавить и чем поделиться — пишите в комментариях.
Программные инженеры: IT-специалисты, которые могут всё
Студенты и преподаватели о бакалавриате «Программная инженерия» факультета компьютерных наук ВШЭ
Каждый год около двухсот студентов приходят в Высшую школу экономики учиться на программных инженеров. За четыре года в бакалавриате кто-то сходит с дистанции, но те, кто добираются до финиша, становятся универсальными IT-специалистами, которые знают всю кухню создания проектов изнутри: от написания кода и дизайна до юридических тонкостей и ГОСТов. Руководитель программы Валерий Шилов и студенты Программной инженерии рассказывают о том, как устроена подготовка специалистов, которые могут все.
От программирования, до патентного права
«Когда я поступала, я не знала, что такое программная инженерия — шла на программу с самым красивым названием и с самым высоким проходным баллом в России (в 2018 проходной балл здесь был 296)», — рассказывает бывшая студентка департамента Екатерина Береснева, которая сейчас учится там же в магистратуре и сама преподает.
Студентов, которые до конца не понимают, что скрывается за внушительным названием, на первый курс приходит немало. «Родители школьников спрашивают меня: “Что такое программная инженерия? Это программирование?”. В том числе и программирование, но программный инженер занимается далеко не только им. Он занимается всеми стадиями производства продукта», — объясняет академический руководитель программы Валерий Шилов.
Тем не менее, все начинается с программирования и изучения большого количества языков. Если не хватает основных C#, Java, C++ и Python, есть факультативы, где можно брать и другие, например, Swift или Kotlin. Знания подкрепляются опытом: со второго курса начинается практика, в том числе в крупных компаниях, и стартует проектная работа. По мере изучения материала студенты берут все этапы создания проекта в свои руки: занимаются дизайном, вопросами авторского права, контролируют соблюдение ГОСТов, готовят документацию. Иногда приходится вести официальные переговоры. Например, студент четвертого курса Александр Плесовских в качестве дипломного проекта разрабатывает приложение-пропуск, используя технологию NFC. Проблема в том, что Apple крайне неохотно дает доступ к этой технологии на своих устройствах, и сейчас студент сам от лица университета убеждает представителей компании сделать для ВШЭ исключение.
Программный инженер совмещает в себе множество функций, и поэтому в учебный план включают не только математику и разработку
«Работа с требованиями заказчика, тестирование продукта, работа с документацией, экономика, принципы управления программными проектами. Студентов учат, как организовывать взаимодействие, как налаживать связи, как выстраивать отношения между разными группам и людьми в них, — по словам Валерия Шилова, программа отвечает запросам современности. — Мы стремимся к тому, чтобы у нас было больше преподавателей, работающих в индустрии».
Фольклор инженеров
Расслабиться при таком количестве разных дисциплин едва ли получится.
«На первом курсе сложно было научиться потреблять информацию в таких объемах, — рассказывает Мария Горденко, которая продолжает учиться программной инженерии в магистратуре. — Программирование я знала очень плохо, но на факультете его преподают практически с нуля, и все можно подтянуть. Для этого, правда, нужно много работать самому, а если человек трудиться не хочет, он просто не сможет продолжать обучение. У нас на курсе были и те, кто изначально умел программировать, но я не уверена, что им в этом плане повезло: пока читают базовый курс, они расслабляются, и им потом трудно снова набрать темп».
Если недостаточно серьезно отнестись к подготовке, то есть шансы попасть в список на отчисление. «Не все выдерживают нагрузки. У нас сейчас был экзамен по программированию, из ста восьмидесяти человек сто отправились на пересдачу», — уточняет Екатерина.
О том, как непросто приходится во время сессии, студенты снимали короткометражки, самодельные триллеры с кадрами лекций и эпические детективы в стиле «Ангелов и демонов» Дэна Брауна.
Это не считая коллажей и стихов о страхе перед неотвратимым — экзаменами:
MSDN, C#, Подбельский,
Бессмысленный и тусклый свет.
Настигнет всех призыв апрельский.
Все будет так. Исхода нет.
Завалишь — всё начнёшь сначала,
Пока не превратишься в тлен:
Ночь, литра кофе уже мало,
Подбел, C#, MSDN.
Что получится, если все пережить
Вакансии на должность программного инженера встречаются редко, но это вопрос терминологии. Программные инженеры могут выбрать любое направление в IT, которые им понравилось, могут заниматься менеджментом, программированием, дизайном, и тем, и другим и третьим вместе или уйти в computer science.
Наши выпускники становятся мощными руководителями проектов, которые не просто выросли из кодировщиков, а понимают все стадии развития проекта
Екатерина Береснева и Мария Горденко остались в науке. Например, Мария ищет метод решения задачи китайского почтальона. Цель задачи — пройти по всем улицам в городе по максимально короткому маршруту, чтобы не проходить по одному и тому же месту по несколько раз. Такие расчеты, например, пригодились бы снегоуборочным машинам, чтобы они не чистили уже очищенные улицы, а скорее отправлялись к нетронутым завалам. Но пока, несмотря на то, что маршрут рассчитывают компьютеры, их решение отклоняется от оптимального на 10-20 процентов.
«Мы пытаемся сократить этот разрыв, и отчасти нам это удалось», — уточнила Мария. В свободное от науки и преподавания время она работает аналитиком в Москва-Сити. Впервые работать в таком качестве она попробовала во время учебной практики в S7, и ей понравилось.
«Программный инженер — это и аналитик в том числе, — объясняет Мария. — Но, как правило, выпускники становятся программистами с разными компетенциями, что особенно хорошо для Agile-команд, где каждый должен обладать компетенциями другого».
Выпускники работают в очень разных сферах. Одни занимаются сложным программированием с тяжелой математикой, другие стали проджект-менеджерами, кто-то системным архитектором, кто-то занимается разработкой в бекенде, кто-то во фронтенде — люди, которые знают и умеют если не все, то очень многое, нужны в каждом большом проекте.
В 2018 году учебная программа получила аккредитацию ABET — самой авторитетной в мире профессиональной организации, занимающейся оценкой качества программ в области инженерных наук и компьютерных технологий. Так что, выпускники стали обладать еще большими преимуществами для международных компаний. Диплом, одобренный организацией, которая собирает лучшие образовательные программы компьютерных и инженерных технологий, — это знак качества подготовки молодого специалиста, не требующий дополнительного подтверждения.