Стандартный программист

:

Примерно неделю назад принимал участие в конкурсе на открытую вакансию Microsoft. И провалился. Прошла неделя, мысли в голове (как же так? не может быть!) немного улеглись и я сделал некоторые выводы из этого опыта, коими и хочу поделиться с хабражителями.

4 года назад, когда я закончил университет, я вообще не знал, кем я хочу быть. Так как в бытность свою студентом, я работал системным администратором, то и принимал участие в основном в конкурсах на подобную должность. Совершенно случайно, по совету знакомого, я попал в довольно крупную новосибирскую компанию на собеседование на должность разработчика C++. На собеседовании мне задавали очень разные вопросы (для чего нужно наследование? знаете ли вы stl?), на 90% которых я не ответил, но хорошо запомнил только один: «как перевернуть строку?». Я подумал, и написал псевдокод на ядерной смеси C++, Pascal и PHP. Мне сказали: «ну нормально… а теперь без буфера хранящего позицию середины строки...» Я ещё подумал-подумал, подумал и сдался. Мне сказали: «Мы вас берём. Выходите на работу в понедельник.»

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

Компания в которой я работал, мне нравилась. Нам предоставляли время на поднятие собственного профессионального уровня, чтение книжек. Мы (зелень, вчерашние студенты) посещали семинары, где нам рассказывали про паттерны проектирования, объектно-ориентированный дизайн и многое другое. Через пол года, я уже не плохо оперировал языком C++. Кроме того, я осваивал средства отладки, поиска утечек памяти, профайлинг, юнит-тестирование.

Дальше у меня было ещё много мест работы… Текущее моё место работы 5-ое по счёту, включая период фриланса.

И чем больше я разбирался в различных программных системах (от банального web-сайта до CDN, от VoIP гейтвея до CRM системы), тем сильнее я ненавидел людей, которые это писали. Особенно люто я ненавидел выпускников мехмата и бывших олимпиадников. Я не понимал, для чего нужно имплементировать бинарную сортировку самому, не понимал, зачем имплементировать связный список, зачем писать рукосуйный сервис обмена сообщениями по рукосуйному-же протоколу. И мне потом приходилось разбираться с этими самопальными решениями и их поддерживать.

Для того, чтобы не портить себе карму и не вызывать ненависть коллег, я старался решить любую стандартную проблему стандартным способом. Для реализации сохранения данных в СУБД я использовал стандартную ORM (Hibernate, Doctrine) и никогда даже не пытался писать свою. Если нужно было спроектировать новую часть системы, я использовал стандартные и простые паттерны проектирования от классиков. Если нужно было реализовать отправку почты, я использовал стандартные библиотеки для этого (Java Mail API, Zend Framework). Таких стандартных решений я знаю достаточно много (и продолжаю их искать каждый день), для того, чтобы решить практически любую задачу. Я, как хороший повар, который может приготовить большое количество разнообразных блюд, знающий большое количество разнообразных рецептов.

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

… и всё это привело к тому, что я разучился думать. На любой технический вопрос я ищу ответ в гугле. Когда на собеседовании в Microsoft меня спросили, как выбрать из int ar[n] = {...} n-1 элементов так, чтобы произведение выбранных было максимальным, на некоторое время я впал в ступор. Первый вопрос, который возник в голове: " На*уя? Зачем?" Потом я попытался вспомнить подобный алгоритм из какой-нибудь стандартной библиотеки, которых я знаю не одну… и не смог. Задачу, в конечном итоге, я решил, но видимо не так легко, как этого ожидал интервьювер.

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

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