Саша Соболев тут написал большой текст в контексте обсуждения пользы обучения программированию на примере C++. Текст правильный, но содержит много тезисов, и поэтому отвечать я буду на него примерно потезисно.
Дима, давай я тут отдельно объясню свою позицию, хотя я помню время, когда это не потребовалось бы.
Я тоже помню (хотя и не застал) время, когда программирование было программирование вообще. Ну так Сайрес Смит в голове держал примерно всю практическую инженерию, и он был последним, кому это вообще удалось.
Если ты хочешь стать программистом, ты должен понимать в том, как устроен дивайс, который ты программируешь. Не потому, что ты будешь потом на ассемблере собирать SQL-запросы и не потому, что придется самому ваять менеджер памяти. А что бы понимать что происходит.
Я в принципе согласен, но адекватный уровень понимания для каждого языка и предметной области разный. Если ты пишешь на JavaScript/CSS, то до железа ты не доберёшься близко к совсем, и тебе не актуальны процессорные кеши, но крайне актуально знание размеров экрана и то, как в какой системе отображаются твои виджеты. А на C, да ещё выжимая каждую операцию досуха ради быстродействия, тебе надо знать, например, про векторные инструкции процессоров.
Ты написал "в школе будут учить С++". Вот если учить, тем более в школе, то есть нубов, то конечно С++ - хороший вариант. Не единственный. На плюсах сейчас работает людей меньше, чем раньше, и если кто решит быть программистом, то это будет, конечно, не единственный язык.
Я тут понял, что единственное, для чего C++ хорош в образовательных целях — это для объяснения про классы, темплейты, контейнеры и алгоритмы. Что у нас бывают разные способы хранить кучу плюс-минус однородных данных, и где-то мы за это заплатим неудобством поиска, где-то проблемами со вставкой, где-то чем-то ещё. Но это примерно C++ 2003. Ну то есть это не C++, это C с классами и немного STL. И я не уверен, что C++ — методически самый лучший для этого язык.
Но толку от обучения в школе Erlang с моей точки зрения сильно меньше. Гораздо. Программист, который не в курсе устройства компьютера, который не понимает базовых вещей (а без знания низкоуровневых языков, только по лекциям этого не получишь), будет где-то хорош, пока не найдет свои грабли. И грабель этих о с шансами вообще не заметит.
Вот тут и согласен, и не согласен. Не компетентен судить про Erlang, но по другим языкам — часть граблей программист не заметит, но ими прилетит.
Течет память - либа тухлая, другую возьмем! Медленно работает - надо апгрейдиться! Ну а чего вы хотите - оно вот так работает! Скомпилить шаред библиотеку и подключить к своему проекту на Erlang/R/Python? Не ко мне 🙂 Ну хоть понять, что это можно реализовать как полагается на низкоуровневом языке и попросить того, кто умеет! Но это уже детали даже.
Это вполне релевантные детали в целом. А в частности всё сложно. Утечки памяти в современном языке с garbage collector надо очень стараться, чтобы организовать. Критичные по времени места уже реализованы на низкоуровневом языке и оптимизированы. Другой вопрос, что их можно неправильно использовать и править надо именно алгоритм. А для этого ещё и профайлить, о чём и профессионалы не всегда думают. А когда думают, часто получают неожиданный результат в том, где на самом деле находится узкое по времени место.
Самое серьёзное ускорение, которое мне довелось привнести, было в проекте на C++. Там товарищ делал обрезал начальные пробелы в строке, проходя с начала, и для каждого пробела двигал всю строку (довольно большую) на этот пробел влево.
С/С++/Pascal - отличные языки для изучения в школе. А над программерами, которые не считают нужным их знать, позволь мне посмеяться. Я не со зла, просто это действительно смешно.
Я не уверен, что тут надо знать именно языки, а не концепции. O-нотацию, например. А из этой тройки я бы сейчас оставил Паскаль, и сильно концептуально ограниченные подмножества.
no subject
Date: 2020-09-06 10:43 am (UTC)Попался мне недавно случай, когда уже в момент предрелизного тестирования был пойман такой баг, глядя на который я долго удивлялся
Вот человеку который учился на Pascal или на Algol-60 как я, в общем на языке, где параметры можно переменовать и по значению и по ссылке, и на этой разнице обязательно заосторяют внимание, должно быть попросту очевидно, что в языке C, где параметр всегда передается по значению, значение переменной p в результате передачи ее значения параметром в функцию free измениться не может.
А тут вот было написано что-то вроде
if (malloced) { free(keyword) }Это было в исходном варианте. Потом в порядке борьбы с якобы утечкой найденной каким-то новомодным статическим анализатором добавили
if (keyword) { free(keyword) }Причем теста, который покрывал этот код, и который вообще-то в том же дереве исходников лежат (и который честно сегфолтился по double free), ухитрились не запустить, ни автор "фикса", ни ревьюер, ни я при мердже в релизную ветку. И только при интеграционном тестирование этот тест запустился (это вообще-то уже к апстриму вопрос - почему в стандартный комплект, запускаемый при make check этот тест не входит).
no subject
Date: 2020-09-06 12:31 pm (UTC)Друзья, когда вам в голову придёт банальная мысль, что "обучение программированию", и "обучение языку программирования" вещи между собой связанные очень опосредованно - вот только тогда начинайте что-то вещать с умным видом. А пока - не надо, ладно?
no subject
Date: 2020-09-06 12:37 pm (UTC)no subject
Date: 2020-09-06 12:39 pm (UTC)Это как? Учить программированию путем рисования блоксхем на бумаже? Еще в первой половине 80-х годов у нас в школе по этому поводу говорили "Програмизьма без механизьма - разновидность онанизма".
Учить программированию можно ТОЛЬКО давая ученику возможность выполнять написанные им программы на каком-нибдуь вычислительном устройстве. Так что без языка¸ причем языка имеющего реальный компилятор или интерпретатор на имеющемся в наличии железе, в процессе обучения не обойтись.
А любой языка как инструмент обучения обладает теми или иными достоинствами или недостатками.
Учить же на десятке языков сразу можно далеко не всех. Это слишком продвинутый уровень. Хотя в ходе обучения будущего профессионального программиста такой период когда к каждому практикуму нужно освоить новый язык, необходим.
no subject
Date: 2020-09-06 12:40 pm (UTC)Почему так мало? По идее оптимальным количеством в подобных ситуациях является число e. Следовательно лучше трем, чем двум - три ближе к e.
no subject
Date: 2020-09-06 12:43 pm (UTC)no subject
Date: 2020-09-06 01:07 pm (UTC)- Я никогда ни с кем не спорю, особенно в интернете.
- Но это-же невозможно!
- Да, вы совершенно правы.
"
no subject
Date: 2020-09-06 01:25 pm (UTC)Можно ссылку?
no subject
Date: 2020-09-06 02:40 pm (UTC)Класс! Ваш комментарий сделал мне ну если не день, то полдня точно. Спасибо!
no subject
Date: 2020-09-06 03:39 pm (UTC)А... я вижу явные приметы маразма "опытного разработчика". Видел это неоднократно. Когда триггеры и ФФЯ были важнее кода. Когда машинные коды были надежней ассемблера (ближе к железу). Когда ассемблер был лучше фортрана и си (ближе к железу).
Ни один из этих людей почему-то не в состоянии оценить важность Раста - хотя казалось бы, вот, контроль ресурсов.
Думаю, все это скорее от невежества, накапливающегося в результате того, что жизнь идет вперед, а нам некогда чему-то учиться.
Насчет того, чему учить детей, я б вообще джаваскрипту обучал, в качестве первой стадии. И тайпскрипту в качестве второй стадии. Речь-то вроде бы шла об обучении программированию, в не об экономии памяти и процессора.
no subject
Date: 2020-09-06 03:39 pm (UTC)no subject
Date: 2020-09-06 04:13 pm (UTC)no subject
Date: 2020-09-06 04:42 pm (UTC)no subject
Date: 2020-09-06 04:48 pm (UTC)no subject
Date: 2020-09-06 04:54 pm (UTC)Re: Блин. Меня нет в фейсбуке =((((
Date: 2020-09-06 04:57 pm (UTC)Тоже, задался вопросом, а где источник, и тоже - без МордоКниги, да и не хочу, а никто платить не хочет...
no subject
Date: 2020-09-06 05:31 pm (UTC)C++ для обучения программированию плох тем, что в нём за деревьями не видно леса. Про классы, контейнеры и алгоритмы лучше взять scala. И, кстати, важно помнить, что классы в С++ — это не концепция, и даже не прямое отражение концепции, а особенность реализации. А темплейты — это либо оптимизация алгоритмов, либо работа с алгоритмами «для бедных». В смысле, для тех, у кого язык не умеет переменных типов по-человечески. В первом варианте они нужны уже для профессиональных программистов, оптимизирующих узкие места, найденные профайлингом, как правило, под конкретную архитектуру. При обучении программированию эту тему затрагивать вообще вредно. Ну а во втором — лучше сначала освоить алгоритмы на языках достаточно высокого уровня, а потом уже, если понадобилось оптимизировать, реализовывать освоенное с помощью темплейтов.
no subject
Date: 2020-09-06 05:36 pm (UTC)no subject
Date: 2020-09-06 05:49 pm (UTC)Процедурному, функциональному и на сдачу (.71828) логическому.
А потом — статической и динамической типизации.
no subject
Date: 2020-09-06 06:15 pm (UTC)Если на сдачу, значит в качестве логического используем make?
no subject
Date: 2020-09-06 06:15 pm (UTC)Не то чтобы я его не слышал, но вовремя и к месту напомненный бородатый анекдот - тоже неплохо.
no subject
Date: 2020-09-06 06:17 pm (UTC)no subject
Date: 2020-09-06 06:19 pm (UTC)no subject
Date: 2020-09-06 06:21 pm (UTC)no subject
Date: 2020-09-06 06:23 pm (UTC)А мнет тут тем временем дружно пытаются доказать, что Go круче Rust.
А ECMAScript к сожалению, сам по себе ни для чего не пригоден. Чтобы учить детей на нем программировать, мало иметь сам языка, надо еще какую-нибудь объектную модель чего-нибудь к нему приложить.
Причем все сколько-нибудь распространенные - что браузерная модель документа, что WindowsScriptingHost-овская модель системы, что предлагаемая NodeJS - отнюдь не образец простоты и логичности.
Я б если ставить задачу учить детей программированию посредством какого-нибудь извода JavaScript, сначала бы разработал исполнителя. Какого-нибудь робота, желательно чтобы его можно было не только в виртуальной среде гонять, но и собрать физического, из Ардуино с RaspberryPi в черепушке, с простой и понятной объектной моделью, и вот на нем бы учил.