Как стать программистом. Выбор первого языка

Технические идеи по созданию сайта
Ответить
Сообщение
Автор
балбес
Сообщения: 119
Зарегистрирован: 24 фев
введите число: 999

Как стать программистом. Выбор первого языка

#1 Сообщение балбес »

Как стать программистом. Выбор первого языка



К сожалению, не все читатели могут самоизолироваться в Альпах с двадцатью наложницами, как это сделал на днях король Таиланда. Тем не менее мы все можем провести время вынужденного заточения с пользой: освоив, например, профессию программиста. Сегодня я начну рассказывать, как это сделать.

Для начала давайте с высоты птичьего полёта осмотрим зверинец языков программирования, так как познакомиться с ним нужно до того, как вы прочтёте основную часть моего 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
<ashura> По дороге на работу решил выбросить мусор. Подхожу к контейнеру.
<ashura> (р-н Б.Дорогомиловской, Москва).
<ashura> В соседнем контейнере роются два бомжа. И вот один вытягивает из мусора книгу.
<ashura> Название: «Программирование на Турбо-Паскале». И выдает фразу:
<ashura> — Глянь, Петрович, неужели кто-то ещё на «Трубе» пишет?
Сейчас, в 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С, всё же достаточно похожи, чтобы можно было за год-другой перейти от сайтов к бухгалтерии или от бухгалтерии к сайтам.

Олег Макаренко

https://cont.ws/@Fritzmorgen/1629784
evpatiy
Сообщения: 3
Зарегистрирован: 05 апр
введите число: 55555

Re: Как стать программистом. Выбор первого языка

#2 Сообщение evpatiy »

Андрей Столяров «Программирование: введение в профессию»

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

С обучением в ВУЗах есть и другая проблема. Абитуриенты поступают на «программистские» специальности, имея в большинстве случаев весьма приблизительное представление о том, чем им там предстоит заниматься. Программирование — это отнюдь не такой вид деятельности, которому можно научить кого угодно; здесь необходимы весьма специфические способности и склонности. По большому счёту, все программисты — изрядные извращенцы, поскольку ухитряются получать удовольствие от работы, от которой любой нормальный человек бежал бы без оглядки. Но распознать будущего программиста на вступительных экзаменах в ВУЗ или даже на собеседовании (какого нигде никто не проводит) совершенно нереально, особенно в условиях, когда в школе программирование либо вообще не изучается, либо изучается так, что лучше бы оно не изучалось. Выйдет из человека толк или нет, становится видно ближе ко второму курсу, но ведь в имеющихся условиях (в отличие, заметим, от большинства западных университетов) сменить выбранную специальность если и возможно в теории, то на практике почти нереально. В итоге даже среди студентов ВМК МГУ, где имеет честь преподавать автор этих строк, будущих программистов наблюдается в лучшем случае треть, а будущих хороших программистов — процентов десять.

Больше того, есть основания предполагать, что создание программиста в рамках ВУЗа вообще принципиально невозможно: ремесло не передаётся в стенах учебных заведений, ремесло передаётся только в мастерской — от действующего мастера к ученику, причём непосредственно в процессе работы, и касается это отнюдь не только программирования.

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

Самообучение — это тоже не так просто
Автору этих строк довелось стать программистом примерно четверть века назад — именно тогда, когда эта профессия вдруг перестала быть уделом узкого круга никому не известных людей и превратилась в массовое явление. Но в те времена мир был устроен несколько иначе. Господствующей платформой (если вообще возможно так выразиться в применении к реалиям того времени) была система MS-DOS и её многочисленные клоны, а типичный внешний вид экрана компьютера образовывали синие панельки Norton Commander. Написать программу для MS-DOS было несложно, средств для этого было — хоть отбавляй, так что на первую половину девяностых пришелся уникальный расцвет любительского программирования. Многие из любителей того времени стали потом профессионалами.

Современные условия качественно отличаются от эпохи начала девяностых. Все господствующие ныне платформы делают акцент на графический интерфейс пользователя; создание программы с GUI требует понимания принципов событийно-ориентированного построения приложений, умения мыслить в терминах объектов и сообщений, то есть, попросту говоря, чтобы сделать программу, снабженную графическим интерфейсом пользователя, необходимо УЖЕ быть программистом, так что варианты «попробовал — понравилось» или «попробовал — получилось» отсекаются сугубо технически. Более того, начать освоение программирования с рисования окошек в большинстве случаев означает необратимо травмировать собственное мышление; такая травма полностью исключает в будущем достижение высокой квалификации.

Единственным прибежищем программистов-любителей внезапно оказалась веб-разработка. К сожалению, начав в этой области, люди обычно ею же и заканчивают. Разница между скриптами, составляющими веб-сайты, и серьёзными программами столь же велика, как, например, между мопедом и карьерным самосвалом; кроме того, привыкнув к "всепрощающему" стилю скриптовых языков типа того же PHP, большинство неофитов оказывается принципиально неспособно перейти к программированию на строгих языках типа Джавы или тем более Си, а хитросплетения Си++ для таких людей оказываются за горизонтом понимания. Веб-кодеры, как правило, называют себя программистами и часто даже получают неплохие деньги, не подозревая при этом, что такое настоящее программирование и что они для себя потеряли.

Выход есть
Всякий раз, когда положение начинает казаться безвыходным, есть смысл поискать выход там, где его ещё не искали. В данном конкретном случае выход из положения немедленно обнаруживается, стоит только сделать шаг в сторону от современного компьютерного мейнстрима. Операционные системы семейства Unix на протяжении всей истории сети Интернет прочно и незыблемо удерживали за собой сектор серверных систем; начиная с середины девяностых, Unix'ы проникли на компьютеры конечных пользователей, а сегодня их доля на настольных компьютерах и ноутбуках такова, что игнорировать её больше не получается. Особенно интересной становится эта ситуация, если учесть, что MacOS X, используемая на «роскошных» мак-буках, представляет собой ничто иное как Unix: в основе MacOS X лежит система Darwin, которая относится к семейству BSD.

Несмотря на наличие в юниксоподобных системах графических интерфейсов, по своей развесистости часто превосходящих их аналоги в системах мейнстрима, основным инструментом профессионального пользователя этих систем всегда была и остаётся командная строка — просто потому, что для человека, умеющего с ней обращаться, правильно организованная командная строка оказывается многократно удобнее «менюшечно-иконочных» интерфейсов. Возможности графического интерфейса ограничены фантазией его разработчика, тогда как возможности командной строки (разумеется, при грамотной её организации) ограничены только характеристиками компьютера; работа в командной строке проходит быстрее (иногда в десятки раз); наконец, руки, освобождённые от необходимости постоянно хвататься за мышку, устают существенно меньше, перестаёт болеть правый плечевой сустав и всё в таком духе. В системах семейства Unix командная строка организована столь грамотно, что её господствующему положению в качестве основного интерфейса ничто не угрожает. В контексте нашей проблемы здесь важен тот факт, что написать программу, предназначенную для работы в командной строке, многократно проще, чем программу с GUI; наличие в Unix-системах командной строки в качестве основного инструмента работы делает возможным то самое любительское программирование, которое казалось безвозвратно утраченным с тех пор, когда в мейнстриме системы линейки Windows сменили «старый добрый» MS-DOS.

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

Увы, большинство учителей и преподавателей с упорством, достойным лучшего применения, продолжает использовать в учебном процессе компьютеры под управлением ОС Windows; нельзя не отметить, что на самом деле при этом учеников и студентов учат программировать под MS-DOS — тот самый MS-DOS, о котором сейчас, спустя почти двадцать лет после его окончательной смерти, даже вспоминать как-то неловко. В таких условиях любые аргументы, высказываемые в пользу сохранения Windows в качестве системы на учебных компьютерах, заведомо оказываются лишь отговорками, а реальная причина здесь одна: иррациональный страх перед освоением всего нового. Windows не годится на роль учебного пособия; продолжать использовать эту систему при наличии заведомо лучших (причём лучших по всем параметрам; Windows не имеет абсолютно никаких достоинств в сравнении с nix-системами) альтернатив — это, мягко говоря, странно. Для человека, взявшегося учить кого-то программированию, не должно быть проблемой освоение непривычной операционной среды.

Язык определяет мышление
Кроме операционной среды, используемой для обучения, важнейшую роль играет также выбор языков программирования. Времена бейсика с пронумерованными строками, к счастью, прошли; к сожалению, часто (особенно в спецшколах) встречается противоположная крайность. Несостоявшиеся программисты, решившие попробовать себя в роли школьных учителей, пытаются обучать ни в чём не повинных школьников «профессиональным» языкам, таким как Java, C# и даже C++. Конечно, пятиклассник, которому пытаются впихнуть в мозги C++ (реальный случай в реально существующем учебном заведении), в результате не поймёт абсолютно ничего, разве что запомнит «волшебные слова» cin и cout (отметим, что как раз это к реальному программированию на C++ отношение имеет весьма сомнительное), но таким «гениальным учителям» возможности аудитории совершенно не указ, тем более что способы контроля, естественно, выбираются такие, при которых ученики без особых проблем «проскакивают», так ничего и не поняв из выданного им материала. Автору этих строк встречались школьники, не понимающие, что такое цикл, но при этом получающие у себя в школе пятёрки по информатике, где им «преподают C++».

Учителям такой категории вообще, судя по всему, всё до лампочки: в C++ используется библиотека STL, а значит, надо рассказать ученикам STL; разумеется, дальше vector'а и list'а обучение никогда не заходит (при этом эти два контейнера, пожалуй, самые бесполезные из всего STL), но самое интересное, что ученики, разумеется, так и не понимают, о чём идёт речь. В самом деле, как можно объяснить разницу между vector и list человеку, который никогда в жизни не видел ни динамических массивов, ни списков и вообще не понимает, что такое указатель? Для такого ученика list отличается от vector тем, что в нём нет удобной операции индексирования (почему её там нет? ну, нам что-то объясняли, но я ничего не понял), так что вообще-то всегда надо использовать vector, ведь он гораздо удобнее. Что? Добавление в начало и в середину? Так оно и для вектора есть, какие проблемы. Ну да, нам говорили, что это «неэффективно», но ведь работает же! Переучить такого ученика практически нереально: попытки заставить его создать односвязный список вручную обречены на провал, ведь есть же list, а тут столько ненужного геморроя! Собственно говоря, всё: если нашему обучаемому дали в руки STL раньше, чем он освоил динамические структуры данных, то знать он их уже не будет никогда; путь в серьёзное программирование ему, таким образом, закрыт.

Не менее часто встречается и другой вариант: учить пытаются, судя по всему, чистому Си (тому, который без плюсов), то есть не рассказывают ни классы, ни контейнеры, ни STL (что, в общем, правильно), ни ссылки, но при этом невесть откуда выскакивают пресловутые cin/cout, тип bool (которого в чистом Си отродясь не было), строчные комментарии и прочие примочки из C++. Объяснение тут довольно простое: стараниями Microsoft с их VisualStudio в сознании виндовых программистов, особенно начинающих, разница между чистым Си и C++ временами совсем теряет очертания. В мире Unix с этим всё гораздо лучше, во всяком случае эти два совершенно разных языка никто не путает; но, как уже говорилось, Unix в нашей школе днём с огнём не найдёшь, учителя предпочитают платить государственные деньги за коммерческий софт, бороться с вирусами путём еженедельной переустановки всех компьютеров (опять же реальная ситуация в реальной школе), уродовать мозги учеников, лишь бы только не изучать ничего за пределами мейнстрима.

Впрочем, даже чистый Си в качестве первого языка программирования — это откровенный нонсенс. Причины этого я уже несколько лет назад подробно расписывал в эссе «Язык Си и начальное обучение программированию», повторяться здесь не буду, отмечу только главное: к изучению Си нужно подходить, уже понимая указатели и умея с ними обращаться; более того, желательно иметь уже некоторый опыт написания программ, чтобы отличать хорошее от плохого, ведь сам язык Си развивает что угодно, кроме культуры программистского мышления.

Довольно удачной представляется (во всяком случае, на первый взгляд) последовательность, традиционная для ВМК МГУ: в первом семестре студенты осваивают Паскаль, причём к концу семестра доходят до динамических структур данных, вплоть до хеш-таблиц; второй семестр посвящается архитектуре ЭВМ, в том числе изучению языка ассемблера и программирования на нём; в третьем семестре в рамках курса «Операционные системы» изучается чистый Си; наконец, в четвёртом семестре делается некая попытка донести до студентов объектно-ориентированное программирование и язык С++.

К сожалению, мелочи и частности могут напрочь испортить даже самую лучшую идею. Так, на лекциях первого семестра студентам зачем-то вдалбливают так называемый «стандартный Паскаль», который представляет собой монстра, годного разве что для устрашения, и в природе не встречающегося; при этом на семинарах тех же студентов заставляют программировать на ТурбоПаскале под всё тот же MS-DOS — на мёртвой системе в мёртвой среде, вдобавок не имеющей никакого отношения к «стандартному» Паскалю, который рассказывается на лекциях. Больше того, лекции построены так, будто целью является не научиться программировать, а изучить в подробностях пресловутый (и несуществующий) Паскаль: тратится море времени на формальное описание его синтаксиса, многократно подчёркивается, в какой конкретно последовательности должны идти секции описаний (любая реально существующая версия Паскаля позволяет расставить описания в произвольной последовательности, и уж точно нет ничего хорошего в том, чтобы, следуя соглашениям стандартного Паскаля, описывать в самом начале программы метки, которые будут использоваться только в головной программе, то есть в самом конце текста программы, но видны при этом будут зачем-то во всех процедурах и функциях).

Во втором семестре язык ассемблера, что уже, увы, ожидаемо, демонстрируется тоже под MS-DOS, то есть изучается система команд 16-битных процессоров Intel (8086 и 20286). Программирование под заведомо мёртвую систему расхолаживает студентов, культивирует презрительное отношение к предмету (и это отношение часто переносится на преподавателей). Впрочем, в действительности нет особой разницы, какой конкретно ассемблер изучать, главное — поймать логику работы с регистрами и областями памяти; но как в этом курсе расставляются акценты — со стороны понять очень трудно, во всяком случае, на выходе большинство студентов не понимает, что такое прерывание, и практически никто не знает, как выглядит стековый фрейм.

Всё более-менее приходит в норму лишь на втором курсе, где используется Unix (FreeBSD) и чистый Си изучается именно в этой, идеально подходящей для Си среде. Однако это не отменяет того факта, что перед этим целых два семестра используются, мягко говоря, с сомнительной эффективностью.

Несколько лет назад на ВМК на одном из трёх потоков начался эксперимент по внедрению новой программы; надо отдать должное авторам эксперимента, гнилой труп MS-DOS они из учебного процесса устранили. Впрочем, на этом достоинства новой программы заканчиваются: вместе с откровенной мертвечиной экспериментаторы выкинули и язык Паскаль, начиная обучение прямо с Си. Это можно было бы делать, если бы все поступающие на первый курс абитуриенты уже имели некий, хотя бы зачаточный опыт программирования: для человека, уже видевшего указатели, Си не представляет особых сложностей. Увы, даже ЕГЭ по информатике не может обеспечить наличие хотя бы и самых примитивных навыков программирования у поступающих: сдать его на положительный балл вполне можно, совершенно не умея программировать. Большинство первокурсников приходят на факультет с абсолютно нулевым уровнем понимания, что такое программирование и как это всё выглядит; Си становится для них первым в жизни языком программирования, а на выходе мы получаем откровенную катастрофу.

Если бы мир был идеален
С моей точки зрения, идеальная последовательность этапов в обучении будущего программиста могла бы выглядеть так. Прежде всего ученика следует убедить в том, что с компьютером следует по возможности общаться через команды, а не через иконки и кнопочки. Это можно было бы сделать, например, предоставив удалённый терминальный доступ к серверной Unix-машине с возможностью сделать там свой веб-сайт, работать с почтой и т.п. Делать это следует как можно раньше, во время учёбы в школе, причём желательно не тянуть с этим до выпускных классов.

Научившись пользоваться компьютером так, как это должно быть, а не так, как нас заставляет коммерческий мейнстрим, можно начать обучение программированию — с Паскаля (например, использовать FreePascal), при этом ни в коем случае не использовать никакие «интегрированные среды», скрывающие от пользователя как раз всё то, что следует знать и понимать. Тексты программ следует набирать в каком-то из множества доступных в Unix'е редакторов, для начала это может быть nano или joe, позже, возможно, vim; компилятор следует запускать вручную, дав соответствующую команду. Что касается самого Паскаля, то изучать следует не «язык Паскаль», а программирование. Нет совершенно никакого смысла в настойчивом вдалбливании ученику формального синтаксиса, таблиц приоритетов операций и прочей подобной ерунды: на выходе нам нужно получить не знание языка Паскаль (который, возможно, ученику никогда больше не понадобится в жизни), а умение писать программы. Наиболее высокими барьерами на пути ученика здесь оказываются, во-первых, пресловутые указатели (и автору этих строк не известно никакого другого языка, который был бы столь же удачен как учебное пособие на эту тему), и, во-вторых, рекурсия, с которой тоже можно научиться работать на примере Паскаля. Отметим, что модуль CRT (нежно любимый нашими педагогами настолько, что uses crt; встречается в программах, не использующих никакие возможности из него, причём даже в учебниках) во FreePascal'е под Linux и FreeBSD замечательно работает, позволяя создавать полноэкранные терминальные программы; на Си это сделать гораздо труднее, автор этих строк в своё время, будучи уже опытным программистом, потратил несколько дней на то, чтобы более-менее разобраться с библиотекой ncurses.

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

Следующим этапом может стать изучение Си (разумеется, чистого Си, причём даже не C99, а скорее ANSI C; всё, что было позже, со всеми VLA и _Complex — это результат террористической деятельности так называемого комитета по стандартизации, и влиять на образование вся эта муть не должна). Наконец, когда ученик окажется к этому готов, можно попытаться рассказать ему объектно-ориентированное программирование на примере C++, но для начала — строго без использования средств стандартной библиотеки этого языка, в противном случае как раз ООП и вообще сам язык C++ (при всех его странностях — один из самых интересных языков программирования среди всех существующих) останется за кадром.

В дополнение ко всему этому стоит, разумеется, в какой-то момент сделать шаг в сторону и освоить альтернативные парадигмы программирования, изучить Лисп, Пролог, возможно, Haskell. Ну а дальше всё зависит от ученика и его склонностей; базовое обучение программированию можно на этом этапе считать состоявшимся.

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

Чего во всём это море не хватает — так это правильной книги для начинающих. Школьные учебники информатики обычно написаны так, что лучше бы их вовсе не писали. Чего стоит одно только упорство, с которым во всех таких учебниках даются определения алгоритма (отметим на всякий случай, что любые попытки дать определение алгоритма противоречат современным научным представлениям, согласно которым понятие алгоритма не просто не имеет определения, но и не может его иметь). Авторы таких учебников тратят целые главы на описание работы с конкретными версиями конкретных коммерческих программ, так что их творения мгновенно устаревают с выходом следующей версии той же программы. Когда же дело доходит до собственно предмета программирования, становится очевидно, что авторы такого учебника, мягко говоря, имеют весьма странные представления о предмете.

Учебники для ВУЗов иногда (но далеко не всегда) пишутся людьми, предмет понимающими. К сожалению, в большинстве своём эти учебники несут на себе «проклятье мейнстрима» — они написаны в предположении, что в учебном процессе используются компьютеры c Windows, причём до сих пор издаются учебники, ориентированные на программирование под MS-DOS. Немногие ВУЗовские учебники, ориентированные на Unix, посвящены отдельным дисциплинам и не создают целостной картины предмета. Все прочие книги по программированию, не являющиеся ни школьным, ни ВУЗовским учебником, обычно расчитаны на профессионалов и для начального самообучения годятся слабо.

Книга под рабочим заглавием «ПРОГРАММИРОВАНИЕ: ВВЕДЕНИЕ В ПРОФЕССИЮ» должна, согласно замыслу автора, заполнить эту брешь.

http://www.stolyarov.info/books/programming_intro
Ответить

Вернуться в «Технические идеи»