Нелёгкая карьера программиста или чего хотят работодатели
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 и просто предложил работу.
Автор: mike1