Какой язык программирования стоит выучить первым? (ʇdıɹɔsɐʌɐɾ: ɯǝʚɯо ņıqнqvиʚɐdu)

Original author: Quincy Larson
  • Translation
Многие начинают путь к изучению программирования, открыв поздним вечером Google. Обычно ищут что-то вроде «Как выучить…». Но как тот, кто ищет подобное, решает, какой именно язык программирования выбрать?

Кто-то, начитавшись сайтов и блогов крупнейших компьютерных компаний, рассуждает так: «В Кремниевой долине что ни слово –  то Java. Думаю, это – то, что мне нужно». Бывает и так: «Haskell. Он ведь на пике популярности. Страшно подумать, что будет дальше. Определённо – Haskell». И даже так: «Этот суслик на логотипе Go – такая няшка. Хочу знать Go».

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

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

Кликабельно:



Если рассмотреть эту схему, окажется, например, что Ruby подходит тем, кто ребёнком любил лепить из пластилина.

Выбор первого языка программирования может стать увлекательным занятием, как полусерьёзные опросники, вроде: «Кто вы из героев Квентина Тарантино?».

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

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

Выбирая первый язык стоит трезво оценить следующие факторы:

  • Рынок труда.
  • Долгосрочные перспективы языка.
  • Сложность изучения языка.
  • Что именно вы сможете создать в процессе изучения, и, показав окружающим, поддержать мотивацию.

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


Когда дело касается выбора первого языка программирования, вам придётся столкнуться с целой лавиной вариантов. Для того, чтобы немного сузить поиск, вот анализ поисковых запросов в Google за последние 12 лет, касающихся изучения программирования.



Из анализа поисковых запросов можно выяснить, что у Java были взлёты и падения. А, например, рейтинг Python постепенно рос, он стал чуть ли не самым популярным языком программирования. Есть здесь и один язык, простой, но обладающий замечательными возможностями, график интереса к которому год от года медленно растёт, хотя и находится в самом низу. Это – JavaScript.

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

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

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

Основы информационных технологий и обучение программированию



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

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

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

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

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


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

Так, в 2014-м году Python обошёл Java, став самым популярным языком программирования в ведущих курсах по информационным технологиям в США.


И я уверен, что ещё одно изменение обязательно произойдёт, да что там говорить – это уже происходит.

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

Вот результат опроса, который проводился на Stack Overflow в 2016-м году. В нём участвовало 49397 разработчиков. Более половины из них используют JavaScript.



Без JavaScript невозможна разработка веб-интерфейсов, а в последнее время, благодаря Node.js, растёт актуальность JavaScript в серверном коде. Этот язык стремительно распространяется и в другие области, такие, как разработка игр и интернет вещей.

Среди программистских вакансий JavaScript упоминается чаще, чем другие языки, если не брать в расчёт Java. Вот данные с крупнейшего агрегатора вакансий Indeed.com.



Неслучайно и то, что мы, на freecodecamp.com, собрали сообщество разработчиков, занятых проектами на JavaScript с открытым исходным кодом. За прошедшие два года более 5000 человек воспользовались Free Code Camp для того, чтобы найти свою первую работу в роли программиста.

Я, кстати, не ратую за JavaScript только потому, что обучаю на нём программировать. Всё, как раз, наоборот. Я обучаю этому языку именно потому что знание JavaScript – это верная дорога к первой работе программиста.

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

Фактор №1: рынок труда


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

Как я уже говорил, в объявлениях о вакансиях чаще всего упоминается Java. На втором же месте стоит JavaScript.

Но в случае с JavaScript надо учесть одну важную вещь. Хотя язык существует уже два десятка лет, лишь сравнительно недавно он превратился в серьёзный инструмент, с помощью которого гиганты вроде Netflix, Walmart и PayPal создают полноценные приложения.

В результате множество компаний нанимают JavaScript-разработчиков, но разработчиков этих не так уж и много.

Вот данные с Indeed.com, здесь показано соотношение вакансий и соискателей.


Итак, что мы видим. На одно место Java-разработчика приходится 2.7 программиста. В сфере вакансий, где требуется знание PHP, а также в среде iOS-разработки, складывается похожая ситуация.

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

Фактор №2: долгосрочные перспективы


JavaScript-проекты на GitHub получают, в среднем, в два раза больше pull-запросов, чем проекты на Java, Python или Ruby. И, кроме этого, JavaScript растёт быстрее, чем любой другой популярный язык.

Вот соответствующие данные GitHub Octoverse:



На экосистему JavaScript, кроме того, благотворно влияют серьёзные инвестиции, как финансовые, так и выражающиеся в человеческом капитале талантливых инженеров, от таких компаний, как Google, Microsoft, Facebook и Netflix.

Например, вклад в язык программирования с открытым исходным кодом TypeScript (расширенная версия JavaScript со статической типизацией) внесли более 100 разработчиков. Многие из них – сотрудники Microsoft и Google, которые получают зарплату за эту работу.

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

Фактор №3: сложность изучения языка


Вот карикатура о сложности языков программирования от XKCD.



Большинство программистов согласится с тем, что высокоуровневые скриптовые языки сравнительно легки в изучении. JavaScript подпадает под эту категорию, вместе с Python и Ruby.

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

Фактор №4: проекты, которые можно создать, используя полученные знания


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

Повсеместное распространение JavaScript привело к такому знаменитому высказыванию Джефа Этвуда, сооснователя Stack Overflow: «Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript».

С течением времени это высказывание, которое ещё называют «Законом Этвуда», не утрачивает актуальности.

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

Python страдает от похожих проблем. Вот что по этому поводу написал Джеймс Хэг в статье о том, что пришла пора отказаться от Python, как от основного языка, используемого при обучении программированию. Ученик спрашивает: «Как мне дать эту вот игру, которую я написал, друзьям? Или, это будет даже лучше, можно ли как-нибудь записать её на мой телефон, чтобы я мог показать её всем в школе, а им не пришлось бы её устанавливать?». Учителю же, если речь идёт о Python, остаётся лишь хмыкнуть. В двух словах тут и не ответишь.

Если же говорить о JavaScript, то вот живые ответы на вышеупомянутый вопрос. Это – приложения, которые написали члены сообщества Free Code Camp в CodePen, пользуясь браузером.

Вот игра «Simon», созданная в стиле 1970-х.


Вот – реализация математической игры Джона Конвея «Жизнь».



Вот – страница поиска для Wikipedia, стилизованная под «Звёздные войны».



А вот – игра-«рогалик» с традиционным подземельем.



Первый язык: пройтись по верхам, или копнуть поглубже?


Сначала как следует изучите один язык. Затем принимайтесь за следующий.

Если вы будете прыгать от одного языка к другому, нигде толком не задерживаясь, далеко вам не уйти. Для того, чтобы продвинуться заметно дальше «Hello World», нужно как следует изучить ваш первый язык. После этого со вторым и последующим языками будет разобраться гораздо проще.

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

  • Изучение C – это отличный способ разобраться с тем, как, на самом деле, работают компьютеры, в частности, в плане управления памятью. C особенно хорош в высокопроизводительных вычислениях.
  • C++ отлично подходит для разработки игр.
  • Python нет равных в научных и статистических расчётах.
  • Java пригодится тем, кто видит себя программистом в крупной компании.

Но сначала, повторюсь, стоит изучить JavaScript.

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

Возражение №1. JavaScript – язык медленный


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

JavaScript (речь идёт о Node.js) на порядки быстрее, чем Python, Ruby и PHP. Его быстродействие приближается к C++, Java и Go. Вот результаты одного весьма серьёзного теста производительности для различных языков программирования.



Возражение №2. В JavaScript нет статической типизации


Как Python и Ruby, JavaScript – это язык с динамической типизацией. И это, с одной стороны, удобно, а с другой – способно завести разработчика в лабиринт ошибок. Вот, например, здесь мне хочется, чтобы переменная exampleArray была массивом. Я записываю в массив значения, проверяю его длину, то есть – количество содержащихся в массиве элементов. Выглядит это так:

exampleArray = [1, 2]
-> [1, 2]
exampleArray.length
-> 2

Затем я случайно записываю в переменную строку, при этом, что ещё хуже, благодаря особенностям строкового типа данных в JavaScript, я вполне могу получить длину того, что считаю массивом, обратившись к свойству length:

exampleArray = "text"
-> "text"
exampleArray.length
-> 4

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

Если же вам, в первом языке программирования, совершенно необходима статическая типизация, я всё равно рекомендую начать с JavaScript. После этого вы сможете быстро освоить TypeScript. Вот что говорит на эту тему Алекс Эверлоф: «Для того, чтобы освоить TypeScript, нужно время, но, если вы уже знаете JavaScript, всё будет гораздо быстрее и проще».

Возражение №3. Я очень хочу создавать мобильные приложения, поэтому JavaScript не для меня


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

  1. В экосистеме JavaScript имеются несколько инструментов для разработки полноценных мобильных приложений. Например, это Angular Cordova и React Native.
  2. Для того, чтобы ваше мобильное приложение делало что-нибудь по-настоящему интересное, вероятно, ему понадобится серверная часть, построенная на некоей подходящей платформе, вроде Node.js + Express.js.

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

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



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

Безусловно, программами они пользуются. В основном это Facebook, Google Maps и некоторые другие. Их не так уж и много. В результате основной спрос на разработчиков мобильных приложений сконцентрирован в нескольких крупных компаниях.

Сложно предвидеть перспективы развития рабочих мест для мобильных программистов. При этом многие задачи, касающиеся разработки, поддержки и распространения приложений для смартфонов и планшетов легче всего решаются с помощью JavaScript. В результате компании, вроде Facebook и Google, обеспечивают мощную поддержку лучшим JavaScript-инструментам для мобильной разработки.
По состоянию на 2016-й год, практически вся работа программистов сосредоточена на веб-проектах. Всё так или иначе связано с этой огромной платформой, со «Всемирной паутиной». И грядущее поколение бытовых приборов, с которыми можно будет разговаривать, и автомобили, которые будут сами забирать детей из школы – всё это тоже будет частью веба.

Из вышесказанного следует простой вывод: учите JavaScript.

Возражение №4: Разве JavaScript это не игрушечный язык, который был создан за десять дней?


Когда слышу подобное, сразу на ум приходит этот твит. А вообще, у JavaScript, конечно, необычная история. Это провоцирует. Наверняка вам доводилось читать и слышать, как кто-то отпускает шутки об этом языке.

Кстати, некоторым невероятно нравится критиковать C++. Но, как и JavaScript, C++ преуспел несмотря ни на что. Теперь он, точно так же, практически повсюду.

JavaScript – это ни разу не игрушка.

Удачной учёбы!


В итоге хочу сказать вот что. Если кто-нибудь станет вас доставать только потому, что вы изучаете JavaScript, а не «хит сезона», просто вспомните знаменитые слова Бьёрна Страуструпа, человека, который создал C++: «Существует лишь два вида языков программирования: те, которые постоянно ругают, и те, которыми никто не пользуется».

Удачи в изучении вашего первого языка программирования!
RUVDS.com
939.21
RUVDS – хостинг VDS/VPS серверов
Share post

Comments 438

    +14
    Реквестирую бугурт от хабровчан. Как раз пятница, давайте развеемся!
      +73

      JS как первый язык?


      Как-то так:
        0
        Вы заставили меня гуглить, как сделать сложение на js вместо конкатенации :)
          0
          Привести первый операнд к числу.
            +3
            Вот с этим вся и проблема. Причем JS не скажет тебе: «Чуваак, ты тут что-то странное сделать пытаешься, может не стоит, а?».
            Первый язык не должен позволять стрелять по ногам из гранатомётов.
              0
              Это заставляет быть более внимательным… Если ты делаешь что-то вроде:

              {} + []
              

              То тут изначально что-то не то!
                +7
                А если c = a + b?
                  0
                  Для первого языка такие конструкции?
                0
                Привести оба операнда к числу :-)
                  0

                  Угу, добавив плюсик перед ними :-)

                –1
                Умножить на 1.
                  0
                  Да не надо гуглить. Все равно с его асинхронностью даже не узнаете, что у вас там. Ушло в глубины памяти и там где-то что-то случилось )))) Самое то для новичка — дебажить изначально асинхронный язык.
                +3
                Вот результаты одного весьма серьёзного теста производительности для различных языков программирования.

                А можно ссылочку?
                  +9
                  Нашёл: Performance of several languages.

                  Подозрительно низкая производительность ассемблера объясняется дубовой прямолинейностью asm-кода (например, счётчики вложенных циклов постоянно перекидываются из регистра в регистр, хотя вполне можно было выделить каждому счётчику по регистру).

                  ASM-исходник
                  %include "io.inc"

                  section .text
                  global CMAIN
                  CMAIN:
                  ;mov rbp, rsp; for correct debugging
                  ; Set to 0, the faster way
                  xor esi, esi

                  DO_LOOP1:
                  mov ecx, 10
                  LOOP1:
                  mov ebx, ecx
                  jmp DO_LOOP2
                  LOOP1_CONTINUE:
                  mov ecx, ebx

                  loop LOOP1
                  jmp QUIT

                  DO_LOOP2:
                  mov ecx, 32000
                  LOOP2:
                  mov eax, ecx
                  ;call DO_LOOP3
                  jmp DO_LOOP3
                  LOOP2_CONTINUE:
                  mov ecx, eax

                  loop LOOP2
                  jmp LOOP1_CONTINUE

                  DO_LOOP3:
                  ; Set to 32000 loops
                  MOV ecx, 32000
                  LOOP3:
                  inc esi
                  cmp esi, 50
                  jg COUNTER_TO_0
                  LOOP3_CONTINUE:

                  loop LOOP3
                  ;ret
                  jmp LOOP2_CONTINUE

                  COUNTER_TO_0:
                  ; Set to 0
                  xor esi, esi

                  jmp LOOP3_CONTINUE

                  ; jmp QUIT

                  QUIT:
                  xor eax, eax
                  ret


                  Само собой, в итоге asm машинный код исполняется в точности как написано ленивым программистом, а байт-код Java оптимизируется JIT'ом — и вуаля, сенсация: Java обгоняет ASM!
                    0
                    Больше удивило сравнение php с python, всегда думал, что наоборот
                      0
                      php в седьмой версии накачали спидами, он стал заметно шустрее
                        0
                        Мало того, в тесте php7 alpha2, который медленнее релиза, который в свою очередь на большинстве типовых задач в моих проектах на уровне hhvm.
                      • UFO just landed and posted this here
                          0
                          Вот здесь гораздо больше тестов. Результаты такие же. JS — самый быстрый интерпретируемый язык в мире. Он в 5-10 раз быстрее Питона и Руби на всех алгоритмах, которые измеряли в benchmarksgame. А измеряли они много всего разного.
                          • UFO just landed and posted this here
                              0
                              Батлнек *никогда* не бывает в производительности самого языка. Ни-ког-да.


                              https://habrahabr.ru/post/187214/
                              • UFO just landed and posted this here
                                  0
                                  Я имел в виду, что добиться выигрыша в производительности путем перехода с DFD на KJY (буквы случайны), увидев, что последний показывает лучшие результаты на синтетических тестах — невозможно.


                                  Это еще почему?

                                  1) Пишем код на PHP.
                                  2) Смотрим результаты синтетических тестов для PHP и Java.
                                  3) Переписываем код на Java.
                                  4) ???
                                  5) Profit!
                                  • UFO just landed and posted this here
                                      0
                                      Если вы перепишете код на Java «в парадигме PHP» (просто переведете синтаксис), он может с равной вероятностью оказаться быстрее, медленнее, таким же.


                                      Ну если считать вероятности как в анекдоте про вероятность встретить динозавра…
                                      • UFO just landed and posted this here
                                          0
                                          Постарайтесь понять, о чем я говорю, пожалуйста. Это не сложно.


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

                                          Пример: померяйте рендеринг динамической странички 404 без кэша (помните, мы переписываем как есть, не меняя парадигмы) на голом PHP и на Java.


                                          Возможно, я ошибаюсь, но что-то мне подсказывает, что Java отдаст 100500 страничек быстрее, чем PHP будет 100500 раз запускать процесс и умирать.
                                      0
                                      На java переходят не столько для ускорения работы, сколько для получения хоть каких-то гарантий надёжности. ИМХО.

                                      PS видел такииих монстров на java… LifeRay, например… а ведь пользуются же!
                            0
                            Посмотрел на тесты — там Java-вский JIT вполне мог повыкидывать циклы (по крайней мере частично).
                            Поэтому не удивительно, что у Java лучший резлуьтат. Но этот результат относится только к данному тесту и очень мало что говорит о производительности в реальных задачах.

                            PS: 6 секунд у Java в этом теста — это фактически время на «прогрев». Наверняка если размер одного из циклов увеличить в 10 раз, то не получится 60 секунд, а много меньше.
                              0
                              Про asm все ясно, на нем нужно уметь писать. Особенно для интеловских процессоров, Optimization Guide — 700 страниц убористого текста. А вот тест этот запустил на своей машине и результаты несколько отличаются от приведенных выше. Самым быстрым у меня оказался С/С++, по мне так очень ожидаемо. Больше всего удивил результат с JavaScript. Было бы интересно посмотреть на другие результаты

                              Я приведу относительные значения:
                              C/C++ MSVC/Windows - 1.00
                              C/C++ GCC/Ubuntu - 1.00
                              C# (.Net 4.61/Windows) - 1.22
                              C# (.Net Core/Ubuntu) - 1.50
                              Java 8 (Oracle/Windows) - 1.56
                              Java 8 (Oracle/Ubuntu) - 1.56
                              JavaScript (Edge 14.14393/Windows) - 1.27
                              JavaScript (Chrome 54/Windows) - 4.60


                              Код JavaScript
                              <button onclick="javascript: benchmark();">Run</button>
                              <div id="output"></div>
                              
                                  <script type="text/javascript">
                                      function benchmark() {
                                          const t0 = new Date();
                                          let i_counter = 0;
                                          let i_loop1 = 0;
                                          let i_loop2 = 0;
                                          let i_loop3 = 0;
                                          for (i_loop1 = 0; i_loop1 < 10; i_loop1++) {
                                              for (i_loop2 = 0; i_loop2 < 32000; i_loop2++) {
                                                  for (i_loop3 = 0; i_loop3 < 32000; i_loop3++) {
                                                      i_counter++;
                              
                                                      if (i_counter > 50) {
                                                          i_counter = 0;
                                                      }
                                                  }
                                                  // If you want to test how the compiler optimizes that, remove the comment
                                                  //i_counter = 0;
                                              }
                                          }
                                          const t1 = new Date();
                                          // This is another trick to avoid compiler's optimization. To use the var somewhere
                                          println("Counter: " + i_counter);
                                          println("Elapsed time: " + (t1.valueOf() - t0.valueOf()) + " ms");
                                      }
                              
                                      function println(s) {
                                          const element = document.getElementById("output");
                                          var para = document.createElement("div");
                                          para.textContent = s;
                                          element.appendChild(para);
                                      }
                                  </script>
                              

                            +3
                            Haskell. Он ведь на пике популярности.

                            Ох как толсто…
                              +1
                              Всем добр(ый|ая) (день, ночь, утро, вечер)!

                              Серебряной пули не существует, по простой причине что люди — разные, как и ЯП.

                              Поэтому какой яп изучать первым это уже личное предпочтение, новичка только можно ознакомить с возможностями определенных яп области, в которую он хочет погрузиться.
                                +15
                                Не согласен с автором.
                                Первый язык, который стоит выучить, это, однозначно, C/C++.
                                Зная С++ вы не только за недельку другую освоите JavsScript, но и сможете покопаться в его движке и узнать все его секреты.
                                Зная С++ вы так же довольно легко сможете изучить любой другой язык, который там сейчас в моде, и при этом будете специалистом более высокого класса.

                                Не тратьте свое время на JavaScript, начинайте с базовых языков.
                                  +25
                                  Как человек, который не только пишет на C++, но и, о ужас, любит его (как и Java), скажу, что начинать изучение программирования с C++ — самый верный способ навсегда отвадить себя от этого занятия.

                                  Я учился на Pascal. Синтаксис C казался непонятным, потому что там мало слов и много хитрых скобочек. Если бы мне в тот момент кто-то показал C++, я бы испугался, подумал, что это ужас-ужас-как-сложно и сбежал бы из этой темы. Возможно, навсегда.

                                  У JS есть одно неоспоримое преимущество: она имеет мощнейший среди всех UI, установленный абсолютно на ккаждом компьютере. Остальные плюсы-минусы для новичка малозначительны.
                                    +4

                                    Как С++-ник с некоторым стажем, категорически с вами не согласен. С++ — просто рассадник костылей и всяческих неочевидностей. Половина его 1600-страничного (на данный момент) стандарта — либо Undefined Behavior, либо Implementation Defined. Утрирую конечно, но впечатление иногда именно такое. А с инструментарием "из коробки" вообще печаль-беда.

                                      +4

                                      В универе 5 лет писал лабы на C++ и не знал ни про какие undefined behaviors) А потом когда узнал, решил, что ну его нафиг все это изучать, и занялся веб-программированием.
                                      Это я к тому, что для обучения необязательно лезть в дебри промышленного применения языка. Int/float, строки, управление памятью, классы с наследованием — этого достаточно для получения уверенных навыков. Потом можно переходить на что-то другое. Так что считаю C++ нормальным вариантом для первого языка.

                                        0

                                        Увы, никогда не знаешь из какой норы вылезет хорёк и грызанёт за пятку.
                                        Я бесспорно уважаю С++. Но он становится всё более и более монструозен. Причём бестолково монструозен. В 17-м стандарте вы сможете использовать зета-функцию Римана и другой матан. Но по-прежнему будете выписывать типы итераторов руками — потому что все ждут Благословенных Рейнджей. Пренебрежительность тут не к самому предложению, которое считаю отличным, а к тому, что если его примут к 20-му — я ооочень сильно удивлюсь. Или втянете Буст, который размером со среднего слонопотама — и практически не подлежит декомпозиции.
                                        В общем давайте закончим. Не хочу разводить очередной холивар.

                                          +2

                                          А кто то до сих пор пишет типы итераторов руками вместо auto, пользуясь 17-ым стандартом?

                                            +1

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

                                              0
                                              Я пишу. Не всегда, но часто. Просто чтобы явно обозначить тип.

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

                                              Уж лучше я напишу vector::const_iterator руками.
                                            +1
                                            В универе 5 лет писал лабы на C++ и не знал ни про какие undefined behaviors)
                                            Лабы можно вообще писать на чём угодно, хоть на FORTRANе. А вот как только начинаешь писать что-то мало-мальски серьёзное — так UB и начинает «кусаться». А поскольку список UB — это не то, про что должен знать разработчик компилятора, а то, что должен знать каждый программист (иначе он не сможет их избегать), то да — для обучения C++ не очень-то годится…
                                              +2

                                              Речь идет о языке для обучения, а не для написания чего-то мало-мальски серьезного. При обучении нет программ, которые идут в продакшн. Лаба либо работает, либо нет, это заметно сразу. Тем более что с оптимизацией никто не заморачивается, и программа разрабатывается и компилируется в debug-режиме. Для обучения условиям, циклам и целочисленным вычислениям C++ вполне подходит.


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

                                                +1
                                                Речь идет о языке для обучения, а не для написания чего-то мало-мальски серьезного.
                                                Погодите — а в какой момент «обученный» таким образом программист сможет писать что-то серьёзное?

                                                Если вы используете для обучения «обучающий язык» (неважно — Pascal или Logo), то всё просто: пока вы обучаетесь — вам неважно что там с UB происходит, начнёте работать — изучите всё, что нужно в рамках изучения C++.

                                                А если вы сразу на C++ ваши лабы пишите — то как и в какой момент вы научитесь не использовать «по ошибке» UB?

                                                В каждом языке есть свои особенности, которые должен знать каждый программист, и которые новичок не знает. Это не значит, что новичкам ни один язык не подходит.
                                                Почему же. Им подходит любой язык в котором подобные особенности встречаются достаточно редко при написании реальных программ. C++ к ним, увы, не относится.
                                                  0
                                                  Погодите — а в какой момент «обученный» таким образом программист сможет писать что-то серьёзное?

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


                                                  Если вы используете для обучения «обучающий язык» (неважно — Pascal или Logo), то всё просто: пока вы обучаетесь — вам неважно что там с UB происходит, начнёте работать — изучите всё, что нужно в рамках изучения C++.

                                                  То есть, учился он на Паскале, потом приходит к работодателю и говорит "Я на C++ не писал, что такое UB не знаю, возьмите меня на работу, я все изучу честно-честно".


                                                  А если вы сразу на C++ ваши лабы пишите — то как и в какой момент вы научитесь не использовать «по ошибке» UB?

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


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

                                                    0
                                                    Человек, выучивший 1 ЯП, идет устраиваться на работу? И где-то таких берут?
                                                      0

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

                                                        0

                                                        Если десктопное приложение, то почему бы и нет. Да если даже Pascal, SQL, Prolog и Lisp. Без знания C++ его на работу с C++ никто не возьмет. Значит он должен изучить его при обучении. А чтобы устранять UB в конструкциях языка, надо сначала научиться их составлять. И здесь нет большой разницы, писать


                                                        Function f(a: integer, b: integer): integer;
                                                            f := a + b;
                                                        End;

                                                        или


                                                        int f(int a, int b)
                                                        {
                                                            return a + b;
                                                        }
                                            +10
                                            Зная С++ вы не только за недельку другую освоите JavaScript, но и сможете покопаться в его движке и узнать все его секреты.

                                            Умея управлять космическим кораблём вы не только за недельку-другую освоите радиоуправляемый вертолёт, но и сможете покопаться в его движке и узнать все его секреты. Вперёд, на симулятор Союза ТМА!
                                              0
                                              Ну такое… Радиоуправляемый вертолет реально можно спокойно за неделю освоить… )
                                                +1
                                                Ну да, а предлагается для этого сначала на космическом корабле поучиться :)
                                                  +3
                                                  Вы недооцениваете всю извращенность JavaScript :)
                                              –1
                                              Никогда не забуду лицо своего товарища, изучавшего С++ в универе, когда я впервые показал ему функцию высшего порядка.

                                              JS хорош для образования тем, что он мультипарадигмален — на нем можно изучить и ООП и функциональщину.
                                                0
                                                В C++ это называется метапрограммирование. Шаблон принимает одну функцию, а возвращает другую, сплошь и рядом встречается.
                                                  +2
                                                  Никогда не забуду лицо своего товарища, изучавшего С++ в универе, когда я впервые показал ему функцию высшего порядка.

                                                  template<typename In>
                                                  auto twice(In x, int arg) {
                                                      return [=] {
                                                          x(arg);
                                                          x(arg);
                                                      };
                                                  }

                                                  — Не-не-не, Дэвид Блейн, это же шаблоны, как я это в библиотеку скомпилирую?


                                                  std::function<void()> twice(std::function<void(int)> x, int arg) {
                                                      return [=] {
                                                          x(arg);
                                                          x(arg);
                                                      };
                                                  }

                                                  Много чего плохо в C++, но с функциями высшего порядка вроде ОК :)

                                                  +10
                                                  Зная С++

                                                  Хорошая шутка.
                                                  +12
                                                  В экосистеме JavaScript имеются несколько инструментов для разработки полноценных мобильных приложений

                                                  С морем костылей и велосипедов изнутри
                                                    0
                                                    ELM гораздо проще и обладает всеми необходимыми возможностями.
                                                      +17
                                                      Не слушайте хипстеров, учите Си
                                                        +2
                                                        Я, кстати, не ратую за JavaScript только потому, что обучаю на нём программировать. Всё, как раз, наоборот. Я обучаю этому языку именно потому что знание JavaScript – это верная дорога к первой работе программиста.
                                                        И больше ничего, кроме JS, после этого заявления, в статье не оказалось. Слишком сильный упор на JS, я бы не хотел начинать с него, когда вижу, что на нём частенько пишут…
                                                        • UFO just landed and posted this here
                                                            –2
                                                            Если человек только учится программировать, то вопрос ни в коем случае не должен стоять про используемость этого ЯП на практике. Поэтому только Паскаль!
                                                              +1
                                                              Что Вам мешает открыть консоль в браузере и начать писать на js? :)
                                                              • UFO just landed and posted this here
                                                                  0
                                                                  Ну если брать задачи из книжек, написанных когда веб только развиватся начал, то пожалуйста, проблем хватает. Но так-то и программа обучения должна технологии соответствовать…

                                                                  Я не в коем не агитирую брать JS как единственный подходящий для обучения язык, но вот если меня спросят, что учить, чтобы попасть в it, то я скажу веб, т.к. за другие сферы я не могу судить и сказать человеку что-то вроде: «когда начнет получатся, то работа найдеться.».

                                                                  О всяких языках не имеющих практического применения в наше время я вообще говорить не буду, т.к. только если ты студент, то можешь себе позволить потратить время на изучение «мертвого» языка для крепкого освоения основ, а у студента как бы и выбора не будет между языками, ему что сказут учить, то он и будет учить.
                                                                  • UFO just landed and posted this here
                                                                      0
                                                                      У людей с первых минут трудности с формализацией задачи на естественном языке, с понятием «переменная», с линейностью программы (ну, как так получается, что раньше исполняется то, что выше? почему так?). Госспаде, да они больше тушуются, пытаясь английские буквы на клавиатуре найти, а уж Home, End и Enter при них нажмешь — и ступор. И среда разработки, которая что-то там подсказывает (исходя из исходного кода с опечатками и ошибками), и это ни в какие ворота не лезет.


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

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

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


                                                                      Оффтоп: эту фразу надо на русском языке разбирать как отличный пример того, как можно в одном предложении перепутать «тся» и «ться» в обе стороны.
                                                                        +2
                                                                        эту фразу надо на русском языке разбирать

                                                                        Оффтоп: эту фразу надо на уроках русского языка разбирать, как отличный пример того, как…
                                                                        Извините за рекурсию
                                                                          0
                                                                          image

                                                                          Оффтоп 2-го уровня: на Хабре можно не извиняться за рекурсию.
                                                                    –2
                                                                    JS сам по себе даже файл с диска не в состоянии открыть.
                                                                      –1
                                                                      Вы предлагаете разрешить непонятным скриптам с любого сайта ковырятся на пользовательских компьютерах? :)
                                                                        +4
                                                                        Нет, но давайте хотя бы обучаемому человеку разрешим это делать.
                                                                        +1
                                                                        В ноде — вполне себе в состоянии.
                                                                          0
                                                                          давать ноду человеку неспособному, пока, написать даже цикл? злой вы человек
                                                                    +12
                                                                    Сам подход вообще очень забавен. «Хочу заниматься физическим трудом, какой инструмент лучше освоить — лопату, кирку или пилу?» Стать программистом — это вообще как понимать? «Хочу фигачить пальцами по клавиатуре, набивая на экране буковки, чтобы потом нажать на кнопочку, и буковки превратились в красивую картинку?» Что конкретно интересно? Предметная область какая? Именно ей инструменты определяются. Обучение программированию ребенка — одно, игрушки писать — другое, веб-сайты — третье, системное программирование — четвертое, суровый мир энтерпрайз-приложений — пятое, если интересна собственно computer science — шестое…
                                                                      +2
                                                                      И ещё этот жуткий подход — не хочу изучать ничего, кроме того, что немедленно позволит получить высокооплачиваемую работу. Это подход карьериста, а не программиста.

                                                                      На эту тему хорошо говорит один из авторов Agile манифеста «Uncle» Bob Martin. Рекомендую его лекцию «The Future of Programming».
                                                                        +1
                                                                        Полностью согласен.
                                                                        Одно дело показать человеку который не планирует зарабатывать на жизнь программированием как облечать себе жизнь простыми скриптами, или как настроить свою веб-страницу ( тут любой питон или js подойдут ), и совсем другое учить будущих программистов. Во втором случае я уверен, что необходимо начинать с языка который не прячет управление памятью, а напротив дает программисту полный контроль над программой. Черные ящики конечно штуки хорошие, но я считаю что человек должен разбираться в инструментах которыми он пользуется.
                                                                        +30
                                                                        Сложно придумать хуже язык для изучения первым чем JS. Особенно, если заниматься самообучением. Вот я ввожу в гугле JavaScript для чайников и мне предлагают написать HTML страничку чтобы запустить мой первый код. Допустим это не так сложно, и я немного освоился, опустим сложности с this, === и наследованием. Теперь я хочу написать что-то минимально полезное с интерфейсом, мне опять нужно либо лезть в Node.js, либо в HTML/css, чтобы получить консольный или нормальный интерфейс.

                                                                        А теперь сравните этот старт с C#, Microsoft предлагает бесплатное IDE, идеальное для разработки. Понятное и простое поведение this, сложность может возникнуть разве что с пониманием ссылочных и значимых типов. Если нужен интерфейс, то в той же IDE есть визуальный инструмент для его создания.

                                                                        У меня создалось такое впечатление, что автор статьи ни разу не пытался никого научить программированию и из-за этого оторван от реальности. Сразу вспоминается смешная картинка с кривой обучения. Если хотите кого-то отговорить изучать программирование, то лучше JavaScript'a будет, наверное, только Lisp или Brainfuck.
                                                                          +9

                                                                          Определенные диалекты Lisp получше JavaScript будут. Совершенно несправедливо записали вы его в один ряд с Brainfuck.

                                                                            –5
                                                                            Lisp, возможно, хороший язык, не зря же он жив до сих пор. Но как первый язык программирования я бы всё-равно его советовал на уровне с Brainfuck.
                                                                              +10
                                                                              Тем не менее, его долгое время изучали именно как первый (см SICP), и вполне успешно, похоже.
                                                                                –4
                                                                                Для кого-то и ассемблер был первым и успешно, но это не значит, что это хороший вариант для старта сегодня.
                                                                                  +2

                                                                                  Вы совершенно неверно ассоциируете Lisp с чем то древним. Возьмем диалект Clojure, современный и активно развивающийся диалект lisp под JVM, за него могу сказать что он намного проще чем JavaScript и стартануть с него в современную фронтенд веб-разработку на ClojureScript намного проще чем скажем с ворохом js либ в виде react+redux+babel+webpack+lodash+npm+nodejs

                                                                                    –4
                                                                                    От вас это читаю впервые. Последний раз сталкивался с Lisp в университете и исхожу из собственного опыта. Я не говорю, что Lisp плохой язык, я говорю, что для первого языка он не подходит на мой взгляд.
                                                                                      +3
                                                                                      Я после университета потом долго боялась даже смотреть на Lisp, настолько отбили всё желание. Понадобилось почти 10 лет, чтобы распробовать. Насчёт первого языка не знаю, личного опыта нет, поэтому и ссылаюсь на SICP (это всё-таки опыт преподавателей лучших вузов, проверенный на тысячах студентов). Но последнее время я иногда балуюсь теорией языков программирования и вижу, что Lisp потрясающе хорош для понимания того, как работают другие языки.
                                                                                      0
                                                                                      Посоветуйте материалы, по которым можно было бы стартонуть в современный web девелопинг на Clojure. ( я фанат идеологии lisp)
                                                                                      Спасибо, с уважением.
                                                                              +2
                                                                              Хм, позвольте не согласиться с вашей логикой.

                                                                              Теперь я хочу написать что-то минимально полезное с интерфейсом
                                                                              в HTML/css, чтобы получить консольный или нормальный интерфейс.

                                                                              Так вы хотите или не хотите написать что-то с интерфейсом?

                                                                              А теперь сравните этот старт с C#, Microsoft предлагает бесплатное IDE

                                                                              Класс, то есть написать пару строчек в любом текстовом редакторе, сложнее чем установить всю эту громадину от MS? Не говоря уже, о разработке на любой операционной системе кроме Windows.
                                                                                0
                                                                                Можете соглашаться, можете нет, но есть сухие факты:
                                                                                1) Мало кому нравится писать консольные программы и радоваться их исполнению, особенно на старте изучения программирования, и стоит отметить, что радость очень хороший мотиватор. Но ознакомление с синтаксисом лучше начинать с консольного hello world в четыре строки, чем с целой мешанины html и js.
                                                                                2) Судя по данным Net Applications доля linux 2%, доля Macos 10%, т.е. в 88% случаев windows уже стоит. А установить Visual Studio гораздо проще, чем пытаться понять почему страничка написанная в блокноте работает, но подключить библиотеку из js файла не получается. Ах да, надо установить IDE для разработки, ой, в случае с JS ещё надо найти бесплатную, а ещё надо её настроить, если вдруг всё не настроено по умолчанию.

                                                                                В общем хотел бы я посмотреть на таких самоучек, которые решать начать с JS.
                                                                                  0
                                                                                  Судя по данным Net Applications доля linux 2%, доля Macos 10%
                                                                                  Да, только эти 10% + 2% как раз и есть программисты.)

                                                                                  А установить Visual Studio гораздо проще, чем пытаться понять почему страничка написанная в блокноте работает, но подключить библиотеку из js файла не получается.
                                                                                  Серьёзно? Установить VIsual Studio + разобраться в синтаксисе C#, построить UI (а мы же говорим именно про него) легче чем подключить js файл к html?

                                                                                  Ах да, надо установить IDE для разработки, ой, в случае с JS ещё надо найти бесплатную, а ещё надо её настроить, если вдруг всё не настроено по умолчанию.
                                                                                  Ну Вы или намеренно лукавите, или не знаю. В отличии от C#, для JS никакая IDE ненужна. Как раз это я и написал вам. Я честно говоря только одну платную IDE для JS — WebStorm, да и 90% людей используют Sublime/Vim/Notepad++
                                                                                    –2
                                                                                    Да, только эти 10% + 2% как раз и есть программисты.)

                                                                                    Т.е. я уже не программист? И тот, кто хочет стать программистом, сразу устанавливает себе Linux или бежит покупать Mac, только потом начинает изучение?

                                                                                    Серьёзно? Установить VIsual Studio + разобраться в синтаксисе C#, построить UI (а мы же говорим именно про него) легче чем подключить js файл к html?

                                                                                    т.е. при изучении JS в синтаксисе разбираться не надо? И да, в Visual Studio легче построить интерфейс и навесить на него обработчики нажатий, чем сделать то же самое в JS+HTML.

                                                                                    В отличии от C#, для JS никакая IDE ненужна.

                                                                                    Да что вы говорите? Откройте в хроме index.html с подключенной js. Что вы увидите? Что JS не загрузился из-за ограничений безопасности, оказывается нужно запускать хотя бы на локальном сервере, который в Webstorm работает сам по себе, а в перечисленных вами редакторах надо настраивать, о чем я и написал.
                                                                                      +1
                                                                                      Логика совсем потерялась.)
                                                                                        –5
                                                                                        У вас, да, логика потерялась.
                                                                                        +1
                                                                                        Подключаемый js можно скачать в папку к html и не будет никаких ограничений безопасности.
                                                                                          –2
                                                                                          Ну конечно же, всякий начинающий знает все эти нюансы. Вот каждый раз сталкиваясь с новой задачей я мечтаю о том с какими новыми трудностями столкнусь, а не о том как решится моя проблема, пфф, жалкие людишки, им лишь бы всё по проще.
                                                                                            +1
                                                                                            Это вовсе не нюанс. На сайте любой js библиотеки есть ссылка скачать. И только как альтернатива ссылка на какой-нибудь cdn. А если начинающий делает по уроку, то тем более никто не скажет подключай ссылкой. Урок же для начинающих. Вот когда я делал Three.js, то да, могли бы и написать, что локально модель в .obj файле не подключишь.
                                                                                      0
                                                                                      Абсолютная правда.
                                                                                      Хотя бы потому что для того чтобы писать на JS нужно понимать браузер, сервер, хтмл и много других сложных по своей сути вещей. Работал с веб приложением один раз — мне джаваскриптист сказал: выгрузи на сервер сам, я занят — так я целый день убил.
                                                                                      Другой пример — с тем же c++. Когда начинал с ним работать, нормальную визуальную среду разработки с графикой и прочим, которая работала бы с нужной мне программой я искал месяц. Ещё месяц конфигурацию рнастраивал. Если бы я учился на программиста в университете и спрашивал бы у уже знающих, тогда да. Но самоучке которому не кого спросить с c и c++ начинать — это очень сложно.
                                                                                      Мне подошёл паскаль как первый язык, потом в университете делфи со средой разработки и всё отлично, пото и на питон, и на с#, и на с++ переход безболезненный (на с++ — почти безболезненный… боль доставляет только компилятор, который делает то что хочет он, а не то что предписывают инструкции).
                                                                                        0
                                                                                        Мне джаваскриптист сказал: выгрузи на сервер сам, я занят — так я целый день убил.
                                                                                        А причём тут JavaScript? У нас задача «выгрузить в прод» может и неделю занять, хотя никакого JavaScript'а мы не касаемся.

                                                                                        компилятор, который делает то что хочет он, а не то что предписывают инструкции
                                                                                        Извините, но когда компилятор делает не то, что продписывают инструкции/спецификации (ISO/IEC 14882, POSIX и прочие) — то это ошибка и за это нужно «бить по рукам»^H^H^H^H^H заводить багрепорты.
                                                                                      0
                                                                                      Устанавливать все равно нужно что-то. Даже джава стоит далеко не на всех машинах.
                                                                                      +4
                                                                                      Microsoft предлагает бесплатное IDE, идеальное для разработки.

                                                                                      Ни в коем случае не критикую ничьи программные продукты, но так перехвалить ни один не могу )
                                                                                        +1
                                                                                        Я бы так не сказал, если бы не перепробовал вагон и маленькую тележку разных IDE для разных языков. И на мой взгляд Visual Studio одна из лучших наряду с продуктами JetBrains.
                                                                                        +3

                                                                                        Я бы наоборот наверное, сейчас бы пробовал первым учить как раз Lisp (Scheme, почему бы и нет?), хотя бы до уровня "умею решать алгоритмические задачки".

                                                                                          0
                                                                                          Попробуйте, будет интересно узнать о результатах.
                                                                                            0

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

                                                                                          0

                                                                                          Не знаю как сейчас, но когда мы учились, у нас курс "введение в програмирование" был на паскале, а вот в MIT на scheme. А это диалект лиспа.

                                                                                          +16
                                                                                          Будь Эдсгер Дейкстра сейчас жив, он бы назвал JS и PHP Бэйсиком нового поколения. Если начинать программировать с них, то крепко привыкаешь к магии и костылям, а переучиться потом стоит немалых усилий.

                                                                                          Наиболее подходящими для обучения программированию языками считаю Python и C#.
                                                                                            0
                                                                                            Мне кажется, люди слишком серьёзно относятся к этому высказыванию Дейкстры о бэйсике. Не так-то много навыков приобретается в начале пути, чтобы потом «переучиваться». Верю, что можно начать на PHP и стать, на пример, хадкорным сишником… Но первый язык не должен отвлекать от самого программирования, поэтому ИМХО в C# слишком много того, что не нужно на начальном этапе, я имею в виду и фишки в самом языке и IDE. Python — практически идеальный вариант, разве что он не статически типизированный да и той самой магии там тоже хватает.
                                                                                              0
                                                                                              Сужу по себе — начинал как раз с С, но быстро попал под развращающее влияние PHP. Наиболее вкусными возможностями казались как раз те, которые считаются «плохим тоном» — register_globals, словаремассивы, написание кода прямо внутри верстки.

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

                                                                                              Для обучения C# лучше всего использовать в связке с LINQPad, а не с Visual Studio. Там можно сразу запускать простые примеры, не загружая новичку голову структурой проекта, классами и пространствами имён.
                                                                                                0
                                                                                                То что в языке с давних времен остались вещи, которые, не стоит использовать — не означает, что вы обязаны их использовать. Не надо говорить, что язык плохой, если вы не можете прити к хорошему решению задачи.
                                                                                                  0
                                                                                                  Я вам обратное скажу — если на языке возможно прийти к хорошему решению задачи, это еще не значит, что сам язык хороший. В руках мастера любой инструмент хорош, но мы же говорим об обучении новичков, которые не знают тонкостей, а тут — чем проще сделать ошибку, тем хуже.
                                                                                                    0
                                                                                                    Просто надо изучать не по учебмным материалам, которым больше десяти лет. По php есть хорошие ресурсы, и если изучать язык следуя им, Вы можете даже не узнать, о возможности написать такую «каку»
                                                                                                      0
                                                                                                      Опять же, это доказывает только то, что php возможно выучить, если знать, что именно читать. Но новичок не знает, а в магазинах до сих пор продаются книги про PHP 5/6 (sic!) и «джентельменский набор веб-мастера».

                                                                                                      Я полностью согласен, что при наличии знаний\опыта\таланта можно достигать впечатляющих результатов с помощью любого инструмента. Точно так же я не спорю с тем, что в любой технологии есть свои недостатки. Но оба этих утверждения — чистой воды демагогия, потому что всегда можно сравнить два инструмента и определить, какой из них для конкретной задачи подходит больше. В данном же случае PHP, при всех его плюсах и возможностях, объективно проигрывает Питону и Шарпу по пригодности для обучения.
                                                                                                        0
                                                                                                        В питоне есть полноценное ООП? (это не в честь спора)
                                                                                                        Можете несколько доводов в его сторону, может будет мне причина хотябы поверхностно его изучить для расширения кругозора.
                                                                                                          +1

                                                                                                          Если Вы хотите ознакомиться с полноценным ООП, посмотрите Smalltalk/Pharo.

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

                                                                                                              Да вроде наличие полноценного ООП никогда не было критерием популярности языка… Когда прочитаете "Pharo by example" поймёте, что ООП в полноценном виде ни в одном мейнстрим языке нет в наличии. Чаще всего мы имеем банальное процедурное программирование с классами, ну и, благодаря исторической роли C++, это принято ассоциировать с ООП.

                                                                                                                0
                                                                                                                Вы правы, но ООП, на сколько мне известно, все еще одна из самых востребованных парадигм, так что, по идее, при изучении программирования очень важно освоить эти принципы и научится их применять. Обязательно прочту, спасибо.
                                                                                                                  0
                                                                                                                  Ну, в Javascript и в Lua (кстати, автор статьи упустил замечательный язык!!) есть настоящее ООП: Мы создаём именованные сущности (объекты), которые содержат в себе данные (поля объектов) и методы, и эти объекты могут обмениваться сообщениями, порождать другие объекты… В общем, по заветам Алана Кэя.
                                                                                                                    0

                                                                                                                    В JavaScript действительно не самая плохая поддержка ООП, но есть существенные минусы:


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

                                                                                                                    Так же его нельзя назвать объектно-ориентированным языком, т.к.


                                                                                                                    1. не всё является объектами
                                                                                                                    2. не все действия возможно выполнить через посылку сообщений объектам (из тривиального: операторы не являются методами)
                                                                                                                      0
                                                                                                                      нет сокрытия данных (можно напрямую обращаться к полям объекта без посылки сообщений)

                                                                                                                      Сокрытие данных есть.


                                                                                                                      function makeObject() {
                                                                                                                          var b;
                                                                                                                          var self = {};
                                                                                                                          self.getB = function() { return b;};
                                                                                                                          return self;
                                                                                                                      }
                                                                                                                      
                                                                                                                      var obj = makeObject();
                                                                                                                      var newB = obj.getB();

                                                                                                                      Вот так как-то.

                                                                                                                        0

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

                                                                                                                          0

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

                                                                                                                            0
                                                                                                                            Во-первых не в любом языке можно это сделать.

                                                                                                                            А в каком нельзя?


                                                                                                                            Тут усилия, как несложно убедиться — минимальны.

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

                                                                                                                              0
                                                                                                                              А в каком нельзя?

                                                                                                                              В php третьем нельзя было, насколько я помню.


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

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


                                                                                                                              Если это считать минимальными усилиями для поддержки сокрытия данных, то можно и чистый С назвать объектно-ориентированным :-)

                                                                                                                              Объектно ориентированное программирование можно осуществлять на разных языках, только с разными усилиями. В случае с javascript — усилия для сокрытия переменных — минимальны. Насчёт Си — не знаю, не пробовал.

                                                                                                                                0
                                                                                                                                В php третьем нельзя было, насколько я помню.

                                                                                                                                Не знаю, не застал эту версию… но думаю, что варианты были даже там.


                                                                                                                                Нет тут никакого переключения подходов.

                                                                                                                                Ну как же нет… Вы даже не замечаете, что замыкание использовали?

                                                                                                                                  0

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


                                                                                                                                  Что касается замыкания — да, использовано замыкание, для того, чтобы реализовать определённый аспект ООП. Подход как был объектно ориентированным, так и остался.

                                                                                                                                    0

                                                                                                                                    Не думаю, что я буду заниматься археологическими исследованиями PHP )))
                                                                                                                                    Просто ещё раз подчеркну, на мой взгляд, принципиальный момент — чтобы назвать язык объектно-ориентированным мало иметь возможность обеспечить сокрытие данных в объекте, нужна невозможность создания объекта без такого сокрытия.
                                                                                                                                    Ну а подход, его можно и в чисто функциональных языках спокойно применять, но там хоть есть чёткое осознание что и зачем. В JS же такая смесь парадигм, которая не позволяет их как-то разграничить.

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

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


                                                                                                                                      Насколько мне известно, никакая. Язык вообще не обязан скрывать данные, чтобы назваться полноценным ООП. Возможно, наоборот: чтобы быть ООП в первоначальном смысле этого слова, язык не должен скрывать никакие поля. ООП пытается моделировать реальный мир, и расскажите, пожалуйста, например, какие поля у объекта класса "трактор" "скрыты разработчиком" для прочтения "методами" объекта класса "человек"?

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

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


                                                                                                                                        An object can do exactly three things:
                                                                                                                                        • Hold state (references to other objects).
                                                                                                                                        • Receive a message from itself or another object.
                                                                                                                                        • In the course of processing a message, send messages to itself or another object.

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

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

                                                                                                                                        Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).


                                                                                                                                        Но напоминаю, что я просто хотел сказать, что на javascript можно делать закрытые поля.

                                                                                                                                          0
                                                                                                                                          Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).

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

                                                                                                                                            0
                                                                                                                                            Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).

                                                                                                                                            Да это давно уже не новость. Большая часть мейнстрима — процедурные языки с элементами ООП.

                                                                                                                                              –1
                                                                                                                                              Большая часть мейнстрима — процедурные языки с элементами ООП.

                                                                                                                                              И, собственно, если исходить из вашего определения — нету большой разницы между поддержкой ООП в javascript и в java, C++ и php.

                                                                                                                                                0

                                                                                                                                                Неверное понимание. И то, и другое является ООП. Никто не говорил, что это может быть сделано только одним способом, и то, что мы видим javascript, java, python и tcloop с совершенно разными подходами — иллюстрация того, насколько разными могут быть разные подходы.

                                                                                                                                                  –1
                                                                                                                                                  Неверное понимание. И то, и другое является ООП

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

                                                                                                                                                    0

                                                                                                                                                    Хорошо, что теперь и Вам понятно, что в Java нет нормального ООП :-)

                                                                                                                                                      –1

                                                                                                                                                      Скажите пожалуйста, как можно было из моих слов


                                                                                                                                                      Собственно я и хотел сказать, что Source неверно понимает тему.

                                                                                                                                                      Можно было сделать вывод, что мне понятно, что в Java нет нормального ООП?


                                                                                                                                                      Но вообще интересно, в каком языке нормальное ООП есть?

                                                                                                                                                        +1

                                                                                                                                                        Это была ответная шутка :-)


                                                                                                                                                        Но вообще интересно, в каком языке нормальное ООП есть?

                                                                                                                                                        ООП на базе классов — Smalltalk
                                                                                                                                                        ООП на базе прототипов — Self


                                                                                                                                                        А вообще дело, конечно, не в "нормальности"… а в чистоте парадигмы.
                                                                                                                                                        Концепция обязана быть сформулирована предельно конкретно и настолько коротко, насколько возможно… иначе Вы просто будете растекаться мыслью по древу на каждом шагу, подгоняя под неё что угодно.
                                                                                                                                                        Двумя комментариями ниже я привёл определение ООП в 3-х коротких предложениях. А теперь попробуйте сформулировать определение ООП так, чтобы оно в полной мере описывало то, что понимается в C++, Java, C# под этой аббревиатурой. Скорее всего, Вы с удивлением поймаете себя на использовании терминов, которые относятся к программированию в целом, а не конкретно к ООП, типа абстракция, полиморфизм и т.д..

                                                                                                                                                          –1

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

                                                                                                                                                            0
                                                                                                                                                            У нас с вами получается, что ООП это одно, а поддержка ООП это другое, что в общем, логично.

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

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

                                                                                                                                            Нет такого в определениях ООП, нет запрета на получение состояния объекта извне.
                                                                                                                                              0

                                                                                                                                              Приведите определение ООП, из которого не следует такой запрет.
                                                                                                                                              Из классического определения он явно вытекает:


                                                                                                                                              1. Everything is an object.
                                                                                                                                              2. Objects communicate by sending and receiving messages (in terms of objects).
                                                                                                                                              3. Objects have their own memory (in terms of objects).
                                                                                                                                                0

                                                                                                                                                Я не вижу ни 4. Objects own memory could be set to be inaccessible to other objects, ни в явном виде, ни в виде следствий из 1,2,3. Возможно, я что-то не понимаю, приведите, пожалуйста, логическую цепочку, как из трёх пунктов следует ограничение.

                                                                                                                                                  0

                                                                                                                                                  Из третьего пункта следует, что у объектов есть состояние. Из первого пункта — что кроме объектов в программе ничего нет, а из второго — что объекты общаются только через сообщения.
                                                                                                                                                  А теперь вопрос: как можно получить доступ к состоянию одного объекта из другого объекта, если они могут взаимодействовать исключительно через сообщения?

                                                                                                                                                    0

                                                                                                                                                    Возможно, посылая сообщение "получить значение поля такого-то"?


                                                                                                                                                    Это сообщение запрещено?


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

                                                                                                                                                      0
                                                                                                                                                      Возможно, посылая сообщение "получить значение поля такого-то"?

                                                                                                                                                      Именно. Фишка в том, что механизм посылки/приёмки сообщений должен быть един в рамках конкретного языка (иначе это уже будет N разных понятий, а не одно — сообщения). Как Вы правильно заметили, это необязательно вызов метода и для полной поддержки ООП наличие методов не требуется. Но в большинстве мейнстрим-языков отправка сообщения — это именно вызов метода.

                                                                                                                                                        +1

                                                                                                                                                        Итак, парадимга ООП не требует наличия запрета доступа к полям или методам, а реализация такого запрета — это уже воля разработчиков конкретного ЯП, продиктованная их желанием сохранить язык "последовательным" или "единообразным", конкретным выбором реализации понятий "сообщение" и "собственная память объекта" и так далее. Ограничения в такой реализации появляются икусственно — как следствие конкретного дизайна языка.
                                                                                                                                                        И вполне возможно, кто-то мог оказаться способен сделать это достаточно удобно и без искусственных ограничений.

                                                                                                                                                          –1
                                                                                                                                                          Итак, парадимга ООП не требует наличия запрета доступа к полям или методам

                                                                                                                                                          Вы опять потеряли мысль… Доступ к полям через посылку сообщений и прямой доступ к полям — это принципиально разные вещи. И прямого доступа к полям в рамках ООП быть не может.

                                                                                                                        0
                                                                                                                        Pharo by example

                                                                                                                        Занятно, конечно.
                                                                                                                        И иерархия стандартных классов да, увесистая и куда более подробная, чем у прочего множества ЯП.
                                                                                                                        SmallTalk/Pharo — по сути такой себе конструктор языков.
                                                                                                                        Однако, на практике не так много тех, кто захотел бы унаследовать от Magnitude и создать конкурента Integer'у (и Boolean то!).
                                                                                                                        Оттого, множество ЯП (созданных позже SmallTalk'а) начинает иерархию классов с уже «готовых» «привычных» типов данных. Их оказалось достаточно для абсолютно подавляющего числа задач.
                                                                                                                          0

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

                                                                                                                            0
                                                                                                                            Да, это свежо в мире современных языков.

                                                                                                                            Видать, мировоззрение у Кэя несколько ближе к реальности, чем у большинства.
                                                                                                                        0
                                                                                                                        А можно уточнить, что имеется в виду под полноценным ООП?
                                                                                                                        Инкапсуляции в python нет в принципе — но есть соглашение, как следует называть методы и атрибуты, которые разаработчик считает приватными, соответственно, нарушение приватности будет намеренным и на совести нарушающего
                                                                                                                        Python поддерживает множественное наследование, используя стандартную библиотеку, можно создавать абстрактные классы.
                                                                                                                        Полиморфизм можно реализовать внутри одного и того же метода в зависимости от типа аргумента.
                                                                                                                          0
                                                                                                                          Не путайте инкапсуляцию и сокрытие. В Питон нет сокрытия.
                                                                                                                      0
                                                                                                                      Я не писал ничего осмысленного на Питоне, поэтому про ООП ничего не скажу — боюсь ошибиться. Судя по мануалу, реализация там проигрывает Java или тому же PHP — например, инкапсуляцию относительно просто обойти. Если в треде есть профессиональные питонисты — объясните ситуацию!

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

                                                                                                                        Что имеется ввиду под "обойти инкапсуляцию"? Как подход "данные и подпрограммы для их обработки всегда вместе" можно "обойти"?


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


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

                                                                                                                          0
                                                                                                                          Инкапсуляция не имеет ничего общего с ограничением доступа.
                                                                                                                          Это всего лишь распространённое заблуждение.
                                                                                                                            –1
                                                                                                                            Если вы узнали «заблуждении» из русской википедии, то почитайте лучше английскую:

                                                                                                                            Encapsulation is used to refer to one of two related but distinct notions, and sometimes to the combination thereof:

                                                                                                                            • A language mechanism for restricting direct access to some of the object's components.
                                                                                                                            • A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data.
                                                                                                                          +2
                                                                                                                          С каких пор ООП надо изучать зеленому студенту, который обычное императивное программирование еще толком не освоил? Каково это — объяснять такому новичку основные принципы ООП: абстракцию, инкапсуляцию, наследование, полиморфизм? Зачем это всё вообще? Это невозможно понять с ходу, не набив шишек в условном Си.
                                                                                                              +1
                                                                                                              Наиболее подходящими для обучения программированию языками считаю Python и C#.

                                                                                                              Полностью согласен.

                                                                                                              Хотя одним из моих первых языков был Pascal и я до сих пор считаю его замечательным выбором для, кхм, академического изучения, рекомендовать бы его всем и каждому по умолчанию я бы не стал.
                                                                                                              Всё-таки в 2016 огромную ценность имеет:
                                                                                                              1. Количество актуальных материалов, библиотек, вопросов на stackoverflow наконец
                                                                                                              2. Возможность из коробки или с быстрой установкой пары либ сделать что-то клёвое (игру/графическую визуализацию/сайт). Python standart library/.NET с pip/nuget для этого идеальны
                                                                                                              3. Продуманность, стабильность языков и экосистемы. Тут у py/c# всё в порядке, в отличие от… (не будем показывать пальцем).

                                                                                                              Я бы добавил что эти две технологии равноценны во всём, кроме, пожалуй, структур данных. Их лучше изучать на C#. Алгоритмы же можно изучать и там и там.
                                                                                                              +3
                                                                                                              javascript несомненно прекрасен, но мне кажется перспективы у него не очень богатые, в связи с появлением WebAssembly, а это дело недалекого будущего. Конечно есть проблемы с унаследованным кодом, но веб очень подвижная среда. И наверное многие и неоднократно задавали вопрос, почему программирование для веб фактически возможно только на javascript при огромном количестве языков программирования, при этом вне веб-а первенство совсем не за javascript. Несомненно есть множество «языков» компилирующихся в javascript, но о большинстве из них мало кто слышал и наверное один из наиболее популярных это TypeScript (упомянут выше). Предварительная версия WebAssembly спецификации уже реализована во всех современных браузерах и это даст импульс разработке и созданию новых технологий разработке в веб. Я за многообразие.
                                                                                                                +7
                                                                                                                Да, все ненавидят js и пользуются им только от безысходности и отсутствия альтернатив. А node.js, electron и т.п. запилили, чтоб было ещё больше безысходности.
                                                                                                                • UFO just landed and posted this here
                                                                                                                    0
                                                                                                                    Потому что хочется красивый GUI, а вся эта армия JS-хипстеров написать что-то хотя бы подобное Kivy или Qt неспособна.
                                                                                                                  +12
                                                                                                                  Как первый язык для обучения? Пресвятой Ктулху, ни в коем случае. Слишком много в нём неочевидной херни, пардон май френч. Замыкания, асинхронность, прототипное наследование, неявное приведение типов…
                                                                                                                  Как первый язык, чтобы сделать что-то относительно полезное? Думаю, это вполне разумно.

                                                                                                                  UPD: Когда я начал писать комментарий, я думал, что он окажется третьим.
                                                                                                                    –3
                                                                                                                    Замыкания, асинхронность, прототипное наследование, неявное приведение типов…

                                                                                                                    Видимо нарушает ваше эталонное мировосприятие навязанное другими языками?
                                                                                                                      0
                                                                                                                      Если что, JS — мой основной язык на текущий момент.
                                                                                                                    • UFO just landed and posted this here
                                                                                                                        0
                                                                                                                        Я конечно всё понимаю но в клиентской части ES6 выглядит вот так
                                                                                                                          0
                                                                                                                          парсер скушал линк: http://caniuse.com/#search=es6
                                                                                                                          • UFO just landed and posted this here
                                                                                                                              0

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

                                                                                                                          +1
                                                                                                                          В ES6 добавили ещё кучу вещей, от которых у юного падавана поседеют мудя. Деструктуризация, прокси, символы, генераторы… Нет-с, для начала какой-нибудь Паскаль — самое оно.
                                                                                                                          • UFO just landed and posted this here
                                                                                                                              0
                                                                                                                              Пожалуй, да, насчёт Паскаля я погорячился.
                                                                                                                                0

                                                                                                                                Про генераторы в Python можно не рассказывать и всё будет хорошо. А вот не рассказывать про сложные приведения типов и вообще особенности композитных типов JS не получится.

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

                                                                                                                                      всё гораздо проще

                                                                                                                                        +1

                                                                                                                                        GetMem оно называется.


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

                                                                                                                                          +1
                                                                                                                                          Вообще да, но в данный момент нет (с).

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

                                                                                                                              Я вижу на картинке 1.6.
                                                                                                                                +1
                                                                                                                                Есть серьёзный довод против изучения JS в качестве первого языка: он устроен не так, как кажется на первый взгляд (и не так, как большинство других языков).
                                                                                                                                Да, он устроен просто — но prototype-based наследование легко понять, когда у тебя уже есть изрядный опыт, а в начале обучения это может сломать мозг. То же — насчёт областей видимости и замыканий в JS.

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

                                                                                                                                  А знаете, тут вот шутят насчёт Haskell, и я тоже раньше думал, что это очень сложный язык. Но когда начал изучать, оказалось, что он весьма простой (основной косяк, что про него любят писать заумно, но это не вина языка). После освоения нескольких базовых концепций, всё остальное выстраивается на их основе, настолько естественно, что иногда диву даёшься… Чуть ли не любую библиотечную функцию можно переписать в пару строк, потом открыть код GHC и с удивлением обнаружить, что именно так она и реализована. Я более-менее знаю больше 10 языков, но ощущение "всё устроено именно так, как кажется на первый взгляд" у меня возникло впервые именно при изучении Haskell.
                                                                                                                                  Не берусь пока его советовать в качестве первого языка, но в качестве одного из первых 5 ЯП однозначно рекомендую.

                                                                                                                                • UFO just landed and posted this here
                                                                                                                                    +1
                                                                                                                                    Вот результат опроса, который проводился на Stack Overflow в 2016-м году. В нём участвовало 49397 разработчиков. Более половины из них используют JavaScript.

                                                                                                                                    В результате множество компаний нанимают JavaScript-разработчиков, но разработчиков этих не так уж и много.

                                                                                                                                    Это 5. Я понимаю, что Вы всё подгоняете, чтобы каждый пункт был в пользу JavaScript, но можно же хоть как-то согласовано это было сделать.


                                                                                                                                    P.S. Если по существу, то с JavaScript имеет смысл начинать тем, кто хочет заниматься разработкой фронтенда для веб-проектов в ближайшие 5 лет. Для остальных это не лучший выбор первого языка.

                                                                                                                                      +4
                                                                                                                                      Сплю и вижу, что можно писать логику на клиенте на любимом языке. Ну хотя бы на каком то другом, не заканчивающимся на *Script.
                                                                                                                                        0

                                                                                                                                        Берём Vaadin, пишем логику на java.

                                                                                                                                          0
                                                                                                                                          Ну можете в сторону GWT посмотреть.
                                                                                                                                            +1

                                                                                                                                            А чем вам, скажем, Clojurescript не угодил? Вот уж что точно не JS.
                                                                                                                                            Еще вроде Scala и Kotlin компилируются в JS.

                                                                                                                                              +1
                                                                                                                                              А ещё Ocaml умеет в JS компилироваться.
                                                                                                                                              Я вот всё облизываюсь на этот интересный язык, да времени мало. А жаль.
                                                                                                                                              +11
                                                                                                                                              Давайте абстрагируемся от ЯП.

                                                                                                                                              Вот Вы хотите, чтобы ребенок научился кататься на велосипеде, скорее всего Вы ему купите вот это:
                                                                                                                                              image
                                                                                                                                              Ну или это:
                                                                                                                                              image

                                                                                                                                              А в качестве первого ЯП выбирать JavaScript, это:
                                                                                                                                              image

                                                                                                                                              Т.е. когда ты на таком умеешь — ты можешь ездить на любом другом, но начинать учиться надо точно не с него :)
                                                                                                                                                +15
                                                                                                                                                У последнего точно должно быть круглое колесо?
                                                                                                                                                  0
                                                                                                                                                  точно, велосипед-моноколесо называется, но к теме это не относится :)
                                                                                                                                                    +6

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

                                                                                                                                                      0
                                                                                                                                                      Боже мой! Какой Вы зануда — это просто картинка для понимания концепции.
                                                                                                                                                      И нет там никаких передач, вот пруф.
                                                                                                                                                        0
                                                                                                                                                        Или это шутка юмора была, про то, что JS еще сложней? Тогда каюсь — не понял :)
                                                                                                                                                        Но в юницикле (велосипеде-моноколесе) точно никаких передач нет и колесо там — круглое — знаю, катался, падал :)))
                                                                                                                                                          0
                                                                                                                                                          Или это шутка юмора была, про то, что JS еще сложней? Тогда каюсь — не понял :)

                                                                                                                                                          именно так


                                                                                                                                                          Как известно, сложность системы измеряется в wtf, так вот в велосипеде-моноколесе слишком мало wtf, чтобы его можно было сравнивать с js. Нужно было хоть что-то добавить :)


                                                                                                                                                          Серьёзно. Моноколесо я бы с C сравнил. Всё возможно, но и следить нужно за всем самому: память и указатели, строки и массивы, и так далее.


                                                                                                                                                          А JS — http://www.besportier.com/archives/world%E2%80%99s-largest-bike-didi-senft.jpg

                                                                                                                                                            +4
                                                                                                                                                            Javascript — это велосипед с инвертированным рулём, как те, на которых предлагают на спор прокатиться в парках:

                                                                                                                                                            Скрытый текст


                                                                                                                                                            С виду велосипед как велосипед, да и владелец катается на нем с лёгкостью. Проехать 20 метров за 100 рублей и выиграть 500 кажется плёвым делом. И первые два метра действительно думаешь, что всё в порядке. А дальше, абсолютно внезапно — лицо на асфальте и полное недоумение.
                                                                                                                                                              0
                                                                                                                                                              Причём ты сзади.
                                                                                                                                                      –4
                                                                                                                                                      А чем сложен JS?
                                                                                                                                                      <script>
                                                                                                                                                      document.write("Hello, world!" + (3+5));
                                                                                                                                                      </script>
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      И поехали…
                                                                                                                                                        0
                                                                                                                                                        Он не сложен, он сложен как первый ЯП.
                                                                                                                                                        Замыканиями, прототипами, нестандартным и не явным приведением и много еще чем.
                                                                                                                                                          +2
                                                                                                                                                          Вы не поняли моего намека. Видимо, не вы один.

                                                                                                                                                          Поясню.

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

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

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

                                                                                                                                                          console.log("Hello, world!" + (3+5));
                                                                                                                                                          


                                                                                                                                                          Так ещё проще и понятнее. И правильнее.
                                                                                                                                                            +1
                                                                                                                                                            Кому правильнее?

                                                                                                                                                            Я — школьник, который умеет открывать блокнот и браузер. Что в браузере есть такая штука, как DevTools, я пока не знаю — этого гришка из 6 «Б» — известный в моих кругах эксперт в области IT — не показал.

                                                                                                                                                            Где прикажете читать ваше «Hello, world»?
                                                                                                                                                              0
                                                                                                                                                              Значит гришка из 6 «Б» вас обманул, и не всё рассказал. И при первой же проблеме вы получите чистый экран. Или куда должны посыпаться JS ошибки? В консоль, то-то же. Так что без девтула вы и так не обойдётесь А ещё васька с 9 «А» класса может рассказать о том что можно поставить node.js, и запускать скрипты прям из консоли, без браузера.
                                                                                                                                                                +1
                                                                                                                                                                Да не интересна пацану ваша консоль, не интересна.

                                                                                                                                                                Я даже в QBasic-е на IBM PC XT с видеоадаптером Hercules и монохромным режимом искал графический режим. И находил-таки!

                                                                                                                                                                Неужели, вы считаете, что ребенок, который сможет замутить клон «злых птиц» в браузере, станет изучать более сложный (и неочевидный) Node.js? До него еще дорасти надо!

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

                                                                                                                                                                Мне бы и в детстве браузер… эх…
                                                                                                                                                            +7
                                                                                                                                                            document.write(prompt() + 1);

                                                                                                                                                            Ой, а почему это тут 11 написано, а я хотел 2?
                                                                                                                                                            Приехали.

                                                                                                                                                              +1
                                                                                                                                                              Вот это — приведение типов — и будет первой проблемой для новичка. Проблемой, с которой он столкнется в любом языке, а не только в JS. Но она ему вполне по зубам, не так ли?

                                                                                                                                                              Если человек не сможет написать «Number» и скобочки, спросив у более опытного товарища, вряд ли ему суждено программировать.
                                                                                                                                                                0

                                                                                                                                                                Она даже мне, не новичку, не по зубам. Да, признаюсь, я время от времени наталкиваюсь на дебильное поведение, при котором, например, [ ] + [ ], [ ] + { }, { } + [ ] и { } + { } — все выдают разные результаты и даже различного типа.


                                                                                                                                                                А в примере со сложением проблема решается просто и элементарно: писать Number (или String) должно быть обязательно всегда, во всех случаях, если имеем конструкцию вида строка + число. То есть, вместо сложного приведения типов и неожиданного результата язык должен был выкинуть исключение. Соединяешь число со строкой — будь добр явно укажи, что ты и во что преобразовываешь.

                                                                                                                                                                  0
                                                                                                                                                                  Знаете, конструкция вида Строка+Объект разрешена даже в Java, где вообще почти ничего неявного нет. Так что исключение там, где явно надо просто привести объект к строке — слишком сурово. Попахивает старым добрым Си, где любая работа со строками — боль.

                                                                                                                                                                  А вот что действительно следовало бы запретить — это обратное неявное приведение. Строка не должна становиться числом, незаметно для программиста. Тогда и программист будет понимать разницу между 1+1 и '1'+'1'. И глупостей делать не будет.
                                                                                                                                                                    –1

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

                                                                                                                                                                      +1
                                                                                                                                                                      Давайте пройдемся по языкам:

                                                                                                                                                                      Pascal — использует +
                                                                                                                                                                      C — не использует, но в нем со строками вообще беда
                                                                                                                                                                      Java — единственный в языке оператор, переопределенный для единственного класса — "+" для класса String. Ради него сломали стройный синтаксис.
                                                                                                                                                                      C# — операторы переопределяются, "+" для строк включен
                                                                                                                                                                      C++ — аналогично
                                                                                                                                                                      Basic — по-разному, не помню уже… Кажется, там можно "+" или "."
                                                                                                                                                                      JS — "+"
                                                                                                                                                                      Python — "+"

                                                                                                                                                                      Теперь скажите мне, какой мейнстримовый язык я пропустил.

                                                                                                                                                                      А еще предложите свой, более очевидный способ конкатенации строк.
                                                                                                                                                                        +1

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


                                                                                                                                                                        Есть вполне себе хорошие варианты:


                                                                                                                                                                        "++" — Haskell, Erlang
                                                                                                                                                                        "<>" — Elixir
                                                                                                                                                                        ".." — Lua
                                                                                                                                                                        "." — Perl, PHP


                                                                                                                                                                        Точки для конкатенации мне тоже не нравятся, т.к. вызывают лишние ассоциации с другими вещами, но всяко лучше, чем +.
                                                                                                                                                                        Ну а ++ или <> вообще идеально. К сожалению, исторически сложилось, что ++ в С-семействе языков зарезервирован под инкремент.

                                                                                                                                                                          +2
                                                                                                                                                                          Чем вам плюс-то не угодил? Сложить две строки — вполне очевидная метафора. Я даже не знаю, чем она может быть плоха.
                                                                                                                                                                            0
                                                                                                                                                                            Сложить две строки — вполне очевидная метафора

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

                                                                                                                                                                            +1
                                                                                                                                                                            "~" — D. Визуально на верёвку или проволоку похоже, коей привязали один массив к другому (а строка в D — просто массив символов).
                                                                                                                                                                              0
                                                                                                                                                                              . — это вообще убийственная конкатенация для объектных языков. Чем разыменовывать-то указатели? Стрелочками? Два символа вместо одного для самого популярного оператора?
                                                                                                                                                                                0
                                                                                                                                                                                Два символа вместо одного для самого популярного оператора?

                                                                                                                                                                                Это конкатенация то самый популярный оператор? Для того, чтобы что-то вставить в строку в 90% случаев интерполяция используется… Теперь она даже в JS есть под названием "String Substitution".

                                                                                                                                                                                  0
                                                                                                                                                                                  Вы внимательно читали? Может ещё раз перечитаете? На всякий случай процитирую дополнительно, вдруг поможет:

                                                                                                                                                                                  > Чем разыменовывать-то указатели? Стрелочками? Два символа вместо одного для самого популярного оператора?

                                                                                                                                                                                  PS ну а касательно самой конкатенации — в той же java используется не то, чтобы реже других способов формирования строк.
                                                                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                                                                      0

                                                                                                                                                                                      Да, неправильно Вас понял… Насчёт точка vs стрелочка для вызова методов, согласен, что точка удобнее.

                                                                                                                                                                                +1
                                                                                                                                                                                Ruby — String + String допустимо как конкатенация, String + что-то еще не допустимо

                                                                                                                                                                                irb(main):001:0> '1' + 1
                                                                                                                                                                                TypeError: no implicit conversion of Fixnum into String
                                                                                                                                                                                

                                                                                                                                                                                Неявные преобразования в строку запрещены. А это Ruby, где магии вагон и маленькая тележка.
                                                                                                                                                                                  0
                                                                                                                                                                                  Вообще, чем больше слышу о Руби, тем сильнее он мне нравится. Жаль, он далек от моей работы сейчас, не досуг выучить…

                                                                                                                                                                                  Преобразования а строку можно запрещать, если есть простой и удобный toString для любого объекта. Как в Java. Думаю, в Ruby он есть.
                                                                                                                                                                                    0
                                                                                                                                                                                    Да, вы правы, у любого класса есть метод to_s (определен в Object, отправная точка всего), в базовом виде он просто имя класса + id объекта внутренний выведет.
                                                                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                                                                      0
                                                                                                                                                                                      Это та самая запретная маленькая тележка черной магии )
                                                                                                                                                                                      • UFO just landed and posted this here
                                                                                                                                                                                          0
                                                                                                                                                                                          Тогда бы уж через alias, все православней )

                                                                                                                                                                                          Злостность манкипатчинга сложный вопрос, ActiveSupport, сплошной манкипатчинг по сути своей. Но народ не сильно жалуется, жалуется когда например какой-нибудь gem начинает неистово потихому расширять ActiveRecord, потом ищи концы из-за чего пошло не так.

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

                                                                                                                                                                                          PS хотя в продакшене видел расширение NilClass, добавление к нему операций индексирования и еще пары часто употребимых. Видать надоело городить проверки, try является частью Rails, но в последних версиях добавили эквивалентную замену в std.
                                                                                                                                                                                          • UFO just landed and posted this here
                                                                                                                                                                        0
                                                                                                                                                                        И куда это написать и как запускать?
                                                                                                                                                                      +6

                                                                                                                                                                      В корне не согласен со статьей… Ну зато у меня конкуренация на рынке труда будет меньше!


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


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

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


                                                                                                                                                                      • строгую типизацию
                                                                                                                                                                      • ООП

                                                                                                                                                                      И я, право, не знаю, что подходит лучше, чем древний бейсик и древний паскаль. На каком современном языке программирования можно в 10 строчек нарисовать синее небо, зеленую землю и желтое солнце? Или звездную ночь? А я такие программы набивал с тетрадки в 3 классе, а в 5 писал сам.