Disclaimer: это не PR. На данный момент с трудоустройством у меня нет проблем.
Нелёгкая карьера программиста или чего хотят работодатели.
Этой статьёй я хочу показать, какой странной и причудливой может быть карьера программиста (или человека, занимающегося программированием, ибо к касте «программистов», наверное, я причислить себя всё же не могу). Кто я такой, я точно не знаю, совсем как редкая порода чебурашек, которые знают все технологии от ASM до Python, и в то же время не знают ничего серьёзно, алгоритмические скиллы которых вязки, как медузы в Чёрном море, а знание computer science близко к нулю при бешеном по продолжительности опыте работы.
Мне почти 40, и я из поколения программистов-кустарей и программистов-самоучек, получивших высшее техническое образование в советском ВУЗе в начале-середине 90-х, когда обучение было иным и даже такое понятие как computer science в наших ВУЗах еще отсутствовало. Оно было только за рубежом, и о таком термине и о соответствующей дисциплине я ничего не знал вплоть до 2007 года, когда начал активно ходить на собеседования и позиционировать себя на рынке труда.
Может быть, этот рассказ будет полезен молодым специалистам, нащупывающим себя в IT-отрасли, дабы избежать каких-то ошибок и построить свою карьеру по-иному.
IT в моей жизни.
Вот основные вехи моей «славной» IT-биографии. Самое интересное в ней, пожалуй, было в период 1990-1995 и 2000-2010 гг.
1973-1985. Периодически находил в журналах и книгах картинки и фотографии компьютеров и внимательно их рассматривал.
1981. Увидел микрокалькулятор и был поражён его «фичами». Хотел сделать такой же самостоятельно, но, естественно, ничего из этой затеи не вышло.
1985. Мечтал о программируемом микрокалькуляторе БЗ-34. Выписывал журнал «Наука и Жизнь», где публиковались программы для него (раздел «Человек с микрокалькулятором», позже сменившийся на «Человек и компьютер»). Позже, в 1990(?) году, мне купили калькулятор МК-52, с ППЗУ и расширенным набором команд. Я вводил в него программы. Ни о каких других компьютерах я не имел понятия. Знал только, что есть ЕС ЭВМ, но что это такое – толком не ведал. Кажется, была такая у нас в школе, и я ее видел в 4-м классе.
1987. В журнале «Моделист-конструктор» появилась схема персонального компьютера «Специалист». Начал готовить плату для него, но не было микросхем. Увидел у приятеля «Микрошу», загружаемую с кассетного магнитофона. Это улучшенный вариант «Специалиста». Очень понравилось. Игры, «Тетрис», «Змея», Бейсик. Взял напрокат «Микрошу» сам. Ввел в него все программы, которые были. Пытался написать сам что-то на «Бейсике». Ездил к знакомым, у них был компьютер «Спектрум», загружался с магнитофона. Я играл в игры.
1988-1989. Средняя школа. 9-й класс. Информатика. «Агаты». Писал программы на «Бейсике» по школьному курсу (геометрия — лежат ли точки на одной прямой, все школы — «Шашки», «Дурак» (карточная игра). Физматшкола при «МИЭМ». КУВТ «Ямаха». 1 год — «Бейсик». 2 год — «Паскаль» и инструментальные среды (DOS, Norton Commander). Писали лабораторные работы и курсовые («MSX Basic» — программа для определения по 4-м точкам, является ли фигура, образованная ими, выпуклым четырехугольником, программа «Крестики-нолики», Turbo-Pascal — программы работы с файлами).
1988. Дворец пионеров, кружок по пакетной радиосвязи. Впервые увидел IBM PC AT.
1990. Поступил в Московский Государственный институт Электроники и Математики.
1990-1992 MSX Yamaha. Basic. Pascal. Лабораторные работы.
1991. Наконец с большим трудом купил «Микрошу». Пытался ввести туда программу для игры в шахматы (из журнала «Моделист-конструктор»). Очень долго разбирался с ней, несколько дней рисовал блок-схему и разбирал алгоритм работы. После ввода программа не заработала. Вероятно, где-то ошибся в наборе. Комп завис и его пришлось перезагружать Reset-ом. Все результаты многочасовой «набивки» пропали. Надо было записать введенное на магнитофон, но я не догадался. Впредь был умнее. Записывал с помощью командочки Save.
1992. Видел 286-ю и Windows 1.0 или 2.0 в зале для лабораторных работ в институте. Очень понравилось.
1993. «Персоналки» с 3-го курса. IBM PC XT. IBM PC AT. Среда Turbo C 2.0. Лекции и курсовая работа. Программа «Композитор» под DOS. «Сочиняет» фугу на нужное число голосов, в нужной тональности и в нужном ладу. Писал несколько месяцев на работе у отца на IBM PC AT. Большие ЭВМ. Unix. Простейшие программы на С (нахождение символа в строке, замена и т.д.)
Конечно же, изучали Prolog, Turbo Basic, программировали на Pascal и с 3-его курса на C. Еще ранее, в 1988-1989 г, программировали на MSX Basic, и это было действительно замечательно! Был также интенсивный курс ассемблера и архитектуры микропроцессоров (тогда еще 80286). Были какие-то дисциплины по параллельным вычислениям и суперкомпьютерам, которые мне никогда потом не понадобились на практике.
1994. IBM PC AT. Turbo Basic. Turbo Pascal. Turbo C. Лабораторные работы (программа «Решение уравнения Коши»). Курс «Компьютерная графика». Лабораборные. Программа для вывода слоной трехмерной фигуры. Программирование адаптеров EGA/VGA. Курс «Банки данных». Dbase 3, 4. Clipper. Лабораторные работы. Писал базы данных в институте и у отца на Clipper. Видел Windows 3.1 и MS Access 2.0 у друга на работе, был шокирован и очень понравилось (ничего там не понял и удивлялся, как он в этом шарит). Друг программировал базы данных на Access для туристической фирмы.
1995. Unix. ООП. Borland С++. Prolog. Turbo Prolog и ARITY-Prolog. Искусственный интеллект. Лабораторные работы. Переделка программы «Композитор» на C++, добавление классов, операторов.
По окончании ВУЗ-а все мои сокурсники разошлись: кто уехал за границу, а кто устроился программистом писать на «С++ под базы данных». Кто-то наиболее «продвинутый» даже стал писать софт под видеокарты на ассемблере (тогда это было еще какое-то убожество наподобие S3 Trio и Trident с 256 кбайтами RAM на борту). Только я пошел на преддипломную практику и диплом в некую госорганизацию, где получил свой первоначальный опыт работы, изучил Unix и MS Access, ознакомился с принципами работы компьютерных сетей. Это была середина 90-х.
1995 — 1997. Решил стать программистом или, на худой конец, сисадмином. Работа в проектном НИИ кем-то вроде сисадмина-программиста. Операционная система VAX/VMS. DECNet. Толстый EtherNet. «Большие компьютеры», VAXCluster-ы, терминалы VT-220, VT-330, DECServer-ы, DECPrintServer. Выполнял резервное копирование, установку нового ПО, администрирование (права пользователей, права на диски, файлы). Sun SparcStation, 32 Мб оперативки (это какое-то нереальное, сумасшедшее количество), винчестер 2 Гб, Silicon Graphics, Alpha DecServer (DecWindows). Впервые как следует поработал с Windows, изучил его (на 386DX, затем Pentium). OS Solaris, Irix, DecWindows.
1996. Защитил диплом по теме «Проектирование межплатформной компьютерной сети». Семиуровневая модель OSI. Сопряжение разных типов сетей по общим протоколам (TCP/IP). Выбор «железа» (маршрутизаторов, концентраторов, репитеров), оценка их стоимости, расчет всевозможных характеристик (длины сегмента, расстояния между репитерами и т.д.).
1996-1997. На работе прослушал курсы «SQL for end users», «The XGL graphic library», «Motif programming», «OpenGL programming», «Xlib programming», «XView programming».
Все курсы, какие были, и для графиков (там много CAD-овцев, под которых покупались Silicon Graphics) и для пользователей баз данных (там был Oracle).
Администрировал Novell Netware 3.11 и 4.0 (в другом здании). Большая сеть на ~100 персоналок, 2 сервера Novell Netware, тонкий Ethernet.
Подключился к разработке «Каталожной базы данных оборудования промышленного применения», которую впоследствии разрабатывал самостоятельно (когда уже все стоящие специалисты свалили с той работы :). Так началось мое собственное знакомство с Access.
Выход Windows 95, знакомство с ней.
1996. Подключение фирмы к интернету (dialup в компании Элвис-Телеком).
1996 (?) Покупка компьютера домой (486DX2-66). Усовершенствовал программу «Композитор» возможностью распечатки на принтере нот. Пробовал программировать под Windows 3.1 (Borland C++ 3.0, Win 3.1 SDK). Сложно и запутанно, но смог написать простейшую программу, выводящую окно (с основными понятиями программирования в мультизадачных средах я был знаком — очередь событий, ресурсы, окна, контролы, обработчики событий — частично по институту, частично по курсам по Motif и OpenGL, но в Windows все это по-другому). Пробовал переделать программу «Композитор» под Windows с использованием multimedia-библиотек. Очень сложно, не смог.
1996. Появился модем, ФИДО, интернет. Начал искать новую работу. Пытался устроиться на работу в компанию, где был UNIX, Informix, NT и т.д. У меня спросили, что такое «template», «group by» и какие UNIX-shell-ы я знаю. Я ничего из этого списка не знал, и меня не взяли.
1997, январь-февраль. Пытался написать складскую программу на Access 2.0, изучать Excel. Помню, как раз вышел Office 97, и я пытался с ним освоиться.
февраль 1997 – декабрь 2000. На мою вторую по счету работу меня взял совершенно незнакомый мне человек и без всякого собеседования просто по объявлению в mo.job (наверное, он все же как-то неявно проверил мою адекватность, но этот тест был успешно мной пройден). Зарплата была неправдоподобно высокая для молодого специалиста на начало 1997 года. На вопрос, зачем он меня взял и почему без собеседования, он сказал: «Мне просто был нужен Access-ист. Вы ведь Access-ист?». Я сказал: «Да, конечно, я — Access-ист». Больше никогда таких глупых вопросов я не задавал. Программировал на Access 2.0. Сразу дали сложные задачи. Было сначала тяжело, потом освоился. Освоил Access 2.0 и Excel 5.0 досконально. Затем Access'97 и Excel'97. ERWin. Вышла «1С-торговля». Очень не понравилась. Чуть-чуть посмотрел Access'2000 и Powerbuilder 6.0. Powerbuilder очень понравился, перевел на него часть библиотек. Перевел программу с MSA 2.0 на MSA 97. Занимался также anykey, администрированием Windows NT Server, внедрением почтовой системы на MS Exchange 5.5, внедрением Office'97, WINS, DHCP, MS Proxy 2.0, RRas и (главное достижение в этой фирме, как я считаю) переводом системы на MS SQL 7.0/MSA'97 с репликацией данных в удаленный офис. Собственноручно проинсталлировал 3 новых сервера Windows NT (SQL, Exchange, WINS, IIS, MS Proxy, RRas), внедрил Faxmaker для Exchange Server. Писал скрипты под MS Exchange Server на VBScript. Замечательно поработав в этой компании несколько лет и написав много софта, я стал задумываться о новой работе.
Времена менялись. Шел 2000-й год. Дабы избежать застоя в верхнем отделе головного мозга и засилья 1С, я пошёл в один стартап, где мы прозанимались интереснейшими вещами вплоть до 2010-го года. Туда меня взяли тоже совершенно без всякого собеседования после выполнения несложного тестового задания. За 10 лет было написано много десятков мегабайт исходников на всевозможных языках программирования (С++, Python, Assembler), сделана куча замечательных проектов. Я великолепно изучил Linux, C++, Python.
На дворе 2007-й год. Впервые я стал беспокоиться, потому что работа перестала меня удовлетворять. Мне стало казаться, что моя работа – это подготовка к чему-то «настоящему», это всего лишь репетиция, отработка навыков перед чем-то важным. Но время шло, а «настоящей работы» так и не начиналось. Настоящей, на которой я смогу реализоваться полностью. Стало казаться, что её просто не существует. Я думал, что моя зарплата и интересность работы будет расти сама прямо пропорционально времени, но этого не происходило. Зарплатный капкан начал меня напрягать. Выйдя на свободный рынок в 2007 году я, пожалуй, впервые ощутил свою косность, неконкурентоспособность и безнадежную отсталость от технологий. Завязнув в стартапе, я порядком закостенел. Я начал заниматься поисками новой работы. Моя out-of-the-markedness беспокоила меня всё больше и больше. Посетил множество фирм, в числе которых были и очень крупные игроки софтверного бизнеса (Rambler, Yandex, Kaspersky и др). Но везде результат один – полный и несомненный отказ. В это время я впервые задался вопросом: «Почему?», на который до сих пор не получил внятного ответа. Я наконец-то узнал, что существует computer science, которую все спрашивают и про которую я впервые слышал. Неужели это потому, что я не знаю computer science? Но я же написал огромное количество высококачественного рабочего софта, знаю множество технологий и промышленную разработку! Я начал кидаться туда-сюда, хвататься за новые бесчисленные технологии, срочно изучать эту самую computer science, ничего не успевал изучать и был расстроен тем, что у меня ничего не получается. В конце концов, так и не найдя новой работы, я смирился со своей грустной участью. Я всё время был «не в струе»: когда все использовали stl и boost, я их практически не использовал, потому что не нужно было по работе; когда питонисты поголовно перешли на django году в 2008-м, я его упорно игнорировал, поскольку пользовался лучшим с моей точки зрения фреймворком, файлы редактировал упорно в FAR-е, хотя кругом было полным-полно замечательных удобных редакторов, и моя производительность не страдала от этого. В конце концов, я начал использовать все эти технологии, но только для того, чтобы быть адекватным рынку.
Но вот – о чудо! – меня пригласили в один стартап опять же совершенно без всякого собеседования. И опять, прилежная работа в течение нескольких лет, проектирование, планирование и эджайл, горы исходников, тестирование и багфиксы, надежды на лучшее, ощущение, что это репетиция чего-то важного и нового, разочарования и безуспешные поиски новой работы, которые проходили ровно так же, как в 2007-м году, но в условиях более жесткой конкуренции, которую я ощущал буквально за своими плечами.
И вот времена опять поменялись. На дворе уже 2013-й год. Я все ещё молодой, но возраст уже начинает брать своё. Мне казалось, что за это время у меня накопился гигантский опыт, что я могу заниматься чем угодно, что я нахожусь в конкурентном поле и у меня достаточно высокий уровень компетенции, что я могу работать, что я – «программист». «Теперь-то», думал я, «уж точно настало время для самой ценной и важной моей работы, для работы всей моей жизни».
На самом деле не всё так просто. Я не знаю, какую именно работу я ищу. Не имею понятия, какая работа будет ценной и важной для меня. Надо попробовать всё. Высока конкуренция. Много молодёжи. Вчерашние выпускники отлично знают computer science и знают все эти загадочные слова, магические пассы и умеют внятно говорить. Поменялись правила игры, хотя Unix, C++, ООП остался. Появились длинные, содержательные, многоэтапные собеседования, grueling interviews. Ужесточаются требования к соискателям. Теперь уже никто не берет «студента без опыта» даже за смешную зарплату. «Странно» — думал я. «В начале 90-х же была демографическая яма, в которую должны были угодить мои потенциальные конкуренты». Но это не так. Выявляются мои пробелы и изъяны в знаниях, последствия многолетней «кустарной практики» и отсутствие системы в знаниях. Оказалось, что я не знаю детально, как работает ни один алгоритм сортировки (все 20 лет сортировал обычным «sort»-ом во всевозможных вариантах и на всевозможных языках программирования, который, по моему мнению, сортирует очень хорошо, но как именно – это меня никогда не волновало, ведь он сортирует наилучшим образом!), не знаю принципов ООП (использовал его еще со времен ВУЗ-а, но, видимо, неправильно, раз я не знаю верных принципов), формата пакетов TCP/IP (а зачем его мне знать? знал, когда писал диплом в ВУЗе, а потом забыл!), алгоритмов на графах и многого другого… Но я же как-то работал эти 20 лет и писал отличный рабочий софт, который используется до сих пор и будет ещё долго использоваться! Как это может быть? Сам удивляюсь.
И второй виток выхода в «свободный рынок» прошел всё в такой же «теплой и дружественной обстановке», как и первый.
«Касперский» снова предложил мне с ним «забрэйнбенчиться», как в старые добрые времена («Thank you, chap, but I don't play that games anymore, have already brainbenched all over»), «Яндекс» прореджектил все мои аппликейшны на все вакансии, на этот раз молча, даже без приглашения на интервью (в 2007-м году проинтервьюировал и «забраковал»), и похоже, включил меня в пожизненный бан, ибо я уже порядочно надоел их HR, поскольку откликаюсь почти на все их вакансии; mail.ru поступил аналогично, а Parallels, Mirantis и другие «акулы» софтверного рынка меня «забраковали» уже на собеседовании. Неприятно чувствовать себя «забракованным», но приятнее понимать, что мы обоюдно не подошли друг другу и не подходим вот уже много лет Мы слишком разные. Я например, люблю поэзию, литературу, музыку и английский язык. А вот любит ли это Яндекс? Не уверен.
Со стороны работодателей: их можно понять. Их задача – за минимально возможное время выяснить знания кандидата по максимально широкому набору тем. Я сам набирал программистов и по себе знаю, как это нетривиально. На готовые вопросы подразумеваются готовые шаблонные ответы. Как у Жванецкого: «…вот список ваших вопросов, вот список моих ответов». Излюбленные приёмы, используемые на собеседовании, которые я собрал за многолетние походы по интервью и которые повергают меня в недоумение, вводят в ступор (ответы на некоторые из них я не знаю и посейчас), и, как мне кажется, некоторые из них имеют мало отношения к программированию и их просто задают, потому что это «проверенный способ» и «все их спрашивают». Мои ответы, не устраивающие работодателей, в скобках:
Представьте, что Вы читаете лекцию перед студентами. Как бы Вы объяснили студентам термин «X»? (X == «тупик», «контекстно-свободная грамматика», «конечный автомат», «оптимистические и пессимистические блокировки», «парадигмы программирования», «шина данных»). (Из этого списка внятно могу объяснить только «тупик», он же deadlock, потому что часто имею с ним дело. С остальными терминами дела не имею, и, соответственно, объяснить их не могу).
Опишите максимально подробно, что происходит при вводе адреса в адресную строку браузера (вариант: при клике на ссылку). (Какая именно степень детализации имеется в виду? Мой рассказ может растянуться на целый день, а время у нас ограничено. Сначала, если мы находимся под Windows, посылается Windows-сообщение WM_CHAR при вводе текста в контрол… нет, точнее, сначала WM_NCHITTEST,… но если начать с самого начала, тогда keystroke поступает в клавиатурный буфер...).
Опишите, какой обмен TCP/IP-пакетами производится при установлении HTTP-соединения. (К сожалению, многократно смотрел TCP/IP трафик с помощью ethereal, но не помню формат пакетов даже приблизительно).
Опишите, какой обмен TCP/IP-пакетами производится при установлении HTTPS-соединения. (К сожалению, TCP/IP-трафик при HTTPS-соединении не смотрел). Верно ли, что HTTPS работает поверх HTTP или верно обратное? (Не знаю, но думаю, что HTTPS поверх HTTP. Или HTTPS поверх TCP? Кто ж его знает..).
Опишите, как производится доставка пакетов транспортным протоколом TCP. Откуда мы знаем, на какой именно физический компьютер доставлять пакет? За счет чего обеспечивается гарантированная доставка? (Адрес доставки определяется MAC-адресом физического компьютера, доставка пакетов производится через gateway, прописанный в настройках системы, если это внешний хост. Внешний или не внешний – это вычисляется из ip-адреса и маски).
Какова алгоритмическая сложность наилучшего и наихудшего возможного алгоритма сортировки массива из N элементов? (Наихудшая сложность – O(N^2), потому что нужно сравнить каждый с каждым, наилучшая – O(N * ln(N)). Почему такая наилучшая? Не помню. Читал в книжке. В какой — не помню).
Рисуются прямоугольнички со стрелочками, говорится, что прямоугольники – это модули, а стрелочки – это зависимости между ними и задаётся вопрос: «Как загрузить все эти модули? И вообще, как это называется?» (Берем и загружаем рекурсивно сначала зависимости модуля, затем сам модуль. Как это называется – не знаю и не имею ни малейшего понятия. Это называется «прямоугольнички со стрелочками»).
Опишите отличия демона от обычного процесса (такой вопрос мне задавали в 2007 году, и я до сих пор не знаю исчерпывающего ответа на него – тема поистине неисчерпаема, и я в ней досконально не разбираюсь, хотя написал за свою рабочую практику огромное количество демонов, при этом до конца не понимая, общая ли у них память или нет, общий ли стэк или нет и общие ли файл-дескрипторы или нет. Кажется, нет, не общие. Или общие. Забыл уже, в общем. Давно это было, в 2004-м году.).
Назовите пять принципов объектно-ориентированного программирования. (Не знаю, к сожалению, хотя использую ООП с 1993 года).
Как с помощью двух стеков сделать очередь? (Не знаю, но можно посмотреть в интернете).
Какие способы синхронизации процессов Вы знаете (вариант: какие примитивы синхронизации Вы знаете) (mutex-ы, семафоры, эвенты)?
Какие шаблоны проектирования Вы знаете (вариант: какие шаблоны программирования Вы знаете) (синглтон, фабрика объектов)?
Как сделать оптимизацию SQL-запроса (вариант: какие приёмы оптимизации SQL-запросов Вы знаете) (посмотреть план запроса, убрать подзапросы по возможности, проставить недостающие индексы)?
Работодатели совершенно правильно делают, безусловно. Я понимаю, почему они так делают. Они выбирают и отсеивают кандидатов, задавая им простейшие вопросы для начала. Затем переходят к более сложным, затем ещё и ещё. Проблема в том, что наши с ними подходы никогда не совпадают. При том, что я уверен, что в большинстве компаний, куда я ходил на собеседование, я смог бы работать без особых проблем, но работодателям виднее, и это правильно.
PS. На самом деле с работой у меня нет проблем. Это только повод, чтобы описать свою причудливую карьеру. Наконец нашелся работодатель, который «проехал на красный свет», проигнорировав все эти многочисленные warning-и о том, что я не знаю, не задал ни одного вопроса на тему computer science и просто предложил работу.