Как стать хорошим программистом? (часть 3 из 3). Обратная сторона Луны

Кстати, если уж говорить о теме, то нужно затронуть и то, что вас ждет на другой стороне. Опять же, задача на самом деле неподъемная, но я по крайней мере могу описать некоторые сюрпризы, которые вас ожидают. Как обычно, не самые приятные.

Писатель или литературовед?

Все, что я описал раньше, поможет вам писать хороший код, «любить это дело», да и знать его тоже. Вот только код уже давно не так много взаимодействует с внешним миром, будь то кнопки клавиатуры, движения мышки или взаимодействие со специализированными устройствами, сколько в кодом написанным другими программистами, в первую очередь, платформой и легаси вашей собственной фирмы.

Причем код платформы и легаси код вашей фирмы далеко не всегда написан хорошими программистами. Очень часто совсем наоборот. Более того, и там, и там, отдельные сорвавшиеся с поводка программисты, которые восприняли родную фирму как еще один компьютер, который надо запрограммировать, создают свои «платформы» направо и налево. А вам в этом добре разбираться.

Пример 1: Строки в С++. Строки бывают простые, широкие и мультибайтные. Но это еще ничего, поскольку можно в команде договориться использовать только широкие и тогда преобразования будут требоваться достаточно редко. Но есть еще несколько представлений строк. Есть стандартные С++ строки, кончающиеся нулем. Есть VB-style строки с длиной перед указателем на строку (и нулем в конце). Есть STL строки, которые работают как нормальный автоматический объект, хотя и со своими тараканами. И есть ATL строки, которые претендуют на то же, что и STL строки.

Каждая из них имеет свои проблемы. Кончающиеся нулем С++ строки считаются одной из двух главных причин всех багов в программах на С++ наравне с указателями и адресной арифметикой. VB строки были бы не так плохи, но их необходимо аллокировать одним и тем же способом, иначе вы запутаетесь как их освобождать. А в ряде случаев вы обязаны их аллокировать как глобальную память, то что вам всегда придется так делать. А размещение глобальной памяти – это очень дорогая операция. Особенно для такого популярного обьекта как строка. STL строки в общем не так и плохи, если не считать того, что они тянут за собой всю STL библиотеку. Что в ряде случаев нежелательно. А главное, как только ваш проект начинает ее использовать, незрелые умы в вашей группе тут же начинают использовать и другие обьекты из оной библиотеки – они и правда очень удобные. Что кончается тем, что вы обнаруживаете свой продукт в тестовой лаборатории завесившим всю машину и использующим 100% процессора. Есть такой таракан в  STL. Ну, а уж если вы вляпались в ATL...

Что в этой картине самое поганое, это то, что как только ваш продукт начинает взаимодействовать с платформой и другими компонентами, вы оказываетесь вынуждены использовать чуть ли не все четыре представления и конвертировать их из одного в другое направо и налево. Win32 использует в основном С++ строки с нулем в конце, COM и WMI часто требуют VB строк, а многочисленные левые компоненты, которые вы подобрали, чтобы не изобретать велосипед, запросто могут потребовать STL и ATL строк.

Пример 2: Media Foundation. Это такой новый фреймворк на нашей фирменной горной вершине дабы играть аудио и видео медиа. Выглядит как набор API, где все необходимые источники, парсеры, трубы, дешифровщики, размазыватели по стенкам (как правильно перевести «rendeder»?) соединяются вместе в полной гармонии и дружной работе по проигрыванию того или иного мультимедийного формата. Причем вы можете (теоретически) просто имплементировать еще одну компоненту, скажем, декодер или источник для определенного формата, и он должен магически начать работать. Ну, то есть буквально магически, поскольку вам еще придется поплясать вокруг костра с бубном – записать куда надо в регистр правильные ключи, правильно оформить DLL,... Один из наиболее впечатливших меня па в этом танце и соло на бубне является то, что вам придется писать в практически полной COM системе, имплементируя на каждом вашем объекте IUnknown со всеми причандалами для ref counting и правильного управвления циклом жизни этих объектов, но при этом сам COM не используется. То есть как бы, all pain, no gain. Просто мазохизм какой-то.

Поневоле вспоминается бородатый анекдот про водителя и феечку. Стоит на обочине дороги водитель и грустно смотри на свою машину, у которой отвалилось колесо. Пролетает мимо феечка: «Чего делаешь?» «Да, вот, с колесом #$%^&*!» «А хочешь по-настоящему?» Водитель взглянул на феечку, симпатичная... «Ну, хочу.» Взмахнула феечка волшебной палочкой, и у машины отвалились остальные три колеса. Такое вот «настоящее» программирование.

Так вот, это все – не то ради чего вы пришли в программирование. Это как если  вы стоите на лесной тропинке и брезгливо оттираете подошву кроссовки об опавшую листву, мысленно матеря на все лады любителей собак... или там, создателей платформ. К слову, если кто решит по этому поводу покритиковать Windows, рекомендую поглядеть на Java и Java 2 – тоже очень большой и очень популярный у любителей собак лес. Вы еще помните (оттирая подошву об опавшую листву) AWT? В общем, «учись сынок, а то так и будешь всю жизнь ключи подавать...»

Если вы не в курсе, имелся в виду анекдот про двух сантехников, мастера и помощника. Вызывали их на прочистку, весь подвал залит понятно чем, мастер ныряет, ученик сидит на лестнице, ждет. Через пару минут мастер выныривает и кричит «Ключ номер десять!» Ученик подает, мастер ныряет, еще через пару минут раздается бульканье и содержимое подвала уходит вниз в канализацию. Мастер подходит к ученику, стряхивая кусочки того, что только что плавало вокруг, и говорит: «Учись, сынок, а то так и будешь всю жизнь ключи подавать...»

И чем больше кода написано в мире вашими предшественниками, тем больше времени у вас занимает именно это, а отнюдь не написание нового кода, делающего что-то полезное.

Рынок труда

Вообще-то, в плане рынка труда программистам грех жаловаться. В кризисы, когда фирмы увольняют направо и налево, им все равно нужно чтобы работа делалась. Соответственно, ее перекладывают на компьютеры, что приводит к новым проектам и новым рабочим местам для программистов. В условиях нынешнего кризиса, начавшегося в октябре 2008-го, правительство Британии считает, что в следующем году им потребуется на 100,000+ больше программистов, чем в этом году (цифра приблизительная, точнее она выглядит ближе в 150 тысячам, но поскольку точно не помню, то и врать не буду). А когда кризис проходит, все это добро по-прежнему надо сопровождать, развивать, да еще и стартапы появляются.

В общем, я в курсе, что очень много программистов на Восточном побережье США, особенно бывших работников Citi, Wachovia, Washington Mutual со мной не согласятся, но все-таки по сравнению с другими профессиями мы в относительно хорошей форме. С одной стороны сборщикам машин на конвейрных линиях в Детройте или там шахтерам после закрытия завода или шахты остается только прямая дорога в систему общепита – жарить картошку и гамбургеры. Неудачливым или начинающим адвокатам и врачам тоже на самом деле несладко – доходы падают, а конкуренция растет, поскольку все новые толпы молодежи рвутся в эти профессии, думая, что там всегда будет медом намазано. Менджеры низшего и среднего звена вообще никому не нужны. В программировании таких проблем нет.

Конечно, есть некоторая массивная конкуренция со стороны программистов-иммигрантов из Индии и Китая. Но это все равно не сравнить с конкуренцией, которую испытывают между собой скажем выпускники-юристы. Да и ситуация меняется. Многие из них уезжают обратно на родину, либо не найдя работы, либо найдя дома лучшую работу в пересчете на местные цены. Чтобы понять масштаб явления, оцените следующий не очень относящийся к делу, но показательный факт: в 2008-м примерно два миллиона мексиканцев добровольно покинуло США и вернулось домой, считая, что в Мексике у них лучшие шансы на работу и нормальную жизнь. Причем, речь идет отнюдь не о программистах. Оценили?

Так что программисты из Индии и Китая - это скорее больше проблема для начинающих российских программистов здесь, которые еще не понимают культуры других народов. Как только вы начинаете понимать культуру китайцев, индусов, британцев, латиноамериканцев, румынов, и собственно американцев, оказывается, что большинство ваших коллег – отличные ребята и девчата, к которым вы начинаете испытывать искреннюю симпатию, даже если и несогласны с некоторыми их инженерными решениями. Вонючки, ясное дело, тоже иногда попадаются, но где их нет? В общем, конкуренция с программистами из Индии и Китая не такой уж большой фактор. А если вы хотите быть программистом в России, то и тем более неактуальный.

Однако, есть один фактор, который полезно понимать. Это то, что рынок труда программистов начинает структуироваться. И большая часть рынка труда на самом деле предназначена не для лучших, а для средних, а то и посредственных программистов. Так что большая часть того, чему вы научитесь на разных курсах или из тех же книжек, которые я упомянул раньше, вам не пригодится. Я уже упоминал, что за все время жизни в Штатах я только несколько раз написал сортировки, причем только один раз по работе, а остальное время так, для удовольствия?

Самое смешное, что интервьюировать-то вас будут все равно по-серьезному, а вот работа будет куда примитивнее и часто скучнее. Виноваты в этом часто сами программисты, которые проводят интервью. IT менеджеры просто вынуждены полагаться на их мнение, а наши собратья по профессии из средней категории часто отличаются полным отсутствие чувства меры. Так что гоняют вас на должность чуть ли не архитекта, а потом вы рисуете формочки. Причина простая. «Недоделанные» программисты обычно очень гордятся кусочками знания, которые им все-таки довелось получить, и поскольку эти кусочки разрозненные и случайные, то спектр вопросов, который вас ожидает на интервью в средней фирме, фактически очень широк. Куда шире, чем одолели бы те, кто проводит с вами интервью. В общем, вас наймут как микроскоп, и тут же начнут вами забивать гвозды. Это не очень приятно.

Смежный эффект происходит по той же причине: когда у «недоделанного» программиста в голове хорошо проработан один кусочек знания, он часто становится религиозной темой для него. Скажем, работал я с один товарищем (кстати, и правда товарищем – он из Китая), который хорошо знал уже упомянутый MF, и все делал в его стиле. Одна нить, все объекты в стиле COM, все операции асинхронно с обратными вызовами через IMFAsyncResponse... И любой программист, который так не делал, воспринимался им как плохой программист. И попробуйте угадать в первые несколько минут интервью, какие тараканы рулят в голове вашего собеседника? Причем, если вы умеете это делать, может вам лучше не в программисты, а в психиатры?

Никак не забуду один случай еще в конце 97-го – начале 98-го года. Я проходил интервью по телефону в фирме в Чикаго. Интервьюер очень хорошо знал MFC и очень гордился этим, так что и вопрос был по теме:

«А что вы сделаете, если вам нужно засунуть сто тысяч элементов в listbox?»

«Я не буду засовывать сто тысяч элементов в listbox.»

«А если заказчик требует?»

«Я поговорю с заказчиком и обьясню почему это неправильно.»

«А если он настаивает?»

«Тогда я сделаю в лоб, и покажу ему что это не работает. А потом сделаю без этого огромного listbox с какой-то навигацией...»

«А если он все равно настаивает?»

«Можно просто сделать в лоб, поскольку тут уж все равно. Машина – железная, она может и потянет, а пользователь, сидящий перед экраном – нет.»

Ребенок на самом деле хотел услышать ответ, что можно повесить обработчики событий на движения списка и динамически добавлять-убирать элементы из него. Решение, к слову, идиотское сразу по нескольким причинам – для начала слайдер сбоку listbox начал бы вести себя очень странно, попасть в нужную точку списка быстро было бы серьезной проблемой, а уж о дисковых операциях на кручение слайдера вверх-вних и думать страшно (поскольку сыр-бор был в первую очередь из-за того, что весь список не лез в память), но я даже не стал это обсуждать. Ему не было никакого дела до заказчика или пользователя. Вот MFC – это вещчь! В общем, я быстро понял, что туда не хочу, и чувство это было взаимным. Но это – прекрасная иллюстрация к тому, что интервьюировать вас нередко будут как раз не настоящие программисты, а полные идиоты.

И главное, это то, что я уже сказал. Нет так много хороших программистов и нужно в экономике. Да, есть заповедники гоблинов вроде MS или Гугл. Хотя и количество этих островков сокращаются. Sun явно идет на закат, IBM того гляди вообще всю разработку выставит в Китай и Индию, Intel и Motorola уверенно идут той же дорогой, только еще часть работ выводят в Россию... Есть некоторое количество консалтинга. То есть консалтинга много, а вот консалтинга, требующего хороших программистов так себе. Еще в хорошие времена есть стартапы. Ну, в общем-то и все.

В общем, пройти интервью вам это поможет, а насколько вы сможете задействовать свой потенциал – вопрос открытый.

Социальный статус

Не знаю, каков социальный статус у программистов в России, но надо понимать, что в целом программисты – это «синие воротнички» с высокой зарплатой. И обращаются с вами соответственно. Если в России вы работали в науке или преподавании, в университетской среде, то получали вы может и очень немного, но ваша свобода как в распоряжении своим временем, так и в направлении исследований была несравненно выше. Даже если вы подрабатывали консалтингом и проектами на стороне. А свобода – это один из важнейших показателей социального статуса.

Уйдя в программисты, особенно программисты в Америке, все это меняется. Это работа по найму. Это рабочий день с 9 до 5 (а то и с 9 до 9). Это подчинение менеджменту. Это партсобрания, пардон, team meetings, на которых вам втюхивают, как вам повезло и какая классная группа, команда, фирма, на которую вы работаете. Причем делают это так фальшиво и неубедительно, что даже если вы в это и верили, то начнете сомневаться. Это не говоря о том, что вам это будут втюхивать даже если ваша фирма делает цифровые контроллеры для унитазов. Кстати, вероятно полезная штука, но очень неудобный объект для пропаганды. Вас может не клеймят как скот, но периодически выдают футболки с лого фирмы или вашего продукта. В принципе, опять же, это даже и неплохо, но все равно что-то где-то в глубине души... как бы это сказать... шкрябает...

В общем, не все так плохо. Получаете вы все равно неимоверно больше чем сезонный Педро, работающий на уборке фруктов. У вас свой дом, хотя бы и с ипотекой. Страховка от работодателя гарантирует вам доступ к медицине и врачам. Вам есть на что содержать семью, послать детей учиться в университет. Так что, были бы деньги, а на социальный статус можно и плюнуть. В конце концов, доходы программистов сравнимы с доходами многих врачей и юристов. Просто надо понимать, что программирование – это не социальный лифт, и стать миллионером (или просто достичь финансовой независимости) в этой профессии ничуть не легче чем в любой другой. И «стекляный потолок» может и выше, чем в многих других областях, но все равно вполне реален и весьма прочен.

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

Если не в курсе: Подъезжает новый русский к заправке, рядом стоит панк с зелеными волосами. Тот спрашивает, а что с волосами-то? Панк отвечает, ну, чтобы отличаться. Новый русский тыкает себе в грудь и говорит: «Видишь, пиджак? Тыщу баксов стоит. УМОМ НАДО ОТЛИЧАТЬСЯ!»

К слову, я не пытаюсь вас отговорить от программирования. Просто насколько могу честно рассказываю о некоторых не столь широко известных аспектах этой профессии. И если вы внимательно посмотрите на другие профессии, то скорее всего будет как сказал бы Иа-Иа, «Так и знал. С этой стороны ничуть не лучше.»

***


blog comments powered by Disqus