Привет, Женя! Скажи, кем ты хотел стать в детстве? Чем нравилось заниматься?
У меня не было какой-то конкретной мечты «хочу стать космонавтом». Мне кажется, я мог бы стать врачом, мог бы заниматься наукой, конкретно физикой, потому что это прикладная наука.
Где ты родился?
Родился в Москве.
Сколько тебе лет сейчас?
31 год.
Родители твои чем занимались?
Отец – научный сотрудник, химией занимается всю жизнь. Работает в Институте органической химии — занимается всем, что связано с нефтепереработкой, катализаторами и т.д.
А мама всю жизнь проработала в санэпидемстанции. Она – госслужащий.
А в школе чем нравилось заниматься? Какие предметы любили?
Больше всего нравились — физкультура, физика и математика.
Когда у тебя произошло знакомство с компьютерами первое?
Лет 10 наверное мне было. Мой отец и дядя принесли домой один из первых пентиумумов. Они пытались установить какие-то драйвера, писали в командной строке — это было жутко интересно, все равно что ступать на землю, на которой никто никогда не был.
Как выбирал высшее образование? Почему пошел на ВМиК?
У меня была очень сильная школа — гимназия 1514. У нас были очень хорошие преподаватели в первую очередь по физике и математике, поэтому мне было легко поступать, но именно на технические специальности. Поэтому в медицину я и не пошел.
А что касается прикладных наук, я поступил, в МГУ на мехмат, физфак и ВМК и в МИФИ. Мехмат я для себя сразу отверг, т.к. хотел заниматься именно прикладными науками. МИФИ было далеко. Если я колебался, то выбор у меня был между физфаком и ВМК. МИФИ было далеко. Пошел в итоге на ВМиК — сейчас понимаю, что это был детский неосознанный выбор. Сейчас, все переиграв, может быть я принял бы другое решение. Но я не жалею нисколечко.
Что тебе дало образование? Почему не жалеешь?
Во-первых, образование хорошее. Но оно, как ни странно, не слишком прикладное. Я уже потом увидел и узнал, что есть много более прикладных программ, если сравнивать с западными вузами, у них гораздо более прикладное образование. Но в МГУ дают хорошее фундаментальные знания. В первую очередь тебя учат учиться. И этот навык очень мне помогает по жизни. А все остальные прикладные фишки, конкретные знания, если ты не дурак, всегда можно добыть, найти и стать в этом профессионалом.
Когда ты решил выйти на работу? Куда? Зачем вообще решил начать работать?
Я начал работать, будучи еще студентом. На 2-ом или 3-ем курсе. Первые работы были такие смешные. Я набирался опыта и часто их менял. И это было нормально, потому что ты студент, зарабатываешь какую-то денежку, приобретаешь опыт и параллельно учишься. Спонтанно появлялись какие-то примитивные работы, связанные с программированием. Я бы не сказал, что в их выборе была какая-то логика.
А потом уже пошли серьезные работы. Если про серьезные работы говорить, эпохальные, это был Acronis, где я 2 года проработал. Это достаточно низкоуровневое программирование С++. Потом занимался алгоритмической торговлей, фондовыми биржами, как в крупных инвстбанках вроде Ренессанса, где куча всевозможных интеграционных проектов, решений было сделано, так и в частных проектах.
А в чем вообще суть программирования? Для чего оно используется?
Я сейчас попробую вкратце рассказать, что такое программирование.
Во-первых, надо понимать, что программирование бывает очень разным. Бывает программирование, когда пишут код, который отвечает за взаимодействие с пользователем. Называют «юзер интерфейсом». Бывают разные операционные системы, бывают разные языки программирования, бывают разные среды разработки, бывают разные библиотеки, бывают разные задачи. Поэтому программирование бывает очень разным. Поэтому всегда забавно, если, к примеру, приходишь в поликлинику, у какой-то тетечки что-то не работает,она спрашивает:
– А ты кем работаешь?
– Программистом.
– А почини мне вот эту программу. (которую ты, естественно, первый раз в жизни видишь).
Все очень часто путают программиста с сисадмином, который обладает знанием, как работает программа. Естественно, если я займусь этим вопросом, то через 10–15 минут я ее изучу вдоль и поперек, дизассемблирую и решу любую задачу, но это работа не программиста, а системного администратора.
Что такое дизассемблирую?
Дизассемблирую – это двоичный код превращу во что-то читаемое, в чем можно понять логику того, как оно работает.
Программирование – это творческая профессия. Я где-то слышал сравнение с работой врача, которое мне очень понравилось. Суть этого сравнения в следующем, что работы похожи: к врачу приходит пациент, у него что-то болит, у него что-то неисправно. Врач берет и лечит. Есть разные клинические случаи и очень много разновидностей тех же самых болезней со своими вариациями, и одно и то же заболевание может проявляться по-разному, и лечиться по-разному. Но все-таки, более-менее есть какие-то стандарты, что касается классических случаев заболевания.
Программирования и медицина очень похожи в этом. Но как мне кажется в программировании вариаций гораздо больше, т.е. каждая задача новая и у тебя каждый раз новый пациент. Тебе нужно либо создать что-то новое, чего до этого не было, либо тебе нужно починить что-то, что сломалось, и это каждый раз новая поломка. Это не какой-то стандартный случай: отказала почка, потому что перекрыт мочеточник. Там каждый раз что-то по-новому. Поэтому это реально творческая профессия. Основным инструментом, который позволяет решать все эти проблемы, является, как правило, декомпозиция. Это когда перед тобой стоит что-то сложное, нужно создать что-то большое, то ты эту большую задачу разбиваешь на много маленьких подзадач и начинаешь решать их. Как говорит главный герой в фильме «Марсианин»: «Если вы в космосе попали в какую-то неприятную ситуацию, то у вас есть 2 пути. Либо отчаяться, либо пытаться с этим бороться. Если вы пытаетесь с этим бороться, то вы эту большую проблему бьете на много маленьких и начинаете их решать постепенно.» Инструментарий, который программисты используют, это, как правило, паттерны, независимо от языков программирования.
Что такое паттерны?
Паттерны – это шаблоны для решения стандартных задач.
Причем по мере развития программирования в целом набор паттернов постоянно увеличивается, появляются какие-то новые паттерны, новые подходы к решению тех же самых задач, более эффективные, более понятные, более наглядные. Их все время нужно изучать. Поэтому программирование — это непрерывное изучение. В программировании вообще не существует идеального кода , не существует конца и предела совершенству программисту. Программирование – это непрерывная учеба. Что-то из серии заветов Ильича: «Учиться, учиться и еще раз учиться!»
Сейчас популярны всякие методологии, типа Agile. Суть в том, что любая разработка ведется итерационно — все делится на маленькие циклы. И чем у тебя короче цикл, тем круче. Допустим, ты делаешь что-то одно очень большое. Ты берешь и ставишь для себя маленькую цель и пытаешься ее достичь гораздо быстрее. Если ты ее быстро достиг, ты двигаешься дальше. Ты имеешь контроль над тем, что происходит.
Это такой антипод тому, что раньше было принято в программировании, это называлось каскадной разработкой. Когда писался большой план, куча предположений делалось. А потом все это много лет создавалось и в конце что-то получалось, что не соответствовало действительности. Сейчас все склонны к Agile-методологиям и я полностью за.
А как вообще и кто создает программный продукт?
Допустим, у вас есть задача, которую вы хотите решить. Пускай даже маленькая. Представим, что процесс идеальный. В таком случае для начала Вам нужно собрать требования, понять что мы вообще хотим. Эта роль в бизнес-аналитика. Потом вам нужно продумать, как это будет работать. Задуматься об архитектуре, о проектировании конструкции. Это то, что должен делать в идеале архитектор. Потом вы должны заняться планированием работы. Это то, что должен делать проджект-менеджер. Потом начинается реализация, т.е. программирование. Программисты пишут код, переодически рефачат (улучшают, упрощают, изменяют) его, создают автоматические тесты.
Сейчас вообще очень популярна идея автоматического тестирования. Т.е. помимо написания самого кода, пишется и другой код, который его проверяет. Порой даже раньше основного кода. Так, например, сначала пишется юнитест, т.е. к какой-то компоненте предъявляются определенные требования в виде кода. И потом, когда ты написал тест, пишешь сам код. Если он удовлетворяет этим тестам, значит код хороший. Так же в этом итерационном цикле есть стадии типа ревью кода. Это когда другой программист читает твой код. Если он видит какие-то проблемы — он сообщает тебе об этом заранее. Дальше начинается ручное тестирование, когда люди просто сидят, кликают и смотрят, как все работает.
Далее — стадия вывода кода в продакшн, в идеале это должен делать саппорт или люди, которых называют модным словом DevOps. Потом начинаетсят стадия пост-продакшен, когда какие-то багги (ошибки) нужно заметить, саппорт должен собрать все эти бесконечные замечания пользователей и девелоперы должны их пофиксить (исправить). Есть куча способов улучшить конечный результат этой операции или всего операционного цикла. Все эти этапы важны и нужны. Зачастую какими-то из них жертвуют. Иногда можно вообще не собирать требования, вообще ничего не планировать, можно не рефачить код, можно не тестировать. Порой даже нужно пренебрегать какими-то этапами и это разумно. Но все это влияет на конечное качество.
Сейчас наблюдается тенденция, что больше функций перепадает на девелоперов. Становится популярно такое слово, как DevOps. Часть функций саппорта переходит к самим разработчикам. Теперь весь енвайромент (среда в которой всё крутиться) — это тоже код. Очень популярно стало юнитестирование, когда программы пишутся и автоматически сами тестируются. Чтобы люди после каждого изменения не прокликивали весь «флоу» заново. Это именно такой подход, когда все бьется на маленькие кусочки, а кусочки ты можешь автоматически протестировать. А если ты их потом собрал, как конструктор, они скорее всего будут работать правильно. Хотя это тоже надо проверять и это тоже можно автоматизировать и называется это словом интеграционное тестирование. И в принципе это хорошо, потому что ручное тестирование это круто, но все равно, особенно если схема системы очень большая, просто невозможно каждый раз прокликивать все заново руками. Возьму на себя смелость и утверждаю, что во всей этой пищевой цепочке ключевое звено занимает именно разработчик. Я видел кучу проектов, в которых не было архитекторов, в которых не было бизнес-аналитиков, в которых не было проджект-менеджеров, в которых не было тестировщиков, в которых не было саппорта. Но я не видел ни одного проекта, где бы не было разработчика. Потому что зачастую именно он выполняет все эти функции и по сути он ключевая персона.
Хотя, безусловно, все эти остальные функции очень важны, и очень круто, когда есть люди, которые умеют клево их выполнять. Когда есть бизнес-аналитики, которые грамотно собирают полные, непротиворечивые, атомарные требования. Когда есть хорошие проджект-менеджеры, которые способны объяснить заказчикам временные сроки, решить все эти бесконечные проблемы и способны снять с команды, которая занимается имплементацией бремя. Так чтобы на голову вся эта лапша не сыпалась в виде бесконечных звонков и вопросов «когда». Очень клево, когда есть тестеры, которые могут клево протестировать, заметить любые баги, которые могут даже автоматизировать отчасти свое тестирование и т.д.
Как сегодня проходит твой рабочий день?
Про рабочий день программиста много мифов и легенд рассказывают, есть очень много анекдотов про программистов. Вызвано это тем, что когда люди погружаются в создание кода — они уходят в себя. В эти моменты они порой совершают какие-то непонятные поступки, которые другим кажутся со стороны идиотскими. На самом деле, часто просто отключаешься и забываешь какие-то вещи. Потом может быть даже стыдно за то, что забыл вовремя позвонить жене или поздравить друга с Днем рожденья.
В реальности ты просто уходишь в себя и 80% времени думаешь. А когда созрел, то начинаешь писать код. И когда ты его пишешь, пишешь, пишешь, в результате что-то получается. Периодически ты разговариваешь с людьми, с заказчиками, выясняешь требования и так далее. Если говорить про разработку, особенно про командную, как правило, бывают митинги. В случае Agile — они бывают ежедневно.
Какие конкретно задачи Вы решаете? Можете привести пример?
Задачи бывают очень разные. Например, задача алгоритмического характера — есть человек или ресурс, и вы можете у них спросить по какому-то протоколу: «Вась, ты знаешь Петю?». Он тебе может ответить да или нет. Вот есть какой-то набор таких людей, которые стоят вокруг вас. Вам нужно за наименьшее количество операций, вопросов, узнать, кто из этих людей так называемая звезда? То есть, такой человек, которого знает больше людей, чем остальных? Это прикладная задача. Потому что реально порой нужно найти именно оптимальный способ. Если говорить про какие-нибудь карты — то оптимальный маршрут от точки А до точки В.
Если говорить про последнюю задачу, которую я решал, буквально, сегодня, это: у вас есть 2 кучи, вам нужно переложить кирпичи. Причем вы можете перекладывать кирпичи только целиком. Но при этом вам нужно соблюсти пропорцию. Одни кирпичи, допустим, красные вы складываете на левую часть борта, синие – на правую часть борта. Если вы чуть-чуть кирпичей больше переложите, пропорцию не соблюдете, корабль перевесит и все утонет. Соответственно, вам нужно переносить кирпичи, но при этом вы не можете их на части бить, вы не можете ломать кирпичи.
Прикол не в том, что вы каждый раз не знаете, как это сделать. Прикол в том, что когда вы делаете несколько итераций, вам нужно сохранять состояние, знать, что вы делали до этого. Но если у вас одно из требований – это состояние, то есть помнить количество итераций вы не можете, вы только знаете, сколько у вас осталось кирпичей и сколько вы уже отгрузили на этот корабль. И знаете вот эту пропорцию. В принципе, достаточно простая математическая задача, кроме пропорции и округления, особо функций никаких и нет. Но, как ни странно, она не такая простая, как может показаться. Даже приходится писать юнитесты, чтобы самого себя проверить, что бы не ошибся. В моем случае проблематика — это финансы. Кирпичи — это просто лоты на фондовой бирже, ведь нельзя купить дробное количество бумаг на рынке. А почему нужно соблюдать пропорции? Ну потому что это тупо риски. Чтобы у вас позиция была сбалансирована.
Другой пример задачи — нужно нарисовать пользовательский интерфейс, вывести что-то в Excel, на форму, или на веб-страничку. Это простая прикладная задача. Это не алгоритмика. Но при этом тоже нужно знать инструментарий, нужно знать, как это правильно сделать. Нужно знать, в какой среде это делать. Нужно знать язык программирования. Это такая классическая рутинная работа. Но это тоже часть профессии.
Какими качествами должен облазать человек, чтобы хотя бы претендовать на то, чтобы стать программистом?
Во-первых, он должен быть умным. Логический склад ума должен присутствовать.
Второе качество — это упорство, терпение. Потому что программирование это постоянная учеба. У тебя что-то не получается, ты должен ни смотря ни на что сделать это.
Зачем человеку так сильно напрягаться, учиться? Что такого хорошего в этой профессии?
Плюсов много. Во-первых, это творческая профессия. Самореализация важна для человека.
Во-вторых, это востребованная профессия. Очень востребованная. Программисты это как вымирающий вид животного, занесенный в Красную книгу. Потому что, чтобы стать программистом, нужно очень много времени потратить. Это очень большой труд. А потребность растет сильно. Людей, которые отдали этому очень много времени, очень мало. Они реально очень востребованы.
Я редко в последнее время встречаю людей, которых я чувствую сильнее себя в профессиональном плане. А когда все-таки встречаю таких, то очень радуюсь. Перенимаю их бесценный опыт. 10 минут общения с человеком, который опытнее тебя, бесценны. Ты узнаешь за эти 10 минут ответы на вопросы, которые ты сам бы искал очень долго.
Отсюда вытекает и третий плюс — есть возможность переехать в какую-то другую страну, получать хорошую зарплату.
Четвертый плюс — поработав программистом в какой-то предметной области, зачастую изучаешь другую профессию вдоль и поперек. Порой даже лучше самих специалистов в этой профессии. Хотя так конечно не должно быть. Т.е. интересного много узнаешь из других областей.
Ну и наконец, важно, что ты можешь видеть результат своей работы. Ты что-то сделал и действительно видишь,что получилось.
А что сложного есть? Что-то еще может сложное в работе, с чем не каждый справится?
Основная сложность, что заказчики, которые что-то просят, очень часто не понимают, не представляют, как это сделать, чего это стоит. Они 150 раз поменяют свои желания.
К тому же многие не понимают, что программирование — это в первую очередь капитальные вложения, хотя с точки зрения финансовой оценки это больше похоже на операционные расходы. Суть программирования в том, чтобы сделать что-то, что потом будет воспроизводить себя 150 раз. Ты один раз написал код, а он потом 150 раз решает одну и ту же задачу раз от раза. Это как строительство дома. Это капитальное вложение. Несмотря на то, что ты платишь программисту, пускай даже хорошую зарплату каждый месяц. И вроде как эта операционные издержки. Очень многие люди не понимают, что на этом глупо экономить.
Как ты любишь отдыхать?
Люблю свою семью, друзей. Люблю добрые теплые компании.
Люблю активный отдых. Хотя бы съездить в лес, искупаться где-то с семьей и с друзьями. Раньше ходил в горы. Сейчас, к сожалению, времени не хватает, да и возможностей мало. Часто играю в футбол в любительской лиге.
А читать что-то успеваешь? Смотреть?
Книги люблю научно-популярные, допустим, по физике. Люблю всех популяризаторов этой науки — того же самого Хокинга. Да, многие научно-популярные книги, на самом деле во многом псевдонаучные. Но хотя бы они дают возможность прикоснуться к этому миру физики.
Если про фильмы, то то же самое. Научно-популярное кино или фантастическое кино, которое основано на какой-то научной проблеме. Фильмы, которые сводили меня с ума, это «Терминатор». В свое время это было круто, потому что тогда первые компьютеры только появлялись. Люди думали: «Искусственный интеллект. Скоро нас роботы поработят». Реально было круто. Сейчас это уже бесконечные повторы тех серий, кажутся просто смешными. Еще спорт люблю смотреть — какой-нибудь хороший футбол. Комедии люблю, страшилки. Мне после них хорошо становится. К примеру, люблю смотреть «Криминальную Россию» про маньяков. Меня вообще никто не понимает. Но это реально такая особенность психики человеческой, когда ты смотришь страшилки, себя угнетаешь, потом наступает хороший период.
Чтобы ты посоветовал людям, которые еще ищут свое призвание?
Не надо питать иллюзию, что ты выбрал профессию, которая тебе нравится, и после ты кайфуешь и все будет идеально и гладко. Да нифига. В любой профессии, в любой работе есть рутина. Не важно, актер ты, программист, хирург, нефтяник, дворник. Везде есть рутина. Поэтому все сказки про то, что «найди себя и все будет как по маслу, жизнь наладится и все будет круто» – это все фигня. Просто реально кому-то что-то подходит больше, кому-то что-то подходит меньше.
Поэтому нужно выбрать профессию, соответствующую твоему складу характера, ума. А если у тебя несколько таких вещей, нужно значит из чего-то сделать хобби . Во многом хобби даже круче, чем профессия. Потому что там ты себя ни в чем не ограничиваешь, ты не загнан ни в какие рамки, тебе никто ничего не может сказать, потому что это твое хобби. У тебя там нет никаких начальников и так далее. Вот секрет успеха. Всем спасибо!