К сожалению, не все читатели могут самоизолироваться в Альпах с двадцатью наложницами, как это сделал на днях король Таиланда. Тем не менее мы все можем провести время вынужденного заточения с пользой: освоив, например, профессию программиста. Сегодня я начну рассказывать, как это сделать.
Для начала давайте с высоты птичьего полёта осмотрим зверинец языков программирования, так как познакомиться с ним нужно до того, как вы прочтёте основную часть моего F.A.Q.
Пусть меня заранее простят коллеги-программисты, но я намерен бессовестно упрощать и карикатурить, чтобы новички не запутались в новых терминах. Это вынужденный шаг: реальный мир настолько объёмен, что осознанно определиться со «своим» языком начинающий программист сможет только после того, как проработает несколько лет по специальности и глубоко погрузится в тему.
Можете сразу писать в комментариях, что я субъективен и невежественен, что я ничего не понимаю в колбасных обрезках, и что мои оценки языков - это чистая вкусовщина. Я охотно соглашусь со всеми претензиями: ни формат короткой статьи, ни мои личные скромные знания не создают достаточно прочной почвы, чтобы уместить на ней сколько-нибудь близкий к идеалу обзор.
1. PHP, JavaScript, HTML и CSS - стандартная связка для интернета, на которой написано огромное количество сайтов, включая, к примеру, «Википедию». Из плюсов - языки просты для изучения, имеют огромное живое сообщество, почти везде работают «из коробки». Так, к примеру, когда я выкладываю в блог свои небольшие проекты, типа «Кукухена» или «Тренажёра для пассажиров метро», я делаю их на джаваскрипте: не потому, что я люблю джаваскрипт, а потому, что они будут работать почти у всех читателей.
http://kukuhen.olegmakarenko.ru/http://metro.olegmakarenko.ru/ Из минусов - так как этой стандартной связкой по умолчанию владеют чуть ли не все профессиональные программисты, платят за неё скудно. При прочих равных можно ожидать, что программист PHP будет зарабатывать на 20-40% меньше, чем той же квалификации программист Java (не путать с JavaScript). Второй минус - веб-программирование прямо-таки принуждает новичков к плохим привычкам. Делать красивый и стройный код для веба - нетривиальная задача, с которой начинающие программисты обычно не справляются.
2. Java - один из самых популярных языков для создания мобильных приложений под Android. На мой взгляд, джава слишком строга и тяжеловесна, из-за чего плохо подходит для начинающих, однако если привыкнуть и перетерпеть первые месяцы, она становится вполне комфортной.
Джава мощна, и потому её часто используют в крупных проектах, причём отнюдь не только для мобильников или для интернета. Её решающее преимущество перед PHP я уже упомянул - джава-программистам платят больше, а работу им найти легче.
3. C# (си-шарп) - созданный «Микрософтом» язык, который весьма похож на джаву. Довольно распространён, используется или для создания программ под «Виндоуз» (на микрософтовском же «ДотНет»), или, например, для программирования игрушек под «Юнити». Если вы хотите писать игры, пожалуй, один из самых перспективных вариантов.
Кстати, игры можно писать не только на «Юнити», но и, например, на Unreal Engine. «Юнити» и «Анриал» примерно равны по возможностям, однако в «Анриале» используется уже не си-шарп, а встроенный в этот движок скриптовый язык, который больше нигде, кроме Unreal Engine, не применяется. Со стратегической точки зрения программисту лучше выбрать «Юнити», так как си-шарп можно будет использовать и в других местах.
4. Python (питон). Мой любимый язык, красивый и лаконичный. Программы на питоне получаются короткими, оставаясь при этом понятными. Один из лучших вариантов для начинающих, так как питон прост в освоении, и так как на питон по природе своей склоняет программистов к хорошему коду.
На питоне часто делают или веб-проекты, или сложные аналитические системы: БигДата, машинное обучение, вот это всё. Тем не менее язык универсален - когда мне нужно написать скрипт для сбора данных с сайтов или для пакетной обработки накладных в Excel, я первым делом вспоминаю именно про питон.
5. 1C. Весьма разумный выбор, если вы живёте в России: программисты 1С всегда нужны, их ценят и любят, при этом амбициозный программист легко может со временем открыть собственную фирму. Собственно, дефицит одинэсников так остёр, что некоторые фирмы набирают полных новичков, бесплатно обучая их программированию 1С с самого нуля. С PHP или Java так не получится, там даже стажёру всё же надо хоть что-то продемонстрировать на собеседовании.
Сам язык 1С мне не нравится, однако критичных недостатков в нём нет - если привыкнуть, на 1С можно делать всё то же, что и на других языках, пусть и несколько противоестественным способом.
Изучение 1С состоит из двух частей. На 20% это изучение самого встроенного языка. На 80% это изучение тех конфигураций 1С, в которых язык используется. Проведу аналогию: автослесарь должен уметь раскручивать закисшие гайки и собирать сложное оборудование. Вместе с тем хороший автослесарь должен хорошо понимать и устройство конкретных марок автомобилей, которые он чинит.
То же самое верно и для 1С: обычно специалист выбирает себе одну из конфигураций 1С и специализируется именно на ней, тщательно изучая, как там устроены данные, и по каким алгоритмам считаются бухгалтерские показатели.
Некоторые полагают, будто тот факт, что операторы 1С написаны на русском, имеет какое-то значение. Это не так: программисту совершенно всё равно, обозначается условный оператор словом «if» или словом «Если».
6. COBOL, ABAP. Кобол часто упоминается в анекдотах как «вечный» язык, на котором писали программы для банков ещё в шестидесятые, и специалисты по которому до сих пор нужны: для поддержки тех самых древних приложений из шестидесятых годов. ABAP - это язык, на котором написана SAP, монструозная система для полной автоматизации крупных предприятий.
Программисты, которые знают Кобол или Абап, не сидят без денег, однако это весьма специфический сегмент рынка. Полагаю, начинать с этих языков стоит только в том случае, если у вас есть на то очень веские причины - например, если вы имеете опыт руководства крупной фирмой или если вы хорошо представляете себе западное банковское дело.
7. Visual Basic. Когда деревья были высокими, а я маленьким, бэйсик считался лучшим языком для старта. Смышлёного третьеклассника можно было посадить за монитор, и к середине первого урока он уже начинал бодро рисовать при помощи команды PLOT разнообразные фигуры.
К сожалению, те времена давно прошли. Микрософтовский вижуал бейсик можно порекомендовать в качестве первого языка или врагу, или находящемуся в совсем уж безвыходном положении человеку.
Помните, как Гэндальф бросил кольцо в камин, и на кольце проступила надпись на языке Мордора? Гэндальф тогда перевёл для хоббита надпись на всеобщий язык, так как не хотел говорить вслух на чёрном наречии. Примерно такие чувства я испытываю, когда мне нужно сделать на «вижуал бейсике» макрос для «Ворда» или «Экселя» - да, я владею этим орочьим говором, но писать на нём код мне почти физически неприятно.
Разумеется, ко всему можно привыкнуть: в том числе и к современному изувеченному бейсику. Вместе с тем я советую изучать его только в одном случае - если вы много работаете с документами и хотите научиться делать макросы, чтобы оптимизировать вашу работу. В такой ситуации бэйсик может сильно помочь - грамотный макрос позволяет иногда одному человеку сделать за час ту работу, на которую раньше уходила целая неделя у всего отдела.
8. LISP. До того, как я увлёкся питоном, моим основным инструментом был LISP. Выучить этот язык полезно хотя бы ради того, чтобы лучше представлять себе программирование в целом - многие стандартные для LISP приёмы можно использовать и в других, более распространённых в наших широтах языках. Также диалекты LISP являются встроенными языками для многих серьёзных программ: для «Автокада» и для «Гимпа», например.
Классическим курсом для изучения LISP является SICP, эта знаменитая книга есть и на русском языке. Некоторые считают, что SICP уже устарел, и я, пожалуй, соглашусь с таким суждением. Вместе с тем знающим высшую математику SICP всё же будет интересен, так как там раскрываются многие важные теории программирования.
Учить LISP первым языком я бы не стал: у него относительно маленькое сообщество в России, он слабо востребован нашими работодателями. Увы, но в 2020 году лисп - экзотика, которая будет интересна скорее пресыщенным ветеранам, нежели зелёным стажёрам.
9. Ассемблер. Примитивный (в хорошем смысле) язык, максимально приближенный к машинным кодам, на которых думает компьютер. Существует маргинальное мнение, согласно которому надо изучать программирование именно с ассемблера, так как он находится в основе любого другого языка, и так как освоение ассемблера позволяет наглядно понять внутреннее устройство компьютера.
Ассемблер обычно применяют в работе или хакеры (простите, я хотел сказать «специалисты по информационной безопасности»), или бородатые инженеры в свитерах с оленями, которые оживляют при помощи ассемблера свои спаянные на коленке приборы.
Если вы мечтаете стать хакером, то ассемблер вам знать нужно, но всяко не первым языком. А вот если вы планируете открыть в гараже мастерскую по производству датчиков утечки газа, возможно, ассемблер и вправду окажется хорошим выбором.
10. C, C++. Раз уж мы начали говорить про ассемблер, нужно снять шляпу перед двумя языками, на которых выстроена огромная доля окружающего нас кода, включая, например, операционные системы Windows и Linux. Любители «Линукса» часто хвастаются, что, когда их что-то не устраивает в стандартных программах, они залезают в исходный код (написанный на си или си-плюс-плюс), после чего правят там всё самостоятельно.
С одной стороны, быть системным программистом, который может самостоятельно написать драйвер для звуковой карты, это круто: в айти-сообществе таких специалистов уважают. С другой стороны, чтобы стать системным программистом, нужно потратить 5-10 лет: выучить си, си-плюс-плюс и ассемблер, освоить несколько околоинженерных навыков, прочесть сотни тысяч строк документации и много раз подвергнуться публичному унижению на профессиональных форумах.
Что же получит герой, который выдержит все эти испытания и станет настоящим системщиком? Может быть, станет вторым Линусом Торвальдсом, создателем «Линукса». Но, с вероятностью в 95%, системщик устроится на условный судостроительный завод, чтобы получать там маленькую зарплату и наслаждаться околонулевыми перспективами карьерного роста.
11. Фортран. Вечно живой язык, который был создан в 1957 году, как раз в то время, когда Никита Хрущёв стал человеком года по версии журнала «Тайм». Используется преимущественно для научных вычислений, - не потому, что он как-то особенно хорош, а потому, что за эти десятилетия под фортран наплодили огромное количество библиотек.
Фортран - логичный выбор для учёного, которому нужно использовать расчётные модули своих предшественников. Вместе с тем фортран уже морально устарел, так что я даже учёным рекомендую сделать главным своим языком более современный питон, а фортран использовать только эпизодически, когда надо будет подгружать созданные учёными из прошлых десятилетий библиотеки.
12. Паскаль. Созданный специально для обучения язык, у которого до сих пор есть свои убеждённые сторонники. 25 лет назад, когда я учился в ЛЭТИ, мы делали лабораторные именно на паскале, при этом уже тогда паскаль имел репутацию малопригодного для реальной жизни языка. Цитата из «Баша» от 2005 года:
https://bash.im/quote/763 По дороге на работу решил выбросить мусор. Подхожу к контейнеру.
(р-н Б.Дорогомиловской, Москва).
В соседнем контейнере роются два бомжа. И вот один вытягивает из мусора книгу.
Название: «Программирование на Турбо-Паскале». И выдает фразу:
- Глянь, Петрович, неужели кто-то ещё на «Трубе» пишет?
Сейчас, в 2020 году, практический смысл паскаля сомнителен. Хоть на паскале и можно создавать современные программы (под платформу «ДотНет», к примеру), однако за пределами вузов он уже почти не встречается - если вы не знаете ничего, кроме паскаля, найти работу вам удастся разве что в качестве преподавателя информатики в гуманитарном вузе.
Мне кажется странной идея потратить три месяца на изучение паскаля, чтобы потом переключиться на изучение какого-нибудь живого языка. Лучше уж сразу начинать с джавы, питона или пиэйчпи - времени на обучение уйдёт примерно столько же, однако за эти языки, по крайней мере, работодатели готовы щедро платить.
13. Perl, «швейцарский нож для хакеров». Весьма интересный язык, который сисадмины раньше массово использовали для создания скриптов по обслуживанию серверов. Знаменит тем, что сделал популярными так называемые регулярные выражения - мини-язык для умного поиска по текстам. Когда-то перл был модным и популярным, - на перле, к примеру, написан «Живой Журнал», - однако сейчас его применяют значительно реже.
Если вы собираетесь стать хакером (в хорошем смысле слова), смело добавляйте перл в список к изучению, он вам понадобится. Остальным будет достаточно освоить регулярные выражения, благо они используются и в других языках.
Учить перл в качестве первого языка - спорная идея, даже если вы сисадмин, который сразу же сможет применить перл в текущей работе. Сейчас на рынке труда дисбаланс, из-за которого админам со знанием перла всё равно платят меньше, нежели начинающим программистам, выучившим какой-нибудь более востребованный язык.
Сделаю лирическое отступление. У девопсов, - смешанного класса, объединяющего сисадмина и программиста, - своя атмосфера. Девопсы работают с докером, с сетями, с непрерывной интеграцией, владеют парой языков типа питона или гоу. Стать хорошим девопсом весьма непросто, а платят им всё равно меньше, чем «чистым» программистам. На мой взгляд, это несправедливо, однако зарплаты на рынке труда устанавливаю не я.
Раз уж мы заговорили про админство, упомяну кратко и другие скриптовые языки - Bash, PowerShell. Они часто бывают полезны в текущей «офисной» работе, чтобы пакетно обрабатывать, к примеру, какие-нибудь фотографии или документы. Тем не менее начинать с баша и пауэршелла не стоит: во-первых, это откровенно некрасивые языки, во-вторых, они навряд ли помогут вам устроиться на хорошую работу.
14. ActionScript, скриптовый язык для создания флеш-приложений. На нём делают, например, браузерные мини-игры для соцсетей.
Муторная для освоения штука, которая заставит новичка изучить массу нюансов, специфичных именно для этого языка. Некоторые думают, что раз браузерные игры простые, то и программировать их, следовательно, тоже несложно. К сожалению, это не так.
Последние 10 лет флеш хоронят в разговорах, пророча, что его вот-вот окончательно заменят на джаваскрипт и HTML5, однако вот уже наступил 2020 год, а разработчики по-прежнему клепают на экшнскрипте свои «Чудо Покеры» и «Уморительные Фермы».
Если вы намерены разбогатеть, сделав небольшую циничную приложеньку для соцсетей, ставка на экшнскрипт может выстрелить. Тем не менее, это рискованная ставка - у флеша масса неустранимых проблем, из-за которых он может сойти с большой сцены уже в среднесрочной перспективе.
15. Delphi, Clipper, FoxPro, и прочие устаревшие (на мой субъективный взгляд) языки. Мир программирования весьма инертен, поэтому много где до сих пор фурычит старый код, созданный ещё в весёлые девяностые годы. Для поддержки такого кода по-прежнему нужны программисты, владеющие популярными тогда языками.
Вместе с тем рынок устроен таким образом, что платят таким программистам немного. Тот, кто надеется выучить ретро-язык и получить надёжный кусок хлеба с маслом, поддерживая старые приложения, будет наверняка разочарован. На Западе такая тактика иногда работает (привет, кобол), в России - почти никогда.
16. Ruby, Kotlin, Swift, Scala, Objective-C, Go и прочие модные языки. Все они имеют в моих глазах критичный недостаток - я не работал или почти не работал с ними, так что я не имею морального права высказывать о них своё мнение.
Если решите выбрать что-нибудь из этого списка, проверьте три вещи. Первое - есть ли в вашем городе вакансии для стажёров, начинающих изучать соответствующий язык. Таких вакансий должно быть как минимум несколько. Второе - есть ли в интернете активное сообщество любителей языка, которому вы сможете адресовать появляющиеся у вас вопросы. Третье - не заменили ли уже этот модный язык на ещё более модный. Так, к примеру корпорация «Эппл» сначала выбрала Objective-C для программирования под айфоны, а потом сменила его на свифт. Теперь перспективы обжектив-си безрадостны.
17. SQL, язык для работы с базами данных. Мощнейшая штука, основы которой нужно знать каждому программисту и сисадмину. Почти вся информация сейчас по умолчанию складывается в базы данных, а эскюэль позволяет её из этих баз извлекать.
Голые программисты SQL встречаются не так часто, при этом, буду откровенен, я бы длинной палкой отгонял от серьёзных серверов новичков, изучивших SQL в качестве первого своего языка. Тем не менее я настоятельно рекомендую каждому начинающему программисту потратить день на изучение основ SQL и ещё день на основы регулярных выражений. Эти знания не только украсят резюме, но и почти наверняка пригодятся в реальной работе.
18. Logo, черепашка, РАПИРА, Робик, алгоритмический язык, КуМир, прочие языки, созданные специально для обучения. Короткий вердикт - не тратьте время, сразу учите что-нибудь настоящее.
Чуть более развёрнуто. Главная сложность, с которой сталкиваются взрослые и дети при обучении программированию, заключается в соблюдении формальностей. Дети не такие тупые, как считают в Министерстве образования - они сходу способны уяснить, что команда draw_line(10,10,100,100) рисует линию из точки (10,10) в точку (100,100). Проблема возникает в тот момент, когда интерпретатор пишет им «Ошибка 102», и они остаются наедине с чёрным экраном, не понимая, что делать дальше.
Далёкие от программирования педагоги полагают, будто сгладить кривую обучения можно при помощи замены английской команды draw_line на что-нибудь типа ДвигайЧерепаху(ВверхВправо). Это наивно, проблема в другом месте.
Когда рядом находится учитель, который может объяснить ученику его мелкую ошибку, - «у тебя лишняя скобка», «это локальная переменная», «тут получается вечный цикл», - учёба идёт легко и быстро. Когда такого учителя рядом нет, ученик может иногда часами биться головой о клавиатуру, не понимая, почему у него не выходит «как в учебнике», и только под конец дня обнаружить, что он случайно нарушил какое-нибудь неизвестное ему правило.
Опытные программисты таких проблем даже не замечают, у них среда разработки настроена так, чтобы подсвечивать распространённые ошибки автоматически. Неопытных программистов любая мелочь может надолго затормозить.
Так вот, про учебные языки программирования. Если учитель рядом есть, то лучше сразу учить питон или пиэйчпи: скорость учёбы будет такой же, при этом ученик будет изначально привыкать к правильному, хорошо оформленному коду. Если учителя рядом нет, то лучше сразу учить… тоже питон или пиэйчпи, так как в интернете у реальных языков есть огромное дружелюбное сообщество, к которому можно обратиться с вопросом, и так как почти все проблемы новичков элементарно гуглятся в поисковике.
19. Django, Joomla!, Bitrix, Wordpress, Unity, Symfony, Laravel, прочие фреймворки, библиотеки и CMS. То, что я сейчас перечислил - это не языки программирования, а платформы и системы управления. Если проводить аналогию с человеческими языками, то выучить немецкий - это полдела, нужно ещё освоить или классическую немецкую литературу, или основы законодательства Германии.
Если фирма работает, к примеру, на «Битриксе», она предпочтёт нанять того, кто знает не только «голый» пиэйчпи, но ещё и внутреннее устройство «Битрикса». Если фирма использует «Симфони», она будет экономить время, нанимая тех, кто помимо пиэйчпи знает ещё и «Симфони».
Делать подробный обзор популярных платформ - задача титаническая, я к такому подвигу не готов. Хорошая новость в том, что прямо сейчас выбирать ничего не надо, обстоятельства сами укажут нужное направление.
Лично я полагаю разумной следующую схему обучения. Изучаете понравившийся язык программирования, пытаетесь устроиться на работу. Если в вакансиях требуют, например, знание OpenCart, изучаете дополнительно основы OpenCart, добавляете соответствующую строчку в своё резюме.
20. Ещё 8500 языков программирования, которые я в этой статье не упомянул. За кадром осталось масса интересного, - языки форт и пролог, к примеру, - однако я сознательно ограничился перечислением или практичных вариантов, или вариантов, которые кто-то может ошибочно счесть практичными.
Если бы я создавал школьную программу информатики, - не ту карго-профанацию, которая выдаётся сейчас за информатику, а нормальный курс, - я бы непременно включил туда историю основных языков, вот прямо начиная с машины Бэббиджа. К сожалению, школьную программу пишу не я, а к тому моменту, как профессиональные методисты дозреют до очевидного, мёртвыми станут уже и многие перечисленные в этой статье языки.
Подведу итог
Правильный выбор сделать нелегко, при этом просто ткнуть пальцем наугад нельзя, ибо различия между языками отнюдь не косметические.
К счастью, программирование - это не классическая музыка. Если профессиональный скрипач не может обычно стать ни трубачом, ни оперным певцом, то программисты регулярно учат новые языки, зачастую кардинально меняя при этом секторы своих интересов. Даже столь разные языки, как, например, PHP и 1С, всё же достаточно похожи, чтобы можно было за год-другой перейти от сайтов к бухгалтерии или от бухгалтерии к сайтам.