Pull to refresh

Comments 142

А где в этом C++ коде используются области видимости?

Но это же пространство имен вроде как.
Чем тогда является это:


int x;
{
    int y;
}
//y=6; - not visible in parent scope

?

Я могу плавать в терминах, но раз официальное название этой штуки − scope resolution operator, то надо думать, что она имеет отношение к scopes (областям видимости).
кстати в сях некоторое время с этим был порядочный бардак.
и от реализации от реализации здорово отличалось.
Сначала начинал изучать C#, а потом — Python. В принципе не важно, какой язык учить первым. Сложнее всё же изучать «обвязки» к языку: многочисленные классы и их методы во многочисленных или немногочисленных, но очень больших фреймворках и библиотеках. Не всегда сразу запоминаешь, где какой инструмент использовать нужно.
Думаю это важно, я например начинал с языка со строгой статической типизацией и до сих пор привык мыслить типами.
Да, согласен в таком случае. По сути я так же и учил первым язык со строгой статической типизацией. Хотя для меня всё равно сейчас самое сложное — это изучение фреймворков и библиотек.
О, опять хэлловордами дружелюбность языков меряют.

Та же Java, минус модификаторы доступа, плюс неймспейсы

Почему про пакеты в Java ни слова? Неявный java.lang и дефолтный пакет — это, конечно, хорошо, но чуть дальше пойдешь — те же импорты начнутся.
А вот Ruby:
puts «Hello World!»
лаконичнее всех вышеприведенных примеров
Не очень понятно, чем оно лаконичнее того же второго питона.
На один символ — print (Python) vs puts (Ruby)
Не соглашусь.
Для носителей английского вариант Питона выглядит дружелюбнее, а буквально
напечатай 'Привет, Мир!'
вполне дружелюбно и естественно, кмк.
На один символ короче, но теряется очевидность ключевого слова. Всё таки, print — он и в английском языке print.
по вашей логике Brainfuck — самый простой язык программирования, там всего 8 команд, порог входа гораздо ниже!
Это вы говорите про простоту реализации языка, а я говорю о количестве и сложности базовых понятий программирования, с которыми приходится столкнуться в анализе даже самой простой программы на данном языке.

Дополнил про Brainfuck тащемта.

Базовые понятия брейнфака? Ячейка, шаг влево, шаг вправо, поднять, опустить :)

Вы просто забыли, каково это было − ничего не знать.

Если я правильно понял статью, то по вашему выходит, что PHP для изучения просто идеален. "Hello, World!" просто прост до безобразия. Для понимания концепции переменных даже в их типы вдаваться не надо. Ну а под конец можно код написать практически в Java-стиле.

Мне кажется, в таком случае Си неплохо подходит.
#include <stdio.h>
int main()
{
   // printf() displays the string inside quotation
   printf("Hello, World!");
   return 0;
}

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

UFO just landed and posted this here
Я обычно начинаю обучение даже не с чистого JS, а с Processing — небольшой графической библиотеки поверх JS.

Рисовать картинки куда нагляднее для начинающего, чем работа в той же консоли а ля DOS.

Как показывает опыт, практически невозможно объяснить современной молодежи, никогда не видевшей зеленых экранов, что такое консоль и как она выводит построчно.
UFO just landed and posted this here

В JS, исходя из моего небольшого опыта в нём, много WTF вызывает то, что лямбды не захватывают this, и приходится извращаться. Кажется, даже в Lua этот аспект понятнее.

UFO just landed and posted this here
UFO just landed and posted this here
кроме как JavaScript — не идеален для использования в продакшен
я такого не говорил, это вы сами придумали. Я лишь хотел сказать, что как по мне — он явно не идеален для обучения, имхо. Вот и все.
UFO just landed and posted this here
Лучший язык для обучения JavaScript.
1. JS — открыл консоль браузера и ты уже можешь быдлокодить. Нет установки доп. программ, а браузер почти 100% есть у любого.
2. Ещё с 2D, 3D алгоритмами можно играться, что гораздо лучше сухих ответов консоли для новичка.
3. Не нужны медленные IDE для разработки (Notepad++ для большинства задач хватает).
4. C-подобный язык (ИМХО — все базовые конструкции максимально просты для понимания с мин. познаниями английского).

В итоге: порог вхождения ниже плинтуса, телодвижений для начала программирования минимум => больше времени можно провести изучая алгоритмы, язык и почти 0 настраивая окружение. Начинать всегда сложнее всего, а с JS этот момент упрощён максимально.

P.S. Непонятное, для начинающих, автоматическое приведение типов заставляет их избегать его использование в пользу спец. методов и в редких случаях, о ужас! почитать спецификацию.
Добавлю пример на JavaScript:
console.log('Hello, World!');

Как бонус для обучения, можно запустить в любом браузере на любой системе, и вообще как-то использовать на практике не по работе, чтобы отключить рекламу на конкретном сайте, например.
А вообще, долго смеялся над Java как лучшим языком для начинающих. Представляю, как школьники будут конфигурировать Maven или Gradle, собирать jar или war, запускать это под каким-нибудь Tomcat… Если уж жестить, пусть лучше Kotlin учат, там хотя бы синтаксис компактнее.

UPD: начал писать про JS, но меня опередили))
редставляю, как школьники будут конфигурировать Maven или Gradle, собирать jar или war, запускать это под каким-нибудь Tomcat…

Посмейтесь по поводу webpack и gulp до кучи.
Аналог Maven скорее npm, и он довольно прост в конфигурации. Webpack и gulp помогут вам автоматизировать некоторые операции, если вы уже знаете, что это за операции и зачем они нужны, в остальном ничто не мешает просто писать на JS без конкатенации, минификации, чанков, спрайтов и т.п… Если говорить про профессиональную разработку, то для начинающих, не разбирающихся в webpack, большинство фреймворков предлагает готовую встроенную конфигурацию, как react-scripts или vue-scripts.
он довольно прост в конфигурации.

Да и мавен не сложен (понятные английские слова в XML, очевидная иерархия тегов), тем более, что к нему гуи есть во многих IDE. Это вам не страшный CLI ковырять.

большинство фреймворков предлагает готовую встроенную конфигурацию, как react-scripts или vue-scripts.

Архетипы мавена, spring boot с генератором проектов.
Ну да, можно ещё сказать, очевидные английские буквы везде, во всех языках. Что может быть не понятного? Мне после Node, Python, Ruby и даже С++, пару месяцев понадобилось, чтобы разобраться с экосистемой Java. В Maven вроде простой XML, но много неявных зависимостей между инструкциями (для справедливости, в JS был аналог Grunt, там тоже всё влияло на всё, но к счастью о нём сейчас никто и не вспоминает). Рекомендуют Gradle, но он основан на Groovy, мы с вами может и освоим, а начинающим, выучить Groovy, чтобы начать собирать проекты на Java — как-то слишком жестоко. В npm скрипты пишутся на shell, если человек умеет работать с командной строкой — он автоматически понимает все скрипты в npm. Я не критикую экосистему Java, в Maven больше возможностей и настроек, можно указать несколько репозиториев зависимостей, например, в npm — только один. Но говорить, что Java лучше для начинающих может только человек, который никогда в жизни не общался с начинающими, не знающими пока ни одного языка.

Помнится мне, NetBeans (да и Idea) генерировал какие-то свои ant-скрипты полностью прозрачно для неискушённого пользователя, и java-проекты компилировались и запускались по нажатию кнопки Run, безо всяких мавенов. Для новичка самое то.

Это достаточно спорный вопрос. Бо потом, у этого новичка будет полный ступор, когда что-то пойдет не так.
Бо потом, у этого новичка будет полный ступор, когда что-то пойдет не так.

Что может пойти не так, чтобы случился полный ступор? Скорее он случится, если усложнять начальный этап обучения программированию системами сборки типа cmake или make (или чем-то позабористее). Но при обучении программированию нужно некоторое усердие, а в таком случае новичок со сборкой разберётся.


К слову, в delphi практически всегда программируют мышкой компилируют нажатием кнопки, отдельной системы сборки как бы и нет. И я когда-то так и не смог объяснить дельфистам cmake. Возможно, это и есть тот ступор, но всё-таки я списываю это на индивидуальные особенности.

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

В IDE есть каталоги "исходники", "тесты", "ресурсы", "тестовые ресурсы", "библиотеки" (прямо *.jar). Добавляете туда что надо — и IDE (посредством ant, а может быть и maven, в зависимости от настроек проекта) автоматически подхватывает изменения конфигурации и запускает (через систему сборки) с правильными параметрами javac и java. При желании конфиг системы можно править вручную, или переписать вручную. Всё довольно наглядно — не припомню, чтобы NetBeans прятал от меня вызов ant или структуру jar-файлов.

Работали как то в 2018м с ситемой, которая «программируется мышкой». То ли WebOS от LG, то ли Tizen от Samsung, для программирования телевизоров. Проблемы начались, когда понадобилось сделать continuous integration, прогонять автотесты, деплоить билд на 10+ девайсов. Для справедливости, какая-то cli там всё же есть, но документацию к ней пришлось у вендора добывать клещами. Вести профессиональную разработку только в GUI, без знания cli, это очень спороное решение.
Но говорить, что Java лучше для начинающих может только человек, который никогда в жизни не общался с начинающими, не знающими пока ни одного языка.

Так-то вы сами, сравнивая его с JS, включили кучу "если", которых у не знающих, очевидно, не будет

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

Так то не язык, а структура данных.Понять связь dependency внутри dependencies не так уж сложно на самом деле. Далее — документация вполне адекватна.

В npm скрипты пишутся на shell, если человек умеет работать с командной строкой — он автоматически понимает все скрипты в npm.

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

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

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

Мне кажется, по вашим критериям лучше подойдут следующие языки:


Forth


.( Hello world )

Используемые конструкции: слова


Brainfuck


+[-[<<[+[--->]-[<<<]]]>>>-]>-.---.>..>.<<<<-.<+.>>>>>.>.<<.<-.

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


Hello


h
Лучший язык для начинающих — asm. Не нужно нам куча молодых специалистов, которые быстренько вошли в ой-ти, и теперь не могут отсюда выйти. Никто не жалует электрика, который только что прочитал правила кирхгофа и закон ома(затронув вскользь правило буравчика). Но почему то все хотят войти-в-ой-ти и оставлять персональные данные сотни тысяч людей в открытом доступе на дефолтных незапароленых портах очередной nosql db. Ну или писать крутые приложения на electron'e, которые скоро без rtx видеокарты не будут заводится. Каждому свое.

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

А ведь когда-то цикл официально считался паттерном…
Логично — все же знают, что оператор безусловного перехода использовать нельзя!

Но можно представлять, что это всего лишь MOV в регистр IP.

Но если очень-очень нужно, то можно!

Если уж сравнивать, то не hello worldами, а todo list. Хотя бы понятно будет, как обрабатывается ввод, как рисовать интерфейс, как организовывать хранение. И т. д.

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

А вы хотите сразу вывалить студенту на голову все концепции языка, все фичи, да ещё библиотеками-фреймворками всё сдобрить, графика там, UX, RDBMS… Это что, такой особый вид дедовщины? Или просто саботаж учебного процесса? ;)

Я не говорю о том, что надо начинать изучать со сложного приложения. Я лишь хочу донести, что измерять сложность языка с помощью hello world неправильно.
Ну вот изучил студент этот hello world, даже математику, формулки посчитал. А дальше захотел написать простенькую игру, например, крестики-нолики. Вот тут уже начинает сложно выглядеть то, что просто выглядело в hello world.

Нет уж, first things first. Я хочу так знакомиться с чудесным миром программирования, чтобы простое приложение было действительно простым, а не как на Java. А когда дойдём до сложных, то там и решим, что делать: внимание тренировать, best practices внедрять, или вообще ЯП менять.
Мы же не студенты, мы тут сравниваем ЯП. Поэтому да, что-то сложнее «hello, world» ярче покажет различия между языками и будет нагляднее показывать сложность ЯП в сравнении с другими. А студенту мы это покажем, но не сразу.

И если уж мы заговорили о ЯП, то следующим мы обучаемся уже на основе примеров кода. За всех не скажу, но мне значительно проще разобраться, глядя в чужие удачные примеры.
Был пост о Java именно как о первом языке программирования, я продолжил тему обучения программированию. Вы и PaulZi говорите уже о практике программирования, это − другая тема.

Имхо, начинать надо с базовых понятий — булевой алгебры, архитектуры компа и процессора в частности(на пальцах, учить делать свои цп не стоит), алгоритмов. Потом перейти к asm и его связи с набором команд, и уже потом — добро пожаловать на высокий уровень. Не говорю, что это надо знать на все 100%, но хотя бы в ознакомительном курсе преподать. Иначе это больше похоже на дрессировку чем на обучение.


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

UFO just landed and posted this here
Мне больше нравится бросать людей в воду, особенно если они выплывают. То есть если у человека достаточная рефлексия, то до него через какое-то время доходит, что он решает проблемы не так, не оптимально или излишне трудоёмко. Он изобретает пару букв из SOLID, и тогда ему можно показывать остальные, то же и про другие умные вещи, как и из математики и CS, так и из методологии.

Я считаю, что начинать надо с практики, за это и люблю Python с его книгами типа "Automate the Boring Stuff with Python", где рассказывается, как решить каждодневные задачи быстро, но неэффективно.
К ключевым словам и строкам добавляется понятие функции.

Неа. Просто не надо объяснять ключевые слова (да и строки объяснять не надо), объясните только функции и значения.


И это, кстати, аргумент в пользу того, что не надо начинать с "Hello world", а надо начинать с математических операций.

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

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

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

… так зачем вы сравниваете языки на бесполезной конструкции?

Я сравниваю языки не на «бесполезной конструкции», а, наоборот, на всём, что попадает в поле зрения обучающегося, кроме неё.

Чем больше попадает, тем хуже для обучения.

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

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

Полностью. Потому что выбор "лучшего языка" бессмысленен вне контекста программы обучения.

Я считаю, что достаточно полно описал контекст фразой «для начинающих». Между выбором первого и последующих ЯП разница действительно существенная. Дальше можно сколько угодно ранжировать фичи по их значимости, это ничего не изменит. Основа останется той же: ввод/вывод, литералы, переменные, присваивание, сравнение и логика, управление последовательностью выполнения, функции, а там мы уже подбираемся к специфическим для разных языков вещам.
Я считаю, что достаточно полно описал контекст фразой «для начинающих».

Нет, недостаточно. Есть "начинающие" в общей школе. Есть — в профильной. Есть — в ВУЗе. В техникуме. На курсах.


И это не считая разницы между программами разных преподавателей.


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

Потому что не надо ранжировать фичи по значимости. Нужно выбирать что и в каком порядке давать учащимся.


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

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

Нет, недостаточно. Есть «начинающие» в общей школе. Есть — в профильной. Есть — в ВУЗе. В техникуме. На курсах.

То есть для изучения в школе Foo может оказаться проще, чем Bar, но при этом в ВУЗе всё кардинально поменяется, и там Foo станет сложнее, чем Bar? Ну, не верю. Разве что Scratch, может быть, но его и старшекласникам-то поздно.

Вообще-то вы к ним «подобрались» на словах «переменная» и «присваивание».

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

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

В определённых случаях без ввода/вывода невозможно ничего продемонстрировать, увы.
То есть для изучения в школе Foo может оказаться проще, чем Bar, но при этом в ВУЗе всё кардинально поменяется, и там Foo станет сложнее, чем Bar?

Не "сложнее", а "бесполезнее". В том смысле, что можно уже брать более сложные и более выразительные языки.


но для некоторых примеров эта разница несущественна

Вот разница между возможностью и невозможностью присвоения несущественна, да.


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

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


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

… и эти случаи вполне можно отодвинуть на "позже".

Не «сложнее», а «бесполезнее». В том смысле, что можно уже брать более сложные и более выразительные языки.

Тут, видимо, мой косяк. Я дожен был в явном виде обозначить то, что подразумевал с самого начала, и уже упомянул в комментариях: главная польза от «учебного» языка − это собственно обучение основам программирования, то есть
ввод/вывод, литералы, переменные, присваивание, сравнение и логика, управление последовательностью выполнения, функции…

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

Вот разница между возможностью и невозможностью присвоения несущественна, да.
Конечно, я забыл, что некоторые функциональные языки обходятся без присваивания. :)

… и эти случаи вполне можно отодвинуть на «позже».
Так все языки, для которых нет REPLов, придётся отодвинуть.
главная польза от «учебного» языка − это собственно обучение основам программирования, то есть

Это ваше мнение. Но оно не обязательно верное.


Так все языки, для которых нет REPLов, придётся отодвинуть.

Ну да. И что?

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

Ну да. И что?
Да и верно, шут с ними! :)
Это не то чтобы мнение, это аналитический приём такой, упрощение. В смысле, я не берусь анализировать сразу все факторы, делающие ЯП хорошим для обучения, я беру только один − сложность входа. Он для меня интереснее других, возможно, потому что мой собственный интеллектуальный ресурс весьма ограничен.

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

OK, будем считать, что это исключительно моя проблема.
UFO just landed and posted this here
А что такое функция?

… в соответствующем языке программирования?

Написали бы для разнообразия энтерпрайзный hellowworld. Чтобы там фабрика делала прокси-объект, который параметризовался стратегией, ну и т.д.
UFO just landed and posted this here
По мне так в список можно добавить LUA.
Из плюсов — хорошая документация, лёгкость в освоении, встречается в разных интересных местах (от wow до nginx, redis или какой-нибудь экзотической консоли pico8). Из минусов — несколько странный null, метатаблицы, не очень удобная отладка, отсутствие ООП в полном смысле этого понятия.
Считаю, что для первого ЯП очень даже годится.
Судя по критериям сравнения статья должна называться «Лучший… для начинающих идиотов».
Что — всё так плохо?
Или так и надо?

Ну по мне так язык нужно выбрать не по сложности для новичка, а по потребностям. Начинать нужно с того где ты сможешь добиться возможности работать. Что толку с языка который не востребован в том месте где живёшь. Можно конечно фрилансить, однако мне кажется, что сначала не помешало бы получать по шапке за, скажем так, не правильный код и пояснение почему он не реальный. А так можно только в компашке где уровень мастерства высок.

Сложность изучения языка определяется умением учителя (либо автора книги) не вдаваться в подробности, которые не нужны на текущем этапе изучения.
Какой разумный критерий, сравнивать простоту изучения языков по «hello world». Нет ничего сложного, есть плохо преподнесенный материал. Учите надо опираясь не надуманные аргументы типа, я на языке «Х» могу хелоуворд написать в одну строчку, а понять, где вы хотите дальше этот язык применить.
Я не понимаю, откуда вы взяли эту «одну строчку». Я нигде ничего не говорю об объёме примеров. Я сравниваю языки по количеству и сложности тех концепций, с которыми студенту приходится столкнуться в анализе даже самой простой программы на данном языке.

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

Аргументы в духе «дальше применить» я не принимаю, потому что я говорю об обучении программированию, а не о практике. Лучше быстро и легко научиться программировать на бесполезном языке, а потом выучить востребованный на практике язык и пользоваться им, чем выбрать для обучения программированию слишком сложный язык и биться лбом об стену.
Python 2: ключевые слова, операторы и строковый тип данных
Python 3: функции, строковый тип данных

IMO, в 3-м заметно проще объяснить
Если начинающие — это, например, ученики в школе, то очень неплохо зарекомендовал себя учебный язык Кумир. Некий, ныне покойный, академик Ершов разработал алгоритмический язык, который реализовали ребята из НИИСИ РАН в виде вполне работающей среды программирования. А для старшеклассников и для тех, кто поспособнее — это Python. Кое-кто по старинке даёт Pascal, но язык-то мёртвый, даже на Delphi уже мало кто пишет. Питон трудноват для начинающих своими отступами и тем, что в цикле в range нужно указывать цифру на единицу больше, чем в традиционном заголовке цикла. В этом отношении Паскаль чуть выигрывает, некоторые для сдачи экзамена выбирают именно его. Он «потупее» что-ли. Кстати, в ЕГЭ присутствуют ещё Basic (я думал, что этот динозавр давно вымер) и C++. Читал, что некоторые пытаются давать в школе Ruby и Javascript. Последний — потому что вроде как просто и исполняются браузером. Но их нет в перечне ЕГЭ.
Питон, как первый язык, плох тем что там динамическая типизация.
1. Академик Ершов может быть «неким» только для людей, не знакомых с историей развития вычислительной техники. Прочитайте хоть статью в википедии что ли.

2. Для полноты картины замечу, что задолго до реализации НИИСИ РАН на мехмате МГУ были разработаны Е-практикум и КуМир, которые использовались на самом мехмате и продавались в школы. Поэтому упоминание только НИИСИ мне глаз резануло. Ну ок, современная реализация их, а название сохранено для узнаваемости, пусть.
С++… Уф, неужели всё?
Можно еще ADL добавить
Я думаю, что для хорошего понимания сути, лучше всего изучать языки уровня С/C++, Pascal, т.к. они вынуждают лезть в низкоуровневые вещи, при этом позволяя делать высокоуровневые штуки.
При таком подходе человеку даётся широкий кругозор, возможность понимать работу программ так, как оно есть на самом деле. Если начать со слишком низкого уровня (ассемблер), то это может на корню отбить желание изучать программирование. Если начать с языка, слишком отдалённого от реальности, то человеку будет вообще сложно понять как и почему эта магия работает, и шаг влево, шаг вправо — всё, ступор.
Мне кажется, это не совсем так работает. Изучение языков уровня C/С++ и ниже надо основывать на знаниях цифровой схемотехники, хотя бы уровня “What Every Programmer Should Know About Memory” или Digital Design and Computer Architecture. Если предложить неподготовленным людям начинать с С++, то это будет не кругозор, а БДСМ. А вот Python легко усваивается и без этого, поэтому он и школьникам доступен, и всякие гуманитарии-естественники на нём статистику просчитывают.
Я читал, но так и не смог понять красоту шаблонов и макросов (когда шаблон в шаблоне в шаблоне, и всё обмазано constexpr). Почему инструмент кодогенерации не вынести наружу языка, например, в лисп, тикль или питон?
Да, препроцессор ужасен, и шаблоны тоже ужасны. Кодогенерация вообще ужасна в любом виде, и если вынести её наружу, то станет наверняка ещё хуже.

Зато есть D, в котором избавились от препроцессора и шаблонов. Я, честно говоря, не понимаю, почему он так непопулярен.
Кодогенерация вообще ужасна в любом виде, и если вынести её наружу, то станет наверняка ещё хуже.
Сейчас читаю про Cog, может, это облегчит мне жизнь, вынеся все макросы в pre-build step IDE. Вообще, с помощью кодогенерации можно попробовать вынести микрооптимизации и часть оптимизация компилятора, но стоит ли оно усилий, я не знаю.
EDIT В хорошей статье lamerok «Безопасный доступ к полям регистров на С++ без ущерба производительности» описана шаблонная магия, которая здорово упрощает программирование для МК, но так писать я не могу — мозг ломается. Может, получится реализовать кодогенерацию на питоне и с большей понятностью.
Зато есть D, [...] честно говоря, не понимаю, почему он так непопулярен.
Я, честно говоря, не совсем понимаю, для кого он. Он как плюсы без значительной части legacy, но специфических фич не вижу, и в ногу тоже не сильно сложнее выстрелить. В качестве замены С++ мне больше Раст видится.
Плюсы без лигаси − это уже круто! А D − это даже не плюсы без лигаси, а плюсы, спроектированные проще и чище. Один foreach чего стоит! А умные массивы и срезы! А какие простые в D лямбды!

Проблема в том, что он поставляется с garbage collector'ом, что сразу делает его конкурентом не C++ и Rust, а, скорее, Go, при том, что позиционируется он как конкурент именно плюсам. Плюс его противоречивая история, когда существовало две стандартные библиотеки; плюс чрезвычайно медленное развитие: например, когда я писал на D (а было это лет 5 назад), в него внесли экспериментальные аллокаторы, которые должны были снизить зависимость от сборщика мусора. Как я сейчас посмотрел, они до сих пор экспериментальные, в то время как Rust уже успел условно вторую версию языка выпустить.


В общем, проблем там хватает. И хотя по скорости и удобству написания он напоминает JavaScript — в том смысле, что ты можешь на коленке программу набросать, и она скомпилируется и запустится, — мне больше импонирует Rust. Писать на нём с непривычки, конечно, боль, но зато и предлагает он значительно больше.

UFO just landed and posted this here
Ну да. Но я всё равно не понимаю, чем шаблоны предпочтительнее in-place кодогенерации или даже целиком внешней, при условии, что сгенерированный файл мы не редактируем руками. Макросы, подкидыш семьи С, обсуждать будем? :)
Вообще, конечно, ответ зависит от того, какой уровень развития человека, области его интересов, склад ума, и т.д. Если человек, например, изучает микроэлектронику в ВУЗе, то ему врядли стоит начинать с Python, т.к. это будет слишком далеко от программирования микроконтроллеров.
Если человеку программирование нужно просто побаловаться, то конечно нужен такой язык, который на первый взгляд очень похож на человеческий язык, чтобы ничего изучать не нужно было. Тем не менее, как и в игре на музыкальном инструменте, лучше начинать с базовых принципов, если только твоя цель — не играть на гитаре перед костром.

Для C# и F# есть прекрасное приложение LINQPad, в котором очень удобно писать короткие скрипты на C#. Можно просто написать Console.WriteLine("Hello World"); и все — остальную портянку из неймспейсов и точки входа LINQPad сгенерирует и скормит компилятору сам.

Страшный и непонятный Haskell. Строки, функции, всё:


main = putStrLn "Hello world!"

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


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

Та же Java, минус модификаторы доступа, плюс неймспейсы. Ничего интересного, проходим мимо.

Неймспейсы для "Hello World" не нужны. Т.е. такой код валидный:


class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine("Hello world!");
    }
}

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


<?php
echo "Hello world!\n";
Неймспейсы для «Hello World» не нужны.

Таки System — это неймспейс.
ИМХО, если человека для начала обучить просто думать, как программист, типа квази-языка, чтобы просто мог формулировать ход мысли формальными шагами (та же классика блок-схем: действия, условия, цикл), то когда он это релаьно поймет, потом чисто техническая вещь — как синтаксически выразить то или иное действие. Различные структуры данных — сами подберутся при решении задачи, когда либо наставник подскажет, либо случайно наткнется в интеренете, либо по производительности будет проседать заметно.
Второй этап — различные глобальные подходы: ООП, процедуры и т.п.
Базы данных — отдельная история, требующая отдельного изучения. Взаимодействие с БД — также независимый момент, который плюс-минус в зяыках принципиально не отличается, когда уже понимаешь, что тебе надо.
PHP и другие языки, смешанные с неявным выводом, не стоит, ИМХО, изучать как первый, т.к. они могут заблудить потенциального крутого программиста, ибо он изначально вольется в смесь вывода и логики — просто потеряет время. Хотя бы на втором этапе их можно задействовать.
asm, конечно, топчик, но нафиг, если собирается идти работать «как обычный программист и зарабатывать кучу бабла» )
Рассматривать пригодность языка только на примере хелловорда все же не совсем корректно. На мой взгляд, лучшим для начального обучения, остается Паскаль. Он позволяет последовательно шаг за шагом рассмотреть основные концепции императивного программирования. Речь идет, разумеется, о тех кто совсем не умеет программировать.
У меня можно сказать такая же проблема, что и в статье, в школе, где я работаю ученикам в плане обучения ставится проект на WordPress, преподаватель подошла ко мне и спрашивает чему их учить, если они в программировании еще ничего не понимают, ну что тут скажешь раз в плане стоит WordPress значит PHP, хотя раньше другой преподаватель факультативно желающим преподавал Java начиная со скратча до создания форм.
А планы разве не сами учителя составляют?

На мой взгляд. в проекте на водпрессе не обязательно кодить. Он может быть полезен, чтобы показать ученикам как устанавливать и запускать веб-сервер и СУБД, как разворачивать на нем вордпресс, как модифицировать его плагинами и темами, как наполнять его контентом. По пути можно захватить житейское объяснение IP, портов, DNS, хостинга, HTTP(S), SSL-сертификатов, SEO.

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

Если школьники в рамках информатики, то изучать им надо базовые концепции программирования, и только немного про написание программ. Потому основы алгоритмов и структуру данных и немного про ввод-вывод. Тут уж правда, чем меньше будет «лишних» языковых конструкций, чем проще делать домашку, тем лучше.
В вузе уже очень много зависит от специализации. Так много, что с этого надо начинать, ибо гораздо лучше будут заходить примеры, связанные с понятной предметной областью.
Если же учиться решил уже взрослый человек, надо понять, для чего ему это. Сменить профессию? Тогда востребованность джуниоров на рынке рулит. Расширить компетенции? Тогда зависит от профессии.
Как я уже отвечал выше в комментариях, я не претендую на всеобъемлющее решение этого вопроса, да мне это и не очень интересно. Я реагирую на вполне конкретную статью (перевод), в которой предлагается обучать полных новичков в программировании (возраст и мотивация не рассматриваются) на примере Java − языка со слишком крутой кривой обучаемости. Характер этой кривой, и даже, кажется, само её существование автором исходной статьи просто игнорируется.

Всё, что я хотел показать в своей статье − это откуда берётся эта кривая, и почему одни языки изучить новичку намного проще, чем другие. И что, соответственно, не все ЯП одинаково хорошо подходят на роль первого, «учебного» языка.
Ваш посыл я понял, но тут спорят не с исходной статьёй, а с вашим мнением, и ему не хватает полноты. Если новичок пришёл учиться игрушки для андроида писать — то java не худший выбор.
Если при изучении Java у ученика возник ментальный блок, то лучше взяться за Python или JS с прицелом на Kivy (Cordova, React Native), чем продолжать штурмовать Java.

Иначе вы просто подменяете понятия: «обучение программированию» → «изучение Java».
А вот тут уже много от преподавателя зависит, и от программы обучения. Я слабо себе представляю ментальный блок от java, который можно преодолеть переходом на phyton. Может и правда, если ему хочется игрушку для телефончика написать, то надо дать готовый каркас и учить сначала простые вещи делать, и уж по мере освоения расширять понимание того, как собирается программа, как она исполняется? Попутно и алгоритмы изучать?
Типичный ментальный блок отлично описал mSnus:
Для начинающих, первым языком? Которые не знают, что такое функция и переменная? Не говоря уж о классах…

Это сколько же времени пройдёт, прежде чем они сумеют написать
public static void main в своем Hello World и понять, что это и зачем вообще нужно? А почему public? А почему void? Я себе представляю школьников классе так в 5-м, которые путают ООП с ОПГ...

Я именно это и имел в виду, когда насчитал 12 концепций различного уровня сложности в самой простой программе на Java.

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

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

А «готовый каркас» Android-приложения на Java будет содержать сотни строк кода и конфигурации, обычно автосгенерированных IDE, без учёта платформенных библиотек. То есть изначальная проблема усугубляется.

Я, наоборот, предполагаю, что от первых шагов до «взрослых» фреймворков − путь неблизкий, и начинать надо с элементарного.
UFO just landed and posted this here

Эх… Не о том вы говорите… Одна из проблем образования вообще, и обучения программированию в частности, это слишком узкий взгляд на задачу. Если ребёнку не заходят в голову алгоритмы и он не понимает, что такое программа, то ментальный блок у него будет от любого языка. И это даже не касаясь языков, переходить на которые сложно даже опытным программистам.
Все эти "public void main" на первых порах не более чем шум, на который можно не отвлекаться. И пофиг, как он выглядит в конкретном языке.

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

Кстати, нет. Не предлагается. Там предлагается начинать изучать программирование (что сразу говорит о мотивации) с Java в качестве первого языка.


Что, впрочем, не отменяет того, что статья выглядит как рекламная.


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

Запасся попкорном, даже не прочитав статью, заголовок все равно всех спровоцирует
С таким подходом лучше с scratch начинать, там нетривиальные концепции представленные в понятном виде для 7-ми летнего ребенка. Но неужели то что для печати необходимо вызвать функцию становится неопределимым препятствием для студентов?
scratch
image

Как я понял, рассматривается ЯП, который не просто будет первый, а на котором вообще будут учиться программированию. И здесь я абсолютно согласен с автором: на каждом новом уроке должна изучаться только одна новая концепция. И не просто изучаться — появляться на глаза ученика! Это ведь просто элементарная педагогика и психология: всё непонятное и необъяснённое только мешает (учиться / работать / жить).

Отсюда требования к такому ЯП:
а) Его транслятор/компилятор должен обладать «ступенчатой» сложностью («версионностью»). Например, сначала мы просто работаем с числами, а потом уже вводим обязательные типы. И только потом говорим, что может быть динамика. Или чтобы можно было «поиграться» с разными вариантами ООП, и т.д.
б) Среда его разработки должна устанавливаться одним щелчком мыши.

И я не уверен, что такой ЯП есть (Кумир еще не смотрел, но осуждаю жаль, что не на английском, кмк).

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

UPD: А вот идти в алгоритмы (вверх) и в железо (вниз) можно будет только потом, когда ученик уже будет понимать, как это всё влияет на «выхлоп».

UPD2: А уже потом, в качестве первого промышленного, в настоящее время оптимален Python.
На HH.ru:
— 6 961 вакансия «C»
— 3 107 вакансий «JavaScript»
— 2 814 вакансий «Python»
— 2 628 вакансий «Java»
— 1 413 вакансий «PHP»
— 1 308 вакансий «C++»
— 1 241 вакансия «C#»
— 543 вакансии «Go»
С, JavaScript и PHP слишком узко-специализорованы и в них надо идти осознанно, а JavaScript еще немного запутанный (как для первого ЯП). У Java, C#, C++ высок порог входа. Go — мало вакансий.
И не просто изучаться — появляться на глаза ученика!

Нет такого требования. Что вы, что автор, видите проблему там, где ее нет. Это абсолютно нормально сказать: всякие static void main это у нас обязательное оформление, мы разберем его подробнее позже. Пока что цель изучить вот этот фрагмент и вот эту команду.
Каверзный вопрос "почему тут так написано" можно задать практически по любому языку.
Вот например для Python 3:


print('Hello world!')

Почему тут кавычки одинарные, а не двойные?
Почему тут скобочки круглые, а не квадратные/фигурные/угловые?
Мы всегда должны ставить восклицательный знак в конце команды?
Почему не работает фрагмент ниже?


print('Первая строка!')print('Вторая строка!')

Зачем команды писать на разных строках?


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

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

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

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

Дело ведь в том, что я разделяю ваш подход "изучать одну концепцию за раз". Однако это не значит, что преподаватель должен всячески избегать оформительского кода. Уж тем более это не значит. что наилучший язык программирования тот, у которого самая тривиальная команда вывода "Hello world!" на экран.

Тогда какой объем оформительского кода вы считаете оптимальным? Для меня, очевидно, чем меньше — тем лучше.

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


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


System.out.printf("Площадь круга равна %.4f метров", areaInMeters);

А в какой-нибудь задаче вычисления площади прямоугольника будет еще пачка условий вроде


if (widthInMeters >= 0){
    System.out.println("Ширина должна быть неотрицательна");
    return;
}
if (heightInMeters >= 0{
    System.out.println("Высота должна быть неотрицательна");
    return;
}

Хотя, конечно же, проще написать что-то вродеSystem.out.print(a) и совсем не требовать проверки вводимых данных.


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

Впору устраивать голосование…
На мой взгляд, не существует «простого» языка программирования для обучения. У каждого есть свои аспекты и подводные камни.
Sign up to leave a comment.

Articles