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

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

Опять же на мой дилетантский взгляд, несложно проверить, отвечает ли язык программирования этому требованию. Достаточно открыть раздел “Hello World” на Rosetta Code.

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

Дополнено по заявкам радиослушателей. Brainfuck, PHP, C, Julia.


Python 2


print 'Hello world!'


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

Руthon 3


print('Hello world!')


К ключевым словам и строкам добавляется понятие функции. Да, функция print ? это плюс Python 3 как промышленного ЯП. Но в то же время функция ? это более высокоуровневая фича, нежели оператор, и это усложняет изучение Python 3 как первого ЯП. Да, вы как преподаватель можете отложить объяснение необходимости использования скобок на одно из следующих занятий, но это останется занозой в мозгах ваших учеников.

Julia


println("Hello world!")


Те же базовые понятия, что и в случае Python 3. Зато Julia ? это высокопроизводительный динамический ЯП, компилируемый в нативный код. Браво!

Basic


10 PRINT "Hello world!"


Ключевые слова, строковый ТД, операторы, нумерация строк кода. Нумерация строк в Basic ? довольно сложная низкоуровневая концепция, имитирующая физическое устройство памяти компьютера. Она может стать камнем преткновения для студента, если преподаватель не уделит ей внимания.

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

Pascal


program HelloWorld(output);
begin
  writeln('Hello, World!');
end.


Ключевые слова, строковый ТД, операторы, функции, а что ещё? Поскольку программа занимает несколько строк, то к первым понятиям добавляются блоки, разделители (или терминаторы? Всегда их путаю) и отступы. Да и оператор program не так уж прост… Похоже, дружелюбность Pascal несколько преувеличена.

C


#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
  printf("Hello world!\n");
  return EXIT_SUCCESS;
}


Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также директивы препроцессора и макросы. Без макросов в этом примере можно было обойтись, но return EXIT_SUCCESS в данном случае очень показателен: C ? это традиционный язык системного программирования, поэтому изучать его желательно на фундаменте хорошего понимания работы операционных систем и с прицелом на переносимость. А иначе этот ЯП кажется ненамного сложнее Pascal.

PHP


<?php
echo "Hello world!\n";
?>


Помимо понимания ключевых слов, строковых ТД, операторов и разделителей (или терминаторов?), данный пример невозможно усвоить без базового понимания таких специфических веб-технологий, как языки разметки (HTML) и шаблонизаторы. Собственно, PHP и есть язык шаблонизатора, разновидность DSL. Как следствие, PHP ? отличный учебный язык для фронтендера, желающего углубиться в бэкенд-технологии. Но учить PHP «с нуля» довольно сложно.

C++


#include <iostream>
 
int main () {
  std::cout << "Hello world!" << std::endl;
}


Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также препроцессор с его директивами, области видимости, потоковый ввод/вывод… Уф, неужели всё?

Java


public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}


Ключевые слова, строковый ТД (даже два строковых ТД, но об этом можно тактично промолчать), пустой ТД, массивы, блоки, разделители и отступы, а также классы, объекты (неявно, но иначе не объяснишь static), атрибуты, методы, модификаторы доступа… Божечки, я уже хочу развидеть всё это! Ведь я хотел только писать моды для Minecraft!

C#


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


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

Brainfuck


Я не хочу приводить здесь листинг ? он слишком объёмный и однообразный. Я только перечислю те базовые понятия, которые нужно усвоить для понимания этого примера: ключевые слова, операторы, переменные, указатели, условия, циклы, числовое представление символов (таблица ASCII). Да, Brainfuck ? не самый доступный для новичков язык.

Заключение


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

Комментарии (135)


  1. MikailBag
    22.11.2019 16:40

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


    1. Tanner Автор
      22.11.2019 16:43
      +1

      ::


      1. MikailBag
        22.11.2019 16:47

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


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

        ?


        1. Tanner Автор
          22.11.2019 16:57

          Я могу плавать в терминах, но раз официальное название этой штуки ? scope resolution operator, то надо думать, что она имеет отношение к scopes (областям видимости).


          1. kalininmr
            22.11.2019 21:30

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


    1. Akon32
      22.11.2019 16:45

      std:: ...


  1. Ironhide
    22.11.2019 16:43

    Сначала начинал изучать C#, а потом — Python. В принципе не важно, какой язык учить первым. Сложнее всё же изучать «обвязки» к языку: многочисленные классы и их методы во многочисленных или немногочисленных, но очень больших фреймворках и библиотеках. Не всегда сразу запоминаешь, где какой инструмент использовать нужно.


    1. iskateli
      22.11.2019 20:08
      +3

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


      1. Ironhide
        22.11.2019 22:25

        Да, согласен в таком случае. По сути я так же и учил первым язык со строгой статической типизацией. Хотя для меня всё равно сейчас самое сложное — это изучение фреймворков и библиотек.


  1. ip1981
    22.11.2019 16:43

    Brainfuck же


  1. Free_ze
    22.11.2019 17:00
    +2

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

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

    Почему про пакеты в Java ни слова? Неявный java.lang и дефолтный пакет — это, конечно, хорошо, но чуть дальше пойдешь — те же импорты начнутся.


  1. saag
    22.11.2019 17:03
    -1

    А вот Ruby:
    puts «Hello World!»
    лаконичнее всех вышеприведенных примеров


    1. hlebloika
      22.11.2019 17:06
      +4

      Не очень понятно, чем оно лаконичнее того же второго питона.


      1. saag
        22.11.2019 18:42
        -1

        На один символ — print (Python) vs puts (Ruby)


        1. Areso
          22.11.2019 22:22
          +1

          Не соглашусь.
          Для носителей английского вариант Питона выглядит дружелюбнее, а буквально
          напечатай 'Привет, Мир!'
          вполне дружелюбно и естественно, кмк.


        1. Soren
          22.11.2019 22:26
          +1

          На один символ короче, но теряется очевидность ключевого слова. Всё таки, print — он и в английском языке print.


  1. Moxa
    22.11.2019 17:04
    +3

    по вашей логике Brainfuck — самый простой язык программирования, там всего 8 команд, порог входа гораздо ниже!


    1. Tanner Автор
      22.11.2019 18:52

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

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


      1. ip1981
        22.11.2019 19:28
        +1

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


        1. Tanner Автор
          22.11.2019 21:07

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


  1. FSA
    22.11.2019 17:04
    +1

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


  1. sborisov
    22.11.2019 17:06
    +2

    Мне кажется, в таком случае Си неплохо подходит.

    #include <stdio.h>
    int main()
    {
       // printf() displays the string inside quotation
       printf("Hello, World!");
       return 0;
    }


    1. Yermack
      22.11.2019 17:50
      +2

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


  1. CoreTeamTech
    22.11.2019 17:17

    Лучший язык, на сегодня, для обучения — JavaScript. Мне немного довелось с нуля обучать, как подростков, так и людей без технического образования в возрастной группе 35+. После того, как получили старт, они дальше развиваются благодаря огромному коммьюнити, без ограничений в возможностях реализации своих идей. Могут разрабатывать веб-сайты, веб-приложения, веб АПИ, игры, десктопные и мобильные приложения, разрабатывать роботов RPA и даже играться с машинным обучением. При этом, никогда не было целью научить их конкретному языку программирования, скорее, мыслить основными концепциями. Поэтому, часто им предлагал портировать небольшую программу с одного языка (Python, Java, C++) на другой (JavaScript), вырабатывая навык узнавания этих общих концепций.


    1. gatoazul
      22.11.2019 19:24

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

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

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


      1. CoreTeamTech
        23.11.2019 17:19

        Интересно, спасибо за наводку. Я как программист старой школы, так и не перестроил мозги с консолей на графику. Действительно, работа с графикой более наглядна и охватывает довольно много алгоритмов.


    1. Akon32
      22.11.2019 20:49

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


    1. ALexhha
      23.11.2019 16:21

      Лучший язык, на сегодня, для обучения — JavaScript
      Серьезно? Сразу вспоминается — https://cs9.pikabu.ru/post_img/2016/09/15/7/147393909915812096.jpg


      1. CoreTeamTech
        23.11.2019 17:17

        Это вызывает проблемы только у тех, кто JavaScript не знает. Когда вы приходите с других языков с Си-подобным синтаксисом и вы используете интуицию для работы в новом для вас языке. JS не идеальный язык, но для обучения он лучший, ИМХО.


      1. lostero
        26.11.2019 04:02

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

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

        P.S. Непонятное, для начинающих, автоматическое приведение типов заставляет их избегать его использование в пользу спец. методов и в редких случаях, о ужас! почитать спецификацию.


  1. rboots
    22.11.2019 17:20
    +3

    Добавлю пример на JavaScript:

    console.log('Hello, World!');

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

    UPD: начал писать про JS, но меня опередили))


    1. Free_ze
      22.11.2019 18:26
      +3

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

      Посмейтесь по поводу webpack и gulp до кучи.


      1. rboots
        22.11.2019 18:47
        -1

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


        1. Free_ze
          22.11.2019 19:08

          он довольно прост в конфигурации.

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

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

          Архетипы мавена, spring boot с генератором проектов.


          1. rboots
            22.11.2019 20:01
            +1

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


            1. Akon32
              22.11.2019 20:55

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


              1. mkovalevskyi
                22.11.2019 22:47
                +1

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


                1. Akon32
                  25.11.2019 21:00

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

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


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


                  1. mkovalevskyi
                    25.11.2019 21:18

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


                  1. rboots
                    26.11.2019 03:09

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


            1. gudvinr
              22.11.2019 23:34

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

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


            1. Free_ze
              23.11.2019 09:53
              +1

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

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

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

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

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

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


  1. a-tk
    22.11.2019 17:21
    +2

    TXT:

    Hello world


  1. ApeCoder
    22.11.2019 17:30
    +1

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


    Forth


    .( Hello world )

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


    Brainfuck


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

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


    Hello


    h


  1. loltrol
    22.11.2019 17:35
    +4

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


    1. Alyoshka1976
      22.11.2019 19:31
      +1

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


      1. Gryphon88
        22.11.2019 23:11

        А ведь когда-то цикл официально считался паттерном…


      1. SlimShaggy
        23.11.2019 00:24

        Логично — все же знают, что оператор безусловного перехода использовать нельзя!


  1. PaulZi
    22.11.2019 18:10

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


    1. Tanner Автор
      22.11.2019 18:31

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

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


      1. PaulZi
        22.11.2019 18:39

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


        1. Tanner Автор
          22.11.2019 18:47

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


      1. pewpew
        22.11.2019 18:41

        Мы же не студенты, мы тут сравниваем ЯП. Поэтому да, что-то сложнее «hello, world» ярче покажет различия между языками и будет нагляднее показывать сложность ЯП в сравнении с другими. А студенту мы это покажем, но не сразу.

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


        1. Tanner Автор
          22.11.2019 18:58

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


      1. loltrol
        23.11.2019 02:01
        +2

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


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


        1. 0xd34df00d
          23.11.2019 03:40

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

          … формальной логики (хотя бы исчисление высказываний и логика первого порядка, вместе с теоремами о полноте), теории вычислимых функций (вместе с теоремой Райса и теоремой о неполноте), топологии (потребуется позже), лямбда-исчислению, теории типов (хотя бы System F, лямбда-цэ и MLTT в идеале) и интерпретации некоторых теорий (тут пригодится топология).


          На несколько лет хватит. Потом уже можно теоркат и категориальную логику.


        1. Gryphon88
          23.11.2019 23:21

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

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


  1. lair
    22.11.2019 18:16

    К ключевым словам и строкам добавляется понятие функции.

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


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


    1. Tanner Автор
      22.11.2019 18:39

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


      1. lair
        22.11.2019 18:42

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


        1. Tanner Автор
          22.11.2019 21:08

          Эффективность чего?


          1. lair
            22.11.2019 21:37

            Обучения.


            1. Tanner Автор
              22.11.2019 22:25

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


              1. lair
                22.11.2019 22:27

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


                1. Tanner Автор
                  22.11.2019 22:31

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

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


                  1. lair
                    22.11.2019 22:34

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


                    1. Tanner Автор
                      22.11.2019 22:45

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


                      1. lair
                        22.11.2019 22:50

                        Я не очень хорошо понимаю, как это относится к теме обсуждения.

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


                        1. Tanner Автор
                          22.11.2019 23:15

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


                          1. lair
                            22.11.2019 23:19

                            Я считаю, что достаточно полно описал контекст фразой «для начинающих».

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


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


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

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


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

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


                            1. Tanner Автор
                              22.11.2019 23:55
                              +1

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

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

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

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

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

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


                              1. lair
                                22.11.2019 23:58

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

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


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

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


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

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


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

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


                                1. Tanner Автор
                                  23.11.2019 00:21
                                  +1

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

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

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

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

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


                                  1. lair
                                    23.11.2019 00:23
                                    -1

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

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


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

                                    Ну да. И что?


                                    1. Tanner Автор
                                      23.11.2019 00:36
                                      +1

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

                                      Ну да. И что?
                                      Да и верно, шут с ними! :)


                                      1. lair
                                        23.11.2019 00:37
                                        -1

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

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


                                        1. Tanner Автор
                                          23.11.2019 00:46
                                          +1

                                          OK, будем считать, что это исключительно моя проблема.


    1. 0xd34df00d
      23.11.2019 03:41

      А что такое функция?


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


      1. lair
        23.11.2019 13:41

        А что такое функция?

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


  1. maxzh83
    22.11.2019 18:19
    +3

    Написали бы для разнообразия энтерпрайзный hellowworld. Чтобы там фабрика делала прокси-объект, который параметризовался стратегией, ну и т.д.


    1. kdmitrii
      23.11.2019 00:22

      Подобному фазбазу уже лет наверно 5, а то и 10


  1. pewpew
    22.11.2019 18:31

    По мне так в список можно добавить LUA.
    Из плюсов — хорошая документация, лёгкость в освоении, встречается в разных интересных местах (от wow до nginx, redis или какой-нибудь экзотической консоли pico8). Из минусов — несколько странный null, метатаблицы, не очень удобная отладка, отсутствие ООП в полном смысле этого понятия.
    Считаю, что для первого ЯП очень даже годится.


  1. justhabrauser
    22.11.2019 19:14
    +1

    Судя по критериям сравнения статья должна называться «Лучший… для начинающих идиотов».
    Что — всё так плохо?
    Или так и надо?


  1. MarsianinM
    22.11.2019 19:56

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


  1. greg123
    22.11.2019 20:03

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


  1. gigabite
    22.11.2019 20:12

    Какой разумный критерий, сравнивать простоту изучения языков по «hello world». Нет ничего сложного, есть плохо преподнесенный материал. Учите надо опираясь не надуманные аргументы типа, я на языке «Х» могу хелоуворд написать в одну строчку, а понять, где вы хотите дальше этот язык применить.


    1. Tanner Автор
      22.11.2019 20:42

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

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

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


  1. tenzink
    22.11.2019 20:21

    Python 2: ключевые слова, операторы и строковый тип данных
    Python 3: функции, строковый тип данных

    IMO, в 3-м заметно проще объяснить


  1. dyuk108
    22.11.2019 20:24

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


    1. sabaca
      23.11.2019 07:58

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


    1. allex
      23.11.2019 10:01

      1. Академик Ершов может быть «неким» только для людей, не знакомых с историей развития вычислительной техники. Прочитайте хоть статью в википедии что ли.

      2. Для полноты картины замечу, что задолго до реализации НИИСИ РАН на мехмате МГУ были разработаны Е-практикум и КуМир, которые использовались на самом мехмате и продавались в школы. Поэтому упоминание только НИИСИ мне глаз резануло. Ну ок, современная реализация их, а название сохранено для узнаваемости, пусть.


  1. Fil
    22.11.2019 20:28

    С++… Уф, неужели всё?
    Можно еще ADL добавить


  1. xirustam
    22.11.2019 20:43

    Я думаю, что для хорошего понимания сути, лучше всего изучать языки уровня С/C++, Pascal, т.к. они вынуждают лезть в низкоуровневые вещи, при этом позволяя делать высокоуровневые штуки.
    При таком подходе человеку даётся широкий кругозор, возможность понимать работу программ так, как оно есть на самом деле. Если начать со слишком низкого уровня (ассемблер), то это может на корню отбить желание изучать программирование. Если начать с языка, слишком отдалённого от реальности, то человеку будет вообще сложно понять как и почему эта магия работает, и шаг влево, шаг вправо — всё, ступор.


    1. Tanner Автор
      22.11.2019 20:57

      Мне кажется, это не совсем так работает. Изучение языков уровня C/С++ и ниже надо основывать на знаниях цифровой схемотехники, хотя бы уровня “What Every Programmer Should Know About Memory” или Digital Design and Computer Architecture. Если предложить неподготовленным людям начинать с С++, то это будет не кругозор, а БДСМ. А вот Python легко усваивается и без этого, поэтому он и школьникам доступен, и всякие гуманитарии-естественники на нём статистику просчитывают.


      1. Gryphon88
        22.11.2019 23:15

        Я читал, но так и не смог понять красоту шаблонов и макросов (когда шаблон в шаблоне в шаблоне, и всё обмазано constexpr). Почему инструмент кодогенерации не вынести наружу языка, например, в лисп, тикль или питон?


        1. Tanner Автор
          23.11.2019 00:26

          Да, препроцессор ужасен, и шаблоны тоже ужасны. Кодогенерация вообще ужасна в любом виде, и если вынести её наружу, то станет наверняка ещё хуже.

          Зато есть D, в котором избавились от препроцессора и шаблонов. Я, честно говоря, не понимаю, почему он так непопулярен.


          1. Gryphon88
            23.11.2019 01:08

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


            1. Tanner Автор
              23.11.2019 02:43

              Плюсы без лигаси ? это уже круто! А D ? это даже не плюсы без лигаси, а плюсы, спроектированные проще и чище. Один foreach чего стоит! А умные массивы и срезы! А какие простые в D лямбды!


              1. Lodin
                23.11.2019 03:41
                +2

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


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


        1. 0xd34df00d
          23.11.2019 03:47

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


          1. Gryphon88
            23.11.2019 23:26

            Ну да. Но я всё равно не понимаю, чем шаблоны предпочтительнее in-place кодогенерации или даже целиком внешней, при условии, что сгенерированный файл мы не редактируем руками. Макросы, подкидыш семьи С, обсуждать будем? :)


      1. xirustam
        25.11.2019 11:00

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


  1. fishca
    22.11.2019 21:22

    OneScript:

    Сообщить("Привет МИР!");


  1. impwx
    22.11.2019 21:22

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


  1. Yuuri
    22.11.2019 21:36

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


    main = putStrLn "Hello world!"


  1. akryukov
    22.11.2019 22:13

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


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


  1. KvanTTT
    22.11.2019 23:26
    +1

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

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


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

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


    <?php
    echo "Hello world!\n";


    1. Free_ze
      22.11.2019 23:55

      Неймспейсы для «Hello World» не нужны.

      Таки System — это неймспейс.


  1. ip1981
    22.11.2019 23:44
    +1

    У меня есть кое-что со школы => https://github.com/ip1981/gcd


  1. ekha
    23.11.2019 02:32

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


  1. sabaca
    23.11.2019 07:52

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


  1. saag
    23.11.2019 09:28

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


    1. Free_ze
      23.11.2019 09:30

      А планы разве не сами учителя составляют?


    1. akryukov
      23.11.2019 11:47

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


  1. Mikluho
    23.11.2019 09:31

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

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


    1. Tanner Автор
      23.11.2019 10:32

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

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


      1. Mikluho
        23.11.2019 10:42
        +1

        Ваш посыл я понял, но тут спорят не с исходной статьёй, а с вашим мнением, и ему не хватает полноты. Если новичок пришёл учиться игрушки для андроида писать — то java не худший выбор.


        1. Tanner Автор
          23.11.2019 11:07

          Если при изучении Java у ученика возник ментальный блок, то лучше взяться за Python или JS с прицелом на Kivy (Cordova, React Native), чем продолжать штурмовать Java.

          Иначе вы просто подменяете понятия: «обучение программированию» > «изучение Java».


          1. Mikluho
            23.11.2019 11:21

            А вот тут уже много от преподавателя зависит, и от программы обучения. Я слабо себе представляю ментальный блок от java, который можно преодолеть переходом на phyton. Может и правда, если ему хочется игрушку для телефончика написать, то надо дать готовый каркас и учить сначала простые вещи делать, и уж по мере освоения расширять понимание того, как собирается программа, как она исполняется? Попутно и алгоритмы изучать?


            1. Tanner Автор
              23.11.2019 12:29
              +1

              Типичный ментальный блок отлично описал mSnus:

              Для начинающих, первым языком? Которые не знают, что такое функция и переменная? Не говоря уж о классах…

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

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

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

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

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

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


              1. CoreTeamTech
                23.11.2019 17:41
                +2

                Я понимаю, что вы пытаетесь измерить, но это порочный метод. Это примерно то же самое, что измерять производительность программиста, количеством строк кода. Люди не так глупы, как вы пытаетесь представить. И ничто не мешает абстрагироваться от понимания, что есть public static void main() и писать арифметические выражения с выводом на консоль. Главная особенность программирования, как раз в построении и использовании абстракций. Поначалу все эти «заклинания» — просто карго-культ, но потом по мере развития, начинаются озарения, вроде, — вот оно для чего! Анализ — биологически, более прокачанный навык, чем синтез. Поэтому даже на презентациях никто и никогда, в здравом уме, не начинает сразу вдаваться в детали, а сначала показывают картину сверху, и только потом углубляясь в дебри специфики.


              1. Mikluho
                24.11.2019 08:03

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


      1. lair
        23.11.2019 13:46

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

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


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


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


  1. Viceroyalty
    23.11.2019 09:43

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


  1. allex
    23.11.2019 09:48

    упс, было


  1. pdima
    23.11.2019 16:26

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

    scratch
    image


  1. Vlad800
    25.11.2019 01:22
    +1

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

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

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

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

    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 — мало вакансий.


    1. akryukov
      25.11.2019 11:37
      +1

      И не просто изучаться — появляться на глаза ученика!

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


      print('Hello world!')

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


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

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


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


      1. lair
        25.11.2019 11:49

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

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


      1. Vlad800
        25.11.2019 17:02

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


        1. akryukov
          25.11.2019 20:01

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


          1. Vlad800
            25.11.2019 21:14

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


            1. akryukov
              25.11.2019 21:42

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


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


              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 страницы, поля для ввода и кнопку. Так люди видят что-то похожее на реальную разработку, а не абстрактные упражения с консолью. Оформительского кода значительно больше, но люди с ним успешно справляются.


              1. Vlad800
                25.11.2019 22:27

                Впору устраивать голосование…


  1. dategranif
    25.11.2019 01:35

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