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

За свой IT'шный бэкграунд (в рамках универа, работы и личного интереса) я изучил порядка 15-ти языков программирования.  Пробовал функциональные, структурные, логические и объектно-ориентированные. Мне есть с чем сравнить и на основе чего делать выводы.

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

Первое – Пробудить интерес к программированию. Это однозначно Python или JS. Человеческий мозг получает удовольствие, когда у него что-то получается, когда он видит результат своего труда, причем чем быстрее, тем лучше. У Python много готовых библиотек и богатая кодовая база. Существует множество туториалов, по которым можно быстро сделать что-то рабочее и прикольное: ботов, простенькое GUI, скрипты для операционных систем и ещё множество несложных интересных проектов.

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

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

Оба языка популярные, вакансий на них немало.  Отличный вариант для старта. Я думаю, что это must have языки для изучения программирования в школе. Поначалу, главное – это привить интерес к программированию, а не готовить девятилетних «сеньёров», стартующих с Erlang, которые будут обсуждать SOLID и Best practice на переменах между уроками ИЗО и Физкультуры.

Второй сценарий – это Программирование интересно само по себе и человек хочет развиваться как разработчик и инженер. Здесь однозначным решением будет C++. Это мощный универсальный язык со статической типизацией и качественным ООП. С памятью поработаете, на указатели посмотрите, поиграете с шаблонами, потыкаетесь в разного рода оптимизации. Стандарты 11-го и 14-го года призваны облегчить «мучения». Не зря в народе С++ в шутку называют «Язык языков». Однако в каждой шутке есть только доля шутки. С ним можно наработать очень хорошую программерскую базу, а потом решить, хочешь ты развиваться в нем дальше или нет. Разработчики редко учат один язык и пишут на нём всю жизнь. Если разобраться в С++ на вменяемом уровне, то изучить любой другой язык в дальнейшем не составит труда.

Следующий вариант – Человек на 100% определился со сферой, в которой хочет работать. Образно, ты горишь идеей разрабатывать мобильные приложения. Это мечта, цель и смысл жизни. Тогда можно сразу приступить к изучению соответствующего ДЛЯ ДАННОЙ СФЕРЫ языка.

Хочется писать под Android – это очевидно Kotlin, если под IOS – то Swift. Прокатиться на двух стульях сразу поможет JS с его React Native.

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

Если ты только начинаешь, то не так важно какой язык осваивать первым. Главное, чётко определиться с направлением, которое тебе интересно: frontend, backend, мобильная разработка или data science, микроконтроллеры и т.д. Так и спектр языков сузится и шанс ненавидеть свою будущую работу уменьшится.

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

Заключительный сценарий - Нужно быстро начать зарабатывать деньги. Если ты отлично знаешь любой язык программирования и разбираешься в его экосистеме – без денег ты не останешься. Но существует ряд языков, зная которые, найти работу проще. Они распространены повсеместно, вакансий на них много, глубокой спецификой не отличаются. По этой причине на них охотнее берут разработчиков без опыта, нежели на языки типа Scala, куда неопытных программистов никогда не нанимают.  Кто бы что ни шутил и ни говорил, такими языками являются: PHP, Java, JavaScript и 1С (если ты некрещёный). Тема сегрегации по языкам программирования достойна отдельного обстоятельного разговора.

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

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


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

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


  1. PrinceKorwin
    25.07.2021 17:59
    +2

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

    Потом уже подвезли cp/m с компилятором Pascal и С.


    1. PyLounge Автор
      25.07.2021 18:01
      +1

      Ох, красота)


  1. Purojok
    25.07.2021 18:06
    +1

    Здравствуйте, спасибо за интересную статью! Действительно, когда я еще начинал изучать программирование, язык Python помогал мне быстро пробовать что-то новое и не скучать во время обучения (всё благодаря тому, что инструкции интерпретировались на лету).
    На мой взгляд, выбор первого языка определяет мышление начинающего программиста, потому что он пытается выразить все свои мысли только конструкциями полюбившегося(возможно) первого языка. Я сам не раз сталкивался с таким.
    Например, некоторым так полюбился JS, что они везде пытаются использовать формат json(это ещё только студенты). Ещё один мой излюбленный и простой пример — взятие последней цифры числа. Если человек изучал язык Python, он, скорее всего, переведёт число в строку и возьмёт последний символ:

    a = 123 # Наше число
    print(str(a)[-1])
    

    Начинающий разработчик, который начал своё изучение с языка программирования С++, к примеру, напишет так:
    int a = 123; 
    std::cout << a%10 << std::endl;
    

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


    1. PyLounge Автор
      25.07.2021 18:09

      Действительно интересное наблюдение. Спасибо за пищу для размышлений)


    1. GospodinKolhoznik
      25.07.2021 18:13

      Формат JSON удачный формат. Язык JS - такое себе... Применяют формат JSON вовсе не за любовь к JS.


      1. Purojok
        25.07.2021 18:18

        Сам я не сильно углублялся в изучение JS. Знаю лишь только, что JSON удобно использовать для передачи данных между фронтом и бэком. У нас в то время была задача хранить карту игрового поля в игре. Программист решил использовать для этого JSON, хотя, на мой взгляд, можно было бы использовать и простую сериализацию средствами языка C++.


        1. Nickellick
          25.07.2021 19:27
          +1

          JSON удобно использовать, поскольку это своего рода "стандарт" вне зависимости от используемого ЯП, при этом он остаётся человекочитаемым


          1. granvi
            26.07.2021 01:00

            JSON это хорошо, когда в ЯП есть ассоциативные массивы. Когда нет таких управляющих структур. Самый проверенный формат csv


            1. Gorthauer87
              26.07.2021 01:39

              Это где остались тьюринг полные языки без ассоциативных массивов?


              1. AnthonyMikh
                27.07.2021 22:42

                C, например :D


    1. mistergrim
      25.07.2021 19:33
      +1

      Не совсем понял, что мешает питонисту сделать

      a = 123 # Наше число
      print(a % 10)


      1. Purojok
        25.07.2021 19:48
        +2

        Это самое простое решение(приведённое мной), что приходит в голову. Лично я подробно познакомился с операцией взятия остатка, когда начал разбираться с Си. В Python она без надобности, имхо.


        1. mistergrim
          25.07.2021 21:02
          +1

          Это самое простое решение(приведённое мной), что приходит в голову.
          Вот за это питонистов и не любят.


          1. nikweter
            26.07.2021 05:43
            +1

            А за что не любят php-стов? А тех кто на JS пишет за что не любят? 1С-ников, кстати, тоже за что-то не любят.
            Наверное, легче перечислить тех, кого любят?


  1. vasya_robot
    25.07.2021 19:05
    +1

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


  1. eandr_67
    25.07.2021 19:23
    +11

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

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

    Качество кода — это, прежде всего, самодисциплина программиста. Именно потому Python / JS / PHP — с их вседозволенностью — не годятся для начального обучения. Эти языки не только не помогают сформировать дисциплину написания кода, но, наоборот, подталкивают писать говнокод.

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

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

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

    P.S. ИМХО, лучший современный язык для начального обучения — Oberon-07 (в качестве дополнения к учебнику Вирта). Если же брать популярные C-style языки, то лучшим выбором будет Go.


    1. nerzhul
      26.07.2021 01:23

      Лучший комментарий! Моя мысли абсолютно такие же, когда вижу советы об обучении программированию на js, питоне и тд


    1. 0xd34df00d
      26.07.2021 02:11

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

      Причём вообще наличие типизации к оценкам сложности? Чем принципиально отличается плюсовый std::unordered_map или какой-нибудь хаскельный аналог?


      1. eandr_67
        26.07.2021 12:07

        Отличается тем, что std::unordered_map — внешняя по отношению к самому языку библиотека (даже если это std). А dict и set — это часть языка Python.

        Когда я пишу a[b] на Pascal (классическом виртовском), Modula или Oberon, я знаю, что эта операция всегда будет выполнена за O(1). Когда я пишу a[b] на Python или JS, я не знаю реальную вычислительную сложность этой операции.

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

        P.S. Если ученику понадобится ассоциативный массив, то в Oberon он будет реализовывать его сам — с нуля. И будет понимать, как он устроен и какую цену придётся платить за его использование. А в Python он просто воспользуется встроенным в язык словарём, не задумываясь об эффективности его использования. В результате обучения на Python мы получаем не программиста, способного оценить эффективность своего кода для заданных условий, а бездумного сборщика как-то работающего кода из готовых библиотек.


        1. AnthonyMikh
          26.07.2021 16:10

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

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


        1. rewlad-dev
          26.07.2021 17:55
          +2

          А так получим людей, которые "тупо" используют массивы, а паяльника с транзистором в руках не держали. Тут вопрос, кого мы хотим получить в итоге. В идеале выходит супергерой, который сможет разрабатывать свой СУБД. Но, боюсь, получится наоборот: Страница циклов с квадратичной сложностью, зарытой ошибкой "+1" и Го-шными "if err!=nil", вместо пары строк с готовым словарем и groupBy.


        1. 0xd34df00d
          26.07.2021 18:24

          Отличается тем, что std::unordered_map — внешняя по отношению к самому языку библиотека (даже если это std). А dict и set — это часть языка Python.

          Как это внешняя? Она описана в том же стандарте, что и сам язык, прям в той же pdf'ке. Это часть языка.


          Когда я пишу a[b] на Pascal (классическом виртовском), Modula или Oberon, я знаю, что эта операция всегда будет выполнена за O(1). Когда я пишу a[b] на Python или JS, я не знаю реальную вычислительную сложность этой операции.

          Когда вы смотрите на терм a[b] в плюсах, то вы тоже не знаете, за какое время эта операция может быть выполнена, хотя в плюсах вполне себе статическая типизация (и это ровно то, о чём я изначально говорил).


          Если ученику понадобится ассоциативный массив, то в Oberon он будет реализовывать его сам — с нуля. И будет понимать, как он устроен и какую цену придётся платить за его использование. А в Python он просто воспользуется встроенным в язык словарём, не задумываясь об эффективности его использования. В результате обучения на Python мы получаем не программиста, способного оценить эффективность своего кода для заданных условий, а бездумного сборщика как-то работающего кода из готовых библиотек.

          Почему бы вам не давать своим ученикам задачи на реализацию своих собственных словарей на любом языке?


    1. JekaMas
      26.07.2021 05:13
      +1

      Сам давно работаю на го. Но лишь частично соглашусь с вашим комментарием. Без хорошего наставника го в руках новичка превращается в кошмар из interface {}, reflect, unsafe плюсом к этому неуправляемыми горутинами и гонками.

      Строгая типизация убивается interface {}, корректность кода убивается гонками.

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


      1. eandr_67
        26.07.2021 18:29

        Начало — это базовые представления о свойствах алгоритмов и основы структурного программирования. И не нужны на начальном этапе обучения ни unsafe, ни рефлексия, ни пустые интерфейсы, ни go-процедуры. Всё это — уже следующие этапы обучения. А для написания Змейки или Жизни, а тем более — учебных заданий по основам программирования, эти возможности Go не требуются.

        Я выбрал Go не потому, что он так хорош для обучения, а потому, что в других C-style языках ситуация ещё хуже.

        В подавляющем большинстве этих языков воспроизводится семантика C: когда =, ++, — - операции, которые могут использоваться внутри выражений. То, что провоцирует написание ненадёжного плохо читаемого кода. Всё это отсутствует в Go: в нём присваивание, инкремент, декремент — операторы, а не операции.

        На хабре на днях была статья о том, что обновление Chrome OS сломало авторизацию потому, что случайно вместо && написали &. В C / C++ / Java / JavaScript / PHP и т.д. компилятор спокойно пропустит такую замену. Но в Go это вызовет ошибку компиляции.

        В Go нет автоматического приведения типов, что также способствует выявлению ошибок в логике кода на этапе компиляции.

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

        P.S. Наличие наставника — наилучший вариант обучения. Независимо от используемых языков.


        1. JekaMas
          26.07.2021 18:39

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


        1. alexdesyatnik
          26.07.2021 19:30

          Кстати о птичках, а как вы собираетесь писать Змейку или Жизнь на Го? Когда я его последний раз смотрел, у меня сложилось впечатление, что он пригоден для двух вещей - веб-сервисы и консольные утилиты. GUI-биндингов, достаточно простых в использовании для новичков, вроде бы нет в природе (да и вообще эта тема у Го скорее мертва, чем жива, как я понял), для продвинутой консоли только биндинги к ncurses, которые, скорее всего, в винде нормально работать не будут.


          1. eandr_67
            28.07.2021 19:51

            Да, столь простой графики, как в Turbo Pascal или qBasic, в Go, похоже, нет. Но зачем графика на этапе начального обучения? Я ведь специально упомянул те игры, которые прекрасно реализуются и работают в текстовой консоли. Без ncurses.


    1. Antervis
      26.07.2021 08:22

      Крайне переусложнённый и достаточно слабо типизированный C++ — один из худших выборов для начального обучения.

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


      1. eandr_67
        26.07.2021 11:38

        Низкоуровневое программирование — это уже следующий этап обучения. И для этого совершенно не нужны плюсы: намного эффективнее использовать подходящий ассемблер (разумеется, это не должен быть 16-битный x86) или C без плюсов.

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


        1. Antervis
          28.07.2021 10:02

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

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


          1. eandr_67
            28.07.2021 13:41

            Да, C — простой язык (почему не он — ниже). Но Python уже излишне сложен (и придётся учить не только основы — без ООП реализовать динамические структуры данных в Python не получится), а C++ дико переусложнён.

            Python плох ещё и тем, что при использовании встроенных list, dict, set и т.д. невозможно предсказать вычислительную сложность решения. Внешне оно может быть O(n), а при прогоне на наборах данных разного размера получим, например, O(n^2). Да даже целые числа неограниченной длины уже создают проблемы с определением вычислительной сложности.

            И я писал не только про алгоритмы, но и про дисциплину написания кода.

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

            Проблема C/C++ в том, что они чуть менее, чем полностью построены на побочных эффектах. Классическое C'шное копирование строки

            while(*out++ = *inp++);
            в одной строчке кода содержит три побочных эффекта. И это никак не может научить хорошему стилю программирования.

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


            1. Antervis
              28.07.2021 18:40

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

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

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

              Для плавающего в терминологии ученика, которому показали переменные, циклы и базовые арифметические/логические операции, сообщение компилятора (возьмем простейшее) "behind a '&' reference" скажет ровно ни о чем. При этом чисто алгоритмически код может быть верным. По мне так уж лучше увидеть спецэффекты различных ошибок на практике. Это я и имел в вижу под "пощупать память". В общем, тут много субъективного с моей стороны.


    1. gudvinr
      26.07.2021 10:29

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

      Почему не C в таком случае? Для обучения, на мой взгляд, стоит использовать то, что имеет наименьшее количество абстракций. В таком случае язык помогает отображать намерения, которые хочет выразить человек, в исполняемый код практически 1 к 1. Как говорится, "Less is more". Чем ближе к железу, тем меньше вопросов к тому, что происходит между вашим кодом и конечным результатом. Даже UB, на самом деле, довольно понятно почему происходят, во многих случаях.


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


      У Go есть опасные упрощения, которые могут сыграть злую шутку в будущем. Инициализация памяти нулями, GC и прочие штуки, которые удобны для написания программ, но плохи для того, чтобы объяснять их работу.


      1. eandr_67
        28.07.2021 15:20
        +2

        Для обучения, на мой взгляд, стоит использовать то, что имеет наименьшее количество абстракций
        Именно потому на первом месте в моём списке Oberon-07.

        Проблема в том, то ученик будет ошибаться — всегда. Он будет забывать ставить {} после if или for, будет выходить за пределы массива, будет разыменовывать неинициализированные указатели… И как на это отреагирует компилятор / рантайм C? Никак…

        Из всех C-style языков Go имеет один из самых упорядоченных (да, не без недостатков, но всё же никаких необязательных служебных слов и никакого произвольного порядка служебных слов) и простых синтаксисов и один из самых «строгих» компиляторов (чему способствует и предельно сильная типизация). И это безусловное достоинство для начального обучения.

        Другая проблема C — вседозволенность и провоцирование использования сложно понимаемого кода с побочными эффектами на грани UB. В плане семантики инструкций "=" (и всех прочих присваиваний), "++", "--" Go следует не трюкачеству C, а принципам написания надёжного кода. И это тоже хорошо для обучения.

        Да, в Go есть срезы и ассоциативные массивы, требующие дополнительных усилий для понимания. Но в нём есть нормальные массивы, полностью отсутствующие в C (массивы в C — всего лишь синтаксический сахар для указателей).

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


    1. alexdesyatnik
      26.07.2021 11:05

      По моему опыту, качество кода никак не коррелирует с выбранным языком. По работе имею дело именно с новичками (школа, олимпиады, немного робототехники), самый лютый говнокод - это решения олимпиадных задач на Паскале или Си++.

      Python и JS в одной куче вызывают, мягко говоря, недоумение: первый, несмотря на динамическую натуру, обладает строгой типизацией. JS да, может проглотить глупые ошибки вроде пропущенных аргументов функции из-за скобки или запятой не в том месте. Ничего подобного JS-ной дичи в Python нет. Хороший, продуманный язык с богатой библиотекой, позволяет очень кратко и точно формулировать мысли без лишнего синтаксического или семантического мусора (тут привет Джаве). Медленный только, из-за чего не годится для олимпиад (кроме совсем уж базовых).

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


    1. Morgan_iv
      26.07.2021 12:32

      Полностью согласен с идеей, но Oberon-07, имхо, слишком мертв на данный момент. На мой взгляд, один из лучших учебников программированию - "Программирование - введение в профессию" за авторством Столярова. Автор, конечно, довольно едко проходится по Windows и различным GUIшным штукам, но сама идея паскаля как первого языка и линукса/макоси (точнее, их эмулятора терминала) как первой ОС, на мой взгляд, безусловно верна и даст лучший результат именно в обучении программированию как концепции


      1. eandr_67
        28.07.2021 16:47

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

        Oberon-07 — один из языков в семействе языков Oberon — самый простой и предназначенный исключительно для обучения. Он не должен быть «живым», так как не предназначен для написания больших проектов (для таких задач есть Component Pascal — тоже один из Oberon'ов), а среда разработки и компилятор для него есть.

        Проблема Pascal в том, что экспериментальный язык, прежде всего предназначенный для реализации концепции типов данных, придуманной Хоаром и грамматик предшествования, придуманных самим Виртом. В результате язык имеет несколько существенных изъянов в своём дизайне, которые Вирт исправил в следующем языке — Modula-2 (более простом и мощном, чем Pascal). В свою очередь, выявленные в результате использования Modula-2 недостатки Вирт исправил в языке Oberon (более простом и мощном, чем Modula-2) из которого выросло семейство языков разного назначения.

        Потому более простой, логичный и при этом более мощный Oberon подходит для начального обучения лучше, чем местами нелогичный и более сложный Pascal.


  1. Stagirite
    25.07.2021 20:04

    Хм... )
    Моим первым был чего скрывать Basic, еще в школе. Тогда же изучил Turbo Pascal. И в старших классах Assembler.

    Далее по жизни работал с Delphi, 1C и VBA.


  1. GospodinKolhoznik
    25.07.2021 20:26
    +3

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

    А С++ как первый язык во всех случаях это дичь. Уберпереусложненный язык! Причем сложность эта существует не ради объективной необходимости (как в хаскеле, например, где сложность вместе с собой привносит кучу полезных вещей), а просто потому что исторически так сложилось.


  1. DrMoro
    25.07.2021 20:27
    +1

    Первым был Фортран-4, потом Паскаль, Бейсик, ассемблер (pdp/11)., потом сбился со счета:)

    Имхо освоить базовый синтаксис нового языка не так сложно, как новую (для тебя) парадигму, фреймворки и best practices. Но это только вопрос времени, если базовые навыки присутствуют.


  1. lumini
    25.07.2021 21:53

    У меня ребенок вникал в DrRacket. Там совершенно бомбическое интро, объясняющее циклы, условия, функции и прочие базовые концепции на примере графических объектов. https://docs.racket-lang.org/quick/index.html . Во взрослом возрасте надо, конечно, выбирать что-то более приближенное к реальности. Тут выше рекомендовали Go или Lua, имхо отличный выбор.


  1. starpearl
    25.07.2021 22:10
    +1

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


  1. Andrey_Ivanofff
    25.07.2021 22:57
    +1

    У меня было много "первых" языков программирования. Например, первый, который я использовал осознанно и сравнительно успешно, был КУМИР-подобный псевдокод на листочке, который нам давали на парах по информатике в девятом классе лицея. Именно на нём я освоил базовые алгоритмы обработки чисел, их последовательностей и простейшую структуру данных -- массив.

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

    Первый язык, освоенный мной целиком (все языковые концепции + стандартная библиотека + пул собственноручно реализованных алгоритмов), был Pascal. Он же стал и первым компьютерным, которым меня кормили в лицее. И пока он у нас там был, я к нему относился нейтрально -- есть и есть, ботаем, решаем задачки, всё ОК. Но потом пришлось порешать какие-то совсем странные задачки для знакомых, и они неадекватно оценивались, и ко мне перекинулась от знакомых ненависть к языку. К счастью, позже я почитал историю языка, его технические и прочие культурные особенности и в итоге очень зауважал.

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

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


  1. sena
    25.07.2021 23:03
    +2

    Нужно быстро начать зарабатывать деньги. ... Кто бы что ни шутил и ни говорил, такими языками являются: PHP, Java, JavaScript и 1С (если ты некрещёный)

    Если быстро зарабатывать много денег, то COBOL


  1. third112
    25.07.2021 23:15
    +1

    Мне суперинтересно об этом почитать. У меня, как и у многих, первым был Pascal :)

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


  1. omxela
    25.07.2021 23:37

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

    Автор это сказал, а дальше как бы уже детали - на вкус и цвет товарищей нет. Потом прочитал про 15 языков. Ух, - подумал, - круто, это много. Потом взял и выписал свои в разное время (только основные, без диалектов). Получилось 11. А я думал - 3. Вот такая аберрация.


  1. maga_niketas
    26.07.2021 06:18

    Я начал учить программирование в школе(лицее). У нас было что-то вроде информатического класса, так что и программирование отличалось от типично школьного(ну или того типично школьного, с которым встречался я, а я сменил не так мало школ). По крайней мере, в отличие от других моих школ, мы там занимались программированием на двух языках, что качественно отличалось от уроков по лазарусу или вижуал бейсику в других школах. Языком номер 0 у меня был паскаль, и, если честно, кроме смутных воспоминаний об интересностях его синтаксиса или синем экране мудрости турбо паскаля я мало что помню, хотя было это и не так давно(сейчас я студент 3го курса). Дело даже не в самом языке, а скорее в тогдашнем отсутствии моего интереса к нему и к проге вообще. Но вот когда у нас начался си с плюсами, я взялся за дело серьезнее. Так что именно он, наверное, мой первый язык. Я сейчас, конечно, не важная птица и 300 кк/наносек не зарабатываю, ведь я пока только учусь, но и сказать, что я жалею о таком первом языке, я совсем не могу. Не совсем пониманию комментариев о том, что с++ сложный титан одиночества. Как по мне, для изучения азов он подходит очень даже. Как раз его честность и строгость мне кажется основным плюсом, ведь за ширмой скрыто не так много, как в том же питоне, и, например, изучение ООП в нем мне кажется несколько более осмысленным занятием, хотя опять же я тот ещё спец. Но я согласен с автором статьи, человеку неподготовленному выдавать в руки с++ несколько рискованно. Он может скорее отпугнуть, а вот тот же питон, с которым и мне в последнее время часто приходится поработать, приятен и прост и дает возможность больше думать о задаче, а не о собственно коде, что, как мне кажется, может быть ценно, например, для начинающих учёных. А в целом, конечно, лучше учить хоть что-то, чем столетиями выбирать и потерять интерес, или даже учить что-то хайповое и крутое, но к чему не лежит сердце.


  1. Old_mammoth
    26.07.2021 06:18
    +1

    Первым были машинные коды М20, Автокод инженера (это уже М222), Алгол, Ассемблер, Фортран, а еще такой странный зверь - Алмир. Это разновидность Алгола с ключевыми словами на русском языке. Существовал на советской ЭВМ "Мир". Потом Pascal, C(сначала без ++, потом с плюсами, потом с #), а дальше уже разного понемножку случалось

    И как мне кажется, для первоначального обучения лучше всего подходит Object Pascal. Строгая типизация, простой синтаксис, классическая объектная модель. Для понимания общих принципов, знакомства с алгоритмами, основами ОП и т.д. подходит и детям, и совсем девственным взрослым. А уж потом можно переходить на C++, например. Или C#. Собственно, второй язык уже может быть любым. Даже - Python )). 


  1. Lavrofff
    26.07.2021 06:18

    Первый язык - чуть Паскаля в универе, потом Си, потом С++. На них и стою. 10 лет продакт опыта разработки (+ биндинг в питон и написание прослоек на нем же). Изучал так же java/sharp, но плюсы не отпускают.


  1. Alina83
    26.07.2021 12:52

    Кто начинает изучение языка Rust, может будет полезен курс на ютуб-канале d-web.


    1. Alina83
      27.07.2021 23:32

      А начинала с С#, после него Rust пока плавно идёт ​


  1. fernandos
    26.07.2021 17:57

    Второй сценарий – это Программирование интересно само по себе и человек хочет развиваться как разработчик и инженер. Здесь однозначным решением будет C++.

    Как первый язык? Я бы тогда советовал си, а с него легко перейти на плюсы. Си достаточно прост для первого языка, по нему много литературы.


  1. otostring
    27.07.2021 06:03

    Для меня, как для офисного работника, первым языком стал VBA, который помог упростить многие рабочие процессы. Дальше уже пошли SQL (сначала в связке с EXCEL), VB.NET с WinForm. На этом этапе запустил несколько приложений, которые очень помогли в работе отдела. Следующим этапом стали C# и WPF.

    Но, всё-таки для меня, самым простым и логичным остаётся VB.NET.