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)
Ответ на: комментарий от dataman

А почему это должно случиться? :) Да, как уже заметили, на картридже этого компьютера было две вариации бейсика: одна со спрайтами, возможностью выводить эти самые спрайты и текст в любое место экрана, читать состояние джойстиков и генерировать звуковые сигналы. Жаль, не было возможности печати на принтере (из простейшего редактора можно было) и сохранять программы в память. Другая – вычислительная, поддерживала операции с дробными числами и математические функции вроде синусов, косинусов, тангенсов, квадратного корня и т. д., и, возможно, все-таки умела в печать на принтере (но я не пробовал). Еще была полезная программа – тренажер клавиатуры. И да, прилагался небольшой альманах на 200 или 300 страниц А4 – руководство по работе с картриджем и описание языков. Причем, для G-Basic там было отведено достаточно много текста, в отличие от F-Basic, хотя перевод был посредственного качества.

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

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

Да, было такое

чем даже тем, кто не знал вообще ничего

Нет, не на столько. В принципе по ощущениям не так мозг то шарп травмирует, все равно даёт базу по ООП, solid и всему такому. Но вполне успешно после этого у меня воспринимались функциональные языки на подобии F# и Haskell.

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

Любой язык (что человечий что компьютерный) имеет смысл учить только если собираешься им пользоваться и в тех объёмах в которых собираешься им пользоваться. Исключения бывают, но они скорее подтверждают правило.

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

И да, я программированию учу почти 20 лет:-)

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

Да, Паскаль – хороший выбор.

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

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

русский

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

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

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

Можно взять питон - там функциональщина вполне.

Правда если взять питон, то паскаль уже можно не брать:-)

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

А почему это должно случиться? :)

Я подумал о GW-BASIC, на котором я когда-то написал мультик на тему космоса, и сдал практику в ВЦ.

и генерировать звуковые сигналы

Да, в GW-BASIC тоже можно было.

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

Я на каком то бейсике (на корвете) векторный графический редактор написал.

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

Правда если взять питон, то паскаль уже можно не брать:-)

Ага, и пройти мимо типов переменных. Они там до сих пор необязательные.

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

Наверное сначала нужна книжка по педагогике. Программирование начинается не с языка, язык вообще не нужен как и компьютер. Пусть рисуют программы, как закрепится фундаментальное понимание даже с Си не будет никаких проблем на старте уже программирования ЭВМ. Хотя (хоть я всех уже и заколебал) можно после рисования начать с Lua и так плааааавненько незаметно уйти в Си :)

P.S Тред не читал, но тут наверное уже перечислили все языки мира :D

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

У, это уже под дос :) Дальше у нас была информатика, и там мы уже гоняли Q-Basic (в основоном), GW-Basic, TurboPascal и под конец обучения, немного Delphi.

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

Смотря что делаешь. Если используешь его как калькулятор то можно не думать. Чуть только пытаешься сделать что то сложнее арифметики сразу приходится думать.

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

Пусть рисуют программы и выполняют нарисованные программы друг друга!

А кто ошибся тот остаётся без своей плошки риса. Китайская педагогика самая педагогичная!:-)

AntonI ★★★★★
()

До сих пор помню 386-й комп, на который наш преподаватель поставил табличку: «Только DOS», а кто-то остроумно дописал «ya» :-D

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

позволяет поначалу о них не думать

А под конец позволяет выделывать такие финты с дескрипторами различных бинарных и унарных операций.

anonymous
()

С какой целью ты хочешь научится программировать?

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

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

https://sgimenez.github.io/laby

выглядит просто.

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

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

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

LINUX-ORG-RU ★★★★★
()

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

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

Это будет ужасно скучно.

Программирование это магия, ты че то повелел железяке и она тебя слушается!

А тут чего? Нарисовал караеули, препод кивнул? Ужасная нудятина, не надо так делать. Нас так учили в школе потому что компов не хватало

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

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

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

Допустим, надо сделать функцию, которая принимает число x и генерирует список из элементов от 0 до x.

Scheme:

(define (my-list n)
    (define (build-list m)
        (cond ((<= m 0) '())
              (else (cons (- m 1)
                          (build-list (- m 1))))))
    (reverse-list (build-list n)))

Python:

def my_list(x):
    l = []
    for i in range(0, x):
        l.append(i)
    return l

Да, в Python есть yield и list comprehensions, но это это все к базе имеет мало отношения.

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

anonymous
()

Только Си, остальное от лукавого

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

list(range(x))

Я здесь range() воткнул потому что не помню как forloop сделоц :DDDD

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

Со Scheme начинается пердолево с разворотами, рекурсией и прочим блудом. За этим теряется особенности структур данных и детали работы с ними.

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

Ну в питоне все особенности устройства списка скрыты. Хорошо это или плохо зависит от целей обучения.

Кстати неплохая задача для питона - сделать список ручками на парах:-)

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

все особенности устройства списка скрыты

Буквально

typedef struct {
    PyObject_HEAD
    Py_ssize_t ob_size;

    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     */
    Py_ssize_t allocated;
} PyListObject;
anonymous
()
Ответ на: комментарий от anonymous

Ну в питоне то этого не видно.

  /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

Не самая лучшая реализация списка…:-)

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

Не, ты меня не понял. Но ладно. Сейчас лень расписывать, кратко не получится, да и смысла наверное особо нету. Дело не в скуке. А в учителе.

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

Это буквально указатель на массив указателей на объекты, как ты собрался по другому делать динамический массив с доступом по индексу?

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

Более того, они же разные: FIFO, LIFO и т.д. В Python это все есть в queue. И с понятными методами. И с документацией. Короче, в 70-х страдать со Scheme имело смысл, потому что ничего другого особо и не было. Сейчас не очень понятно зачем мучить людей подсчетом скобочек и страданиями с особенностями самой Scheme, когда можно три понятных строчки на Python написать и осознать как работает только что пройденная структура данных.

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

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

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

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

Какое отношение динамический массив имеет к двусвязному списку?!

[] в питоне это такая амальгамация обоих. «Чистые» списки в queue, «чистые» массив в numPy.

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

Дело не в скуке. А в учителе.

Ну если учитель не учитель а симпатичная учительница лет 30ти, одетая в че нить эдакое, то скучно точно не будет. Но к программированию это относится еще меньше чем рисование программ;-)

Главная задача учителя - пробудить интерес к предмету. С программированием сделать это на основе рисования программ (в любой нотации) это сделать почти невозможно.

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

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

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

Главная задача учителя - пробудить интерес к предмету. С программированием сделать это на основе рисования программ (в любой нотации) это сделать почти невозможно.

Python ещё и здесь – ты можешь попросить реализовать самостоятельно только маленькую часть программы, а дальше дернуть библиотеку, которая начнет рулить стробоском в аудитории, параллельно включая рикроллы в нужном порядке через MPD.

Кто первый сможет уронить приглашенного эпилептика в приступ – получает приз.

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

Мне больше подходит «снизу вверх», но не “the hard way.” Я хочу сделать акцент на памяти, типах, алгоритмах, организации процедурной программы, но я против ассемблера или Си.

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

Ещё ассемблер и Си сложные. У меня лично не получилось изучить их самостоятельно. Только через годы я изучил сначала Си, потом ассемблер.

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

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

Python меня тревожит тем, что он слишком сильно отдалён от этой базовой модели компьютера и программ

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

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

Ты бы лучше своим ученикам задачу поставил как реализовать словарь.

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

Структуры как в Си можно только с версии 3.7 сделать.

Последняя поддерживаемая версия – 3.9. Ваще не проблема.

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

Какое отношение динамический массив имеет к двусвязному списку?!

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

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

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

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

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

По большому счету списки нужны там, где ты делаешь очередь. В том числе intrusive списки, которые позволяют тебе append/remove без аллокаций. В ядре через это RCU сделан, например.

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

«чистые» массив в numPy Эммм… как тебе сказать то, в питоне есть array которые ограничиваются одним типом элементов, в numpy многомерные array неализуются по принципу локазизации данных т.е. это не сишный многомерный массив ака массив объектов а линейные массивы на каждое измерение ака объект массивов.

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

Дык я ему код кинул, в питоне списки реализованы через обычный массив. Просто аллокация делается с заделом а не на один элемент, а в случае необходимости делается реаллок с копированием и вставкой/добавлением.

anonymous
()

Кстати, для питона есть отличная книжка Problem Solving with Algorithms and Data Structures, эдакий аналог книги Вирта. Есть русский перевод https://aliev.me/runestone/. Поэтому питон получается для обучения без вариантов)

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

надо сделать функцию, которая принимает число x и генерирует список из элементов от 0 до x.

Clojure:

(defn integers-up-to [x] 
  (into [] (range x)))

(integers-up-to 8)
;; => [0 1 2 3 4 5 6 7]

А можно просто использовать значение, которое возвращает вызов (range N) в выражениях вместо списка.

Если бы в Scheme был range, всё было бы примерно так же — то есть проще, чем в питоне. Вероятно, он там таки есть. И даже если нет, никто не мешает его предварительно написать. Конечно, это уже не совсем стартовый уровень, но и не рокет саенс, однозначно.

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

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

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

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

это это все к базе имеет мало отношения

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

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