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

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

Примерно та же история и с C. Чистый C я знаю и люблю (в отличие от C++ и прочих монструозин), но предлагать его для обучения — это дичь. Это именно что 85% борьбы с языком и 15% фокуса на задаче. Когда я хочу присвоить строку из одной переменной в другую, я хочу использовать = или на крайняк set, а не городить указательную херню с strncpy (помня ещё, что надо использовать strncpy вместо strcpy, чтобы не выстрелить себе в ногу) и следить за размерами буфера-приёмника. Слишком много бесполезной информации на голову бедного студента, которая в итоге отбивает желание учиться как следует и постигать правильные высокоуровневые подходы к программированию. Когда же их постигать, когда лоулевел настолько душит?

rebforce
()

JS

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

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

Не понимаю почему исключён Go. Насчёт нарастания сложности я бы вообще не парился. Обучает же кто-то C++, и не жужжит, как-то же разобрал всё по нарастанию сложности.

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

У JS, увы, есть один недостаток: его нужно очень хорошо изучить самому и ещё лучше разжёвывать студенту, чтобы на выходе не получались отборные говнокодеры. И начинать надо с ASI. А то задрали долбодятлы, по-сишному пихающие точки с запятой где ни попадя и при этом втирающие, что не делать так — плохой стиль. И эти долбодятлы, не осилившие ASI, раньше ещё и JS-минификаторы писали, тоже не умевшие в ASI. Ну ты понял.

А ещё с JS надо каждый год обновлять программу обучения, потому как новые стандарты. И ещё следить, чтобы студенты не начали халтурить со всякими говнофреймворками.

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

отборные говнокодеры

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

ASI

Хех. Нормально ты конечно угорел по перекраске сарая для велика. Да наплевать, пусть пишут как удобно.

каждый год обновлять программу

Уже не надо. Где-то с приходом ES6 основные инновации уже закончились, остальное незаметно само собой в справочниках по стдлибе появилось. А говнофреймворки это нормально, часть процесса роста.

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

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

Да если бы они как калькулятором пользовались, проблемы бы не было. А они телефонные книги на реакте пишут. Под устройства с 384 МБ рамы. Не утрирую, реальный случай.

Да наплевать, пусть пишут как удобно.

А потом они становятся тимлидами и начинают втирать эту же дичь остальным в приказном порядке.

А говнофреймворки это нормально, часть процесса роста.

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

Но лично мне, например, JS тоже не кажется чем-то позволяющим сфокусироваться на задаче вместо борьбы с языком. Начиная с «ехал промис через промис» (ранее было «ехал коллбэк через коллбэк») и заканчивая тем, что 0 + '1' == '01', а тот же питон на такое бы выругался.

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

А они телефонные книги на реакте пишут

Так здорово же! Где ещё кодеры с низким скиллом могут сделать что-то полезное?

становятся тимлидами и начинают втирать эту же дичь

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

0 + ‘1’ == ‘01’

Ну знаешь, в питоне такое количество wtf, стоит только копнуть. Впрочем в любом языке тоже. А промисы и колбэки с приходом async/await уже выбросить пора.

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

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

Вот вы привели хорошую аналогию. А теперь минутка педагогики: учебники языка для носителя языка ПРИНЦИПИАЛЬНО отличаются от учебников языка для инофонов. Скажу больше, учебники языка для инофонов очень сильно различаются между собой в зависимости от целей обучения. И столь же сильно в зависимости от стержневого метода обучения.

Введение в программирование до какого порога? Возьмём тот же Паскаль. До создания своих модулей математических алгоритмов? До создания СУБД на основе типа данных record? До создания многосвязных списков на основе записей и ссылок? (P.S. Ссылки в Паскале тот ещё цирк.)

До написания своего редактора текста? До написания GUI подключением xlib (а здесь можно задуматься о том, чтобы начинать обучение с этого)? До полноценного ООП со всем этим вместе до уровня «полноценная СУБД с интеграцией с MSO»? До момента, когда возможностей для FreePascal не хватает и надо переходить к ассемблерным вставкам, дергая ими APIWin?

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

проблема в массовом недообразовании

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

ни турбопаскаль(во временна оные проф инструмент с развитием в bp) ни js( в консоле браузера али на страничке непосредственно) - не есть заведомо годно-не_годные балалайки

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

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

Так здорово же! Где ещё кодеры с низким скиллом могут сделать что-то полезное?

На устройствах, где такое не начинает уже на сотне контактов тормозить, не?

Впрочем в любом языке тоже.

В Tcl проще: всё есть строка и исходить надо из этого. Но в expr ты не-число не впихнёшь при этом, как бы ни хотелось. Шах и мат.

А промисы и колбэки с приходом async/await уже выбросить пора.

Дык как же их выбросишь, если async/await — всего лишь сахар для промисов?

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

Этот код понятен любому человеку, знакомому с простейшей математикой

Ну, вы, вот, например, не поняли. И @no-such-file не понял (по крайней мере не дал виду).

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

он не воспринимает знак равенства как присваивание.

Дык, я когда впервые запись x=x+1 увидел, вообще в осадок выпал. Это же явный бред, уравнение не имеет решения.

Вы совершенно зря начали называть x, который int x = 4 и x в x²+3x-4=0 одним словом. Неизвестный параметр уравнения и именованное типизированное значение в памяти — это совершенно разные вещи, у которых общего только то, что используется одна буква латинского алфавита.

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

например внутри может быть

Допустим, отчего нет. Какая разница?

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

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

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

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

Дело в том, что эти уравнения потом и без всякого программирования с переменными ассоциируются — в функциях. Функции подобны уравнениям, а переменные в функциях подобны переменным в программировании. И в математике, и когда в физике формулы появляются, и тому подобное. Так что это имеет смысл в целом.

А что касается того, что запись x=x+1 выглядит как бред… Ну да, вот так сложилось. Причём не просто случайно, а такой вариант даже в каком-то смысле выиграл эволюционную борьбу. Ведь были же и языки, где = означало именно равенство, а присваивание было := или ещё как-то. Но в целом к нашему времени более популярным однозначно стал синтаксис, где присваивание это =, а равенство — ==. Разве что в Хаскеле не так — и там как раз запись функций очень даже близка к математической с некоторыми нюансами.

Что-то вроде присваивания, впрочем, в школьной математике таки встречается, в основном при доказательствах теорем. Когда мы пишем «пусть X = 42». Нечто подобное можно встретить в виде ключевого слова let в некоторых языках. Чаще функциональных, но не обязательно.

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

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

УК РФ Статья 135. Развратные действия

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

…

4. Деяния, предусмотренные частями первой, второй или третьей настоящей статьи, совершенные группой лиц по предварительному сговору или организованной группой, наказываются лишением свободы на срок от семи до пятнадцати лет с лишением права занимать определенные должности или заниматься определенной деятельностью на срок до двадцати лет или без такового и с ограничением свободы на срок до двух лет либо без такового.
ugoday ★★★★★
()
Ответ на: комментарий от CrX

Функции подобны уравнениям, а переменные в функциях подобны переменным в программировании

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

А что касается того, что запись x=x+1 выглядит как бред… Ну да, вот так сложилось

Продолжаем разговор. Возьмём нотацию x<1, что эта запись означает в математике и в программировании?

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

которая в итоге отбивает желание учиться

Если отбивет, значит этого желания не было изначально. Тебя не удивляет почему кто-то не может в математику, кто-то в русская языка, кто-то в физику или химию? Программирование тоже не всем нужно и не всем интересно.

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

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

Продолжаем разговор. Возьмём нотацию x<1, что эта запись означает в математике и в программировании?

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

Да, я понимаю, что результатом вычисления этого выражения будет bool. Но в математике во многих контекстах подразумевается то же самое, только именно типа boolean нет.

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

Обычный стек - push, pop.

После операции старый стек должен остаться без изменений.

тесты для проверки

x = list(1, 2, 3);
y = cons(4, x);
assert(y[0] == 4);
assert(y[1] == 1);
assert(y[2] == 2);
assert(y[3] == 3);
assert(x[0] == 1);
assert(x[1] == 2);
assert(x[2] == 3);
x[1] = 8;
assert(y[2] == 8);
monk ★★★★★
()
Ответ на: комментарий от no-such-file

[специальная форма] Значение возвращает?

Нет.

Всё-таки они там* немного наркоманы (2). В кложе вроде как все спецформы возвращают значения.

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


* в Scheme

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

темпоральная логика не везде в математики

а в программировании темпоральная логика составная часть императивной модели

для матки x<1 постулируется(конкретизируется) что текущее пространство ограничивается той частью где x<1

для прога x<1 это проба вселенной мы там где x<1 али в дополняющей

т.е в матке мы выбираем в проге вселенная :)

qulinxao3 ★☆
()

Pascal устарел

Зато есть Ada,которая вполне современна. Причем в своем минимальном подмножестве это практически тот же Паскаль,осваивается также легко. Зато при необходимости потом можно использовать такие возможности которые паскалю и не снились. Например встроенное прямо в язык управление многозадачностью. А еще Ада хороша тем что она очень строго следит за дисциплиной мысли - неряшливый код,написанные «на отвяжись» просто не компилируется и всё. Наплевать на типы и их преобразования - ну никак не получится. С Адской системой контроля типов конечно придется разобраться чтобы не «бороться» с компилятором,а применять эти возможности на пользу дела.

Основной недостаток Ады - малое количество бесплатных свободно доступных готовых библиотек. Но он больше актуален для коммерческого программирования где надо «быстрей-быстрей» и подешевле. А для обучения как раз «написание велосипедов» это хорошо,способствует усвоению основ.

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

разбор/формирование бинарных данных на сишечке удобнее и быстрее например).

На Аде работа с бинарными данными точно не хуже,а на мой взгляд и лучше. По скорости не сравнивал - на мой взгляд и то и другое быстро.

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

Ещё есть SPARK. Но это совсем не Паскаль. Ещё один язык европейской школы.

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

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

Как и на запоминании таблиц производных. Математика — это про абстракции и подходы. Как и программирование, кстати. Поэтому язык программирования, как и математическая нотация, не должен вообще ни разу вставлять палки в колёса при постижении этих подходов и абстракций.

Программирование тоже не всем нужно и не всем интересно.

А низкоуровневое — и подавно. И вообще… Странно читать доводы поборников указателей в эпоху вполне рабочих MicroPython, PunyForth и TinyGo.

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

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

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

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

Начинал с ЯВУ, потом освоил ассемблер и даже деньги на нем зарабатывал в 90х. Так что на мой взгляд выбор учебного языка не настолько критичен как это иногда преподносят. Изучать надо теорию программирования,а какой язык использовать в примерах и упражнениях - не особенно критично. А вот возможность наглядно «походить» по коду(и ЯВУ и асм который из него получается) в борландовском отладчике мне в свое время существенно помогла быстрее понять как работают программы. Вот не знаю есть ли визуальные отладчики для Питона.

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

Для Питона есть много визуализаторов

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

Причем тут доступ по индексу? cons - это не про произвольный доступ, это про голову и хвост.

Да даже про доступ по индексу. Например, стек x86 процессоров. Массив с обратной индексацией.

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

При использовании Ады, Питона, С++, просто С, Java, PHP, да хоть PL/I в качестве учебного получаем всё тот же Паскаль, но без удобств Паскаля.

Есть такая «мелкая» деталь, в мире практически нет учебников по программированию. Можно вспомнить лишь Столярова, Кнут уж слишком академичен и «заумен». Остальное более или менее разжованные руководства по конкретным языкам или по программированию на данном конкретном языке.

Если вы открываете книгу и она начинается со списка зарезервированных слов, правил именования идентификаторов, списка типов данных и т.п., то это ни разу не руководство по программированию. Я сталкивался с попыткой выдать за учебник по программированию книгу, начинавшуюся с описание Си в нотации Бэкуса-Наура.

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

У одного:

т.е в матке мы выбираем в проге вселенная :)

У другого:

С Адской системой контроля

Куда я попал? (Вопрос риторический.)

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

Странно читать доводы поборников указателей в эпоху вполне рабочих MicroPython, PunyForth и TinyGo.

В них данные передаются по значению через копирование?

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

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

Не только. Как раз строгость языка в работе с типами данных хорошо противодействует привычке к написанию неряшливого кода. Это как обучение письму в школе - требуется четко выводить крючки и палочки в буквах,складывая их в слова и ровные строчки из слов. А классический «почерк врача» - он потом со временем сам выработается у тех кому надо:)

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

В них данные передаются по значению через копирование?

Конкретнее, пожалуйста. Какие данные и куда передаются?

Особенный лол от данного вопроса, конечно, возникает в контексте PunyForth, в котором данные передаются вообще через стек.

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

Причем тут доступ по индексу? cons - это не про произвольный доступ, это про голову и хвост.

Исключительно для целей тестирования. Могу записать так

x = list(1, 2, 3);
y = cons(4, x);
// считаем, что == сравнивает списки по содержимому
assert(y == list(4, 1 , 2, 3));
assert(x == list(1, 2, 3));
head(tail(x)) = 8;
assert(x == list(1, 8, 3));
assert(y == list(4, 1, 8, 3));
monk ★★★★★
()
Ответ на: комментарий от mister_VA

Кнут уж слишком академичен и «заумен».

Это разросшееся введение к брошюрке о конструировании компиляторов.

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

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

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

В питоне при передаче параметра в функцию происходит то же, что и при присваивании. В зависимости от типа объекта может и полная копия создаваться, и ссылка. В го ­— по значению, если явно * не указать. В фортах — по значению через стек.

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

То есть там, где полноценно работают модули типа Crt и Graph. С Лазарусом у программы будет дранная структура на событиях и сгенерированных методах

Правильное замечание! Начинаюещему и даже не очень начинающему программисту бывает сложно разобраться если не он вызывает функции библиотеки,а графическая библиотека вызывает его код. И главный цикл обработки событий ввода находится не в его программе,а где-то в недрах огромной библиотеки. Фактически приходится изучать не столько язык программирования,сколько особенности поведения(и глюки,да) библиотеки GUI. А это очень намного сложнее потому что и объем огромен и документация обычно куда хуже чем по языку. Ну или брать не монстров типа GTK и QT,а минималистичные библиотеки в работе которых хотябы легче разобраться.

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

Лисп конечно же

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

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

Жду, когда нарисуешь драгона - многоголовый список. :)

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

Между лиспом и автолиспом сходства, как между java и javascript. Возможно, меньше.

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

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

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

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

Даже defn?

defn — это макрос над специальной формой def, которая возвращает созданный var.

(defn dot [xs ys]
  (reduce + (map * xs ys)))
;; => #'recur/dot

(type (defn dot [xs ys]
        (reduce + (map * xs ys))))
;; => clojure.lang.Var
Nervous ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)