Многие начинают путь к изучению программирования, открыв поздним вечером 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++: «Существует лишь два вида языков программирования: те, которые постоянно ругают, и те, которыми никто не пользуется».

Удачи в изучении вашего первого языка программирования!
Поделиться с друзьями
-->

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


  1. Kenya-West
    18.11.2016 13:23
    +14

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


  1. Nagg
    18.11.2016 13:24
    +73

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


    Как-то так:


    1. kvaps
      18.11.2016 14:27

      Вы заставили меня гуглить, как сделать сложение на js вместо конкатенации :)


      1. 6649166
        18.11.2016 17:02

        Привести первый операнд к числу.


        1. jetexe
          18.11.2016 17:04
          +3

          Вот с этим вся и проблема. Причем JS не скажет тебе: «Чуваак, ты тут что-то странное сделать пытаешься, может не стоит, а?».
          Первый язык не должен позволять стрелять по ногам из гранатомётов.


          1. DenimTornado
            18.11.2016 20:11

            Это заставляет быть более внимательным… Если ты делаешь что-то вроде:

            {} + []
            

            То тут изначально что-то не то!


            1. VolCh
              18.11.2016 23:14
              +7

              А если c = a + b?


        1. ainoneko
          19.11.2016 08:54

          Привести оба операнда к числу :-)


          1. Source
            19.11.2016 11:04

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


      1. Flammar
        18.11.2016 23:40
        -1

        Умножить на 1.


      1. Singaporian
        21.11.2016 11:10

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


  1. quantum
    18.11.2016 13:27
    +3

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

    А можно ссылочку?


    1. anmipo
      18.11.2016 15:01
      +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


      1. quantum
        18.11.2016 15:43

        Больше удивило сравнение php с python, всегда думал, что наоборот


        1. jetexe
          18.11.2016 16:29

          php в седьмой версии накачали спидами, он стал заметно шустрее


        1. Fafhrd
          19.11.2016 15:49

          Мало того, в тесте php7 alpha2, который медленнее релиза, который в свою очередь на большинстве типовых задач в моих проектах на уровне hhvm.


      1. am-amotion-city
        18.11.2016 16:29
        +6

        Кроме того, performance of nested loops, даже если написана аккуратно на всех испытуемых языках, никаким образом не является «одним весьма серьёзным тестом производительности», а является всего лишь тестом производительности _вложенных циклов_. Экстраполировать даже и верные результаты такого теста на производительности _языков_ — довольно странно.

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

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


        1. zapolnoch
          18.11.2016 20:39

          Вот здесь гораздо больше тестов. Результаты такие же. JS — самый быстрый интерпретируемый язык в мире. Он в 5-10 раз быстрее Питона и Руби на всех алгоритмах, которые измеряли в benchmarksgame. А измеряли они много всего разного.


          1. am-amotion-city
            21.11.2016 11:09

            Да, красивые картинки. Совершенно безотносительно сравнения производительности языков: вы же, надеюсь, понимаете, что из «А быстрее А1» и «Б быстрее Б1» никак не следует, что хитросплетенный «А и Б» — быстрее «А1 и Б1», правда? Иначе оптимизация мапредьюса была бы бессмысленной задачей: мап и редьюс по отдельности оптимизировали — и в путь.

            Кроме того, понятие «быстрее» — очень эфемерное. Я вообще не люблю вот такие академические сравнения производительности. Это приятно, что твой родной язык в топе, но на большее они не годятся. Батлнек *никогда* не бывает в производительности самого языка. Ни-ког-да.


            1. s-kozlov
              21.11.2016 11:33

              Батлнек *никогда* не бывает в производительности самого языка. Ни-ког-да.


              https://habrahabr.ru/post/187214/


              1. am-amotion-city
                21.11.2016 12:31

                И что это доказывает? Что исполнение скомпилированного кода обычно быстрее, чем интерпретация? Сенсация!

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


                1. s-kozlov
                  21.11.2016 14:00

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


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

                  1) Пишем код на PHP.
                  2) Смотрим результаты синтетических тестов для PHP и Java.
                  3) Переписываем код на Java.
                  4) ???
                  5) Profit!


                  1. am-amotion-city
                    21.11.2016 14:24

                    Если вы перепишете код на Java «в парадигме PHP» (просто переведете синтаксис), он может с равной вероятностью оказаться быстрее, медленнее, таким же.

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

                    Просто обычно там, где переход с DFD на KJY в пределах одной команды даст, например, 10% прироста производительности — грамотный архитектор, смена команды, выделение какого-нибудь узкого места в микросервис на хаскеле, юнеймит — даст 50%. Я об этом.


                    1. s-kozlov
                      21.11.2016 14:43

                      Если вы перепишете код на Java «в парадигме PHP» (просто переведете синтаксис), он может с равной вероятностью оказаться быстрее, медленнее, таким же.


                      Ну если считать вероятности как в анекдоте про вероятность встретить динозавра…


                      1. am-amotion-city
                        21.11.2016 15:08

                        Нет, это не «если считать вероятности как в анекдоте про вероятность встретить динозавра», это «если понимать, чем PHP и Java отличаются друг от друга».

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

                        Постарайтесь понять, о чем я говорю, пожалуйста. Это не сложно.


                        1. s-kozlov
                          21.11.2016 17:07

                          Постарайтесь понять, о чем я говорю, пожалуйста. Это не сложно.


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

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


                          Возможно, я ошибаюсь, но что-то мне подсказывает, что Java отдаст 100500 страничек быстрее, чем PHP будет 100500 раз запускать процесс и умирать.


                  1. webkumo
                    22.11.2016 13:13

                    На java переходят не столько для ускорения работы, сколько для получения хоть каких-то гарантий надёжности. ИМХО.

                    PS видел такииих монстров на java… LifeRay, например… а ведь пользуются же!


      1. Regis
        18.11.2016 18:38

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

        PS: 6 секунд у Java в этом теста — это фактически время на «прогрев». Наверняка если размер одного из циклов увеличить в 10 раз, то не получится 60 секунд, а много меньше.


      1. ideatum
        19.11.2016 20:54

        Про 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>
        


  1. docker1
    18.11.2016 13:29
    +3

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

    Ох как толсто…


  1. ivsol
    18.11.2016 13:35
    +1

    Всем добр(ый|ая) (день, ночь, утро, вечер)!

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

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


  1. dimack
    18.11.2016 13:35
    +15

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

    Не тратьте свое время на JavaScript, начинайте с базовых языков.


    1. bigfatbrowncat
      18.11.2016 14:19
      +25

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

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

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


    1. TargetSan
      18.11.2016 14:23
      +4

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


      1. michael_vostrikov
        18.11.2016 14:55
        +4

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


        1. TargetSan
          18.11.2016 15:44

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


          1. Randl
            18.11.2016 20:33
            +2

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


            1. TargetSan
              18.11.2016 20:43
              +1

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


            1. bigfatbrowncat
              18.11.2016 23:10

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

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

              Уж лучше я напишу vector::const_iterator руками.


        1. khim
          18.11.2016 18:02
          +1

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


          1. michael_vostrikov
            18.11.2016 20:23
            +2

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


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


            1. khim
              18.11.2016 22:30
              +1

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

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

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

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


              1. michael_vostrikov
                19.11.2016 07:49

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

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


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

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


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

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


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


                1. s-kozlov
                  19.11.2016 09:14

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


                  1. poxu
                    19.11.2016 10:45

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


                  1. michael_vostrikov
                    19.11.2016 11:32

                    Если десктопное приложение, то почему бы и нет. Да если даже 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;
                    }


    1. Tairesh
      18.11.2016 15:18
      +10

      Зная С++ вы не только за недельку другую освоите JavaScript, но и сможете покопаться в его движке и узнать все его секреты.

      Умея управлять космическим кораблём вы не только за недельку-другую освоите радиоуправляемый вертолёт, но и сможете покопаться в его движке и узнать все его секреты. Вперёд, на симулятор Союза ТМА!


      1. boldyrev_gene
        18.11.2016 16:36

        Ну такое… Радиоуправляемый вертолет реально можно спокойно за неделю освоить… )


        1. AnutaU
          18.11.2016 16:55
          +1

          Ну да, а предлагается для этого сначала на космическом корабле поучиться :)


          1. boldyrev_gene
            18.11.2016 16:58
            +3

            Вы недооцениваете всю извращенность JavaScript :)


    1. RealFLYNN
      18.11.2016 17:26
      -1

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

      JS хорош для образования тем, что он мультипарадигмален — на нем можно изучить и ООП и функциональщину.


      1. ToSHiC
        18.11.2016 21:13

        В C++ это называется метапрограммирование. Шаблон принимает одну функцию, а возвращает другую, сплошь и рядом встречается.


      1. dkozh
        18.11.2016 22:56
        +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++, но с функциями высшего порядка вроде ОК :)


    1. gotoxy
      18.11.2016 20:38
      +10

      Зная С++

      Хорошая шутка.


  1. Skull
    18.11.2016 13:36
    +12

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

    С морем костылей и велосипедов изнутри


  1. potan
    18.11.2016 13:41

    ELM гораздо проще и обладает всеми необходимыми возможностями.


  1. DexterHD
    18.11.2016 13:42
    +17

    Не слушайте хипстеров, учите Си


  1. MonkAlex
    18.11.2016 13:44
    +2

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


  1. alexkunin
    18.11.2016 13:45
    +6

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

    Правда, чем старше новичок, тем больше ему хочется получить что-то практически значимое. А ведь перед его глазами эксель, гугл поиск, шазам, игры, автоматические переводчики… Так что может быть — если новичок примерно в курсе современного зоопарка технологий — сразу его на что-то интегрирующее подсадить? Что-то вроде яху пайпс (уже почивших). Может что-то еще такое есть?

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


    1. stokker
      18.11.2016 15:43
      -2

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


    1. boldyrev_gene
      18.11.2016 16:59
      +1

      Что Вам мешает открыть консоль в браузере и начать писать на js? :)


      1. alexkunin
        18.11.2016 17:33
        +4

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

        * спросить у человека его возраст (ReadLn в паскале, в браузере — диаложек)
        * задержка (Delay в паскале, в браузере — концепция колбеков, возможно сразу с замыканиями, и вообще всякая асинхрощина — из понятного императивного программирования вы переходите в чертичто, в чем новичок сразу потеряется)
        * вывести что-то по координатам (GotoXY в паскале, в браузере — ну тут конкретно нужно в дом лезть, парой строк не обойдешься)
        * отреагировать на нажатие клавиш в реальном времени (в паскале это ReadKey в цикле, можно с Delay, а в браузере вы вываливаете на новичка концепцию событий и обработчиков, которые нужно вешать на дом)

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


        1. boldyrev_gene
          18.11.2016 17:40

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

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

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


          1. alexkunin
            18.11.2016 17:54
            +6

            Я занимался обучением студентов языкам программирования, а также занимался этим в частном порядке с представителями разных возрастных групп. У людей с первых минут трудности с формализацией задачи на естественном языке, с понятием «переменная», с линейностью программы (ну, как так получается, что раньше исполняется то, что выше? почему так?). Госспаде, да они больше тушуются, пытаясь английские буквы на клавиатуре найти, а уж Home, End и Enter при них нажмешь — и ступор. И среда разработки, которая что-то там подсказывает (исходя из исходного кода с опечатками и ошибками), и это ни в какие ворота не лезет.

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

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


            1. fuCtor
              19.11.2016 08:44

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


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

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

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


          1. s-kozlov
            19.11.2016 09:17
            +6

            когда начнет получатся, то работа найдеться


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


            1. gimntut
              19.11.2016 18:43
              +2

              эту фразу надо на русском языке разбирать

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


              1. s-kozlov
                19.11.2016 19:51

                image

                Оффтоп 2-го уровня: на Хабре можно не извиняться за рекурсию.


      1. evocatus
        18.11.2016 19:03
        -2

        JS сам по себе даже файл с диска не в состоянии открыть.


        1. boldyrev_gene
          18.11.2016 19:05
          -1

          Вы предлагаете разрешить непонятным скриптам с любого сайта ковырятся на пользовательских компьютерах? :)


          1. s-kozlov
            19.11.2016 09:20
            +4

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


        1. Apathetic
          18.11.2016 22:24
          +1

          В ноде — вполне себе в состоянии.


          1. jetexe
            20.11.2016 13:28

            давать ноду человеку неспособному, пока, написать даже цикл? злой вы человек


  1. ildarz
    18.11.2016 13:45
    +12

    Сам подход вообще очень забавен. «Хочу заниматься физическим трудом, какой инструмент лучше освоить — лопату, кирку или пилу?» Стать программистом — это вообще как понимать? «Хочу фигачить пальцами по клавиатуре, набивая на экране буковки, чтобы потом нажать на кнопочку, и буковки превратились в красивую картинку?» Что конкретно интересно? Предметная область какая? Именно ей инструменты определяются. Обучение программированию ребенка — одно, игрушки писать — другое, веб-сайты — третье, системное программирование — четвертое, суровый мир энтерпрайз-приложений — пятое, если интересна собственно computer science — шестое…


    1. evocatus
      18.11.2016 19:06
      +2

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

      На эту тему хорошо говорит один из авторов Agile манифеста «Uncle» Bob Martin. Рекомендую его лекцию «The Future of Programming».


    1. bogolt
      18.11.2016 20:45
      +1

      Полностью согласен.
      Одно дело показать человеку который не планирует зарабатывать на жизнь программированием как облечать себе жизнь простыми скриптами, или как настроить свою веб-страницу ( тут любой питон или js подойдут ), и совсем другое учить будущих программистов. Во втором случае я уверен, что необходимо начинать с языка который не прячет управление памятью, а напротив дает программисту полный контроль над программой. Черные ящики конечно штуки хорошие, но я считаю что человек должен разбираться в инструментах которыми он пользуется.


  1. Vilyx
    18.11.2016 13:45
    +30

    Сложно придумать хуже язык для изучения первым чем JS. Особенно, если заниматься самообучением. Вот я ввожу в гугле JavaScript для чайников и мне предлагают написать HTML страничку чтобы запустить мой первый код. Допустим это не так сложно, и я немного освоился, опустим сложности с this, === и наследованием. Теперь я хочу написать что-то минимально полезное с интерфейсом, мне опять нужно либо лезть в Node.js, либо в HTML/css, чтобы получить консольный или нормальный интерфейс.

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

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


    1. seryh
      18.11.2016 14:59
      +9

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


      1. Vilyx
        18.11.2016 15:38
        -5

        Lisp, возможно, хороший язык, не зря же он жив до сих пор. Но как первый язык программирования я бы всё-равно его советовал на уровне с Brainfuck.


        1. AnutaU
          18.11.2016 17:08
          +10

          Тем не менее, его долгое время изучали именно как первый (см SICP), и вполне успешно, похоже.


          1. Vilyx
            18.11.2016 17:57
            -4

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


            1. seryh
              18.11.2016 18:38
              +2

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


              1. Vilyx
                18.11.2016 18:52
                -4

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


                1. AnutaU
                  18.11.2016 19:44
                  +3

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


    1. RUQ
      18.11.2016 15:11
      +2

      Хм, позвольте не согласиться с вашей логикой.

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

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

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

      Класс, то есть написать пару строчек в любом текстовом редакторе, сложнее чем установить всю эту громадину от MS? Не говоря уже, о разработке на любой операционной системе кроме Windows.


      1. Vilyx
        18.11.2016 15:51

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

        В общем хотел бы я посмотреть на таких самоучек, которые решать начать с JS.


        1. RUQ
          18.11.2016 16:15

          Судя по данным 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++


          1. Vilyx
            18.11.2016 16:22
            -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. RUQ
              18.11.2016 16:24
              +1

              Логика совсем потерялась.)


              1. Vilyx
                18.11.2016 16:26
                -5

                У вас, да, логика потерялась.


            1. tautomer
              18.11.2016 20:52
              +1

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


              1. Vilyx
                18.11.2016 21:36
                -2

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


                1. tautomer
                  19.11.2016 11:56
                  +1

                  Это вовсе не нюанс. На сайте любой js библиотеки есть ссылка скачать. И только как альтернатива ссылка на какой-нибудь cdn. А если начинающий делает по уроку, то тем более никто не скажет подключай ссылкой. Урок же для начинающих. Вот когда я делал Three.js, то да, могли бы и написать, что локально модель в .obj файле не подключишь.


      1. Alexsandr_SE
        18.11.2016 15:56

        Устанавливать все равно нужно что-то. Даже джава стоит далеко не на всех машинах.


    1. boldyrev_gene
      18.11.2016 17:02
      +4

      Microsoft предлагает бесплатное IDE, идеальное для разработки.

      Ни в коем случае не критикую ничьи программные продукты, но так перехвалить ни один не могу )


      1. Vilyx
        18.11.2016 18:08
        +1

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


    1. Bringoff
      18.11.2016 17:03
      +3

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


      1. Vilyx
        18.11.2016 18:05

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


        1. Bringoff
          18.11.2016 18:49

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


    1. lagranzh
      20.11.2016 09:07

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


  1. impwx
    18.11.2016 13:47
    +16

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

    Наиболее подходящими для обучения программированию языками считаю Python и C#.


    1. marfenkov
      18.11.2016 15:22

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


      1. impwx
        18.11.2016 15:55

        Сужу по себе — начинал как раз с С, но быстро попал под развращающее влияние PHP. Наиболее вкусными возможностями казались как раз те, которые считаются «плохим тоном» — register_globals, словаремассивы, написание кода прямо внутри верстки.

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

        Для обучения C# лучше всего использовать в связке с LINQPad, а не с Visual Studio. Там можно сразу запускать простые примеры, не загружая новичку голову структурой проекта, классами и пространствами имён.


        1. boldyrev_gene
          18.11.2016 17:16

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


          1. impwx
            18.11.2016 17:41

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


            1. boldyrev_gene
              18.11.2016 17:46

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


              1. impwx
                18.11.2016 18:34

                Опять же, это доказывает только то, что php возможно выучить, если знать, что именно читать. Но новичок не знает, а в магазинах до сих пор продаются книги про PHP 5/6 (sic!) и «джентельменский набор веб-мастера».

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


                1. boldyrev_gene
                  18.11.2016 18:38

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


                  1. Source
                    18.11.2016 18:56
                    +1

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


                    1. boldyrev_gene
                      18.11.2016 19:00

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


                      1. Source
                        18.11.2016 22:10

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


                        1. boldyrev_gene
                          18.11.2016 22:26

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


                          1. svboobnov
                            18.11.2016 23:21

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


                            1. Source
                              19.11.2016 01:05

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


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

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


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


                              1. poxu
                                19.11.2016 10:53

                                нет сокрытия данных (можно напрямую обращаться к полям объекта без посылки сообщений)

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


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

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


                                1. Source
                                  19.11.2016 11:20

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


                                  1. poxu
                                    19.11.2016 11:27

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


                                    1. Source
                                      19.11.2016 12:13

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

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


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

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


                                      1. poxu
                                        19.11.2016 13:04

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

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


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

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


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

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


                                        1. Source
                                          19.11.2016 14:03

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

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


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

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


                                          1. poxu
                                            19.11.2016 14:29

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


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


                                            1. Source
                                              19.11.2016 18:59

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


                                              1. merlin-vrn
                                                19.11.2016 19:35

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

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


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


                                                1. Source
                                                  19.11.2016 20:43

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

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


                                                  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.

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


                                              1. poxu
                                                19.11.2016 19:40

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

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


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


                                                1. merlin-vrn
                                                  19.11.2016 19:48

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

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


                                                1. Source
                                                  19.11.2016 20:49

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

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


                                                  1. poxu
                                                    19.11.2016 23:17
                                                    -1

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

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


                                                    1. merlin-vrn
                                                      20.11.2016 08:27

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


                                                      1. poxu
                                                        20.11.2016 11:30
                                                        -1

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

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


                                                        1. Source
                                                          20.11.2016 21:15

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


                                                          1. poxu
                                                            20.11.2016 23:52
                                                            -1

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


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

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


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


                                                            1. Source
                                                              21.11.2016 00:18
                                                              +1

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


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

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


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


                                                              1. poxu
                                                                21.11.2016 12:34
                                                                -1

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


                                                                1. Source
                                                                  21.11.2016 13:37

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

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


                                              1. VolCh
                                                20.11.2016 11:50
                                                +2

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

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


                                                1. Source
                                                  20.11.2016 21:13

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


                                                  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).


                                                  1. merlin-vrn
                                                    21.11.2016 11:59

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


                                                    1. Source
                                                      21.11.2016 12:20

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


                                                      1. merlin-vrn
                                                        21.11.2016 12:59

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


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


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


                                                        1. Source
                                                          21.11.2016 13:42

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

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


                                                          1. merlin-vrn
                                                            21.11.2016 13:46
                                                            +1

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


                                                            1. Source
                                                              21.11.2016 14:59
                                                              -1

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

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


                        1. pingping
                          19.11.2016 00:30

                          Pharo by example

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


                          1. Source
                            19.11.2016 01:09

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


                            1. pingping
                              19.11.2016 16:30

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

                              Видать, мировоззрение у Кэя несколько ближе к реальности, чем у большинства.


                      1. EqualsZero
                        19.11.2016 11:02

                        А можно уточнить, что имеется в виду под полноценным ООП?
                        Инкапсуляции в python нет в принципе — но есть соглашение, как следует называть методы и атрибуты, которые разаработчик считает приватными, соответственно, нарушение приватности будет намеренным и на совести нарушающего
                        Python поддерживает множественное наследование, используя стандартную библиотеку, можно создавать абстрактные классы.
                        Полиморфизм можно реализовать внутри одного и того же метода в зависимости от типа аргумента.


                        1. VolCh
                          20.11.2016 11:52

                          Не путайте инкапсуляцию и сокрытие. В Питон нет сокрытия.


                  1. impwx
                    18.11.2016 19:10

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

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


                    1. merlin-vrn
                      18.11.2016 19:29

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


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


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


                    1. fireSparrow
                      19.11.2016 07:29

                      Инкапсуляция не имеет ничего общего с ограничением доступа.
                      Это всего лишь распространённое заблуждение.


                      1. impwx
                        19.11.2016 23:00
                        -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.


                  1. s-kozlov
                    19.11.2016 09:25
                    +2

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


    1. lightman
      18.11.2016 15:51
      +1

      Наиболее подходящими для обучения программированию языками считаю Python и C#.

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

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

      Я бы добавил что эти две технологии равноценны во всём, кроме, пожалуй, структур данных. Их лучше изучать на C#. Алгоритмы же можно изучать и там и там.


  1. ideatum
    18.11.2016 13:47
    +3

    javascript несомненно прекрасен, но мне кажется перспективы у него не очень богатые, в связи с появлением WebAssembly, а это дело недалекого будущего. Конечно есть проблемы с унаследованным кодом, но веб очень подвижная среда. И наверное многие и неоднократно задавали вопрос, почему программирование для веб фактически возможно только на javascript при огромном количестве языков программирования, при этом вне веб-а первенство совсем не за javascript. Несомненно есть множество «языков» компилирующихся в javascript, но о большинстве из них мало кто слышал и наверное один из наиболее популярных это TypeScript (упомянут выше). Предварительная версия WebAssembly спецификации уже реализована во всех современных браузерах и это даст импульс разработке и созданию новых технологий разработке в веб. Я за многообразие.


    1. Sirion
      18.11.2016 13:54
      +7

      Да, все ненавидят js и пользуются им только от безысходности и отсутствия альтернатив. А node.js, electron и т.п. запилили, чтоб было ещё больше безысходности.


      1. raidhon
        18.11.2016 17:08

        Спасибо что ответили за всех включая меня!


      1. evocatus
        18.11.2016 19:26

        Потому что хочется красивый GUI, а вся эта армия JS-хипстеров написать что-то хотя бы подобное Kivy или Qt неспособна.


  1. Sirion
    18.11.2016 13:49
    +12

    Как первый язык для обучения? Пресвятой Ктулху, ни в коем случае. Слишком много в нём неочевидной херни, пардон май френч. Замыкания, асинхронность, прототипное наследование, неявное приведение типов…
    Как первый язык, чтобы сделать что-то относительно полезное? Думаю, это вполне разумно.

    UPD: Когда я начал писать комментарий, я думал, что он окажется третьим.


    1. boldyrev_gene
      18.11.2016 17:20
      -3

      Замыкания, асинхронность, прототипное наследование, неявное приведение типов…

      Видимо нарушает ваше эталонное мировосприятие навязанное другими языками?


      1. Sirion
        19.11.2016 01:13

        Если что, JS — мой основной язык на текущий момент.


    1. raidhon
      18.11.2016 17:29
      -1

      Неочевидная херня была в ES5(видимо с чем вы и работали в последний раз) теперь есть ES6, есть классы, есть наследование, есть блочные переменные и константы и много другой очевидной на этот раз херни.
      С асинхронностью удобно работать с промисами, а если хотеть ещё больше удобства с контролем управления всегда есть async.
      Сейчас практически все свои веб проекты пишу на node.js ( лишь иногда приправляя микросервисом на Go), а Python c Ruby лежат скромно на полочке и ждут специфического заказа именно под них.


      1. jetexe
        18.11.2016 17:46

        Я конечно всё понимаю но в клиентской части ES6 выглядит вот так


        1. jetexe
          18.11.2016 17:58

          парсер скушал линк: http://caniuse.com/#search=es6


          1. raidhon
            18.11.2016 20:55
            -2

            Что вам ответить, вы не в курсе технологий ни фронтенда ни бекенда js.
            Так как вы бы знали про существование транспайлера babel.js фактически стандарта сборки на фронтенд.
            И думаю вряд ли вы собираете фронтенд через gulp, grunt или webpack.


            1. franzose
              20.11.2016 07:22

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


      1. Sirion
        19.11.2016 01:16
        +1

        В ES6 добавили ещё кучу вещей, от которых у юного падавана поседеют мудя. Деструктуризация, прокси, символы, генераторы… Нет-с, для начала какой-нибудь Паскаль — самое оно.


        1. raidhon
          19.11.2016 14:32
          +1

          Я начинал с C++ 15 лет назад и не поседел.
          JS скриптовый язык программирования с динамической типизацией вы серьезно полагаете что он сложнее чем Паскаль компилируемый язык со статической типизацией и ручным управление памятью?

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


          1. Sirion
            19.11.2016 16:40

            Пожалуй, да, насчёт Паскаля я погорячился.


          1. merlin-vrn
            19.11.2016 16:55

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


          1. AnutaU
            19.11.2016 21:10

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


            1. Sirion
              20.11.2016 00:25

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


              1. Source
                20.11.2016 06:48

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

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


              1. merlin-vrn
                20.11.2016 08:31
                +1

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


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


                1. Sirion
                  20.11.2016 13:22
                  +1

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

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


  1. cb_ein
    18.11.2016 13:53

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

    Я вижу на картинке 1.6.


  1. aamonster
    18.11.2016 14:00
    +1

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

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


    1. Source
      18.11.2016 14:30

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

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


  1. dusty_arrow
    18.11.2016 14:00
    +1

    Наконец-то, всё встало на свои места
    image


  1. Source
    18.11.2016 14:05
    +1

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

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

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


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


  1. uniqm
    18.11.2016 14:05
    +4

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


    1. poxu
      18.11.2016 14:29

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


    1. Anasazi
      18.11.2016 17:57

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


    1. nwalker
      22.11.2016 19:12
      +1

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


    1. svboobnov
      26.11.2016 23:35
      +1

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


  1. ionicman
    18.11.2016 14:14
    +11

    Давайте абстрагируемся от ЯП.

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

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

    Т.е. когда ты на таком умеешь — ты можешь ездить на любом другом, но начинать учиться надо точно не с него :)


    1. hatari90
      18.11.2016 14:20
      +15

      У последнего точно должно быть круглое колесо?


      1. ionicman
        18.11.2016 14:21

        точно, велосипед-моноколесо называется, но к теме это не относится :)


      1. merlin-vrn
        18.11.2016 14:25
        +6

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


        1. ionicman
          18.11.2016 14:29

          Боже мой! Какой Вы зануда — это просто картинка для понимания концепции.
          И нет там никаких передач, вот пруф.


          1. ionicman
            18.11.2016 14:42

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


            1. merlin-vrn
              18.11.2016 15:59

              Или это шутка юмора была, про то, что JS еще сложней? Тогда каюсь — не понял :)

              именно так


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


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


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


              1. impwx
                18.11.2016 16:18
                +4

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

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


              1. vlivyur
                19.11.2016 16:14

                Причём ты сзади.


    1. bigfatbrowncat
      18.11.2016 14:29
      -4

      А чем сложен JS?

      <script>
      document.write("Hello, world!" + (3+5));
      </script>
      
      
      И поехали…


      1. ionicman
        18.11.2016 14:34

        Он не сложен, он сложен как первый ЯП.
        Замыканиями, прототипами, нестандартным и не явным приведением и много еще чем.


        1. bigfatbrowncat
          18.11.2016 18:30
          +2

          Вы не поняли моего намека. Видимо, не вы один.

          Поясню.

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

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

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


      1. vlreshet
        18.11.2016 14:45

        Тогда уж

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


        Так ещё проще и понятнее. И правильнее.


        1. bigfatbrowncat
          18.11.2016 18:31
          +1

          Кому правильнее?

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

          Где прикажете читать ваше «Hello, world»?


          1. vlreshet
            18.11.2016 19:49

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


            1. bigfatbrowncat
              18.11.2016 23:07
              +1

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

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

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

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

              Мне бы и в детстве браузер… эх…


      1. SomebodyElse
        18.11.2016 15:29
        +7

        document.write(prompt() + 1);

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


        1. bigfatbrowncat
          18.11.2016 18:39
          +1

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

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


          1. merlin-vrn
            18.11.2016 19:35

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


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


            1. bigfatbrowncat
              18.11.2016 20:04

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

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


              1. Source
                19.11.2016 00:37
                -1

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


                1. bigfatbrowncat
                  19.11.2016 01:03
                  +1

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

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

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

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


                  1. Source
                    19.11.2016 01:24
                    +1

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


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


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


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


                    1. bigfatbrowncat
                      19.11.2016 02:38
                      +2

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


                      1. Source
                        19.11.2016 11:28

                        Сложить две строки — вполне очевидная метафора

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


                    1. svboobnov
                      19.11.2016 22:38
                      +1

                      "~" — D. Визуально на верёвку или проволоку похоже, коей привязали один массив к другому (а строка в D — просто массив символов).


                    1. webkumo
                      23.11.2016 18:11

                      . — это вообще убийственная конкатенация для объектных языков. Чем разыменовывать-то указатели? Стрелочками? Два символа вместо одного для самого популярного оператора?


                      1. Source
                        24.11.2016 00:24

                        Два символа вместо одного для самого популярного оператора?

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


                        1. webkumo
                          24.11.2016 08:44

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

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

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


                          1. am-amotion-city
                            24.11.2016 11:50

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


                            Но в нормальном мире, конечно, да, никто не заморачивается, и правильно делает.


                          1. Source
                            24.11.2016 13:02

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


                  1. fuCtor
                    19.11.2016 08:26
                    +1

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

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

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


                    1. bigfatbrowncat
                      19.11.2016 11:00

                      Вообще, чем больше слышу о Руби, тем сильнее он мне нравится. Жаль, он далек от моей работы сейчас, не досуг выучить…

                      Преобразования а строку можно запрещать, если есть простой и удобный toString для любого объекта. Как в Java. Думаю, в Ruby он есть.


                      1. fuCtor
                        19.11.2016 11:25

                        Да, вы правы, у любого класса есть метод to_s (определен в Object, отправная точка всего), в базовом виде он просто имя класса + id объекта внутренний выведет.


                    1. am-amotion-city
                      21.11.2016 12:25
                      +1

                      Это только пока ваш коллега не

                      String.prepend(Module.new do
                        define_method :+ do |other|
                           case other
                           when Integer then self << other.to_s
                           else super(other)
                           end
                        end
                      end)
                      


                      :)


                      1. fuCtor
                        21.11.2016 13:20

                        Это та самая запретная маленькая тележка черной магии )


                        1. am-amotion-city
                          21.11.2016 14:36
                          +1

                          Да ну, бросьте, это абсолютно легитимный и прозрачный способ для толстолобых :)

                          Черная магия — это

                          class Integer
                            def to_str; to_s; end
                          end
                          

                          Имплицитные касты — вот настоящее зло™, неведомое даже DHH, а никак не манкипатчинг.


                          1. fuCtor
                            21.11.2016 16:46

                            Тогда бы уж через alias, все православней )

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

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

                            PS хотя в продакшене видел расширение NilClass, добавление к нему операций индексирования и еще пары часто употребимых. Видать надоело городить проверки, try является частью Rails, но в последних версиях добавили эквивалентную замену в std.


                            1. am-amotion-city
                              21.11.2016 17:30

                              После того, как в 2.3 сломали `__callee__` в `alias`ed, и чинить не собираются, я на автомате ими перестал пользоваться. Кроме того, известно, что `alias` ведет себя не всегда предсказуемо в сложных контекстах, чтобы с гарантией избежать граблей лучше использовать `alias_method`.

                              `refinements` они назывались, и не взлетели по очень понятной причине: они ничем не лучше манкипатчинга eigenclass’а, а во многих случаях — гораздо хуже. Я даже пытался это объяснять в списке рассылки, но меня закидали тапками как ретрограда.

                              За использование `try` в продакшене я бы лично ссылал во фронтенд на неделю :) Страшное зло.


      1. vlivyur
        19.11.2016 16:15

        И куда это написать и как запускать?


  1. Scf
    18.11.2016 14:17
    +6

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


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


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

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


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

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


    1. TargetSan
      18.11.2016 14:27
      +1

      1. Source
        18.11.2016 14:47
        +1

        Поддержу! Stratch, Logo и Racket для начального обучения самое то.
        Кстати, Stratch в том числе хорошо решает проблему "поделиться результатом с друзьями".
        Ещё очень круто выглядит Project Spark.


        1. bigfatbrowncat
          18.11.2016 18:42
          -1

          У Scratch, Logo и Racket при всех их неоспоримых достоинствах, есть один общий фатальный недостаток.

          Они не имеют ничего общего с промышленными ЯП.

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

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

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

          Хотя, это всё требует осмысления, конечно…


          1. Source
            18.11.2016 19:15
            +2

            Ну, если для Вас вся суть промышленного программирования сводится к "натыкивать буквами команды", тогда конечно )))
            Во-первых, блоки только у Scratch. Во-вторых, это всяко веселее, чем блок-схемы на бумажке, которые мы в школе рисовали. В-третьих, вспомните, что было 10 лет назад, что есть сейчас и Вы поймёте, что никто не знает как будет выглядеть промышленное программирование ещё через 10 лет.


            давая ему совершенно бесполезную технологию

            Ох, я чувствую дай Вам волю, Вы и цветные карандаши у детей отберёте..


            1. bigfatbrowncat
              18.11.2016 19:23

              >Во-вторых, это всяко веселее, чем блок-схемы на бумажке, которые мы в школе рисовали.

              Школьная программа по информатике — кошмар. Была и остается. Я, слава богу, учился программировать не в классе информатики. И, кстати, мы изучали Паскаль. Просто, я всю программу по нему знал на момент начала курса, что мне абсолютно ничего не стоило.

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

              10 лет назад я начал изучать C++. В данный момент я пишу на C++. Думаю, что он никуда не денется еще лет 10.

              Javascript, кстати, тоже вряд ли куда-то исчезнет в ближайшее время. Просто, будет продолжать обрастать всякой пеной, но так мы же десь не о фреймворках спорим — их и для C++ вышла куча за 10 лет, и для Java…

              >Ох, я чувствую дай Вам волю, Вы и цветные карандаши у детей отберёте…

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

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

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

              Хороший пример привели ;)


              1. Source
                19.11.2016 01:32

                10 лет назад я начал изучать C++. В данный момент я пишу на C++. Думаю, что он никуда не денется еще лет 10.

                Рад за Вас и даже могу допустить, что Вы всё на том же подмножестве C++ программируете, игнорируя вышедшие стандарты. Но если посмотреть на web, mobile, робототехнику, там произошли изменения гораздо масштабнее, чем в С++.


                1. bigfatbrowncat
                  19.11.2016 11:08

                  Нет, не игнорирую, хотя и использую далеко не все.

                  Ради web-разработки я вынужден был в свое время изучить Java, которая, в смысле парадигм и синтаксиса, ушла от C++ не сильно далеко. Android отличается от Windows в плане идеологии куда сильнее. Например, меня в свое время шокировало, что любое неактивное окошко в нем система может безжалостно прихлопнуть. Неделю ходил — восхищался таким уровнем оптимизации.

                  За робототехнику не скажу. Уже выше писал, что ЧПУ не занимался. А других роботов и вовсе не встречал.

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


                  1. Source
                    19.11.2016 11:33
                    +1

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

                    С этим я полностью согласен. Но есть ещё и бекэнд и там есть не только Java :-)
                    В целом идёт неторопливая адаптация мейнстримом концепций из менее популярных ЯП.


          1. AnutaU
            18.11.2016 19:17
            +2

            На Racket всё же существует какая-никакая промышленная разработка. А в научной среде он и подавно используется по-взрослому.

            P.S. Или есть ещё какой-то Racket? 0_o


            1. bigfatbrowncat
              18.11.2016 19:26
              +1

              Пардон, по части Racket я слился :)

              Я понятия не имел, что это такое — и просто решил, что что-то типа Scratch.


              1. Source
                19.11.2016 01:35

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


                1. bigfatbrowncat
                  19.11.2016 11:10

                  Посмотрел на его синтаксис… Меня бы он в свое время напугал. Не слабее, чем C++

                  Но это — уже вкусовщина.


                  1. Source
                    19.11.2016 11:39

                    Это вопрос привычек. В принципе, чем меньше базовых концепций, тем проще язык.
                    В концепции единообразия типа:


                    • "Всё есть объект" (Smalltalk/Pharo)
                    • "Всё есть список" (Lisp/Scheme/Racket)

                    довольно легко въехать и легко ими пользоваться (если язык сам не нарушает свою концепцию на каждом шагу)


                    1. bigfatbrowncat
                      22.11.2016 23:13
                      -2

                      чем меньше базовых концепций, тем проще язык.


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


                      1. Source
                        23.11.2016 01:03

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


                        1. Bringoff
                          23.11.2016 10:58

                          Для Java не подскажете?


                          1. Source
                            23.11.2016 11:40

                            Java Playground, Java REPL. Далеко не самые удобные, но хоть что-то…
                            В качестве первого языка, я бы Java не советовал.


                            1. Bringoff
                              23.11.2016 11:48

                              Я бы тоже, но REPL ведь не только для поиграться бывает нужен.


                              1. Source
                                23.11.2016 12:43

                                Нормальный REPL обещают в Java 9. В общем, слоупочат с официальной поддержкой, как всегда.


                          1. svboobnov
                            26.11.2016 23:44

                            С 2000 года существует, а с 2005 встроен был в NetBeans скриптовый язык BeanShell. Там можно писать либо на самом BeanShell (иногда не указывая типов, а так синтаксис и значение 1:1), либо на Java. Таким образом, его можно как REPL для Java использовать, а можно подключить в качестве скриптового движка к Ant'у.


                      1. merlin-vrn
                        23.11.2016 09:41

                        И чем проще язык, тем проще получить работающий и понятный результат.


                1. AnutaU
                  19.11.2016 14:19
                  +1

                  Скажите, а это ваш личный опыт? Или может быть можете посоветовать что-нибудь, что можно почитать на тему Racket для детей? Заинтересовалась, но сходу нагуглила только книгу Realm of Racket.


                  1. igrishaev
                    19.11.2016 15:54

                    вот забавная книжица про Лисп вообще
                    http://landoflisp.com/


                  1. Source
                    19.11.2016 19:32

                    Нет, личного опыта на эту тему пока нет. Но из всех production-ready языков я только у Racket видел такую заботу о детях… Она по-моему красной нитью проходит через все обучающие материалы… Например, "How to Design Programs" начинается с написания программы управления ракетой, да и в целом просто замечальные библиотеки Teachpacks идут в составе стандартного дистрибутива. Помимо этого в него включен набор классических игр и руководство как написать свою.
                    Ну и "Realm of Racket" тоже конечно отличное дополнение.


                    1. AnutaU
                      19.11.2016 21:16

                      Большое спасибо! Я детей не учу, но всё равно смогу что-то полезное для себя найти.


          1. merlin-vrn
            18.11.2016 19:37

            Вот мы видим человека, который явно ЧПУ никогда в глаза не видел.


            Это ваш JS не имеет ничего общего с промышленным программированием, в отличие от Лого.


            1. bigfatbrowncat
              18.11.2016 20:08

              В каком месте JS — мой? Я люблю и использую в работе C++, Java, а JS считаю неизбежным злом индустрии, злой монополией и… отличной игрушкой для детей. Именно так.

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

              Что до ЧПУ — тут вы меня подбили насмерть. Из «ЧПУ» я программировал только Ардуино. В планах было начать освоение ПЛИС-микросхем (это близко к моей теперешней теме), но пока я о них почти ничего не знаю. Разве только то, что даже там большинство людей предпочитают не тыкать блоки мышкой, а, всё же, писать команды.

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

              Вы уверены, что его обучение следует начинать с ЧПУ? Мозг не сломаете? Спрашиваю без подколки, на полном серьезе — я ответ не знаю.


              1. merlin-vrn
                18.11.2016 20:25
                +1

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


                Но вот Лого похож на вытачивание объекта на токарном станке, и я ни разу не слышал, чтобы эта черепашка, которая рисует линии на экране кому-то сломала мозг. Это язык простой и без лишнего, минимум абстракций. Научиться понятию аглоритм, последовательность, циклам — ну просто идеальный вариант. Во-вторых, результат не абстрактный, он нагляден, поскольку это картинка. Хорошо видно, где цикл недокрутили или перекрутили — это же просто кладезь багов, а тут вот оно, на картинке лишний поворот. Можно наблюдать процесс выполнения в "замедленном варианте" или пошагово и этот замедленный вариант тоже очень нагляден, поскольку чётко видно (именно видно) что за команда выполнилась и к чему это привело.


                1. bigfatbrowncat
                  18.11.2016 23:26

                  Спасибо, я знаю, что такое ЧПУ.

                  Ардуино ничуть к нему не близок. Си как Си — ничго особенного. Только памяти мало и адские лаги, если не оптимальный код написать.

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

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

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

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

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

                  Поэтому, на мой взгляд, единственный вопрос, который имеет смысл поставить к языку программирования при выборе его в качестве академического — "за какое время на нем можно написать Сапер, Тетрис, или нарисовать фрактал Мандельброта?"

                  И, самое главное, — сколько строк кода для этого придется написать и насколько они будут сложны.


                  1. Source
                    19.11.2016 01:45

                    Для игрушек точно Scratch и Project Spark. Там можно гораздо интереснее вещи создавать, чем сапёр и тетрис. Для фракталов — Logo и Racket. И там и там, первый вариант — для маленьких, второй — для тех, кто повзрослее и хочет покруче.


                    1. bigfatbrowncat
                      19.11.2016 11:13

                      А вам знакомо чистолюбие вида «хочу всё сделать сам»?

                      Я вот, например, никогда не хотел брать чужие движки и наработки. Это же не программирование, а просто настройка чьей-то чужой сложной штуки. Это — не круто. Куда круче самому инициализировать графический режим (или создать OpenGL-окошко), самому на нем что-нибудь нарисовать…

                      А Scratch, как я уже сказал, в плане навыков настолько далек от обычного написания кода, что мне, разработчику с 10-летним стажем, приходится с ним разбираться дольше 15 минут.


                      1. Source
                        19.11.2016 11:49

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


                        P.S. Современным детям нравится Minecraft, достаточно дать им удобную возможность автоматизировать тыкание в экран, чтобы привить тягу к программированию.


                      1. chesterset
                        19.11.2016 16:46
                        +1

                        >Я вот, например, никогда не хотел брать чужие движки и наработки. Это же не программирование, а просто настройка чьей-то чужой сложной штуки.

                        И вы предлагаете детям в самом начале пути подобное наставлять? Мол, не надо использовать наработки, сделанные до тебя, пиши велосипед по поводу и без. Не плохо было бы конкретизировать «детей» — есть разница между условным первоклассником и условным шестнадцатилетним ребёнком. Первому глубоко наплевать, как оно работает, лишь бы работало и было всё интерактивно, просто и легко. Второму уже следует объяснять, что программирование — это не те кулцхакеры из телевизора, которые усердно пингуют localhost, делая вид, что работают. Хороший программист, ИМХО, это не тот, который пишет движки по поводу и без, а тот, кто умеет использовать наработки (при этом различая плохие наработки от хороших), создавая из различных модулей, дополнений и расширений что-то уникальное. Естественно, если нет наработок — нужно самому делать, но в 99% случаев наработка будет или её нужно будет несильно доработать. Представьте себе веб-разработчика, который под каждый сайт (интернет-магазин, корпоративный сайт, витрина, блог) будет бабахать по движку собственного производства — мало того, что он потратит в сотни раз больше времени, чем оно того на самом деле стоило, так ещё и максимально усложнит поддержку продукта. Я уже молчу про то, что в плане безопасности это будет решето.

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


    1. merlin-vrn
      18.11.2016 16:03

      scratch, logo — вот это вот


      1. Wedmer
        20.11.2016 04:38

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


    1. s-kozlov
      18.11.2016 16:25

      Давать ООП начинающему? Это шутка такая?


      1. VolCh
        20.11.2016 14:38

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


        1. dimykus
          20.11.2016 14:58
          +1

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


          1. s-kozlov
            20.11.2016 18:13

            Вот именно, что нет понимания, зачем это надо.


          1. VolCh
            21.11.2016 13:06

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


            1. dimykus
              21.11.2016 14:57

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


        1. s-kozlov
          20.11.2016 18:13

          А что непонятного в глобальных переменных? Новичку непонятно, что в них плохого.


        1. merlin-vrn
          21.11.2016 12:06

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


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


          1. s-kozlov
            21.11.2016 14:09

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


            Цель преподавателя (заинтересованного) — научить программировать, цель студента (заинтересованного) — научиться программировать. Я не вижу тут конфликта интересов.

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

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


            (http://local.joelonsoftware.com/wiki/%D0%9E%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Java)


    1. fireSparrow
      18.11.2016 17:09

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


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


      1. merlin-vrn
        18.11.2016 20:29

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


        Да и фотография и кино не сразу стало цветным.


    1. RabraBabr
      19.11.2016 15:48

      QML не?


      1. jetexe
        20.11.2016 14:05

        не, рано зелёным давать


    1. commanderxo
      19.11.2016 23:04

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

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


      В точку! Давно ищу что-то такое чтоб сделать программирование интересным для сына.

      Scratch мы уже выучили и переросли. Хочется что-то более ориентированное на вычисления и работу с массивами, чтоб изучать программирование на реальных задачах из школьной программы. Думаю зайти со стороны геометрии, например чтоб ребёнок понял что такое синусы/косинусы. Не сухое определение про отношение длины катета к гипотенузе, а именно чтоб почувствовал что это такое. Например нарисовать с ним модель солнечной системы, чтоб вокруг Солнца крутилась Земля, а вокруг неё — Луна. Так школьник сам почувствует что тригонометрические функции повторяются с периодом 360 градусов, что |sin| <= 1, и т.д.

      Python вроде хорош, но пока не нашёл подходящую библиотеку для рисования. Turtle-графика слишком примитивна и подходит только для узкого класса задач. Сам я Python не знаю, думал заодно выучить его вместе с ребёнком. Гугль выдал ссылки на Pygame, но как-то он мне не нравится. Последняя версия 2009 года, программа должна содержать цикл обработки сообщений, буферизация вывода на экран вызовами flip… как-то слишком сложно для первого языка. Хочется сразу рисовать по координатам линии и окружности, заливать цветом. Без необходимости писать ещё 10 малопонятных строчек потому что «тут так надо делать».

      Смотрел и в сторону JavaScript. Из плюсов — web и возможность показать своё творение одноклассникам или учителю. Большой минус (для обучения) — асинхронность. Когда в других языках скорость анимации регулируется расстановкой delay — просто и понятно, в JavaScript приходится паковать код в функции и вызывать их по определённым правилам. Для ребёнка среднего школьного возраста это неоправданная сложность.

      В общем я пока в поиске, надеюсь на «помощь зала» в этом топике.


      1. Source
        20.11.2016 07:24

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


      1. Barafu
        20.11.2016 15:45

        Для простейшей графики в Питоне народ пользует библиотеку `graphics.py`.
        Вот сама библиотека: http://mcsp.wartburg.edu/zelle/python/graphics.py
        Вот документация: http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/graphics.html


    1. Yuuri
      20.11.2016 20:26

      На каком современном языке программирования можно в 10 строчек нарисовать синее небо, зеленую землю и желтое солнце?

      На Haskell.


  1. Shamov
    18.11.2016 14:40
    +2

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


    1. bigfatbrowncat
      18.11.2016 18:46

      В каком возрасте?

      Я, например, в 7 лет писал в DOS-овских bat-файлах последовательность вывода на экран чего-то, отдаленно напоминающего интерфейс (очень крутой и красивый!) программы-антивируса AIDSTEST. Дело было в 1993 году, я сидел за списанной IBM PC XT.

      Ассемблер я, увы, так и не осилил. QBasic -> Pascal -> Delphi -> C++ -> C# -> Java ->…

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


      1. Landgraph
        18.11.2016 21:05

        Блин, я чуть позже начал, но учил как-то так:
        QBasic -> Pascal -> Delphi -> C/C++ -> Asm -> HTML+JS…

        Ну т.е. от простого к сложному и пониманию как работает ПК, а потом снова в упрощение. Ну и параллельно «опускался» до схемотехники =)


      1. Shamov
        18.11.2016 21:07

        Я тоже начинал с Бейсика, но чуть-чуть попозже… в 4-м классе. И вообще не на PC. У нас в школе были советские машины, которые назывались УКНЦ. Когда же, в 90-е, у меня дома появился PC, это был сразу 286-й… с сопроцессором. Жесткий диск — 40 мегабайт, ОЗУ — 1 мегабайт. Это был просто космос. Сразу появилась возможность запускать Turbo Pascal.

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


        1. Landgraph
          18.11.2016 21:11

          Я в детстве пытался понять что за фигня написана в журнале «Радио», потом узнал про то, что это были машинные коды =)


          1. Shamov
            18.11.2016 22:23
            +1

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


            1. bigfatbrowncat
              18.11.2016 23:29
              +1

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


        1. fuCtor
          19.11.2016 08:30

          Первая программа на нем была, ну как программа. В «Энциколопедия профессора Фортрана» на одной странице на мониторе был изображен код программы в пару строк, складывающий числа. Запустить его был первый квест )


  1. ZoomLS
    18.11.2016 14:48
    -1

    >>Какой язык программирования стоит выучить первым?

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

    Т.е. если человек хочет работать с вебом, а ему говорят — первым языком должен быт C/C++, ты должен знать основы аппаратной части, работа с процессором и т.д. В итоге, человек тратит год, а то и несколько лет на всё это, а к цели никак не приближается. А потом наконец берёт, изучает JS и получает сразу первые результаты.

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


    1. s-kozlov
      18.11.2016 16:32
      +2

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


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


      1. ZoomLS
        18.11.2016 17:10

        Меня совсем не так поняли. Понятно, что основы это главное.

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

        Глупые на форумах — обычно по тому, что не изучают теорию и/или сам язык, а сразу начинают работать с фрамеворком.


        1. jetexe
          18.11.2016 17:40
          +3

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


          1. ZoomLS
            18.11.2016 17:46

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


            1. jetexe
              18.11.2016 17:53
              +3

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

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


          1. Fedcomp
            18.11.2016 18:29

            Дети это сколько лет?


          1. poxu
            19.11.2016 11:05
            +1

            никто не идет в программирование с целью делать сайты.

            А я вот много таких знаю. Сайты делать это нынче реально круто.


            А вот делать сайты люди не хотят, в особенности дети.

            Ещё как хотят.


        1. s-kozlov
          18.11.2016 21:18
          +3

          Основы — это и культура программирования, для формирования которой трудно придумать что-то хуже JS.


  1. RafaelRS
    18.11.2016 15:19

    Первый язык должен быть согласно классике жанра — Паскаль


    1. lightman
      18.11.2016 16:01

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

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


      1. jetexe
        18.11.2016 16:34
        -1

        Чутка позже появилась среда PascalABC, для обучения самое оно. В программировании важно научить мыслить алгоритмами а не образами. Дать понять что только ТЫ виноват в том что тут что-то работает не так. Язык должен обязательно быть компилируемым, чтобы на стадии сборки давать понять что тут не так.
        Если не хочется тыкать палкой в мертвяков, то есть Go. Там всё так строго, что можно научить обезьянку


      1. s-kozlov
        18.11.2016 16:35

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


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


        1. boldyrev_gene
          18.11.2016 17:29

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


          1. Barafu
            20.11.2016 15:50

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


            1. s-kozlov
              20.11.2016 18:16

              Это когда при обучении гонишься за модными новинками, а не «вечными» технологиями и принципами. Знание SQL, Си, ООП и т.д. не устаревает за 5 лет.


              1. Barafu
                20.11.2016 18:41

                Основы Си у нас были. Как раз как модная новинка — всего-то 30 лет…


                1. s-kozlov
                  20.11.2016 18:52

                  Освоить практически любой мейнстримный язык после Си — как два пальца об асфальт.


                  1. Barafu
                    20.11.2016 19:16

                    Да, а потом я читаю на Питоне
                    for i in range (0, len(data)):
                    sum = sum + sqrt(data[i])

                    Потому что человек освоил C и теперь ему море по колено. Но главная моя мысль — оно точно надо 5 лет учить Си, чтобы потом быстро выучивать «практически любой мейнстримный язык» и этот Си больше не вспоминать? Может быть есть более эффективные методы?


                    1. s-kozlov
                      21.11.2016 07:30

                      Я вас умоляю, какие 5 лет? И кстати, я против того, чтобы изучать Си как первый ЯП.


                      1. Barafu
                        21.11.2016 08:10

                        Ну речь то была про университет.


                        1. s-kozlov
                          21.11.2016 19:55

                          Никто не учит Си 5 лет в университете, кроме тех, кто 5 лет не может закончить 1-й курс.


          1. VolCh
            21.11.2016 13:08

            А если эти пять лет работать, обучаясь без отрыва от производства, как говорилось?


            1. boldyrev_gene
              21.11.2016 13:22

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


        1. yarric
          18.11.2016 18:13

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


          1. khim
            18.11.2016 18:21
            +2

            А потом нам приходится тратить кучу времени чтобы этих «самоосвоивших» отсеять на собеседованиях.

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

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


            1. yarric
              18.11.2016 20:23
              +4

              Вас так послушаешь, так программирование — это сплошная rocket science, а как посмотришь вакансии — большая часть 1С, Java-энтерпрайз, сайты-визитки, мобильные игры…


              Впрочем если подходить формально, то, к примеру в США, хирургу нужно учиться 8 лет, а потом ещё от 3-х до 8-ми лет проходить практику, прежде чем он сможет оперировать.
              В тоже время студенты-третьекурсники и всякие undergraduate уже вполне нормально находят работу в области программирования и работают в командах. Кстати и соответствующие опросы на хабре показывают, что большинство людей в этой отрасли не смотрит на образование, а смотрит на результаты собеседования — ничего, работают.


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


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


              1. khim
                18.11.2016 23:59
                +2

                Проблема не в «возвеличивании». Проблема в том, что люди мешают в кучу разные вещи. А студент третьекурсник — он, как бы, третьекурсник потому что он три года учился, не? Так что у него уж всяко больше багаж знаний, чем у «специалиста» изучившего программирование по книжке «XXX за 21 день»!

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

                А насчёт «надёжности и безопасности»… Посмотрим на какую-нибудь новость про безопасность ПО. Если скормить проигрывателю «специальным образом сконструированный файл» — то у него случится «бяда». О как. Ужос. А что будет если скормить даже не «специальным образом сконструированную грампластинку», а всего-навсего арбазивный круг любому проигрывателю грампластинок?

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

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


                1. yarric
                  19.11.2016 20:29
                  +1

                  Я и не говорю, что программирование — это неквалифицированная работа. Но и с работой, требующей высокой квалификации (как хирурга), оно не сравнимо.


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

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


                  При этом способы формальной верификации разумеется, существуют — ещё Дейкстра об этом писал, но все эти крутые фирмы почему-то продолжают пользоваться странными подходами вроде юнит-тестирования, которое, как пишут в любой книжке по тестированию, "не может на 100% верифицировать корректность работы программы".


                  1. s-kozlov
                    20.11.2016 09:15

                    Но и с работой, требующей высокой квалификации (как хирурга), оно не сравнимо.


                    Смотря где. Клепание однотипных сайтиков на популярной CMS сравнимо с выносом уток санитаркой. Разработка и поддержка системы 24/7 — уже «хирургия». Сервер упал — пациент умер. И доверять самоучке с 1 годом опыта лабания на JS разработку такой системы — такая же глупость, как доверить санитарке пересадку сердца.


                    1. yarric
                      24.11.2016 19:44

                      Сервер упал — сервер подняли или включился резервный. С пациентом так не получится.


                      1. s-kozlov
                        25.11.2016 06:10

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

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


                        1. yarric
                          25.11.2016 21:00

                          В программном коде написал что-то не то, скомпилировал, не работает — нажал Ctrl-Z. Если попало в релиз — накатал патч. В хирургии резанул что-то не то — нажать Ctrl-Z уже не получится.


                          Например даже в такой "банальной" области, как радиоизмерения, цена случайной ошибки гораздо выше, чем в программировании — можно легко сжечь дорогостоящий прибор, например. Функции Undo нет.


                          1. s-kozlov
                            26.11.2016 13:01

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


                            1. yarric
                              27.11.2016 20:45

                              Есть программисты, которым приходится писать код с первого раза без единой ошибки? Seriously?


                              1. s-kozlov
                                28.11.2016 08:07

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


                      1. poxu
                        25.11.2016 10:08

                        Сервер упал — сервер подняли или включился резервный. С пациентом так не получится.

                        А если речь идёт о программировании инструментов для хирурга? Или если водитель нажал тормоз, а тут как раз JVM решила сборщик мусора запустить?


                        1. webkumo
                          25.11.2016 11:08

                          Я так подозреваю, что на авто ставить JVM со сборщиком мусора — не самая лучшая идея… Если же ну очень хочется (например для автопилота), то необходимо дублировать управляющие цепи железяками реального времени с прямым пробросом управления пользователю.


                          1. poxu
                            25.11.2016 11:48
                            +1

                            Я так подозреваю, что на авто ставить JVM со сборщиком мусора — не самая лучшая идея…

                            Вот именно!


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


                          1. merlin-vrn
                            25.11.2016 16:39

                            Помните историю с Therac 25 (аппарат лучевой терапии)? В его предшественнике были такие аппаратные цепи, в 25 это убрали "за ненужностью". А код-то оказался с гнильцой, и выяснилось, что та предыдущая модель не убивала людей только благодаря аппаратным блокировкам.


                            И это вовсе не про джаву речь, а про культуру программирования, ассемблер тут и там, где он неуместен и трюки в коде…


                          1. s-kozlov
                            25.11.2016 17:12

                            https://ru.wikipedia.org/wiki/RTSJ


                          1. svboobnov
                            26.11.2016 23:53

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


                            1. Wedmer
                              28.11.2016 09:31

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


          1. s-kozlov
            18.11.2016 21:34

            Чтобы стать хирургом — надо долго учиться, а программирование многие осваивают сами за год-два на достаточном уровне


            Смотря для чего достаточном.


            1. poxu
              19.11.2016 11:07
              +1

              Смотря для чего достаточном

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


      1. RafaelRS
        18.11.2016 17:23
        +1

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

        Мне странно, что здесь некоторые проголосовали за Си или C++ — Си еще куда не шло, но даже там лишние заморочки с указателями и другая специфика, которая будет только мешать усвоить базовые навыки программирования и сбивать с толку. Ну а С++ вообще тот еще лес для новичка.

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


  1. newpy
    18.11.2016 15:22

    Фантасмагория:
    — Что выбрать Ауди, Мерсдес, БМВ, Порше или Феррари?
    — Да что тут думать?! У меня Феррари, Феррари лучшая первая машина!
    — Спасибо за совет, да феррари супер машина! Но мне как-то больше нравится БМВ, хоть я на ней и не ездил…
    — БМВ? Да ты что?! Как можно сравнивать Феррари и БМВ?!
    — Ну ты знаешь… просто вот нравится и все… внешний вид, салон, приборная панель, ангельские глазки…
    — Привет парни, о чем говорите? Ооо… о первой машине? Так я вам скажу, лучшая первая машина это Мерседес!
    — Фууу… Феррари зэ бэст!
    — Я как бы хочу первую БМВ, феррари может потом когда-нибудь…
    — Нееее… если уж потом, так Мерседес! На крайняк Ауди купи, она хоть тоже немецкая!
    — О! Привет мужики! Я тут вчера Порше купил… Тачка огонь! О чем болтаете?
    — …


    1. merlin-vrn
      18.11.2016 16:04
      +8

      и тут выползают они: ВАЗ! Начинать нужно с ВАЗа! Это конструктор! Ты потом сможешь разобраться и починить любой автомобиль!


      1. newpy
        18.11.2016 16:10

        ну сегодня пятница, не хотелось о плохом )))


      1. jusiter
        18.11.2016 16:25

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


        1. merlin-vrn
          18.11.2016 16:53

          Так в (относительно, так-то лет двадцать пять уже) современных ВАЗах двигателем управляет такая же электроника: собирает данные с гирлянд датчиков, управляет форсунками инжектора… Часто не просто такая же, а та же самая электроника.


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


        1. newpy
          18.11.2016 16:59

          Речь шла о выборе первой машины и простом использовании в идеальном мире где я дарю вам 100 млрд долларов на все названные машины, и о выборе первой из них.
          Машина — ЯП. Вы же скорей проводите аналогию между копанием в исходном коде ЯП и разборкой авто любой марки. Зачем вам копаться в феррари каждый день? Вы ездить на ней будете. А ремонтировать ее будут другие ))). У вас же 99,5 млрд долларов. В моей пятничной фантасмагории не проводится такой аналогии )) короче, и ВАЗа тоже не было.


          1. newpy
            18.11.2016 17:01

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


  1. GLPavel
    18.11.2016 15:25

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


    1. worldmind
      18.11.2016 17:22
      +1

      возможно стоит глянуть на всякие хаскелы, лиспы и эликсиры


  1. Snakecatcher
    18.11.2016 15:25
    +7

    В институте (МИРЭА), имел глупость спросить у преподавательницы (Дина Эммануиловна, может кто знает :) ), какой язык программирования лучше.
    На меня посмотрели, как на первокласника, и сказали «Основы, надо знать основы, молодой человек. А язык изучается за два-три месяца». :)


    1. RUQ
      18.11.2016 15:38
      +1

      Дина Эммануиловна, права.


    1. Fenix_x_com
      18.11.2016 15:46

      У Федотовой ты спросил??? ПАРЕНЬ, ТЫ ЧТО :O
      Извините, я из МИРЭА (в прошлом) :)

      Но основы то знать, конечно, стоит. Вообще спрос на программистов с крепким базовым образованием всегда выше.


      1. Snakecatcher
        18.11.2016 15:54

        Ну да у неё. Знаю, за вредный характер нелюбима студентами. :)
        Но по отзывам, специалист она хороший.


      1. boldyrev_gene
        18.11.2016 17:32
        -1

        4 года в сфере работаю (начал до поступления в универ). Ни разу за образование не спросили :)


        1. ZoomLS
          18.11.2016 17:52
          -1

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


          1. Shamov
            18.11.2016 18:20

            Этот спрос выражен неявно. Никто не спрашивает про образование в таком ключе, чтобы можно было подумать, что это имеет значение. Боятся отпугнуть тех, у кого его нет. Но зато когда оно у тебя есть, это работает как ксива-вездеход. Имея профильное программерское образование (в России оно называется «прикладная математика»), ты просто приходишь в любую компанию и при желании получаешь там работу. Конечно, при условии, что на собеседовании были такие вопросы, которые позволили это образование продемонстрировать. Часто предложение получаешь сразу на месте. Но даже если нет, покидая собеседование, всё равно уже точно знаешь, что оно последует. Некоторым работодателям требуется время. Должен пройти шок. Они не могут поверить в то, что это всё взаправду.


          1. am-amotion-city
            21.11.2016 12:37

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


            1. vlivyur
              23.11.2016 16:54

              А им разве только стажа работы не достаточно?


              1. am-amotion-city
                23.11.2016 17:02

                Вам рабочую визу будет не получить. Это на уровне государственной бюрократии. Компании диплом может быть не так важен, на «стаж работы» (по моему опыту) они даже не смотрят.


                Меня сами отыскивают по профилям на SO/GH, но вопрос про образование всегда идет первым, из-за визы. Фрилансерам можно без него, но приличную интересную работу в Европе на фрилансе не получить, только всякие формочки клепать.


                1. vlivyur
                  24.11.2016 12:55

                  Я просто не раз натыкался что нужно либо совместимый диплом, либо стаж работы по такой же должности не менее 3-5 лет. Вроде в Австралии и Канаде именно так.


                  1. am-amotion-city
                    24.11.2016 13:04

                    Я говорю про то, что знаю: в Европе и Америке это не так. В Канаде, кстати, тоже, но тут информация из одного источника и менее проверенная.


                    Как они, по вашему, ваш стаж будут проверять? Ну я напишу, к примеру, что я на Байконуре уже 70 лет программирую нанороботов — и? Даже совместимость диплома — весьма тонкая штука, например в Испании для получения рабочей визы необходимо окончить один из 12 российских вузов.


                    В принципе, компания может вывернуться, если вы прямо ваще ценный сотрудник. Но с улицы — все очень протокольно обычно.


                    1. webkumo
                      24.11.2016 15:56

                      Про Германию: для визы blue card на должность программиста необходим IT-образование или n (кажется 6) лет работы по специальности. Это по их законам, легко ли получить визу по стажу — я не знаю, отзывов ни за, ни против не встречал.

                      Подтверждается ваш стаж в РФ вашей трудовой книжкой (на основании которой составляется юридически значимый документ и юридически значимый перевод к нему).


  1. Ghedeon
    18.11.2016 15:43
    +9

    Серьезно, JavaScript? Ну, и по традиции:


    1. poxu
      18.11.2016 15:58
      +14

      По традиции вот:


      Был у меня друг один. Всё на JavaScript писал. И клиента и бэкенд и десктоп даже. И базы данных на джаваскрипте делал и игрушки клепал. Говорил удобно, быстро, клёво. Всё работает, всё устраивает.
      Ну, потом его в дурку сдали конечно…


  1. JonNiBravo
    18.11.2016 16:05

    Я просто расскажу свою историю.
    Моим первым компьютером был ZX Спектрум 48k, программы и игры на кассетах, в качестве встроенного языка Basic. Выбирать было не из чего. Когда появился нормальный комп на Intel Pentium2, я начал изучать Borland Delphi 4, ибо друзья показали и родители подарили книгу. Когда на третьем курсе универа пришел устраиваться на первую работу, мне в шутку сказали, что «за слова Delphi и Pascal у нас бьют по морде». Пришлось учить C\C++.

    Для первого языка и изучения основ и алгоритмов(в школе) я бы посоветовал простой язык: С, Pascal, Basic.
    Для студентов универа зависит от конкретной специализации: Java, C++, Python, PHP, Haskell…


  1. punkkk
    18.11.2016 16:12
    +3

    Почему аргументами является только рынок и прочее, если немало важно изучить программирование как таковое, а потом уже выбрать язык? JS явно не очень подходит как первый язык, как минимум потому, что нет строгой типизации, человеку после js будет сложновато, на мой взгляд, перейти на тот же С, а вот наоборот — запросто. Но и С на мой взгляд для первого языка сложноват.


    1. jusiter
      18.11.2016 16:27

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

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

      Что мне начать учить? И зачем?


      1. jetexe
        18.11.2016 16:41
        +1

        биографии успешных программистов и логику чтобы понимать что так оно не работает


        1. poxu
          18.11.2016 16:49

          Успешные программисты это, наверное, Линус Торвальд, Роберт Мартин и какой-нибудь Ханссон Давид Хейнемейер?
          Интересно почитать биографию средненького такого программиста, который просто нормально зарабатывает, а не всяких звёзд.


          1. jetexe
            18.11.2016 16:57

            с этим ещё проще, на хабре таких много. Любого в лс спроси


            1. ionicman
              18.11.2016 17:06
              +3

              -хай, бро! как ты стал программистом?
              -меня укусил другой программист...


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


          1. s-kozlov
            18.11.2016 17:06
            +1

            Что написал Роберт Мартин, кроме кучи книг «как правильно программировать»?


            1. poxu
              18.11.2016 20:40

              Мартиновед из меня не очень. Но так сходу — FitNesse.


      1. Source
        18.11.2016 17:07
        +1

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

        Имхо, с такой мотивацией вообще бесполезно что-то учить.
        Если уж программировать, то только тогда, когда не можешь не программировать :-)


        1. poxu
          18.11.2016 20:43

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


          1. Source
            19.11.2016 01:52
            +1

            Ну да, а потом 20 лет джуниором работаешь, мечтая о средней зарплате xD


            1. poxu
              19.11.2016 11:12

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


              Поэтому ваше утверждение нельзя подтвердить никаким примером совсем.


              1. Source
                19.11.2016 11:55

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


      1. punkkk
        18.11.2016 19:57

        Вопрос «зачем» надо задавать самому себе, без ответа на него вряд ли будет желание учить. :)


    1. Source
      18.11.2016 17:04

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

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


  1. dadyjo
    18.11.2016 17:05

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


    1. jetexe
      18.11.2016 17:12

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


    1. random1st
      18.11.2016 17:19

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


    1. Scf
      18.11.2016 17:21

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


  1. worldmind
    18.11.2016 17:27
    +3

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


  1. LooMaclin
    18.11.2016 18:01
    -1

    Rust?


    1. Crypt0r
      20.11.2016 08:43

      Вряд ли как первый язык для изучения… На Rust возлагаю большие надежды как на достойную замену C++.


  1. Dark_Purple
    18.11.2016 18:46
    +1

    Учите Си как все приличные люди.


    1. s-kozlov
      18.11.2016 21:41

      http://stolyarov.info/files/anti_c_v03.pdf


      1. Door
        19.11.2016 16:41

        Достойно. Спасибо за ссылку. Получил массу удовольствия :)


        1. s-kozlov
          19.11.2016 19:54

          Есть и ответ: http://info.fenster.name/misc/teaching_c.pdf


  1. bond1768
    18.11.2016 20:39

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


  1. zjoin
    18.11.2016 20:39
    +1

    Мой первый язык был JavaScript, ну… просто потому что я выбрал фронтенд. При изучении, скажем, как работают прототипы или this, каждый учебник сначала описывает что в js все работает не как в других языках программирования. И это с учетом того, что я не знаю как работает в других языках.


    Для первого языка он точно не походит.


  1. matraskin
    18.11.2016 20:39
    +2

    1c?
    Можно программировать на русском. Есть бесплатный ИДЕ. Куча исходников. Очень востребован на рынке труда.


    1. svboobnov
      18.11.2016 23:32
      +2

      В принципе, я, как одинэсник, готов с Вами согласиться, но есть несколько «но»:

      • В языке 1С нет нормального ООП (ни на классах, ни на прототипах); Там есть встроенные объекты, но создать свой, «с нуля» невозможно;
      • В языке 1С нет и функциональной парадигмы, есть только 2 функции: «Шаблон» и «Выполнить»;
      • В платформе 1С есть источник неочевидных багов (и плохого стиля): очень много данных и процедур (методов) доступны глобально, из любого места приложения;
      • И ещё: я бы не хотел в 5 классе писать вместо игры или теста по географии «мини-склад». или мини-бухучёт;
      • Сама среда разработки тоже обрушивает на слабых духом неподготовленных много ненужных понятий.

      По мне, так хорош Lua.


  1. raidhon
    18.11.2016 21:10
    -1

    Судя по комментариям хабр из профессионального сообщества превращается в сообщество хейтеров которые ругают все что ни попадя.
    Зачем знать js это же херня, это для хипстеров.
    Зачем знать php это же херня, это для дебилов.
    Современный js на бекенд сопоставим по скорости с java компилируемым языком.
    И в 5 — 10 раз быстрее главных скриптовых языков PHP, Python, Ruby.
    http://benchmarksgame.alioth.debian.org/u64q/javascript.html
    У него огромное сообщество и библиотека пакетов с самым крутым пакетным менеджером npm.
    А новый стандарт позволяет писать с ООП классами и наследованием.

    Современный PHP (7) быстрее Python( с Ruby ещё больше разница) в 3 раза и в 5 раз меньше расходует оперативной памяти.
    И у него ООП с абстрактными классами и интерфейсами которое было почти с самого начала.
    Крутой менеджер зависимостей Composer, огромное сообщество и 80% рынка разработки сайтов.

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


    1. s-kozlov
      18.11.2016 21:46
      -1

      А заголовок статьи читал? При чем тут производительность?


      1. raidhon
        18.11.2016 21:52
        +1

        А вы комментарии читали к статье?


        1. s-kozlov
          19.11.2016 09:35

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


    1. Source
      19.11.2016 02:09

      Современный js на бекенд сопоставим по скорости с java компилируемым языком.

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


      1. raidhon
        20.11.2016 01:52

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


        1. Source
          20.11.2016 08:05
          +1

          Вы видите то, что хотите видеть… Node.JS сейчас там же, где и все остальные интерпретаторы с JIT, будь то PyPy, LuaJIT или Hack. Кроме того JIT это не свойство языка, т.е. ничто не мешает добавить его в любой интерпретатор, были бы финансы.
          Ну и самое главное: везде, где нужна скорость при использовании интерпретируемого языка, как использовали биндинги к C-либам, так и будут использовать. Поэтому к реальным задачам все эти бенчмарки относятся весьма косвенно.


          1. raidhon
            20.11.2016 13:10
            +1

            Я не настолько юн чтобы судить по бенчмаркам.
            Реальность такова
            Пробовал и Hack и HipHopVM(на PHP без Hack) в продакшен и реальность показывает что он на 10% быстрее PHP7, а node.js показал пятикратное превосходство перед PHP7 и Hack в нужных мне задачах. В итоге я использую Node.js.
            И как то писал проект на Django Pypy и был не в восторге от производительности и в итоге переписал проект на тогда ещё php5.5 Phalcon. Сейчас может ситуация изменилась но что то я сомневаюсь.
            JIT компиляцию нужно ещё реализовать по человечески.
            Единственным исключением из этого списка может быть LuaJIT я слышал про него но насколько этот компилятор эффективен не могу сказать так как не знаю Lua и как то желания учить нет.
            Лучше уж Rust доучу, больше переспектив.
            Благодаря связке асинхронность + JIT компиляции и значительным финансовым вливанием Google в V8 я уверен что node.js будет быстрее.


            1. Source
              20.11.2016 21:26

              значительным финансовым вливанием Google в V8

              Понятно, что финансы конвертируются в ресурсы, выделяемые разработке, и это собственно основной фактор. Но насчёт пятикратного превосходства в реальных задачах хотелось бы узнать поподробнее… Какого рода задачи? И не имело ли место сравнение одного ядра CPU против всех?


  1. Landgraph
    18.11.2016 21:45

    А почему никто не вспомнил про SmallBasic для обучения? =)


    1. svboobnov
      18.11.2016 23:35
      -1

      Ради всего святого! Не надо калечить юных бейсиком!!!
      Я понял программирование только благодаря Паскалю и хорошему преподавателю.
      Прошу извинить за повтор, но для учёбы надо использовать либо Lua, либо Oberon.


  1. VolCh
    18.11.2016 23:22
    +3

    А я бы на такой вопрос задал встречный: «А вы с какой целью интересуетесь?»

    Ок, пускай цель как можно быстрее «войти в айти». Но в качестве кого, разработчика (техника) или программиста (инженера)? Имхо, если цель как можно быстрее стать вторым, то JavaScript должен быть минимум вторым языком, а лучше третьим, после Питона (с приоритетом на функциональность) и чего-то типа «C классами». На JavaScript из топ-10 мэйнстрим языков, имхо, сложнее всего обучаться именно программированию как инженерной дисциплине. Разработке, наверное, проще всего. Ну или на втором месте после после PHP.


  1. QtRoS
    18.11.2016 23:26
    +4

    JavaScript первым языком? Ну-ну, у меня больше работы будет :)


    1. s-kozlov
      19.11.2016 09:39

      Судя по бардаку, который творится на фронтенде (была на хабре статья про это в духе «It's the future», не могу найти) и который, как мне начинает казаться, — во многом заслуга «носителей JS», работа будет всем.


  1. Wedmer
    19.11.2016 06:25
    +1

    IMHO лучше сначала научиться строить алгоритмы. А язык потом по задаче подбирать.


  1. TheDeadOne
    19.11.2016 08:42

    Я 17 лет назад подошёл к вопросу просто — разберусь с самым сложным языком, разберусь с любым. Кроме того, Ассемблер — это основа основ, позволяющая понять, как же оно всё там внутри работает.


    1. gotoxy
      19.11.2016 11:13

      И в мире ничего за 17 лет не произошло. Я восхищён закостенелостью стойкостью взглядов.


    1. Wedmer
      19.11.2016 11:34
      +1

      20 лет назад асм не показался сложным. Нудным — да, но точно не сложным.


      1. velvetcat
        19.11.2016 21:30

        А я бы даже сказал, что ассемблер — это один из самых простых языков. И программирование надо начинать учить с асма или, например, языка программируемого калькулятора. Регистры, условные и безусловные переходы (да-да!), циклы, ссылки, подпрограммы, стек… Все это очень просто, и это действительно элементарные концепции.


        1. merlin-vrn
          20.11.2016 08:37

          Во, вот так у меня и вышло. Сидеть на уроке алгебры и демонстрировать, как я быстро "в уме" решаю квадраные уравнения, прикольно (а я сочинил программу для МК-61, которая их решает, и просто по мере зачитывания коэффициентов вводил в программу).


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


          1. velvetcat
            20.11.2016 23:02

            > хочется поскорее начать рисовать картинки
            Возможно.


  1. marlen_alishev
    19.11.2016 11:03

    Очень подробно и основательно. Спасибо!


  1. i360u
    19.11.2016 13:42
    -2

    Мне JavaScript кажется отличным вариантом для введения в программирования именно из-за указанных "недостатков". Само по себе несовершенство — отличный обучающий фактор: вы гарантированно зададитесь вопросом о том, как могло бы быть лучше, и это поможет глубже понять суть. Я помню как сам начал лучше понимать язык и его эволюцию, когда начал переключаться с JS на Dart и TypeScript.


    1. Sirion
      19.11.2016 16:42

      Простите, но на это я могу ответить только так
      image


    1. merlin-vrn
      19.11.2016 16:59
      +1

      обучение в духе "вы поняли, что JS — говно, достигли просветления, и достойны перехода на новый уровень — PHP"? :)


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


      1. i360u
        19.11.2016 17:22

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


        1. s-kozlov
          19.11.2016 20:06
          +1

          Проблема в том, что JS сейчас везде. В результате человек, который с него начал, с большой вероятностью на нем и закончит, потому что «нафига еще что-то учить, если я уже и на сервере, и на клиенте всё умею».
          Если начинать с условного Pascal, зная, что на нем уже никто не пишет, то на нем не остановишься. Приходим к парадоксальному выводу: лучше начинать с языков, на которых не собираешься писать «во взрослой жизни».
          Конечно, уйдет больше времени, но ведь спешка нужна только при ловле блох.


          1. i360u
            20.11.2016 12:06

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


            1. s-kozlov
              20.11.2016 18:25
              -1

              быстрее можно получить результат и фидбек


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


              1. i360u
                20.11.2016 18:48

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


  1. fastwit
    19.11.2016 15:43
    +3

    Изучения языка само по себе не цель. Программирование не столько связано с конкретным языком, сколько с подходами, концепциями и алгоритмами. Если браться за изучение программирования, то нужно отдавать себе отчет в том, что вы собираетесь это использовать в работе или как хобби. И дело не в том насколько сложный и навороченный язык. Иначе бы в школе нас обучали китайскому (для меня лично — это эталон сложности), или эспиранто, а не родному языку, на котором разговаривают окружающие. Например, в топовые компании собеседуют независимо от языка. Только это уже говорит о том, что язык — далеко не главное.
    JavaScript — язык для UI. Он был спроектирован для этого и до сих пор большая часть кода на нем — это всевозможные UI библиотеки, фреймворки и т.п. То есть это очень прикладной язык. Настолько прикладной, что начав изучать язык вы, скорее всего, закончите тем, что будете делать какой-либо веб-интерфейс. В добавок к этому вы будете вынуждены изучить большое количество инфраструктурных инструментов для того, чтобы собрать этот веб-интерфейс. И может быть, это было бы не так уж и плохо, но весь этот «зоопарк» инструментов устаревает. И с чем вы остаетесь?
    Я всегда восхищался работой фронтенд-разработчиков (тогда мы их звали верстальщиками, без обид). Они знали JS, DOM, CSS и 100500 хаков для всех популярных браузеров. Как разработчик я понимал, что простая красивая страничка — это не так уж и просто. И вот мне довелось обучать их бэкенд разработке. На строго типизированном языке. И несмотря на схожесть синтаксиса и наличие у них разработческого опыта, динамика и скорость изучения не была сильно лучше, чем если бы они были просто математиками (с ними тоже довелось поработать). Им действительно не пришлось объяснять переменные и циклы, некоторые имели даже представление об ООП, но после того как просто математикам даешь эти азы, то они начинают прогрессировать заметно лучше в своем обучении. Получается, что начинать лучше с математики? Само собой, ведь большая часть концепций и подходов пришла из математики. Но мы же говорим про выбор первого языка программирования.
    Я вот к чему веду, вокруг каждого языка есть окружение, культура и набор практик, но программирование — это нечто большее. Став программистом, вы сможете разрабатывать практически что угодно и ограничивать вас будет только недостаток времени и лень. Вы будете понимать концепции, подходы и алгоритмы. Поэтому выбирать окружение и культуру следует таким образом, чтобы развиваться в этом. И на мой взгляд, JavaScript должен быть следующим языком, который вы изучите, но не первым.


  1. Ddnn
    20.11.2016 08:44

    Имхо, если в качестве первого языка изучать Си, то нужно параллельно читать что-то вроде «Операционных систем» Таненбаума, только в сильно упрощенном виде( обычно на первых курсах университета это изучается под общим названием «информатика»). Такой способ очень сильно поднимет техническую грамотность, позволяет разобраться, как вообще компьютер работает. К сожалению, это не самое веселое занятие — далеко не всем интересно читать про указатели, системные вызовы и строение памяти, пока другие на всяких js и C# пишут игры на Unity.


    1. s-kozlov
      20.11.2016 09:24
      -1

      К сожалению, это не самое веселое занятие — далеко не всем интересно читать про указатели, системные вызовы и строение памяти, пока другие на всяких js и C# пишут игры на Unity.


      Если человек не любит сам процесс программирования, а хочет рисовать картинки, тыкать кнопки и делать игры с корованами, то, может быть, это вообще не его?


      1. dimykus
        20.11.2016 14:49

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


        1. s-kozlov
          20.11.2016 18:29

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


      1. poxu
        20.11.2016 15:28
        -1

        Если человек не любит сам процесс программирования, а хочет рисовать картинки, тыкать кнопки и делать игры с корованами, то, может быть, это вообще не его?

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


        1. s-kozlov
          20.11.2016 18:33

          Очень многие известные программисты утверждают, что они ненавидят программировать


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


  1. NiTr0_ua
    20.11.2016 08:44
    -3

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

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


    1. fuCtor
      20.11.2016 11:03

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


      1. VolCh
        20.11.2016 14:37

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


        1. poxu
          20.11.2016 15:29
          -1

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


  1. u010602
    21.11.2016 11:11
    +1

    Попытаюсь сформулировать свое мнение на этот счет. Я исхожу из того, что в начале, нужны правила, и чем жестче, тем лучше, и ментор который за ними следит. Т.к. изначально человек изучает и познает то, что есть. А потом уже, когда достиг определенного уровня, начинает понимать что рамки жмут и можно было-бы и выйти за них. Помню свое первое впечатление от С++ в университете, после 5 лет паскаля и трех лет делфи. Казалось что можно напечатать любую белиберду, и оно все равно соберется и что-то будет делать, хоть и падать. Т.е. синтаксис казался таким гибким что превращался в хаос. Второй момент, который отпугнул — все делается сложно, под что угодно нужно заморачиваться с памятью, нет варианта по проще для начала. Динамическая типизация еще хуже.

    Т.е. первый язык должен иметь жесткий четкий синтаксис. Паскаль хорош тем, что там нужно объявлять переменные в начале, это учит думать и планировать наперед и экономить память, переиспользуя существующие переменные. Даже сейчас на C#, если метод содержит сложную логику, я объявляю переменные в начале. Не все, но ключевые.
    Статическая типизация, подсказки решарпера, варнинги и статический анализ кода — это отличный безустанный ментор, который будет долбить голову «как правильно» с первого и до последнего дня, кроме того, обычно там есть подсказки как нужно сделать правильно.

    Кроме того, язык должен позволять плавно наращивать сложность, т.е. начать например с консоли, потом а-ля блокнот из готовых блоков, потом уже что-то сложнее, красивее и кастомнее. Тут лидером для меня является платформа .NET, ну и C# в частности. Консоль — винформы — а дальше специализация, асп, впф, ксамарин, на выбор.

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

    Т.е. ИДЕ очень важна, ИДЕ должна позволять наращивать сложность, т.е. простые вещи должны делаться просто, а все сложное должно быть скрыто по умолчанию. Тут в лидерах для меня Делфи, очень интуитивно и очень легко зашла мне даже без мануалов. VS лохматых годов до 2003 года была ужасна, первое знакомство с ней испугало и отбило желание писать под винду в принципе, для создания проекта нужно было под сотню кликов и под десяток принятых решений. Современные версии намного лучше и понятнее, простые проекты создаются просто, есть примеры прямо в визарде создания. Кроме того последняя VS Community Edition в принципе бесплатная и содержит практически все возможности.

    Думаю вы уже догадались, что я считаю идеальным кандидатом для первого языка C# + VS Community Edition.
    Альтернатива — паскаль или бейсик который встроен в офис.
    Почему бейсик из офиса — потому что у него сразу есть гуи и простые и понятные средства вводы и вывода информации.

    Почему JS не подходит.
    1) нет статической типизации, нет статического анализа кода
    2) слишком гибкий синтаксис, но при этом каждый символ имеет вес, например пробелы и переносы строки
    3) не понятно что делать с IDE, писать в блокноте — плохо для обучения, нет четкости. Искать и пробовать разные IDE — сложно для новичка. Хорошие IDE — платные.
    4) для запуска простого приложения не достаточно JS, нужен еще и HTML. Для более сложных примеров — нужен CSS. А для более менее близких к продакшену нужна еще и серверная часть, и понимание взаимодействия с ней.
    4+) из этого минуса, выплывает еще один, изначальная ориентация на верстку и дизайн, хотя почти все мои знакомые с хорошей зарплатой стараются избегать верстки за версту. А почти все проф фронт енды — не могут перейти на абстрактные слои, т.к. их задачи не предполагают этого, нужно отдельно доучиваться.
    5) JS хоть и работает в браузерах на всех платформах, эффективные решения для многих платформ на нем писать не выйдет, т.е. он такой-же нишевый, как и все остальные. А размер ниши не сильно важен, т.к. все ниши примерно одинаково наполнены, конкуренция +\- одинаковая.

    Ну и мое личное замечание насчет веб и мобильного направления. Да это очень активное и модное направление, да там много заказов, много вакансий, но посидев одно время на oDeskе перебирая все доступные вакансии, я заметил, что веб и мобильные заказы — не выгодные совершенно, они очень дешевые но при этом очень объемные, все хотят условно за 100-1000 уе сделать приложение под 3 платформы или под все браузеры и по быстрее. А сами проекты — скучный треш, типа очередной платформер с «нескучными обоями». Нормальных заказов оказалось меньше, чем на десктоп например. Даже те кто сидели на фулл тайме в соседней комнате, клепали приложения однодневки, скучные и однообразные.


  1. dimykus
    21.11.2016 15:04
    +1

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

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

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


    1. s-kozlov
      21.11.2016 17:11
      +1

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


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

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


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


    1. u010602
      23.11.2016 03:19
      +4

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

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


  1. fedor1113
    21.11.2016 19:36

    Как любитель python…
    image
    PS Не встречал ещё человека, который думал, что лучше всего начинать с JS…