Как стать программистом? Часть 1: А нужно ли оно тебе вообще?

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

Зачем вообще становиться программистом?

Многие решают стать программистом потому что им «нравится программировать». Однако если подобную аналогию применять, например, шире, то можно сказать, что тем, кому нравится что-то писать, надо сразу идти в писатели (а кому только читать – соответственно, сразу в читатели :-) ), кому нравится играть в футбол – сразу становиться профессиональным спортсменом, а после получения пятерки по пению – сразу рваться в шоу-бизнес.

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

Поэтому основной вопрос, на который должен ответить каждый, кто обдумывает карьеру программиста, должен быть: хочу ли я действительно быть программистом, или я хочу использовать свои знания и навыки программирования в какой-то специализированной области чтобы быть в ней уникальным специалистом?

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

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

Если у тебя нет уверенности, хочешь ли ты скорее быть программистом-биохимиком или биохимиком-программистом, то постарайтесь подумать, насколько легок будет переход из одной сферы в другую. То есть насколько трудно получить навык программиста, уже будучи биохимиком, и наоборот, насколько легко из программиста стать биохимиком. Зачастую легче освоить программирование (особенно как прикладную дисциплину), нежели чем какое-нибудь почвоведение.

Какие программисты бывают?

Если ты дошёл до этого места и всё еще думаете, что хотите стать программистом, а не, скажем, архитектором, у которого проекты новых домов создаются автоматически «умными» скриптами, или патологоанатомом, у которого написанные программы анализируют срезы и сами определяют вероятность онкологии в срезе – то у меня для вас радостная новость. Даже если ты пойдёшь в программисты, у Вас всегда есть путь в область, которая называется «прикладная информатика», где ты как раз можешь найти себе область по душе и пытаться приобрести в ней знания, для того, чтобы понимать, какие проблемы тут существуют и применять свои навыки и знания для решения этих проблем. Для обозначения этой области в русском языке используется термин «предметная область», однако в английском название у нее более говорящее – «область, в которой ты ищешь (и решаешь) Ваши задачи» -- problem domain.

Однако имейте в виду, что если ты приходишь в эту область уже после того, как пошли на стезю информатики, то отношение к тебе часто будет как к программисту, а не как к представителю этой области. То есть если ты вдруг подашься в медицину и напишете там программу, которая будет на основании симптомов предлагать возможный диагноз, то это будет воспринято как нечто обычное. А вот если вдруг человек с медицинским дипломом напишет такую программу, тогда его будут считать уникальным широким специалистом. Для таких людей, с широким спектром навыков, в англоязычных источниках принято использовать не слово «специалист», а слово «генералист» (generalist), которое как бы противопоставляется одному-двум навыкам в узком спектре, которыми хорошо владеет «специалист».

Но и в самой информатике, или как ее обозначают на английском, «науке о компьютерах» (Computer Science), есть много направлений, где можно найти много всего интересного. Информатика сейчас переживает пору бурного развития, сходного с бурным развитием математики в 19-20-х веках: он нее регулярно отпочковываются новые интересные направления, который начинают жить самостоятельной жизнь и зачастую требовать знания из многих смежных дисциплин. Одной из последних дисциплин, которая сейчас находится на пике своего развития, например, является наука об анализе данных, data science.

Здесь важно понять, что какие-то направления менее специфичны и порог вхождения в них довольно низкий, а какие-то более специфичны и требующие большего запаса знаний. Конечно, с ростом профессионализма и сложности задач объем требуемых навыков и знаний возрастает и становится примерно равным на высоких уровнях, но на начальных, как правило, намного проще изучить программирование обычных, веб- и мобильных приложений, чем, скажем, программирование FPGA систем, микроконтроллеров или GPU. По возможности, на мой взгляд, стоит сначала освоить что-то более сложное, требующего большего запаса знаний имеющего более плоскую кривую обучения, например, программирование FPGA систем с использованием Verilog, и оценить насколько эта область тебе нравится. Для этого, как правило, требуется хорошее понимание электроники и знания об устройстве цифровых логических элементов, здесь нужны специальные программы, книги, и зачастую не самое дешевое оборудование, чтобы изучать и экспериментировать.

В отличие от такого программирования, для веб-программирования достаточно просто текстового редактора и браузера. Это, конечно, может быть не так удобно, как наличие специальной среды разработки с подсветкой и автодополнением синтаксиса, но этого вполне достаточно, если их нет. Кроме того, количество различных, в том числе полностью и условно-бесплатных, пособий о том, как освоить тот или иной аспект веб-программирования, на порядки выше, чем программирования аппаратных систем на VHDL. Поэтому скорее всего, веб-программирование, при необходимости, ты освоишь и без ВУЗа, дома, просто читая и сравнивая различные пособия. Сможешь ли ты также хорошо освоить аппаратное программирование – это вопрос.

С компьютерами работают не только программисты!

Так как компьютеры сегодня проникают во все возможные сферы, то для работы с компьютерами не всегда нужно становиться именно программистом. Хороший сетевой администратор, который может настроить и поддерживать гетерогенную сеть на несколько сот компьютеров в предприятии, обеспечивать работу всех необходимых служб (электронной почты, файлового хранилища, контроллера домена, веб-сервера, баз данных, систем учета, мониторинга и контроля), должен знать и уметь больше, чем простой программист. Навыки программирования также очень полезны в администрировании сетей и компьютеров, позволяя автоматизировать такие процессы, как добавление нового компьютера или пользователя, восстановление поврежденного компьютера из бэкапа и так далее.

Окончание в первом комментарии к посту (из-за ограничения размеров текста)