Я всегда была сильна в математике. Не имею в виду тригонометрию, арифметику и все то, о чем люди думают, говоря: «Да ты
На втором курсе колледжа я встречалась со студентом кафедры прикладной математики и из любопытства выбрала несколько из его предметов. К моему удивлению, это ничем не отличалась от обычной математики. Возьмем например курс введения в ЯП Java. Сначала в программе идет всякая абракадабра: public чего-то там void mail что-то еще
, но если абстрагироваться от этой ерунды, то это всё та же сортировка листа, запись в матрицу и обход дерева. Легко и просто. Ещё проще стало, когда ПМ переключился на Python.
Итак, я с двумя специализациями: математика и программирование, доучилась в своей крошечной гуманитарной школе в Миннесоте до старших курсов и стала искать работу. Оказывается, только страховые фирмы желают нанимать спецов по комбинаторике (все же не уровня кандидата наук) единственно умеющих определять, как владельцам пальто раздать шляпы, чтобы в итоге у всех оказалась не своя. Таким образом, мой выбор пал на разработку ПО.
Через какое-то время, изучив обстановку и провалив пару собеседований, отойдя от приличной паники, я нашла стартап в Сан Франциско, казавшийся мечтой. На собеседовании я ожидала худшего, однако интервьюер почему-то попросил меня найти на графе кратчайший путь между узлами А и Б. Кажется он что-то еще говорил о Кевине Бейконе. Я рассчитала и тогда он спросил, можно ли улучшить результат, зная о том, что узлы отстоят друг от друга на расстоянии шести ступеней. Ага, поиск в ширину с обоих концов. Постойте, но ведь в любом случае пришлось бы его применять, не важно, известно-ли нам расстояние между узлами. Просто отлично. Я прилетела на собеседование длиною в целый день, мне задавали еще кучу вопросов: сортировка, обход, запоминание объектов а в конце предложили работу. Весь цикл собеседований продолжался шесть дней и за это время я не написала ни одной строки кода.
Вместо этого, уместно было спросить:
— Насколько хорошо Вы разбираетесь в Unix?
— Я знаю и умею сменить директорию, выдать список файлов и запустить прогу на Python. Ах да, еще переименовать файл… скорее всего.
— Что такое AJAX, и с чем его едят?
— Эмм… та штука, что GMail использует? Это что-то вроде обновления страницы без обновления всей страницы.
— С какими системами управления версиями работали
— На последнем курсе мы писали дипломную, в проекте использовали SVN. Я нажала не туда и возник конфликт, кто-то за меня все починил.
— Как можно реализовать, используя объектно-ориентированный ЯП колоду карт, общую парковку, систему бронирования гостиниц
— Переменные, везде переменные, с счетчиками и строками.
— Базы данных, ну хоть что-нибудь.
— Чего?
Послушайте, меньше всего я хочу выглядеть неблагодарной. На этой первой работе я выучила все вышеизложенное и даже больше, потому что старшие коллеги терпеливо сидели и выносили мои глупые расспросы, их это не раздражало, даже когда я раздражала сама себя. Однако на это у меня ушло больше года, с тех пор я сменила три работы и прошла немереное количество собеседований, придя к выводу, что способ собеседования в первом из стартапов не был лишь странной флуктуацией. Это общепринятая практика. Эти люди задают математические головоломки, пытаясь установить навыки программирования. Почему?
Кричащий случай произошел во время собеседования на вторую работу после окончания колледжа. Меня попросили показать навыки морского боя, предложить алгоритм затопления подлодки с неизвестными целочисленными координатами и скоростью. Нужно пронумеровать рациональные числа для того, чтобы решить проблему. И снова — ни одной строки кода. Через две недели меня попросили написать пользовательскую программу для iPhone. Излишне говорить, что я никогда с Objective-C раньше не сталкивалась. До этого в колледже я написала, от силы, двадцать строк на C во время группового задания на классе программирования и помню только, что это было ужасно, отсутствует сборщик мусора, поэтому надо самому высвобождать память. Мне дали книгу The C Programming Language
, показали откуда можно скачать новую версию Xcode
и пожелали удачи. Через три недели босс позвал меня на ковер и завел такой разговор: «Что-то ты не так быстро осваиваешься, как мы ожидали». Я удвоила свои старания. Такой же разговор состоялся еще через неделю, только хуже. Затем были каникулы а на следующий день меня уволили.
Я была жутко расстроена, еще никто раньше не жаловался на мою успеваемость. У меня была уйма друзей разработчиков, которые умели все это делать. Как такое могло случиться? Почему-же у меня не получалось?
Я подавила это воспоминание и никому об этом не рассказывала. Устроилась на работу в третий стартап (спросили кое-что о марковских цепях) и каждый раз бесилась после разговора наедине с боссом, очередной раз выслушав о том, что я не оправдываю их ожиданий и вообще обманом устроилась на работу.
Продолжая бороться, я замечала, что обучение дается все легче. Потихоньку, я стала осваивать все новые и новые концепции, которые раньше обитали в моей голове вне контекста. Как-то собрались мы в воскресенье с друзьями веселиться и кодить, тут кто-то предложил использовать Node.js
, потому что это круто и стоит того, чтобы выучить. В одной типовой программе я обнаружила безымянную функцию, которая передает значение другой функции и не врубилась в смысл происходящего. Но все остальные сразу-же поняли, несмотря на то, что до этого также не имели работали с бэкенд Javascript-ом! Они потратили полчаса, чертя для меня диаграммы с кучей стрелок и в конце-концов, опираясь на целый ряд метафор, я смогла кое-что понять. Потом, когда я наблюдала, как лихо они перебрасывают обратные вызовы, все равно для меня это оставалось мистикой и я самой себе казалось такой тугодумшей.
Недавно моя подруга стала учить программирование и попросила меня объяснить ей какую-то ерунду — разницу между статичными переменными
и объектными переменными
а также механизм наследования. И тут меня осенило, что я свободно сыпала словечками «класс», «объект» или «метод», понимая их значение и не задумываясь об этом, потому что я годами использовала эти понятия. Но каждый раз, когда я использовала одно из них, я видело как она напрягается, стараясь вспомнить смысл термина, его свойства и как это вяжется с тем, что было ранее сказано, ведь не прошло и двух недель как преподаватель написал эти определения на доске. Я осознала, что нельзя просто так взять и перекачать в нее (так долго до меня доходило) три года разработки софта, наращивая и наращивая знания, на все то, что уже объясняла ранее.
Такое чувство, что те, кто проводит собеседование, считают будто теория программирования и умение решать задачи — самое трудное а все остальное — мелочи. Это объяснимо, ведь многие из них научились программировать в двенадцать лет, и они освоили программирование так же, как я научилась решать головоломки. А теорию они подучили уже в колледже. Но я-то практиковалась в задачках с десяти лет и поэтому имею все основания сказать: программирование — охренительно трудная штука. Такая-же трудная как и решение головоломок, если не труднее. И если я с ходу справляюсь с общими элементами в несортированном листе, циклами связанных листов и кратчайшим путем в сети, то это еще не значит, что я буду знать все что требуется для программирования в первые недели работы.
Короче, я уже вполне продвинулась и растерянность начального этапа осталась по ту сторону. На это ушло целых три года, но все равно впереди еще долгий и длинный путь, пока я научусь программировать почти так же хорошо, как я умею решать головоломки. Итак, сообщаю тем кто будет проводить со мной собеседование, следующий раз задавайте мне вопросы по программированию, если пытаетесь понять насколько хорошо я умею кодить. Я хочу чтобы вы поняли — я не пытаюсь дурить вас! Так что нет абсолютно никакой причины, чтобы ходить кругами.
Примечания
Эта статья была написана несколько лет назад и теперь недоступна по оригинальной ссылке. Её можно вытащить из вэб-архива или из онлайн блокнота, куда я скопировал текст. На Хабре был эпичный пост о том, что все знают почему люки круглые, но не умеют отличить абстрактный класс от интефейса. Оказывается, стартапы в Америке точно так же любят высчитывать квадратуру круга крышек люка. Курсив, выделенный текст и прочие анимации текста мои, за исключением придуманного диалога.
Автор: temujin