Публикую интервью с Александром, что имеет опыт разработки на C++ более 15 лет и на данный момент работает в MongoDB.
1.Расскажите о вашем образовании?
Мое образование — это весьма интересная штука. В школе я углубленно изучал математику, полюбил ее и с тех пор моя жизнь так или иначе связана с ней. После школы я поступил на два факультета — экономический и механико-математический. Выбрал экономическую теорию просто потому, что там была более крутая математика на вступительных экзаменах. Экономическая теория является весьма специфическим предметом, это какая-то смесь математики и философии с примерно такой же практической пользой. На самом деле ряд предметов, изученных в университете, мне очень пригодились позднее — особенно линейная алгебра, статистика, теория вероятностей и математическое программирование (раздел математики, посвященный оптимизационным задачам, ничего общего с компьютерами). Был любопытный предмет, называемый эконометрикой, по факту это статистический анализ больших данных, позволяющий найти взаимосвязи данных, прямо-таки столь популярное сейчас машинное обучение. После получения высшего образования я несколько лет проучился в Вычислительном центре РАН, тема моей так и не законченной диссертации была «Параллельные методы решения задач дискретной оптимизации транспортного типа», простыми словами я решал задачу коммивояжера. Привет математическое программирование из университета.
2. Почему вы выбрали именно C++? Чем импонирует вам данный язык программирования?
Я его не выбирал, это он меня выбрал, я честно предпринял несколько попыток уйти из него, но он всякий раз меня догонял. Последняя попытка была в Microsoft, там я писал на C#, и думал, что я такой умный и сумел уйти от C++, но как говорил один мой друг «C++ умеет ждать», и в Microsoft я опять переключился на C++. По своей воле, очень уж интересная была задача.
3. Начать профессиональную деятельность на С++ получилось благодаря самообразованию или же благодаря профильному образованию? Расскажите о своём пути в С++
Я решал задачу коммивояжера и ее варианты на C++, так уж получилось, что это был самый подходящий язык для такой задачи. Затем я начал работать в Яндексе, в отделе качества поиска над MapReduce (помните тему диссертации — «Параллельные методы…»), там тоже был C++, и он так и не отпускал меня с тех пор.
4. Есть ли книги по С++, что вы можете посоветовать?
Самыми полезными для меня были, пожалуй, серия небольших книг Скота Майерса «Эффективное использование С++» с набором рецептов, понять STL мне помогла книга Николая Джосьютиса по STL «С++. Стандартная библиотека». Но самое главное, конечно же, практика. Как язык C++ меня никогда особо не интересовал, я рассматривал его лишь как средство для решения интересных задач.
5. Расскажите о вашей компании, где вы работаете. Что входит в ваши рабочие обязанности на данный момент и чем занимается ваша компания? Какой продукт?
Я работаю Senior Software Engineer в MongoDB, компании, которая разрабатывает собственную СУБД (система управления базами данных). Моя команда занимается оптимизацией запросов (Query Optimization). MongoDB привлекла меня тем, что сумела успешно бросить вызов на рынке СУБД, казалось бы, надежно поделенного между такими гигантами как Microsoft SQL Server, Oracle и IBM DB2.
Так получилось, что с 70-х годов и исследовательского проекта реляционных баз данных IBM System R, от которого произошли современные базы данных, очень многое изменилось. Благодаря интернет-компаниям, таким как Google, стало набирать популярность горизонтальное масштабирование. Другой тип масштабирования, вертикальное, характеризуется тем, что по мере роста требований к вычислительным мощностям, старые сервера заменяют на более мощные, происходит вертикальный рост. Но такой рост всегда ограничен мощностями одного сервера. Горизонтальный рост характеризуется не заменой сервера на более мощный, а добавлением новых серверов. Это оказывается дешевле и позволяет почти неограниченно расти, но и требование к программному обеспечению гораздо выше, новый софт должен быть «распределенным», то есть работать на множестве серверов. Одна из первых попыток распределения работы на множество серверов была система MapReduce, над одной из реализаций которой я работал в Яндексе.
Классические СУБД оказались не готовы к такому повороту событий по ряду причин: изначально они были спроектированы для работы на одном сервере, и реляционная модель данных предполагает высокую нормализацию данных, грубо говоря никаких дублирующих данных, вместо сохранения адреса для каждого заказа, адрес сохраняется в отдельной таблице и каждый заказ содержит уникальный идентификатор адреса, а значит большое число джойнов (join), т. е. теперь, чтобы получить, адрес для заказа надо найти его по идентификатору в другой таблице.
MongoDB реализовала совершенно новый подход, называемый документным, все связанные данные должны хранится вместе. Это позволяет сократить число джойнов, а то и полностью избавиться от них, это опять же упрощает создание по-настоящему распределенной базы данных. Новый подход оказался коммерчески успешным, MongoDB как СУБД активно развивается, и старый query engine (движок запросов) перестал отвечать требованиям новой MongoDB. Я сейчас работаю над оптимизацией запросов в новом движке, это задача дискретной оптимизации и ее методы во многом пересекаются с моей работой над задачей коммивояжера. Также используются метод ветвей и границ (Cascades, реализованный в Microsoft SQL Server) и динамическое программирование (Oracle и IBM DB2).
6. Расскажите о проектах, в которых вы приняли участие? О проектах и их функциональных возможностях.
Я был техническом лидером проекта поиска по графу знаний, в проект входила реализация графа знаний в поисковом индексе и поддержка соответствующей грамматики поиска к примеру «файлы Йена программиста из Лондона». Мы разбивали эту фразу и обрабатывали запрос следующим образом в индексе контактов находили человека с именем Йен, должностью программист/разработчик или другой синоним из Лондона. Затем переходили по графу знаний и находили файлы, которые этот человек правил или создавал. Вы можете видеть, как работает подобный поиск в Microsoft Office 365. Если вы знаете английский язык вы можете увидеть демонстрацию вначале этого промо видео: https://youtu.be/zbqlAd6aMoE
7. Исходя из вашего опыта, на какие личные качества/навыки/компетенции в первую очередь обращают внимания работодатели в вашей сфере?
На интервью обычно проверяются три навыка:
- навык решения задач и насколько эффективно человек может сформулировать и донести свои мысли о разных подходах к решению задачи, обсудить эти подходы и выбрать правильный
- насколько эффективно человек умеет работать в команде, здесь оценивается множество навыков, к примеру, умение признавать свои ошибки, умение конструктивно критиковать и принимать критику, эмпатия и т.п.
- проектирование систем: как реализовать тот иной сервис или функциональность в программе, начиная с выбора системы хранения данных, продолжая методами обмена данными и так далее, оценивается, в частности, то как умеет ли человек собирать требования о будущей система и как он умеет использовать требования для выбора подходящих технологий.
8. По вашему мнению, каков спрос на рынке труда и какие перспективы у данной профессии в ближайшие полгода – год, исходя из нынешней экономической ситуации?
Да все как обычно, не вижу никаких причин, чтобы что-то изменилось в ближайший год.
9. Есть ли спрос в данный момент на новичков (Junior-специалистов) в С++ ?
В MongoDB, Microsoft и т. п. активно практикуется приглашение на практику студентов ВУЗов (internship), после окончания ВУЗа студенты могут вернуться в компанию, обычно это практически единственный способ попасть новичку на работу в ведущие компании.
10. Подводя итоги. Что можете посоветовать людям, что самостоятельно изучить С++ и в дальнейшем работать в данной сфере?
Я бы порекомендовал для начала осознать, что язык программирования не так и важен, важны фундаментальные знания – линейная алгебра, статистика, алгоритмы и структуры данных. Умение применять эти знания на практике. Я не говорю, что я никогда не читал книг по языкам программирования, это не так. По одному C++ я прочитал с десяток книг, а еще я читал книги и в целом изучал такие языки как Java, C#, Python, JavaScript, Haskell, F#, OCaml, Ruby. Но это никогда не было в моих приоритетах, я понимал, что эти знания мимолетны и быстро устаревают. Что не устаревает так это общие принципы программирования (они, кстати, часто описаны в книгах по языкам программирования в том числе), алгоритмы, принципы построения систем.
К примеру, самый продвинутый Query Optimizer сегодня реализован в Microsoft SQL Server, его принципы были разработаны в 90-е годы Goetz Graefe. Этот оптимизатор используется метод ветвей и границ, разработанный в 60-е годы Литтлом для решения задачи коммивояжера. Серьезные современные передовые системы базируются на принципах, разработанных десятилетия назад.
Может показаться, что моя дорога была прямолинейной и я знал к чему иду, это неправда. У меня было много метаний и поисков, одно лишь было постоянным — я всегда любил математику и алгоритмы и стремился ими заниматься, а также я любил программирование потому, что оно даёт мне свободу выражать свои идеи во что-то работающее. Именно этот акт творчества во время программирования когда-то привёл меня в восторг, и этот восторг не отпускает меня до сих пор.
Мой ТГ-канал
IT-Старт t.me/it_begin
Интервью, обзоры технической литературы. Кратко, ёмко.