LINUX.ORG.RU

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

 , , , ,


1

3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Clojure

Clojure гораздо ближе к реальности, да.

И то, и то использует кучу незнакомых новичку понятий (выражение, функция, вызов функции и возвращаемое значение, формальные параметры vs аргументы, cписок, метод, побочные эффекты, итерация, рекурсия) и будет вызывать тонну вопросов. Это нормально.

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

Возможно, легче (на первых порах) будет с питоном, в котором ученику доступно больше встроенной магии типа range. Но кому в итоге будет проще в работе — тому, кто умеет только кое-как комбинировать и использовать готовые кирпичики, или тому, кто понимает, как эта встроенная магия устроена внутри — и может не только строить из готового, но и обжигать свои собственные кирпичики?

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

Бездумное дёрганье готовых методов — да, к базе имеет крайне мало отношения %)

Вообще в этом вся идея – бездумно дергать методы, которые реализуют абстрактные структуры, модель которых уже известна. Вот это pop, вот это push, вот это индексация. Когда с этим разобрались, можно переходить к тому как это все внутри устроено. Иначе можно начать с того как это на ассемблере работает, в итоге половина забьет через неделю, потому что станет скучно.

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

дело совсем не в указателях - дело в умении отличать имя(именующее) от именуемого - ну и не ловитца в аутореферентные :)

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

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

тому, кто умеет только кое-как комбинировать и использовать готовые кирпичики, или тому, кто понимает, как эта встроенная магия устроена внутри — и может не только строить из готового, но и обжигать свои собственные кирпичики?

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

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

Насчёт бабашки — без шансов. Чтобы её нормально использовать, нужно досконально знать java, иначе помрёшь. Придётся на уроке постоянно прерываться, объясняя что такое ByteArrayInputStream и зачем он нужен, и как отличается от PushbackInputStream и когда какой применять и почему так сложно. Это будет педагогическая катастрофа.

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

Это понятные понятия

Для того, кто их уже понял — безусловно %)

у Scheme есть свои закидоны

Рекурсия и итерация — это не закидоны конкретных языков, это общие, универсальные методы организации вычислительного процесса. И лучше быть с ними знакомым, чем не быть, не так ли?

Циклы в том или ином виде – базовая часть программирования, они везде есть

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

Вот итерация (итеративный процесс) — да, базовая часть. Но итерация и циклы — не одно и то же. Циклы — только один из способов организовать вычисления итеративно.

Вообще в этом вся идея – бездумно дергать методы, которые реализуют абстрактные структуры

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

Ну, или нет.

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

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

Способы эти я бы назвал «снизу вверх» и «сверху вниз».

С такой точки зрения не думал. Сам я, наверное, к первому типу принадлежу, хотя в каких-то вещах, наоборот, понятнее когда сверху вниз объясняют.

Pascal не сильно много преимуществ даст в плане обучения по сравнению с Python. Типы данных разве что там удобнее будет объяснить, это да.

В отличие от питона, паскаль все же низкоуровневый язык и в этом смысле примерно равен Си.

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

Для того, кто их уже понял — безусловно %)

А тебе придется их определить для любого языка. Вот ваще для любого. Ладно, кроме brainfuck.

Рекурсия и итерация — это не закидоны конкретных языков, это общие, универсальные методы организации вычислительного процесса. И лучше быть с ними знакомым, чем не быть, не так ли?

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

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

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

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

Милфа может стимулировать обучение, это да =)

Посещение — наверняка. Обучение — ну, не знаю %)

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

Буквально вчера столкнулся с неявным преобразованием в pandas. Понятно, что это не сам питон, но было обидно, когда он мне пририсовал .0 в конце всех user_id и запорол файлик для обмена.

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

а где вы увидели слово «двусвязный» ? :-)

«если человеку надо понять, как работает двухсвязный список, то в питоне это просто»

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

в реальном софте операции на которых массив может проиграть линейному списку крайне редки.

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

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

Глазеть приесться, у каждого наверное была хоть одна красивая училка, не ради неё ходили на учёбу, но её красота точно этому не мешала, ну разве что по началу ахаха, а вот социализация и тяга приходить к сверстникам может появится, даже сме**ёчки с друзьями в учебном заведении по поводу шикарности училки часть социализации. Скорее всего у единиц, но всё же. Порой вещи действуют косвенно, как катализатор. Всё влияет на всё, можно лишь делать вид что чего-то нет. Можно привести контр аргумент, училка страшная, воняет и злая и ещё и тупая, +к причине прогулять нахер это дело на уровне эмоций и чувств и даже отношению к предмету на всю жизнь ибо может сформироваться невыпиливаемая из мозга негативная ассоциация. Это не стоит всё во главе угла, но тоже имеет своё влияние.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от Nervous

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

И на первых и на последних - достаточно глянуть на то как взлетел питон и как сдулся лисп и его производные.

Бездумное дёрганье готовых методов — да, к базе имеет крайне мало отношения %) Одним дёрганьем готовых методов понимания не получить.

С этим спорить невозможно. Вопрос только в том какую именно базу мы пытаемся наработать у обучающихся;-)

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

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

Лисп умеет ждать %)

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

jupyter это для дата сатанистов.

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

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

Как человек, который со Scheme дела не имел, попробовал реализовать вариант без разворота в конце. Получилось такое:

(define (my-list n)
    (define (build-list x y)
        (cond ((= x y) '())
            (else (cons x (build-list (+ 1 x) y)))))
    (build-list 0 n))

Вроде бы на https://try.scheme.org/ работает. Но что-то я просветления не достиг, не осознал «как эта встроенная магия устроена внутри», а только изумился, как можно фанатеть от такого инопланетянского синтаксиса.

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

Но что-то я просветления не достиг

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

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

что-то я просветления не достиг … а только изумился, как можно фанатеть от такого инопланетянского синтаксиса

Ну вот ещё парочка реализаций, может, поможет %)

(defn my-list [n]
  (if (zero? n) [] (conj (my-list (dec n)) n)))

(defn my-list* [n]
  (loop [counter 0 result []]
    (if (= counter n)
      result
      (recur (inc counter) (conj result counter)))))

(comment

  (my-list 8)
  ;; => [1 2 3 4 5 6 7 8]

  (my-list* 8)
  ;; => [0 1 2 3 4 5 6 7]

)

А теперь внимание, вопрос: какая из них взрывает стек при больших n? %)

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

«если человеку надо понять, как работает двухсвязный список, то в питоне это просто»

вот отчасти поэтому Питон и не надо. Хотя его по многому ненадо и это самое малое.

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

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

Ещё раз - просто потому что вставка/удаление эл-тов в/из середины редко встречается. Практически только в учебных пособиях. А доступ по индексу или поиск-проход вперёд/назад часто.

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

«Все есть указатель», даже массив и тот тоже указатель :) Выборка из массива в Си скорее просто другой способ записи разыменовывания указателя, чем отдельная сущность.

А вот здесь есть нюанс, в котором иногда даже давно пишущие на Си ошибаются.

Имя массива, строго говоря, является синтаксическим сахаром для указателя на первый элемент массива, но не переменной, содержащей указатель на начало массива. То есть, присвоить имени массива что-то другое не удастся.

int a[10]; a[0] = 4; 
int b[10]; b[0] = 5;
b = &a;         /* Ошибка компиляции, как бы не пытаться приводить указатели */
printf("%d\n",b[0]) ; /* А вот не будет тут 4 вместо 5 */

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

А с какого перепугу Си-строка называется так тогда?

Потому что это не строка, а строковый литерал. А нормальной структуры для строки нет. Поэтому сишники постоянно strlen(s) с O(n) делают, вместо s.len за O(1). Э – эффективность.

«Все есть указатель», даже массив и тот тоже указатель

О нет. Массив это отдельная, особая и очень хтоническая сущность. Собственно, как и указатель.

Правда, любой массив – указатель

Ваще ни разу. Просто имя массива деградирует до указателя при определенных условиях.

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

whom how

ща с marimo в vscode балуюсь - есть конечно выверт обусловленный реактивностью и по факту чуть по правленной семантикой - но имхо сам факт того что marimo уже как год как не взлетает в стратосферу показатель зрелости индустрии где нотебуки как кто-первый-встал-того-и-тапки

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

только изумился, как можно фанатеть от такого инопланетянского синтаксиса

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

Проблема же у лиспа очень простая – первые реализации сосали по производительности, а потом на него просто забили. Сейчас уже просто очень сложно объяснить людям почему этот скобочный кошмар на самом деле не деле не говно дедов, а уникальный язык с огромными возможностями. Sad but true.

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

вот отчасти поэтому Питон и не надо.

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

Следовательно по Вашему подавляющее большинство интерпретируемых ЯП брать не надо?! Однако…

А вот в MIT например с Вами насчет питона не согласны. Да и не только в MIT. Да и по моему опыту тоже, питон прекрасно подходит в качестве ЯП для обучения.

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

Следовательно по Вашему подавляющее большинство интерпретируемых ЯП брать не надо?! Однако…

Просто я вместо collections.deque, который тоже из коробки, предолжил [], это было зря. Не в ту сторону воюешь.

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

Ну вот ещё парочка реализаций

Это примеры не на Scheme, а на Clojure, который имеет более богатый синтаксис, насколько я понимаю. А новичкам почему-то Scheme рекомендовалась. За что их так?

А «стек взрывает» вариант с простой рекурсией. Цикл и хвостовая рекурсия от этого избавлены. Но как это связано со скобочным синтаксисом? Это относится и к другим языкам.

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

Python … необратимо испортит ему мозг динамическим подходом, отсутствием типизации и своеобразным стилем записи

Какой-то нежный у вас мозг, кисельный почти что. Я бы показался специалисту на всякий случай; с головой не шутят.

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

А нормальной структуры для строки нет. Поэтому сишники постоянно strlen(s) с O(n) делают, вместо s.len за O(1). Э – эффективность.

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

хочешь строку с длиной - делай ее ручками. и пиши функции для работы с ней… впрочем все это написано давно стопицот раз, еще в стародавние времена.

alysnix ★★★
()

Тут некоторые высказывались в пользу SICP и Scheme. Тем временем сам курс в MIT давно упразднён: The End of an Era, 2008 blog post.

Теперь введение в программирование преподают на базе Python. Вот список курсов MIT по программированию для новичков: https://ocw.mit.edu/collections/introductory-programming/

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

Заметь, однако, «мёртвая» латынь всё ещё полезнее живого таджикского, монгольского и десятков прочих иррелевантных для нетаджиков, немонголов языков. Аналогично с древнегреческим. Представь, что Джон Стюарт Милл, начавший изучать древнегреческий в 3 года и прочитавший Платона к 5, занялся бы вместо этого таджикским… Т.е. был бы обычным ребёнком гастарбайтера.

Pwner
()

Я бы теорию графов ещё добавил к обучению. Крутая вещь, на Ютубе смотрел про динамическое программирование(одного известного лектора, не блогера). Чавку с пола еле подобрал от удивления)

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

уникальный язык с огромными возможностями

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

Что касается именно Scheme, то у меня есть подозрения, что он со своими списками и рекурсиями будет уступать Питону не только в лаконичности, но и в скорости выполнения. Другое дело, что сам интерпретатор может быть намного меньше и быстрее запускаться.

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

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

И чо? В Rust тоже есть строка терминированая нулем. Это не мешает Rust’у иметь нормальные строки.

хочешь строку с длиной - делай ее ручками. и пиши функции для работы с ней… впрочем все это написано давно стопицот раз, еще в стародавние времена.

Ничего не написано, в каждом проекте сишники строки заново изобретают.

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

Что касается именно Scheme, то у меня есть подозрения, что он со своими списками и рекурсиями будет уступать Питону не только в лаконичности, но и в скорости выполнения. Другое дело, что сам интерпретатор может быть намного меньше и быстрее запускаться.

Не, Scheme быстрее Python в общем случае.

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

«стек взрывает» вариант с простой рекурсией. Цикл и хвостовая рекурсия от этого избавлены. Но как это связано со скобочным синтаксисом?

Сомневаюсь, что ты обо всём этом узнал, ковыряясь в петоне %)

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

А новичкам почему-то Scheme рекомендовалась. За что их так?

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

Схема в этом плане попроще — она сама себе платформа, и лишние навороты под ногами не мешаются. На начальном этапе это дорогого стоит. Сделал apt install guile, запустил репл и поехали. Хотя я бы, конечно, рекомендовал Emacs и M-x geiser.

Кстати, заметь, даже лавсан не стал предлагать борщелисп как учебный. Как думаешь, почему? %)

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

А вот в MIT например с Вами насчет питона не согласны. Да и не только в MIT. Да и по моему опыту тоже, питон прекрасно подходит в качестве ЯП для обучения.

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

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

Какой-то нежный у вас мозг, кисельный почти что. Я бы показался специалисту на всякий случай; с головой не шутят.

А причем тут мой мозг?

praseodim ★★★★★
()

Basic и Pascal, это всё, расходимся /thread

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

«мёртвая» латынь всё ещё полезнее живого таджикского

Ну попробуйте на латыни в Таджикистане купить себе еды;-)

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

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

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

Python 3.10.12 (main, Nov  6 2024, 20:22:13) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def mysum(x): return 0 if x==0 else x+mysum(x-1)
... 
>>> mysum(10000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in mysum
  File "<stdin>", line 1, in mysum
  File "<stdin>", line 1, in mysum
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded in comparison

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

(iota 8)

Всё-таки они там немножко наркоманы.

Скорее всего это наследие APL: ι8.

stabilitron
()

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

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

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

SICP … в MIT давно упразднён

Не от хорошей жизни он упразднён, надо заметить.

Да, той романтики программирования уже нет. А вот раньше!

from life import success
stabilitron
()
Ответ на: комментарий от stabilitron

Да, той романтики программирования уже нет.

Вообще есть. Посмотри как автора Hyprland прет! Дискорд разрывает от мемосов, тысячи людей кидают донаты.

anonymous
()
Ограничение на отправку комментариев: