LINUX.ORG.RU

ЛОР, помоги выбрать ЯП для обучения

 , , ,


0

2

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

Вот к каким мыслям я пришёл:

Язык должен наиболее чисто демонстрировать самые основы написания кода.

Не Си и не современные коммерческие языки (Java, C#, Go). Си, хотя примитивный в основе, усложнён из-за окружения, в котором используется. Современные коммерческие языки были созданы для решения проблем индустрии. Проблема общая: я хочу преподавать материал по мере нарастания сложности. Если в языке неизбежно приходится использовать классы или printf, то это затруднит объяснение (не хотелось бы слишком часто говорить «потом узнаешь для чего это нужно»), напугает студента (ему придётся писать код, используя возможности, которые он плохо понимает), создаст неправильное восприятие основ (как будто printf — это какая-то важная часть компьютера или ОС).

В целом, я хочу постепенно наращивать сложность и, если задачу можно решить более простым методом, то выбрать этот метод.

Языки, между которыми я выбираю: Pascal и Python.

Pascal устарел и денег не принесёт (обидно), но это и не является основной целью. Целью является программирование, а не современное окружение.

В частности, я не собираюсь задрачивать студента на Delphi или любой «продвинутый» диалект языка. Это противоречит цели. Я рассчитываю на то, что после должной тренировки “bare bones” нужно перейти на современный язык и это будет легко.

Важно упомянуть, что спека языка Oberon (Виртовский язык, тот же Паскаль, только упрощённый и доработанный) составляет 17 страниц.

Питон мне сложнее оценить, потому что я избегал работы с ним.

Если ограничиться императивным подмножеством, без ассоциативных массивов, классов и мета-классов, list comprehensions, HOF, исключений, то выглядит как альтернатива Паскалю. Хотя меня беспокоит динамическая типизация. Типы — очень важная вещь, хотелось бы чтобы язык помог это донести, а не быть типа «ну да, это важно, но ты забей».

Это все мои мысли.

Что касается практики, то я имел несчастье наблюдать как человек впервые знакомился с программированием, изучая Java на javarush. На это было больно смотреть.

Edit: дальнейшие пояснения по теме:

  • Почему не Си и не ассемблер: 1 2
  • Почему Паскаль: 1 2
  • Почему не Питон: 1
  • Целевая аудитория: 1
  • Почему такая размытая аудитория: 1 2
  • Про важность иерархии: 1


Последнее исправление: kaldeon (всего исправлений: 7)
Ответ на: комментарий от AntonI

Степанов который на пеньсии:

https://stepanovpapers.com/canon.html

https://psoberoi.github.io/stepanov-civilization/civilization.html

забавно обнаруживать что некоторая часть народных поговорок прямые цитаты из того или иного текста

так же забавно что последовательности символов:

«всё мне разрешено, но не всё полезно» не так форсится как иные из того же источника

латынь(точнее классическая филология)(на уровне бе-ме) прикольно хотя бы тем что итти(с 1956 идти) местное а ход из исхода(новогре)

qulinxao3 ★☆
()
Ответ на: комментарий от kaldeon

вот это проекция!

да и клауза «только» делает утверждение очень сильным

Pascal(IPL58 Алгол Алгол60 Эйлер Алгол-W PL360 pASCAl modula... oberon ... lua(?!?) ) - это инструмент который «сделано в Европе»

Python(.... Algol-68) - сделанно в европе тож

у Pascal завезли вложенные процедуры(функ) но забоялись с замыканиями :(

у Pascal достаточно TurboPascal-ый импорт :)

https://en.wikipedia.org/wiki/Asca

https://en.wikipedia.org/wiki/P-code_machine

https://en.wikipedia.org/wiki/Euler_(programming_language)

qulinxao3 ★☆
()
Ответ на: комментарий от kaldeon

ох ёж

golang это во многом parallel-pascal Хансена

на литкоде гошка вроде как есть

а навык дистрибутивного программирования о котором при THE ещё Дейкстра парился в 1965+- ща более актуально массовый навык

действительно обучение обучает и обучающего

qulinxao3 ★☆
()
Ответ на: комментарий от ya-betmen

если в полноте то какой(вариант) Pascal?

если же реально фундаментально то выбор языка тут не основной выбор

а судя по максималистким высказываниям «отрока»(классификация на основе степени максимализма) дело вообще не в Паскале а возможности защищать кафедру меньшими усилиями

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)

В корне ошибочный подход к обучению программированию. Ничего кроме производителей bloatware с таким подходом на выходе не получится никогда.

Не бывает никакого сферического программирования в вакууме, поэтому обучение программированию должно начинаться с изучения железа. Вот эти все эти логические элементы, декодеры, счётчики, триггеры, основы схемотехники, и пр. Потом ассемблер, хотя бы поверхностно, и только потом уже языки высокого уровня, с пониманием того, что это всё в любом случае будет в итоге сведено исключительно к инструкциям процессора и логическим элементам которые будут эти инструкции обрабатывать. Какой ЯП будет после этого изучаться основательно - без разницы, на самом деле.

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

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

Эта проблема полного разрыва с реальностью есть не только в компьютерной науке, на самом деле. Физика, например тоже страдает от того, что теоретики оторваны от реальности полностью, и более того, им это очень нравится т.к. позволяет бесконечно плодить всякие теории струн, высасывать из пальца новые частицы, разглагольствовать о тёмной материи/энергии и т.п. получая гранты которые могли бы пойти практикам.

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

ещё один аргумент в пользу Python – читаемость кода.

что из этого проще прочитать человеку, который только знакомится с программированием?

Когда учим писать, важнее писаемость кода.

vM ★★
()
Ответ на: комментарий от vM

Verilog или другой HDL высокого уровня.

Это если разработчиков процессоров надо готовить. Для базового понимания как на самом деле работает компьютер верилог излишен и ничего особо не даст.

Stanson ★★★★★
()
Ответ на: комментарий от kaldeon

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

Если язык явно не позволяет программно создавать и модифицировать код во время выполнения программы, то это неполноценная модель фон Неймана.

vM ★★
()
Ответ на: комментарий от kaldeon

люди, которые рассматривают программирование как профессию.

Тогда, если ориентироваться на языковое программирование, базовый (не обязательно первый) язык должен быть таким, чтобы закончив вводный курс, ученик мог реализовать этот язык в разумные сроки.

vM ★★
()
Ответ на: комментарий от vM

вопрос в росте косвенности

если язык позволяет поднять тот же эмулятор шитого кода на основе массива изображающего память и регистры некоторой «машины» то вот и модель полноценная

если язык позволяет читать и писать файлы - то вот и модель фон Неймана где файл это ячейка памяти

qulinxao3 ★☆
()
Ответ на: комментарий от kaldeon

меня заставляет задуматься утиная типизация и интерпретируемость. Типы и машинный код — важные вещи.

Интерпретируемость важна. В конце концов код нашей программы выполняется каким-то интерпретатором или системой интерпретаторов.

vM ★★
()
Ответ на: комментарий от Stanson

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

Это не проблема, потому что их код не будет выполняться на железе. Он будет выполняться в контейнере, запущенном поверх виртуалки, причем хз на какой архитектуре.

anonymous
()
Ответ на: комментарий от kaldeon

почему привилегии отданы рекурсивным языкам

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

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

В работе простота, конечно, тоже сильно помогает. Но искалеченным байтодрочем людям просто не с чем сравнивать, и им вроде норм. Выгорел, сходил в запой, работаем дальше. Такая жызнь.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

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

Если бы это было так, мы бы видели огромное количество софта на ФП. И вакансий. И преподавался бы он тоже везде.

А по факту проще в использовании Python и Golang.

anonymous
()
Ответ на: комментарий от anonymous

Если бы это было так, мы бы видели огромное количество софта на ФП.

У ФП (лямбда-исчисления) есть некоторые проблемы со сложностью (вроде NP-полная) в проецировании в гарвардскую архитектуру (машину Тьюринга). Из-за этой сложности ФП программирование выпало из практического употребления на целое поколение учеников (1980-2000 годы).

anonymous
()
Ответ на: комментарий от anonymous

нет ибо логический разрыв

более того выч моща настолько ща дёшева как впрочем и корм для мартышеккода что нет нужды внедрять оптимальные по когнитивной сложности методы

чиста для примера Инженерии - днища для электрокаров печатают на итальянском станке - почему это (печатать днища для автомобилей) не начале массово когда появилась технология (лет 60 кста) - а вот

и да основной то дефицит в менеджменте :)

резервы далеко не исчерпаны так что

а эволюция всегда медленнее прогресса ибо целевая более размазанная

qulinxao3 ★☆
()
Ответ на: комментарий от Nervous

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

Это все хорошо в теории. Потом начинается практика, и выясняется, что ФП легкие и простые на однострочных примерах. А когда тебе в базу данных надо сходить, выясняется, что ученика теперь придется научить работать с монадическим стеком. А он всратый. И там нельзя два Reader просто так, надо трансформеры писать. Ладно, возьмем эффекты, это проще. Ой, очередная либа, которая должна была стать дефолтом, сдохла. А, да, забыли сказать, Either для ошибок работает, но не всегда, потому что есть ещё асинхронные эксепшоны.

С лишпами проще, но там тоже есть свое безумие. Зачем все это нужно, когда есть простейшие языки вроде Python, на которых просто и наглядно можно показать все концепты программирования, решительно непонятно.

anonymous
()
Ответ на: комментарий от qulinxao3

более того выч моща настолько ща дёшева как впрочем и корм для мартышеккода что нет нужды внедрять оптимальные по когнитивной сложности методы

ФП сосут по памяти просто как не в себя. Aeson в Haskell запросто жрет гигабайты при парсинге простейшего вложенного JSON с десяток мегабайт.

anonymous
()
Ответ на: комментарий от lovesan

(defun foo (n) (loop :for i :below n :collect i))

Как и следовало ожидать, в Scheme приведённый пример не запускается:

*** ERROR IN console@1:2 – Unbound variable: defun

То есть уже два лиспера рекомендуют язык, который сами не используют и пример на котором написать не могут.

дергать стандартную библиотеку вместо программирования

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

Что касается дёрганья не только стандартной библиотеки, но и сторонних библиотек - то это и есть работа программиста.

Единственно, кому верно советовать Scheme - это начинающему создателю интерпретаторов, который уже ассемблерный и фортовский синтаксис осилил. Но это всё равно может быть только ступенью к созданию интерпретаторов «нормальных» языков.

Kogrom
()
Ответ на: комментарий от qulinxao3

для ФП нужно более непрерывный спектр иерархии памяти

Дело не в этом, дело в том, GHC RTS плохо память отдает. Наверное его можно починить, сделать другие трейдоффы и так далее, но зачем все это страдание пареньку, которого учат как дерево обходить?

anonymous
()
Ответ на: комментарий от lovesan

говорили, что уровень студентов упал

Я на лекциях (снято судя интерпретатору схемы в телевизоре в начале 90х) у них видел в основном 30-40 летних мужиков и баб, то есть скорее всего людей с уже какие-то образованием.

Ygor ★★★★★
()
Ответ на: комментарий от anonymous

Для ФП не нужна память (как понятие).

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

  • как разложить задачу на подзадачи

  • как положить подзадачи на структуры данных

  • как оценить сколько памяти сожрет мой алгоритм

  • как ограничить потребляемые ресурсы (работа за константную память)

И вот на последних двух пунтках актульные ФП начинают сосать. Есть решения всех этих проблем (вплоть до загнать ввод в сишную либу и распарсить уже её вывод), но это не про обучение новичков вообще никак.

anonymous
()
Ответ на: комментарий от Ygor

Потому что написан для cl и там, в sbcl во всяком случае, оно работает.

Один пишет примеры на SBCL, второй на Clojure, хотя оба советуют Scheme. Если бы они советовали SBCL или Clojure, оно хоть как-то было бы понятно.

anonymous
()
Ответ на: комментарий от anonymous

как положить подзадачи на структуры данных

Структуры данных для ФП или для структурного программирования?

как оценить сколько памяти сожрет мой алгоритм

Память - это понятие из архитектуры фон Неймана и гравардской архитектуры. Это не про ФП.

Ты занимаешься натагиванием совы на глобус, ФП на гарвардскую архитектуру.

anonymous
()
Ответ на: комментарий от anonymous

возможно, непрофильным.

Образование как раз учит усваивать незнакомую информацию. Да и в 30-40 спермотоксикоза в разы меньше.

хотя оба советуют Scheme.

На scheme есть русское издание и лекции на русском. А вот есть ли возможность, как в указанном @lovesan примере итеративного создания списка я хз.

Ygor ★★★★★
()
Ответ на: комментарий от anonymous

Структуры данных для ФП или для структурного программирования?

Это одни и те же структуры. Просто в ФП с ними страдают. Посмотри на коллекции в хачкеле, там все то же самое.

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

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

anonymous
()
Ответ на: комментарий от anonymous

Посмотри на коллекции в хачкеле

Это и есть то самое натягивание. Потому что хаскель работает на машиние с гарвардской архитектурой.

Учить людей <чему-то>, которые не применимы в реальной работе

Реальность изменчива. Проблема обучения - это угадать, что понадобится в будущем.

anonymous
()