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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Окончание в первом комментарии к посту (из-за ограничения размеров текста)
49
Автор поста оценил этот комментарий

С всемирной глобализацией и таким развитием технологий, что у нас теперь телефоны и часы, а скоро даже и домашние приборы, будут всегда подключены к интернету и передавать туда в реальном времени данные, снова появляется интерес к такой, довольно древней профессии в информатике, как специалисты по базам данных. И если раньше эта область была довольно чётко очерчена реляционными базами данных, их администрированием (с классическими задачами, как обеспечение доступа (availability), обеспечение безопасности (security) и восстановление после аварии (disaster recovery)), то сейчас здесь с одной стороны наблюдается огромное разнообразие подходов к организации и хранению данных (NoSQL, OLAP, Data Marts, Cubes), с другой стороны требования к доступности и нагрузки также изменились (high load, high availability). Ну и с появлением такого феномена как Big Data (который еще та вещь в себе, и это совсем не «большие данные», как раз данные в Big Data обычно небольшие, просто их очень много :-) ) тут снова появился целый ландшафт того, чем можно заниматься. Например, map-reduce логика и ее применение в том же Hadoop – это непросто понять после 10-15 лет работы с традиционными базами и системами данных. Зато как интересно!!


Ну и, как говорится, «последнее, но, отнюдь, не самое неважное» (last but not least) – это компьютерная безопасность. Если раньше здесь выбор был довольно небольшой, то сейчас столько всего нового: хочешь, ломай, как и раньше, веб-сайт через SQL-injection и придумывай защиты против этого, а хочешь, попробуй подсоединиться и перепрограммировать контроллер управления температурой, чтобы он записывал и передавал шпионские данные (как случилось в офисе газеты New York Times) и делай так, чтобы это не было так просто. Или может быть тебе интересны алгоритмы обнаружение утечки данных (penetration detection). А ты знаешь, что есть такие вирусы, которые специально написаны, чтобы выводить из строя заводы и атомные станции (Stuxnet).


Для тех, кто не осилил всего текста (TL;DR)


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


И что, ты всё еще хочешь стать программистом? Просто программистом? Тогда жди моего следующего выпуска в серии «Как стать программистом?» :-)

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


В отличие от такого программирования, для веб-программирования достаточно просто текстового редактора и браузера...

Для любого типа программирования нужно своё оборудование, программное обеспечение, литература и так далее. Если в вашем понимании "web-программирование" это создание html странички ucoz'е, то там можно справиться текстовым редактором и браузером (да и то понадобится несколько разных браузеров, так как они не всегда одинаково эти страницы отображают: спросите у любого web-дизайнера как он "любит" фразу "необходима совместимость с IE7")


При создании нормального ресурса необходим сервер, целый набор программного обеспечения на нём (тот же Apache, если сайт на php, MySQL и так далее). Чтобы сделать надёжный ресурс, web-программист должен прочесть гору литературы по существующим уязвимостям и способам защиты. Web-программисты это не школьники, прочитавшие в 7 классе пару книжечек по html и php и запускающие свои "сайты" на денвере.


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

раскрыть ветку
6
Автор поста оценил этот комментарий

Ребят, вопрос тем, кто уже отучился - скажите, а нужна ли математика? Не практические знания, а всякие там доказательства теорем и формальные определения? Попал на специальность "математика и компьютерные науки", каждую пару втирают, мол, "программиста без математики быть не может!". При этом на ~12 часов математической бадьи 3-4 пары, которые конкретно связаны с программированием. Сейчас второй семестр - программирования уже 4 пары на две недели, а математики стало больше. Есть ли вообще смысл идти дальше, или стоит сваливать и искать другое направление (возможно вообще в другой области)?

раскрыть ветку
6
Автор поста оценил этот комментарий

Жаль не ценится геймерство, я бы знатным работягой стал бы))))))


Те кто тебя задалбывает, в основной своей массе скорее всего геймеры задроты.

Я конечно понимаю что ты как адекватный человек, пытаешься все всем объяснить и рассказать.

Но у тебя должны быть оппоненты тоже адекватными, для нормального диалога.


Я сам на тебя подписался и интересно почитать, то что ты пишешь, но запудривать твой мозг своими распросами, просто глупо.

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

Как по мне это равноценно фотожопу обучаться по рассказам других.


Забей, и лучше по своей работе чего нибудь пиши!!!))))

Интересно читать!!!

раскрыть ветку
1
Автор поста оценил этот комментарий
@alaudo, не могли бы Вы рассказать про то, что такое Big Data, желательно, с примерами? Где применяется, какие перспективы у этой области?