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

Можно ли на него ответить?

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

В конце 90-х я писал на С++ и присматривался к вебу. Писать веб-приложения на C++ было безумием. Тогда не было ни Python, ни Ruby, ни C#, и даже PHP был в зачаточном состоянии. Свои первые программы для веба я написал на Perl. Сейчас проект на Perl назовут глубоко и безоговорочно устаревшим.

Все тридцать лет мне постоянно приходится изучать новые языки программирования. Причиной тому не только любознательность, но и банальная жизненная необходимость. Сегодня востребованы программисты на Python, Go, C#, Java. То, что я знаю язык Ассемблера и Delphi, не помогает мне найти интересную высокооплачиваемую работу. В индустрии ходят слухи о баснословных зарплатах программистов на COBOL. Не знаю. Не уверен. Программисты на Go сейчас гораздо нужнее.

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

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

Я много лет писал на C++, потом неплохо освоил Java и, оказалось, что все основные концепции C# были мне знакомы. Знатокам C# напомню, что речь идёт про 2003 год, когда в языке не было ни LINQ, ни async/await, ни даже обобщённого программирования.

Я открыл MSDN, прочитал несколько страниц, и написал первый код, который сразу ушёл в прод. Конечно, я не знал язык полностью — пара моментов потребовала дополнительного освоения. В частности, новой для меня оказалась концепция делегатов. В C++ и Java есть свои способы, чтобы работать с указателями на функцию, а в C# для этого придумали новое средство языка.

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

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

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

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

Семейства языков

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

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

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

К императивным языкам, помимо Fortran, можно отнести Pascal, C, C++, Java, C#, Python, Go. К функциональным — Haskell, Scala, Erlang, Clojure, Scheme, F#.

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

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

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

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

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

В противовес им, в объектно-ориентированных языках программист размещает код и данные вместе, и называет объектом. К таким языкам относят C++, Object Pascal, Java, C#, JavaScript.

Существуют ли объектно-ориентированные функциональные языки? Да, конечно. Обычно разработчики языка совмещают несколько разных парадигм, что, кстати, значительно облегчает нашу задачу, а именно, освоение разных концепций. И если Pascal — императивный и процедурный, то OCaml — функциональный и объекто-ориентированный.

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

Динамически типизированные языки часто используют для разработки небольших программ — скриптов или сценариев. Они просты в изучении, нетребовательны к квалификации программиста и обычно позволяют писать короткий код. К ним относят JavaScript, Python, PHP, Ruby.

Статически типизированные языки проверяют соответствие типов данных, поэтому программисту приходится описывать объекты, которые он использует. Это касается и переменных, и функций, и даже самих типов. Программы на таких языках обычно больше по размеру, поскольку, в определённом смысле, дублирование помогает справляться с опечатками и другими простыми ошибками. В этой категории мы обнаружим C++, Java, C#, Kotlin, Go.

Ещё один признанный способ классификации — разделение языков на низкоуровневые и высокоуровневые. Языки низкого уровня используют в системном программировании и разработке игр, то есть там, где требуется высокая производительность кода и экономия ресурсов. К ним относят C, C++, Rust и, в какой-то мере, Go.

Языки высокого уровня повышают производительность программиста. Ему не приходится распределять память или вручную обрабатывать строки, он занимается решением бизнес-задач. В категорию высокоуровневых входят Java, C#, Scala, Python, Ruby.

Если языку программирования не хватает скорости, часть программы пишут на низкоуровневом языке и вызывают этот быстрый код из языка высокого уровня. Подобное смешение возможно за счёт техник, которые в целом называют Foreign Function Interface (FFI), или Интерфейс Внешних Функций.

Наконец, языки бывают универсальные и нишевые. Это условное разделение, поскольку нишевые языки практически не похожи друг на друга. Просто надо помнить, что для работы с базами данных придётся учить SQL, для разработки фронтенда — JavaScript, а для проектирования iOS приложений — Swift.

Фундамент

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

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

Но здесь полезно вспомнить историю. Двадцать лет назад круды пилили не на Python, а на Delphi. Бекенд писали на Perl. За свою карьеру, хотите вы этого или нет, вы несколько раз поменяете стек. И, возможно, единственное, что вам не придётся изучать на новых платформах — это фундамент.

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

Не языками едиными

Кроме языков программирования, нам нужны инструменты и методологии. Где бы вы ни работали, вам наверняка пригодится git. Даже если вы не работаете в команде, заведите аккаунт на GitHub и держите там домашние проекты.

Разберитесь с непрерывной интеграцией и развёртыванием — CI/CD. Настройте автоматическую сборку своих проектов.

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

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

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

Заключение

Что можно сказать про индустрию, проработав в ней тридцать лет? Технологии умирают, и умирают быстро. Больше нет dBASE и Clarion, и даже названия эти современным программистам неведомы. Священная война между Pascal и C, которая шла все восьмидесятые, как-то обыденно закончилась победой C. Но сейчас это никого не волнует — что нам Pascal и C, когда мы пишем на Java?

Мы учимся, зная, что 90% новых знаний устареют уже через три года. Возможно, нам надо освоить ещё два навыка.

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

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


  1. niko1aev
    28.09.2021 17:44
    +31

    Спасибо большое за пост. Он пропитан Вашим опытом и написан с уважением ко всем языкам программирования.


    1. gudvinr
      28.09.2021 18:19
      +49

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

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


      1. vlad-kras
        29.09.2021 09:31
        +7

        Не все мысли автора правильные

        Что же тогда делать начинающему программисту?

        Ответ — научиться быстро осваивать новые языки.

        Не надо начинающему учиться быстро осваивать новые языки - быстро не получится. Синтаксис языка - это еще не все, дальше есть инструментарий ide, сборка, тесты и фреймворки, которые потребуются для написания проекта сложнее "hello world". И на это все уйдет время - куча времени на каждый язык и умножить на N изученных языков. Куча времени, просто для того, чтобы наработать практику освоения нового языка, даже без его применения хотя бы в одном рабочем проекте.

        … Обычно изучение нового языка занимает несколько дней, иногда недель, но C# я выучил за двадцать минут.

        просто магия, хотя нет, не магия, а всего-лишь есть нюанс

        Я много лет писал на C++, потом неплохо освоил Java и оказалось, что все основные концепции C# были мне знакомы. Знатокам C# напомню, что речь идёт про 2003 год, когда в языке не было ни LINQ, ни async/await, ни даже обобщённого программирования.

        Раскрываю секрет фокуса. За 20 минут не язык выучил, а просто выяснилась огромная схожесть Java / C#, что и сыграло на руку. Попробуйте этот же фокус - «изучение» нового языка за 20 минут - проделать в несколько другой ситуации. Исходные условия практически те же самые, даже несколько лучше - вам известны несколько ЯВУ, причем в идеале. Список ЯВУ могу расширить - c# / java / delphi / c / c++ . Вам надо изучить за 20 минут один из следующих языков - javascript, python, lisp, ruby или возьмите любой другой не сильно похожий на известные c# / java. Справитесь, за 20-то минут или за 1 час хотя бы? А код, который напишете, даже если рабочим будет, не вызовет ли на ревью реплику "да, можно и так написать, но на нашем %языке% так не пишут" - и вас заставят, если сроки не горят, код переписать более привычным для проектного языка способом.

        Я открыл MSDN, прочитал несколько страниц, и написал первый код, который сразу ушёл в прод.

        Похвально. Но те 20 минут, которые потратились на изучение MSDN по конкретной тематике - все же не весь язык и даже не бОльшая его часть, достаточная чтобы потом писать самостоятельно, не прибегая ежедневно обратно к помощи MSDN. Да автор и сам раскрывает секрет фокуса:

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

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


        1. DenKoren
          29.09.2021 11:09
          +11

          Вот вы придираетесь-то.

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

          Нет тут никакого фокуса. Я даже после нескольких лет ежедневного программирования на одном языке не могу сказать, что я его «выучил», если рассматривать это слово только как конечную остановку вида «всё, я знаю все 100%».

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

          ИМХО - уровень знания «не знаю всех концепций и конструкций языка, но могу быстро написать prod-ready код, который решает поставленную задачу» можно назвать словом «выучил». Так же, как этим словом можно назвать тот уровень, который описываете вы, с детальным погружением в концепции, специфичные именно для этого языка. Или даже более глубокий уровень, с пониманием нюансов компилятора/транслятора/интерпретатора и эффектов, которые они оказывают на производительность полученной программы при обработке немного по-разному состряпанных фрагментов кода.

          Всё зависит от конкретной задачи, которую необходимо решить.


          1. marshinov
            30.09.2021 12:52
            -4

            Даже принимая во внимания ваши аргументы, автор лукавит. Думаю, что за 20 минут ему не удалось разобраться, например, в нюансах работы моделей памяти JMM и CLR, хотя бы потому что последняя очень скудно специфицирована. Думаю, что ключевое слово dynamic автор тоже обошел стороной. Быть может даже не использовал typeof(T) первое время. За 20 минут он открыл IDE и стал писать Java-код на C#, благо синтаксис позволяет.


        1. Hardwar
          29.09.2021 19:36
          -1

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


        1. saboteur_kiev
          30.09.2021 02:30
          +1

          дальше есть инструментарий ide,

          Visual Studio или Inteli Idea поддерживают уйму языков. есть примерно 80% вероятности, что сменив язык не придется менять IDE

          сборка, тесты и фреймворки

          Освоить maven после make проще будет, и это явно не те знания, которые надо долго изучать. Это простые инструменты.

          Да, 20 минут на язык это конечно единичный случай. Так же можно вообще не зная язык поправить какой-нить простой баг (или даже более сложны с помощью SO), но если ты сеньор в одном языке, у тебя будет ощущение правильности решения и в другом языке. Особенно если ты в принципе знаком с несколькими языками и подходами - а это уже важно, исправить код костылем, велосипедом, или чем-то похожим на дело и понимать это.


        1. PsyHaSTe
          30.09.2021 20:32
          +2

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


    1. Chronicler
      28.09.2021 19:21
      +6

      Священная война между Pascal и C, которая шла все восьмидесятые, как-то обыденно закончилась победой C

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

      Иногда даже скучно что и на Хабре сейчас холиваров стало меньше =)

      Давайте обсудим, кто победит в энтерпрайзе, Java или C#?


      1. tuxi
        29.09.2021 00:41
        +11

        Священная война между Pascal и C, которая шла все восьмидесятые, как-то обыденно закончилась победой…
        третьего ЯП ))))


      1. SadOcean
        29.09.2021 00:59
        +4

        Вопрос особенно ироничен, учитывая существование Kotlin


        1. PsyHaSTe
          30.09.2021 20:33
          +1

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


          Та же история с F# же произошла.


          1. Black_and_green
            01.10.2021 05:39
            +2

            Боюсь F# ещё многому сможет научить C#. А вот CoffeeScript действительно пнул js и умер.


      1. pdragon
        29.09.2021 08:53

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


      1. alan008
        29.09.2021 11:33
        +5

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


        1. saboteur_kiev
          30.09.2021 02:31
          +2

          Это не единственный аргумент.

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


        1. spaceatmoon
          30.09.2021 07:15

          Написать приложение на C# + WPF довольно просто и быстро, а вот сколько я не задавал вопрос гуглу java desctop. Так много ответов было в духе, что java это не про десктоп вообще сейчас.


          1. titsi
            30.09.2021 08:30
            +1

            java fx/swing вакансии есть, но их мало.


            1. ksbes
              30.09.2021 09:24
              +1

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

              С netcore, кстати такая же проблема есть — годик назад писал кроссплатформенную кастомную печатолку всяких форм на специализированных принтерах linux+win (именно в таком порядке). Так и не получилось сделать нормальный виндовый интерфейс на винде простыми методами(не то что бы я сильно заморачивался).

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


              1. aleksandy
                04.10.2021 20:52
                +1

                добиться реально «нативного» UX можно будет только на одной платформе — на других будет в лучшем случае чужеродный интерфейс

                Было бы желание. Да, оно, конечно, не pure-java на самом нижнем уровне, но само приложение вполне себе java.


          1. saboteur_kiev
            30.09.2021 16:09
            +1

            не задавал вопрос гуглу java desctop

            А если поискать "java desktop"? Там же полно.


          1. VictorF
            30.09.2021 23:46

            В конце XX века, IBM интегрировал свои дистижения, и, 'родил' Eclipse. ( как это получилось - см. здесь, но там не про desktop: https://vfedorov.info/GEFwiki/Wiki.jsp?page=GEF%20Preface%20%28GEF%29 (user/pwd: anybody/123123) Отжившие свой век AWT/Swing - в Eclipse заменен на SWT/JFace. В основе SWT - нативный код на C (для каждой платформы linux/win/mac|32|64 - надо предоставлять соответствующую сворку. Издержки однако :)

            Галопом, по европе - тут: https://betacode.net/10177/ - "Какую платформу я должен выбрать для разработки приложений Java Desktop?", вопрос ведь в этом?

            Кстати, после 17 лет 'кувыркания' в кодах от Eclipse-консорциума, мое обращение к C# & WPF - навеяло симбиоз Java & GWT (это ужасней). Конечно, для данной реализации концепции решения, следует отдать должное инструментарию Microsoft. Однако под Linux они его не затащили! ;)

            Достаточно сложно вхождение в Eclipse (не в IDE) - без методологии изучения потребуется больше времени. Для относительно 'легкого' знакомства, без блуждания по www - несколько ссылок (спасибо Ларсу Фогелю!!!):

            https://www.vogella.com/tutorials/SWT/article.html

            https://www.vogella.com/tutorials/EclipseDialogs/article.html

            https://www.vogella.com/tutorials/EclipseRCP/article.html - это уже 'тяжелая артиллерия'

            https://www.vogella.com/tutorials/EclipseWindowBuilder/article.html - это Window Builder (однозначно к нему кто-то от Borland приложил руку ;) (кстати, одним из 9ти отцов-основателей консорциума Eclipse - является Borland)


            1. Konstantin0Scheglov
              11.10.2021 04:12
              +1

              Window Builder написали я и ещё три человека из маленького города Липецка. Ни один из нас не работал в Borland. Но мы очень любили их продукты, это правда :-)


              1. VictorF
                11.10.2021 15:37

                Молодцы! (что WB 'родили и пестовали'.)

                Успехов.


      1. trdm
        01.10.2021 12:14

        Давайте обсудим, кто победит в энтерпрайзе, Java или C#?

        Это элементарно.
        В интерпрайзе всегда побеждает хозяин интерпрайза :)


  1. SergeKh
    28.09.2021 17:49
    +38

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


    1. pfr46
      28.09.2021 20:17
      +4

      Нас учили, что нужно начинать с изучения семантик. Собственно мы это и делали.


    1. Ulys-ses
      28.09.2021 23:43
      +3

      Начинать учиться можно с чего угодно. А вот начинать работать - да, лучше с чего-то строгого.


    1. sunki
      29.09.2021 01:05
      +7

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


      1. SergeKh
        29.09.2021 08:01
        +1

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


        1. sunki
          29.09.2021 14:15
          +2

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


    1. darkAlert
      29.09.2021 03:27
      +8

      Python такой приятный после многих лет на плюсах


      1. 0xd34df00d
        29.09.2021 03:38
        +19

        Не осилил питон после многих лет на плюсах, ушёл на хаскель.


      1. dimskiy
        29.09.2021 09:43
        +4

        как раз его изучаю сейчас из любопытства - там такое пространство для говнокода… еще и динамическая типизация. После kotlin ощущение что попал на вечеринку подростков :)

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


        1. tzlom
          29.09.2021 10:00
          +3

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


        1. KvanTTT
          02.10.2021 23:52

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


          1. dimskiy
            02.10.2021 23:56

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

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


          1. tyomitch
            03.10.2021 09:15
            +3

            (если кто не узнал, это автор Perl)
            (если кто не узнал, это автор Perl)


      1. linux_art
        29.09.2021 11:03
        +1

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


      1. 5oclock
        29.09.2021 11:19
        +2

        Мне js (node.js) показался как-то внутренне стройнее что-ли.


    1. Koliamba
      29.09.2021 03:58
      +1

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


    1. AnthonyMikh
      29.09.2021 13:59

      и ручным управлением памятью

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


      1. philya
        05.10.2021 19:36

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

        Я любил Modula 2


    1. marshinov
      30.09.2021 12:54

      Т.е. с С или С++?


      1. WASD1
        07.10.2021 14:42

        или Rust


        1. Vilaine
          07.10.2021 20:44

          Там можно над низменными деталями сильно не задумываться (разве что в unsafe, но зачем брать unsafe для обучения низкоуровневой разработке).


  1. UncleAndy
    28.09.2021 17:49
    +2

    Все верно написано. У меня примерно такой-же опыт, но развивался я чуть в другом направлении: Си, Delphi, Perl, Ruby, Go. По пути немного Java, Python и C#. Но суть вся та-же. Языки все разные и не стоит зацикливаться именно на них. Шаблоны проектирования, инструменты разработки и интеграции - это то, что однозначно пригодиться при выборе любого языка программирования.


    1. gudvinr
      28.09.2021 18:21
      +1

      *тся

      Про языки непрограммирования тоже не стоит забывать (:


      1. UncleAndy
        28.09.2021 18:25

        Естественно. Этому меня еще учитель физики в школе научил. :))) Но иногда, в процессе набора текста могу и ошибиться. :)


      1. IgorRJ
        28.09.2021 19:06

        Почему "непрограммирования"?

        С помощью этого языка мы программируем нашего собеседника. Искажение программных конструкций человеческого языка вызывает соответствующую реакцию: программируемый либо вовсе не понимает программирующего (приблизительный аналог: if...ten...else), либо понимает не так (аналог: использование ">" вместо "<").

        Так что тщательнЕе нужно относиться к своей речи, други-программеры! И поменьше говнокодить мутный поток сознания :)


  1. dmitry_rozhkov
    28.09.2021 19:33
    +2

    А HTML - это тоже «нишевый» язык как SQL? ;) Вроде не императивные и не функциональные… а может, они и не языки программирования вовсе…

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


    1. GospodinKolhoznik
      28.09.2021 19:41
      +9

      Войдёте в айти за 7 недель! Просто каждый вечер, перед сном, читайте по одной странице обычной советской книги Структура и Интерпретация Компьютерных...


      1. static_cast
        28.09.2021 19:56
        +2

        Думаете, уже на линейной рекурсии надоест (глава 1.2, страница 49)?


      1. dmitry_rozhkov
        28.09.2021 20:32
        +3

        Она не советская :)

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


    1. dimskiy
      29.09.2021 09:48

      А я бы им рекомендовал оставить это и дальше пылиться на полке, да взять книжку ISBN: 978-5-4461-0587-8 “Теоретический минимум по Computer Science”.


    1. PsyHaSTe
      30.09.2021 20:52

      Он не язык программирования вообще, так что вопрос снимается сам собой


      1. dmitry_rozhkov
        30.09.2021 22:12

        Ну, не знаю, не знаю. Поговаривают, на голом HTML удаётся делать конечные автоматы. А в сочетании с CSS он вообще становится Turing complete.


  1. MaM
    28.09.2021 19:54
    +32

    Лучший язык


    1. enabokov
      29.09.2021 02:13

      Я ждал подобного комментария.


      1. Gordon01
        29.09.2021 13:49
        +5

        Ну и в чем человек не прав?)


        1. enabokov
          29.09.2021 22:46

          На момент моего прочтения статьи упоминания Rust не было. Да и сейчас нет громкого крика.


  1. alexshy
    28.09.2021 20:05
    +3

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


  1. Red_Lord
    28.09.2021 20:56
    +1

    Хаскель конечно самый лучший язык, разве могут быть какие-то сомнения?


    1. 0xd34df00d
      28.09.2021 22:29
      +4

      Его не сделать консистентным без того, чтобы совсем сломать имеющуюся кодовую базу, увы.


      1. insecto
        28.09.2021 23:57
        +1

        А что в нём поломано сейчас?


        1. 0xd34df00d
          29.09.2021 00:22
          +6

          Не получится выразить тотальное подмножество языка (с сохранением совместимости, да). А без этого вы не будете уверены, доказали ли вы на самом деле что-либо, когда написали тайпчекающееся тело функции fmap-id-holds :: forall (x :: MyData a). fmap id x = x, или оно там просто внутри где-то неявный боттом использует, которым населён любой тип.


          1. Vilaine
            05.10.2021 01:58

            Часто вижу про bottom в разделе «но из-за него не получится». Похоже на «Null References: The Billion Dollar Mistake», но в Java/C# кое-какие подвижки ухода есть, есть ли такие же в Haskell?

            с сохранением совместимости
            И что поломается без этого bottom?


            1. 0xd34df00d
              06.10.2021 01:18
              +2

              Без боттомов поломается примерно всё, и, в частности, тьюринг-полнота :]


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


              stupid :: True = False
              stupid = stupid

              Кроме того, это означает, например, что вы теперь должны разделять данные и коданные, а те же списки в хаскелевском прелюде — это и обычные данные (когда они конечные), и коданные (когда у вас есть какой-нибудь enumFrom 0, генерирующий бесконечный [0, 1, 2, ..]).


              Теоретически, наверное, можно что-то разумное построить, но ИМХО проще воспроизвести хаскелевскую экосистему на идрисе.


              Естественно, все эти претензии исходят из пресуппозиции, что вам нужны завтипы. Но как можно из этого не исходить в 2021-м году, я не знаю.


    1. WASD1
      07.10.2021 14:49

      Если в нём засахарить монаду State (как в Kotlin засахарена монада Option), разумеется протаскивать \ снимать признак "где-то в кишках ссылается на mutable type" надо встроенным средством рефакторинга - то может быть.

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


      1. 0xd34df00d
        07.10.2021 20:57
        +1

        Например? Какого сахара не хватает для State, и зачем нужно часто протаскивать/снимать признак мутабельности?


        1. WASD1
          08.10.2021 14:07

          ====================================
          Этот пролог был добавлен чуть позднее:
          Ну вот смотрите в Scala есть иммутабельность коллекций, но это нетранизитивный признак, т.е. в данные в иммутабельной коллекции могут поменяться "подвержены эффектам" - т.е. List[SomeClass] это совсем не иммутабельная штука.

          Но блин мутабельность данных штука-то удобная: начиная с банального "счётчик у дерева - сколько раз посетили", заканчивая честно-мутабельным полем у структуры.
          Но тадам: у нас есть хаскель, который умеет управлять эффектами. Надо только вместо монады State ввести нормальный эффект "мутабельная переменная", с которой было бы удобно работать.

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

          Дальше ответ на ваш вопрос - но он наверное более технический.
          ==========================================

          Сахара - чтобы поддерживать мутабельные структуры а не городить огород, кажый раз через State или городить огород "недо-замену" на иммутабельных структурах
          Более того, чтобы поддерживать мутабельные структуры "обычном синтаксисте - ХЗ как его назвать, expression-syntax, без перехода в do-notation).

          Зачем компилятору протаскивать \ снимать признак:
          Ну вот предположим было:
          data Student = Student { name :: String, gender :: Gender }

          Вдруг мы осознали, что в современном мире живём и нужно:
          data Student = Student { name :: String, mut gender :: Gender }

          Компилятор доправит нас здесь (и явно везде вверх по структурам данных \ типам):
          data var Student = Student { name :: String, mut gender :: Gender }

          В итоге:
          - В типах выражены те структуры, которые не immutable - ну и соответственно подсказка для компилятора, что и насколько агрессивно можно параллелить \ менять порядок исполнения - подозреваю что правила для компилятора будут те же, что и с монадой State.

          - var (транзитивно мутабельный) отличается от mut (непосредственно мутабельный). При удалении/добавлении mut(вдруг я осознал, что mut gender : :Gender - излишне современно) - можно попросить компилятор "привести в порядок все зависящие от него типы\структуры на предмет var"


          1. 0xd34df00d
            24.10.2021 00:04
            +1

            Но блин мутабельность данных штука-то удобная: начиная с банального "счётчик у дерева — сколько раз посетили", заканчивая честно-мутабельным полем у структуры.

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


            Если таки нужна мутабельность — заверните в MVar/TVar. Система типов скажет, где обращение к этой переменной надо будет завернуть в MonadIO/STM/чего там ещё.


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


            Вдруг мы осознали, что в современном мире живём и нужно:
            data Student = Student { name :: String, mut gender :: Gender }

            Ну пишете gender :: TVar Gender уже сегодня (хотя не знаю, зачем, если можно просто сделать student' = student { gender = Bale } и выкинуть старого студента).


            Компилятор доправит нас здесь (и явно везде вверх по структурам данных \ типам):
            data var Student = Student { name :: String, mut gender :: Gender }

            Зачем здесь var? var здесь не нужно. Сама структура от этого не поменялась, поменялось только её поле.


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


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

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


  1. gatoazul
    28.09.2021 21:22
    +1

    Добавлю, что пониманию принципов языков программирования в целом очень помогает книга Т. Пратта "Языки программирования. Разработка и реализация".


  1. grigoryvp
    28.09.2021 22:06

    Очень хорошо сформулировано, респект!


  1. Politura
    29.09.2021 00:28
    +8

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

    Кстати, C# легко дался, думаю, не столько из-за Джавы и Си, сколько из-за Делфи, если не ошибаюсь, Майки какого-то крутого мужика, дизайнера библиотек для Дельфи к себе переманили задизайнить дотНет. Мне в начале нулевых библиотеки Java показались какими-то дурацкими и инопланетянскими, а вот на C# очень легко после Delphi перешел.


    1. kipar
      29.09.2021 09:45
      +5

      habr.com/ru/post/314616
      Точнее создателя турбо паскаля и дельфи. А потом он еще Тайпскрипт сделал.


    1. SadOcean
      29.09.2021 12:00

      Согласен про Delphi полностью, но Java дейсвительно очень похожа.
      Они как бы пересекаются разными подмножествами фич и концепций.
      Я бы сказал так, делфи - язык, прыгнувший дальше всех от языков с ручным управлением памятью (с/++/paskal) к языком со сборкой мусора (c#/java)


    1. user5000
      29.09.2021 12:53

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


      1. odissey_nemo
        29.09.2021 14:28

        Delphi всё же не язык, а среда быстрой разработки (RAD). Язык - диалект Object Pascal, вроде бы. А суть Delphi в её библиотеке форм и классов (VCL), подозреваю.


        1. AllexIn
          29.09.2021 15:11
          +1

          Delphi - отдельный язык уже давно. C 2002 года, если быть точным.


          1. odissey_nemo
            29.09.2021 18:05
            +1

            Имеет такое право говорить, т.к. перестал использовать RAD Delphi как раз в 2002:

            "...начиная с Delphi 7[3], в официальных документах компании Borland название Delphi стало использоваться для обозначения языка, ранее известного как Object Pascal."


            1. AllexIn
              29.09.2021 18:57
              +1

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


              1. odissey_nemo
                30.09.2021 08:40

                Хе-хе. Описался, надо было написать "Имеете такое право говорить...", не "Имеет...".
                Это что-то меняет или наоборот?


    1. kolu4iy
      29.09.2021 13:47
      +1

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

      А вот как берешь минимальный модуль на java, с его public protected final static (или как там правильно) перед названием каждого метода - и уныние нападает на тебя...


      1. odissey_nemo
        29.09.2021 14:31

        Как говорили раньше: Java - это улучшенный C, а C# - улучшенная Java.

        Впрочем мне, начинавшему с Фортрана и C, а Java изучившего позже C#, Java оказалась более приемлемой. Дело вкуса в данном случае. И текущих задач!


      1. Shatun
        29.09.2021 16:24

        А вот как берешь минимальный модуль на java, с его public protected final static (или как там правильно) перед названием каждого метода - и уныние нападает на тебя...

        Как будто от C# хоть чем-то отличается... В C# и java практически одинаковые области видимости и все объявления нужны ровно в тех же случаях

        у меня полное ощущение что у C# порог входа в разы меньше, чем у джавы, до сих пор.

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

        Мне синтаксически шарпы при этом ближе, а вот экосистема джавовая больше нравится


  1. tuxi
    29.09.2021 00:33
    +4

    XSLT в свое время изрядно поломал мне голову. Жаль, что про него в статье ни слова. До сих пор использую в проектах с простейшей MVC идеалогией. Трансформация на бекенде.


    1. eee
      29.09.2021 11:54
      +2

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


      1. ivegner
        29.09.2021 14:20
        +3

        В 2007-м мы истово верили, что за XSLT будущее, и оно правда было за ним... Просто недолго. Потом наступило другое будущее.


  1. enabokov
    29.09.2021 02:19

    Когда-то C, не говоря уж о C++, считали языком высокого уровня.


    1. igor_burenkov
      29.09.2021 04:00

      Просто на ассемблерах пишут 3,5 человека. Мейнфреймы нынче не те...

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


  1. NR_electronics
    29.09.2021 04:01
    -3

    Учите Rust и Python. Они не просядут через 3-5 лет.


  1. himikgenuine
    29.09.2021 04:01

    Тогда не было ни Python, ни Ruby, ни C#

    Питон с рубями были уже. Рельсы с джанго не было.


  1. VictorF
    29.09.2021 04:01
    +1

    Всё верно. Однако, можно пойти дальше - создать 'свой язык'. Конечно, просто так, без причин - это абсурдно. Но, если есть требования, предпосылки, то порой продуктивней работать с кастомизированным, специфичным языком (DSL), чем создавать надстройки на языке 'общего назначения'. (язык может служить только лишь для описания данных, как CSS). Как сделать 'свой' DSL, см. https://vfedorov.info/XtextXtendWiki/

    user: anybody

    password: 123123

    Технологически (есть инструменты, кодовая база), в "нише Eclipse", - можно создать графический DSL, или объединить и графическую нотацию и текстовую (и много другого). На эту тему есть тонны материала, дело за малым - решить вопрос внедрения в массы. (Eclipse - это не IDE)


    1. tzlom
      29.09.2021 10:06

      Согласен что Eclipse это не IDE, это бенчмарк и отопительная система в одном флаконе.


      1. VictorF
        29.09.2021 14:07

        А-а-а, использовать под разработку на android? Да, проблематично. Давненько пробовал пару раз... Бросил. Да и разработка на C/C++ - не нативно и коряво там (не для этого его заточили). Не так 'гладко', как, скажем для Java. Хотя и для Java - строит в памяти AST всех открытых одновременно проектов, и если исходников море - может привести к деградации... А тормоза при первой загрузке IDE - удручают, особенно под Windows, который усугубляет проблему антивирусом (1й старт - 45сек., 2й старт - 5сек.).

        В целом, Eclipse - это монстр (на 2018 год, в консорциуме - 465 млн. строк opensource кода различных проектов). Причины появления Eclipse - см. тут: https://vfedorov.info/GEFwiki/Wiki.jsp?page=GEF%20Preface%20%28GEF%29

        anybody/123123


  1. humanshapedhole
    29.09.2021 04:01
    +5

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


  1. usa_habro_user
    29.09.2021 05:10
    +8

    но C# я выучил за двадцать минут

    Вы, все-таки, "остера-то урежьте" малёхо... Я тоже программирую уже больше 30 лет, правда, если говорить о "самом начале", то вспоминаю не о Delphi и "языке ассемблера" (для какого CPU?), а о FORTRAN, PL/M и "ДВК ассемблер" (он же MACRO-11).

    Прочитать за 20 минут о синтаксисе языка вполне возможно; даже можно успеть написать "Hello world" и опробовать еще парочку примеров (правда, нужно быть "минитменом"). Но вот "выучить" язык за 20 минут невозможно, imho.

    Ну, или поясните, что лично вы имеете ввиду под словом "выучил", а также "запустил в продакшн", и что это за "продакшн" у вас был в 2003 году?


    1. Politura
      29.09.2021 06:21

      В 2003 году в C# не было фич, даже дженериков, по-сути это был Java-подобный синтаксис и библиотеки Delphi (ну или точнее - развитие библиотек Delphi), так что перейти с Делфи зная Си или Джаву не представляло никаких проблем.


      1. usa_habro_user
        29.09.2021 06:35
        +12

        При чем тут "фичи и дженерики"?! Даже просто, реально зная (а не "зная за 20 минут") языки, и много лет их используя в практической деятельности, переключиться с синтаксиса одного языка на другой занимает больше 20 минут, уж поверьте мне! А уж чтобы начать нормально мыслить в парадигмах конкретного языка (перестроить себя с C++ на C#, например), требуется больше времени.

        Я понимаю, что тут, на хабре, в кого не ткни - все сплошь гении и вундеркинды, но в RL это все-таки немного не так...


        1. Politura
          29.09.2021 07:09

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

          А теперь давайте подумаем, возможно ли было это сделать? Понять синтаксис C# из .NET 1.1 уже зная Java тех времен можно гораздо быстрее чем за 20 минут, т.к он был практически одинаковый. Да даже сейчас, можно на литкоде решить задачку на Java потом скопировать решение без изменений в C# и оно зачастую заработает, ну или потребуется минимум изменений, ибо базовый синтаксис и базовые типы данных очень похожи. Ок, а что там с базовой библиотекой? А у .NET 1.1 она была прям до боли знакома тому, кто переходил в C# с Delphi. Даже мастер форм в Визуал Студии тех времен был прям как в Delphi.

          переключиться с синтаксиса одного языка на другой занимает больше 20 минут

          Смотря для чего. Ивестигейтить какой-нибудь баг лазая одновременно и C# и JavaScript коду - вообще никаких проблем, думаю, многим фуллстак разработчикам так приходится делать время от времени. Кодревью разных языков - да не проблема. Понять, что написанно - тоже. Что-нибудь отрефакторить - тоже. Вот начать какой-нибудь проект с нуля в каком-то одном языке, если только-что плотно работал с другим тут да, проблема, надо переключаться. По крайней мере мой личный опыт такой.


          1. usa_habro_user
            29.09.2021 07:13
            +3

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

            Или, хотите "на слабо": я задам вам язык и детальное описание достаточно простого приложения, и вы за час мне его напишите? 20 минут на изучение языка, плюс 40 на написание несложного приложения - вполне должно хватить, imho! :D


            1. Politura
              29.09.2021 07:26
              +1

              Простите, но почему вы не хотите прочитать того, что вам пишут?

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


            1. WASD1
              08.10.2021 16:48

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

              Вы и говорите на разных языках.
              Ваш оппонент о "знании", а вы как минимум об "умении".


    1. markshevchenko Автор
      29.09.2021 09:28
      +2

      Учить C# мне надо было, чтобы написать пару-вебчастей для SharePoint. Его первая версия как раз вышла в 2003-м. За 20 минут я написал первую полезную веб-часть, которая попала на портал, и там работала. Дело было действительно в том, что C++, Java и C# были в то время очень похожи.


      1. ru_vlad
        30.09.2021 00:25

        Добавьте это комментарий в вашу статью (можно p.s.), а то как я понимаю многих раздражает "20 минут на изучения с#"


        1. markshevchenko Автор
          30.09.2021 07:18
          +3

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


          1. usa_habro_user
            01.10.2021 05:04
            +2

            "Авторы комментариев" вас процитировали ;) Напиши вы: "увидев в первый раз C#, я смог, из-за его похожести на java, написать небольшую часть кода, которая буквально сразу пошла в production" - тут не было бы никаких вопросов, все ясно. Но заявление "выучил C# за 20 минут", все-таки звучит "оверамбициозно", и, по большому счету, не очень скромно.

            Это, если бы, old fashioned разработчик на C, откомпилировав и собрав свой старый добрый plain C code под C++, заявил бы: "да я этот ваш C++ выучил за 10 секунд, тоже мне, rocket science".


            1. PsyHaSTe
              01.10.2021 12:45
              +3

              Нормально он написал, хватит докапываться до формулировок.


  1. vsb
    29.09.2021 08:50
    +5

    Статья хорошая и правильная. Но всё же нужна специализация. Если нужен программист на C#, обычно не будут искать программиста на С++, готового переучиться на C#. Будут искать именно программиста на C# с опытом работы. На одном языке всю жизнь сидеть может быть и не получится, но лет 10-15 должно получиться, а там уже жизнь выведет куда-нибудь.

    Пожалуй единственное исключение это когда новая технология выстреливает. Предположительно это происходит с Rust в западном мире. Тогда будут набирать людей из смежных областей (например C++), готовых переучиваться. Но всё же это не такое частое явление. Чаще всего язык получает нишу постепенно.

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


    1. tyomitch
      29.09.2021 11:18
      +1

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


  1. duke_alba
    29.09.2021 09:29

    Я бы к списку полезных знаний добавил бы немного мета-языков: UML для того, чтобы находить общий язык с архитекторами, и один из языков описания ЯП. Спасибо за статью!


  1. 5oclock
    29.09.2021 10:39
    +3

    «C++, Java и C# очень похожи друг на друга не только концептуально, но и синтаксически.»
    Не могу сравнить Java и C# друг с другом, т.к. последний — в глаза не видел.
    А C++ с Java очень не похожи именно концептуально.
    Разве что синтаксис Java явно заимствован из C++.

    Самое очевидное — (полу)автоматическое управление памятью в в Java.
    Концепция ссылок в этих языках — разная.
    Обобщённое программирование — тоже непохоже.
    Классы Java вообще не то же самое, что в С++.
    В C++ нет рефлексии Java.
    В противовес — в Java нет метапрограммирования в том виде, в котором оно есть в C++ (может и слава богу).

    В общем, это очень разные языки.

    Кстати, декларация о том что «выучил язык за 20 минут» — звучит слишком самоуверенно.
    Относительно быстро можно освоить азы синтаксиса, но не «выучить язык».
    Даже просто язык! Не говоря уже о его экосистеме!

    Хотя соглашусь, что после C++ многие нынешние main stream языки изучить значительно легче.

    P.S. Сам программирую 25 лет, 20 из которых — за деньги.
    Начинал тоже с C++, тоже упражнялся в Web на Perl.
    20 лет назад писал на Java/JSP, по пути освоил node.js, немного python.
    Сейчас изучаю современную Java на курсах.
    Но основной объём написанного мною кода всё-таки на C++.

    Мой путь в IT похож на путь автора (если не рассматривать C#), но самоуверенность в изучении новых языков — я не разделяю совершенно.


  1. manyakRus
    29.09.2021 10:48
    +2

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


    1. megahertz
      29.09.2021 11:26

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


    1. SadOcean
      29.09.2021 12:14

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


    1. PsyHaSTe
      30.09.2021 22:05
      +2

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


      Я например бекенд разраб с опытом C#, но при этом за 2 дня смог сделать задачку, где нужно было генерировать пдфки для специального принтера который клеет на коробки с доставкой информацию по заказу. 1 день разбирался в express/..., второй день писал логику, разбирался с вебпаком, упаковывал в докер. При том что на жс/тс не писал практически никогда, немного фуллстечил в начале прошлого десятилетия и все, не очень релевантный опыт. А почему жс? А потому что там библиотека бесплатная была для пдфок, а на шарпах везде ценник был, вплоть до 60к вечнозеленых за годовую лицензию.


  1. TaF
    29.09.2021 11:22
    +3

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


    1. eee
      29.09.2021 11:57
      +1

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


      1. freecoder_xx
        29.09.2021 13:05
        +1

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


      1. Gordon01
        29.09.2021 13:52

        Одна из проблем рынка раст разработчиков сейчас в том, что криптостартапы платят 5к+.


    1. nikolayv81
      27.11.2021 23:29

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


  1. MixKs
    29.09.2021 11:36

    Мне нравится JAVA и PHP.


  1. melodictsk
    29.09.2021 11:45

    Да чё тут изобретать. Типичный путь програмеров в 80-90 это Бэйсик>Паскаль>си>дэльфи>си++>Ява. Далее уже можно определяться. :)


    1. VictorF
      29.09.2021 14:19
      +3

      В списке отсутствует 'язык' для Б3-34, и всеми любимый Fortran ;). Кстати, в стандарте фортрана присутствует полная поддержка ООП (довелось в 2003м писать тесты, для покрытия кода компилятора intel...).


      1. ru_vlad
        30.09.2021 00:29

        Можно еще Forth вспомнить, кто 34 прошел его хорошо помнят.


  1. freecoder_xx
    29.09.2021 13:11
    +4

    Pascal -> C/C++ -> Asm -> Lisp -> Rust, Go, Python, C#, Java, JavaScript, Haskell, ...

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

    Как только почувствуете уверенность и Pascal начнет раздражать - можно переходить к C (или C++ в некотором минимальном его подмножестве).

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

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

    Теперь, от этой точки, можно двигаться в любом направлении: Rust, Go, Python, C#, Java, Haskell и т. д. что душе угодно.


  1. freecoder_xx
    29.09.2021 13:15

    C, C++ и уж тем более Rust - это высокоуровневые языки программирования.


  1. Slavik7
    29.09.2021 14:59
    +1

    Столько текста лишь бы не признавать PHP лучшим языком ;)


    1. ksbes
      29.09.2021 15:15
      -1

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

      (Дань уважения По: sarcasm!)


  1. anonymous
    00.00.0000 00:00


  1. schernichkin
    29.09.2021 18:27
    +1

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


    1. 0xd34df00d
      29.09.2021 21:04
      +2

      Туда еще завтипы не завезли.


    1. GospodinKolhoznik
      29.09.2021 21:28
      +1

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

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

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


      1. PsyHaSTe
        30.09.2021 22:07

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

        Спорный вопрос. Понять каждую конкретную строчку он сможет, но если вместо траверса на 5 строчек будет написат фасад итераторов визиторов на 2000, решающий ту же задачу — то вряд ли они будут понятнее.


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

        У меня противоположенный опыт — мало какой бизнес может потянуть джунов)


  1. theoretician
    29.09.2021 19:32
    +3

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

    Но сложилось всё так, что стал работать в командах где пайтон не жаловали, посмеивались над ним хлеще чем над пхп. Всё-таки статическая типизация - главный аргумент, это абсолютно необходимый инструмент, позволяющий сразу отлавливать большое количество багов. Сейчас не то что на бэкенде (где как раз и Python живёт), даже на фронтенде всё чаще используется TypeScript, добавляющий к JS типизацию. Сейчас для меня в пайтоне нет вообще никакого смысла, динамически-типизируемый, отстающий язык по внедрению асинхронных техник программирования, а если взять в расчёт, что это ещё один из самых тормозных языков в рантайме, даже новые версии PHP его уделывают в разы, то сейчас Python - это трэш-язык номер один. То что Python так популярен и используется многими разработчиками, меня радует - значит, у меня есть неплохие преимущества перед стартапами и командами, использующими его.


    1. Yuribtr
      29.09.2021 21:59

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


      1. theoretician
        30.09.2021 08:51

        MVP - веб приложение? Было бы здорово, если бы кто-нибудь более развернуто поднял этот вопрос на Хабре, но вот вкратце моё видение. Где нужен Python? В мобильной разработке он не используется, для десктопа тоже почти, на бэкэнде только и для аналитики и обучения сетей (тоже в основном для бэкэнда)? Если для бэкэнда, я даже не беру производительность в расчёт, странно писать на скриптовом динамически-типизируемом языке для серьезного бэкэнда, к тому же где фреймворков с поддержкой асинхронного программирования раз два и обчёлся для этого языка, и вообще асинхронное программирование - это не стезя пайтона, это вообще не его идея, и даже её реализация далеко не влучшем виде. По поводу MVP, MVC, MVVM и прочее на бэкэнде, тенденция идёт к созданию одностраничных web-приложений react, angular, vue, которые сами поддерживают эти архитектуры, двойной MVC на бэкэнде и фронтенде - тоже та ещё идея. По сути на бэкэнде нужен мощный высокопроизводительный высокораспараллеленный надёжный API, для которого Python крайне слабый выбор в сравнении с тем что вообще есть.

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

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

        Если всё же захочешь нечто скриптовое и динамически-типизиуремое на сервере, то лучше JS/CoffeeScript/Node вряд ли что-то найдётся, широчашая экосистема, отличные сборщики и, главное, асинхронное програмиирование на высочайшем уровне. И, кстати, JS в Node так же динамически-типизируемый, как правильно вы сказали, слабо-типизируемый, что ещё хуже влияет на производительность, но как тогда объяснить, что при этом JS в сотню раз производительнее Python?

        В общем для меня Python главное разочарование за всё время. То что он популярен, ну что ж, у кого-то будет преимущество, когда дело касается конкурентных работ.


        1. freecoder_xx
          30.09.2021 15:32

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


        1. Yuribtr
          30.09.2021 18:08
          +1

          MVP может быть чем угодно, даже концепт-кар.

          По поводу асинхронщины - да, обычный Python (Cython) в нем слабоват, все таки GIL сильно ограничивает возможности настоящей многопоточности. Однако есть варианты асинхронности (Asyncio, Multithreading и Multiprocessing). Надо понимать, что GIL внедрен не просто так, а для легкого встраивания библиотек на C, что в конечном итоге ускорило рост экосистемы Python.

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

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


          1. PsyHaSTe
            30.09.2021 22:13

            Так а в чем смысл в питоне тогда? Почему бы этот оптимизированный и однажды написанный специалистами код не взывать из Haskell/JS/TS/C#/Go/чегоугодноещё?


            Питон неплохой язык для обучения, чтобы заинтересовать человека, что у него что-то получается, такой вот wysiwyg. В моё время этим языком стал vbs который можно было в блокноте писать и сразу исполнять, но и питон хорошо, особенно на линухе где он есть из коробки. Но писать на нем что-то серьезное… Все эти возможность по манкипатчингу объектов в рантайме для меня скорее огромный минус, а не плюс. Впрочем, это проблема практически всей динамики. Но даже среди динамики имхо жс поинтереснее выглядит. А бог мне свидетель — я бы с жс на одной скамеечке бы не сел)


            1. Yuribtr
              30.09.2021 23:55

              Так а в чем смысл в питоне тогда?

              Ну вот тут написаны причины по которым выбирают Python. От себя еще добавлю и наверное повторюсь:
              1. Скорость разработки (Развернуть свой сервис API с БД можно буквально за минуты)
              2. Простота и лаконичность синтаксиса (Код читается чаще чем пишется)
              3. Наличие строгих правил оформления кода (PEP8)
              4. Огромная экосистема из библиотек (почти для всего что можно придумать)
              5. Сильная типизация (меньше шанс на ошибку)
              6. Скриптовый язык (код не нужно компилировать часами)
              7. В Python все есть объект, и даже функции - объекты первого класса
              8. Генераторы списков и выражений, а также все что связано с коллекциями
              9. Микро Python запускается даже на микроконтроллерах с 16Кб памяти

              Минусы также напишу, чтобы не думали что я агитирую исключительно за Python:
              1. Низкая скорость работы
              2. Псевдо-асинхронность из за GIL
              3. В Python возможно будет мало функциональщины для любителей реактивного программирования
              4. Увлекшись, можно наговнокодить - например написав целую игру "Змейка" в одну строку
              5. Для мобильной разработки, прикладных программ с GUI, системного программирования, написания фронта - Python подходит с большим скрипом. Написать если и можно, то разработка будет медленнее и результат не такой хороший как при использовании специализированных языков с нужной обвязкой.


              1. PsyHaSTe
                01.10.2021 00:55
                +2

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


                1. То же самое в практически любом языке. dotnet new --web-db И у вас настроенный хелловорлд апи с бд коннектом. Да и у жс с экспрессом кмк не хуже
                2. Ну тут можно наверное согласиться, но во-первых проблемы с тем, чтобы написать этот легковесный синтаксис не ошибившись. Во-вторых проблема не в том, чтобы прочитать пару строк кода, а например разобраться как работает библиотека. И тут у меня постоянно проблемы с ним. Ну и плюс у меня стойкое убеждение, что код непонятный статическому анализатору зачастую будет непонятный и для человека, его читающего. С этим я в ЖС столкнулся: сначала люди пишут как попало, а когда натягивают типы (чтобы понятно было что куда) всё вылезает, а сделать уже ничего нельзя — библиотекой пользуются. В итоге живут эти HeadersInit франкенштейны и живут.
                3. Во всех распространенных языках оно есть. eslint, rustfmt, gofmt, dotnet-format,…
                4. У жс/жавы не меньше
                5. Наверное можно согласиться, хотя мне лично всё что не дает мне ошибку до запуска программы тяжело отнести к сколько-нибудь хорошей защите от ошибок. Поставил if и так совпало что одна из веток не выполняется — сиди гадай, правильно ли там всё написано или нет.
                6. Не знаю где вы взяли компиляцию часами, но даже раст в дебаг компилируется секунды, а он лоулевел. Компиляция же сишарпов вообще считается в сотнях миллисекунд, мне кажется это даже вспоминать лишнее. ВО времена плюсов и плохой инкременталки — да, вероятно. Сейчас — только если сравнивать с теми же плюсами или сложными проектами на С/Rust.
                7. Функции первого класса везде, не вижу отличий питона от любых других япов. Можно ещё в плюсы записать что можно не знать ISA целевой архитектуры) Автоматически выполняется для практически любых япов из топ20 гитхаба.
                8. Лично я наоборот очень боли получил от питона в этом плане. Ну давайте простой пример, у меня есть коллекция чисел, я хочу получить следующее: если все элементы списка совпадают, то получить это число. Если различаюстя, то упасть с ошибкой. В итоге мне пришлось написать нечто такое:

                fair_id = reduce(lambda a, b: (a if a
                  == b else raise_(DepersonException('Multiple fairs are not supported'
                  ))), fair_ids)
                
                ...
                
                def raise_(ex):
                    raise ex

                тут и безумное форматирование (иначе код не компилируется или пеп ругатся), и супер-хелпер функция raise_ (ведь в питоне raise не является экспрешном), и километровый кейворд lambda. Поэтому в питоне так по-моему не пишут. Не обломаются написать форик проверяющий условие а потом в конце стыдливо напишут fair_id = fair_ids[0] # checked that it all elements are equal to the first one. В общем, мне трудно назвать это хорошей работой с коллекциями, честно говоря.
                9. Ну тут ничего не скажу — для кого-то это плюс, наверное. Я для таких случаев взял бы Rust с no_std.


                1. titsi
                  01.10.2021 08:43

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


                  1. VictorF
                    01.10.2021 09:08

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

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


                    1. SerHitman
                      01.10.2021 13:13
                      +1

                      В давние времена обучался по специальности с очень длинным названием и довольно глубоко изучался С++ и Ассемблер (2006-2009г) . После обучений знания по ЯП не использовались. А работаю я сетевым инженером и иногда пишу на python скрипты. Скрипт к примеру: Залогинится на какую-то железку, что то там выполнить, отпарсить интересующее, преобразовать в csv/json/(записать результат в БД) и т.д. Мой код даже в рамках програмистов-python далек от совершенства, уверен что код даже можно назвать "страшным", но я потратил на обучение и реализацию минимум времени, и все работает как надо, спасибо python. Повторюсь я не программист, "научился писать и пишу, но писателем себя не считаю".


                      1. VictorF
                        01.10.2021 13:42
                        +1

                        Ура!!! (кроме шуток). Python и был для этого создан. Автор языка-инструмента обслуживал море хостов университета. Его заставила окружающая действительность упростить себе жизнь...


                1. hardtop
                  01.10.2021 10:50
                  +1

                  Ну, это немного не python-way

                  def check_equal(my_list):
                      result = all(element == my_list[0] for element in my_list)
                      if result:
                          return my_list[0]
                      else:
                          raise Exception('Non equal')
                  

                  Я так в юности писал на с++. Вернее, использовал подход си, но с cout << )))


                  1. PsyHaSTe
                    01.10.2021 12:51
                    +3

                    Ну так в этом и проблема, в boolean blindness и том что мы явно проверяем my_list[0] и вот этом всем. Фолды призваны решать проблемы с коллекциями, а форик так не может. Кроме того, у нас my_list в первом случае может быть каким-нибудь networkStream у которого нет никакого индекса, по которому можно только итерироваться.


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


                    vat fairId = fairIds.Aggregate(
                      |acc, x| acc == x ? acc : throw new Exception("Something"));

                    Кмк тут проще и понятнее все. Ну и короче, что не то что важно, но приятно


                    1. hardtop
                      01.10.2021 13:54

                      Признаю, хороший пример, хоть мы начинали с "коллекции чисел" а не с "какого-нибудь networkStream".

                      Ну и то, что lambda в питоне не может кинуть исключение - так во всех яп есть свои ограничения.


                    1. tyomitch
                      01.10.2021 14:30

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

                      Ну мысленно замените my_list[0] на next(iter(my_list)), делов-то.


                1. theoretician
                  01.10.2021 17:29

                  С пунктом про время компиляции всё-таки соглашусь с @Yuribtr , в остальном с вашими доводами согласен. Сам пишу на Scala, реально долго идёт компиляция. На С++ ситуация со временем компиляции тоже не лучше. На счёт сильной типизации в Python тоже не совсем понятно, как это поможет, ну да, там не сложишь строку с числом как в JS, но вылезет-то это всё равно в рантайме.

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

                  Пайтону действительно не хватает функционального программирования, даже его там почти нет, почти всюду используются мутабельные данные. Мутабельные данные с распараллеливанием ещё с динамической типизацией, ещё и без компиляции, всё в рантайме - действительно, что может лучше для хорошего бэкэнда. В приведённом фрагменте вообще не стоило бы строить логику на бросании исключения как, например, в Scala + cats

                      val allTheSame = ids.zip(ids.tail).forall { case (previous, current) =>
                        previous == current
                      }
                  
                      val result = Either.cond(allTheSame, "All right", new IllegalStateException("All ids must be the same"))


                  1. PsyHaSTe
                    01.10.2021 17:39
                    +1

                    Хотел про скалу отдельно отметить, о потом подумал "да ладно, не так много народу на ней же пишет". И вот зря) Да, на скале с шейплесом можно накрутить такого что время компиляции С++ покажется совсем незначительным)


                    Но нужно помнить что С++ и обвешанная скала наверное самые долгокомпилирующиеся языки на рынке. У остальных с этим всё куда лучше. Например, при компиляции типового C# сервиса на 50kloc я наблюдаю следующие цифра для холодной/инкрементальной компиляции:


                    Build succeeded.
                        0 Warning(s)
                        0 Error(s)
                    
                    Time Elapsed 00:00:06.38

                    Build succeeded.
                        0 Warning(s)
                        0 Error(s)
                    
                    Time Elapsed 00:00:00.92


                  1. 0xd34df00d
                    01.10.2021 17:42
                    +1

                    С пунктом про время компиляции всё-таки соглашусь с Yuribtr, в остальном с вашими доводами согласен. Сам пишу на Scala, реально долго идёт компиляция.

                    Это всё сильно зависит. Я на хаскеле пишу, в том числе — да, релизные билды очень долгие, но билды без оптимизаций, релоад в репле или, тем более, фидбек от language server'а — моментальные. Да и вообще, когда у вас есть language server с нормальным типизированным языком, то компилятор вы запускать будете сильно реже.


                  1. tyomitch
                    01.10.2021 19:04

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

                    Да, именно так.

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

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


                    1. theoretician
                      01.10.2021 20:17

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

                      Я представляю так, сидят на хорошей зарплате штат scala-программистов, тут приходит директор и говорит: "Так, есть идея, но на чём же будем писать... хм... а давайте напишем пробный проект на Python..." ))


                      1. tyomitch
                        01.10.2021 21:16
                        +1

                        Я представляю так, сидят на хорошей зарплате штат scala-программистов

                        Выше в комментариях PsyHaSTe очень хорошо написал: «langname developer это и есть уровень джуна, ну мб мидла. Сениор и выше просто реализует функционал, а на чем — да на чем придется.»

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


                      1. vtb_k
                        02.10.2021 00:26

                        Я представляю так, сидят на хорошей зарплате штат scala-программистов, тут приходит директор и говорит: "Так, есть идея, но на чём же будем писать… хм… а давайте напишем пробный проект на Python..." ))

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


                      1. 0xd34df00d
                        02.10.2021 02:21
                        +1

                        Тоже самое и с ресерчами всякими.

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


                      1. tyomitch
                        02.10.2021 18:49
                        +1

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


                      1. 0xd34df00d
                        02.10.2021 19:36
                        +1

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


                      1. KvanTTT
                        03.10.2021 15:43

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


                  1. hardtop
                    02.10.2021 00:30
                    +1

                    Когда говорят про быстрый прототип на Python (или php или js), то часто имеется ввиду не "большая команда на зарплате" а один-два человека делают MVP. Это подразумевает не только код, но и дизайн, верстку (layout), картинки\иконки и пр.

                    Простые языки хороши тем, что их могут использовать не только истинные программисты (которые драйвер для сетевой карты напишут), но и дизайнеры\верстальщики. И простой (тупой) императивный стиль позволяет достичь нужной задачи. Для меня if\else в несколько строк гораздо нагляднее, чем кидать эксепшен при агрегации в одной строке.

                    Я много раз писал стартапы, и многие вообще не взлетали. А те что взлетали - оптимизировали и они вполне работали. Ютуб на питоне сначала написали - потом поправили. Фейсбук на php - тоже оптимизировали. А вот Одноклассники сразу на java накодили... что, сильно быстрее или успешнее стали?


                    1. KvanTTT
                      03.10.2021 15:48

                      Ну вот stackoverflow на net сразу сделали — это самый успешный проект в своей области. Одноклассники — довольно успешный для своей аудитории. Фейсбук соорудил костыль с php, который практически больше нигде не используется.


                      1. 5oclock
                        03.10.2021 16:08
                        +1

                        Вконтакте, насколько я помню, тоже свой PHP написали, который транспилируется в C++.


              1. 5oclock
                01.10.2021 08:53

                7. В Python все есть объект, и даже функции - объекты первого класса

                Я вот не пойму, что все носятся с этими функциями-объектами?

                Есть что-ли хоть один распространенный ЯП где функцию нельзя передать параметром в другую функцию или вернуть из неё?

                Где нельзя сложить функции в контейнер?

                Что в древнем C это было доступно мне кажется с самого его рождения, что в стильном-модном-молодёжном js.

                Все языки которые я хоть немного знаю (c/c++/js/java/python) - везде это есть.


                1. tyomitch
                  01.10.2021 09:17

                  Все языки которые я хоть немного знаю (c/c++/js/java/python) — везде это есть.

                  Ну и как вы в Java «сложите функции в контейнер»?


                  1. 5oclock
                    01.10.2021 10:20
                    +1

                    Видимо с Java я поторопился.
                    Признаю, что этот момент языка я знаю не достаточно.


                    1. VictorF
                      01.10.2021 10:28

                      Не разочаровывайтесь ;), ведь в стандарте Java нет понятия 'функция', соответственно и механизма для манипуляции ими. Или есть?


                      1. 5oclock
                        01.10.2021 11:58

                        Функция там есть. Но это — шаблонный класс (или как там оно называется в Java).

                        А то, что можно назвать функцией в контексте нашего обсуждения — в Java называется метод.
                        Он доступен через reflection API.
                        docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html

                        Наверное java.lang.reflect.Method можно и из функций возвращать, и передавать в функции.

                        Можно их считать «объектами первого класса»?


                1. ksbes
                  01.10.2021 09:28
                  +2

                  В Java этого нет. Даже в новых версиях, где есть похожее — это не более чем синтаксический сахар (т.к. по сути создаётся объект анонимного класса c методом apply). Это один из краеугольных камней Java, который всё никак не расшатают.

                  В с/с++ — тоже нет. Да там есть указатель на функцию, но это совсем не тоже самое! Попробуйте с этими указателями организовать каррирование — поймёте.

                  Со скрипом есть в js (любая функция-класс, любой класс — функция), но это именно со скрипом — в идеале не так должно быть.

                  Носятся с этим, потому что позволяет без лишних телодвижений писать очень универсальные и очень обобщённые алгоритмы — map/reduce как классический пример. На Java 8 реализовывать его самостоятельно — глаза кровью потекут. А на Пайтоне — напишешь и плачешь от умиления.


                  1. 5oclock
                    01.10.2021 10:19

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

                    А в c/c++ я именно указатели и имел в виду.
                    Для решения задачи: «может быть передан аргументом в другую функцию, возвращён из функции» — вполне подходят.

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


                  1. tyomitch
                    01.10.2021 12:34

                    В с/с++ — тоже нет. Да там есть указатель на функцию, но это совсем не тоже самое! Попробуйте с этими указателями организовать каррирование — поймёте.

                    Начиная с C++11, есть std::function, есть лямбды, каррируйте на удовольствие.


                  1. PsyHaSTe
                    01.10.2021 12:59
                    +1

                    В Java этого нет. Даже в новых версиях, где есть похожее — это не более чем синтаксический сахар (т.к. по сути создаётся объект анонимного класса c методом apply). Это один из краеугольных камней Java, который всё никак не расшатают.

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


                    1. tyomitch
                      01.10.2021 14:40

                      Ну например в том, что во всех остальных языках из списка 5oclock передача функции ничего не стоит (передаётся ссылка на нечто, что уже существует), тогда как в Java ради передачи функции создаётся каждый раз новый объект.


                      1. PsyHaSTe
                        01.10.2021 15:05
                        +1

                        Так а разве перформанс какое-то отношение в фиче имеет? Вон передать функцию в С++ дешевле намного чем в ЖС или лиспе, будем ли мы теперь говорить что в С++ ФП а лисп нет? Какая-то ерунда выходит, если честно.


                      1. tyomitch
                        01.10.2021 15:16

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


                      1. PsyHaSTe
                        01.10.2021 15:22
                        +1

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


                        К слову в сишарпе скорее всего у Delegate будет такое же поведение. Иногда, потому что когда может C# кэширует этот "функтор" в статическое поле класса и тогда адрес будет совпадать. А если не смог закешировать то адрес всегда будет отличаться.


                        Завязываться на это — завязываться на детали реализации и по сути эксплуатировать UB.


                      1. tyomitch
                        01.10.2021 18:46

                        В лиспе и C# это действительно UB, зато в остальных языках в списке выше - вполне штатная фича, которая к тому же ничего не стоит в рантайме


                      1. PsyHaSTe
                        01.10.2021 19:06
                        +2

                        Это я понял, это хорошая фича. Я просто не понял, почему это вдруг стало причиной "выписывания" из ФП. Странное деление, не по функционалу а по ничего не значащим цифрам.


                      1. 0xd34df00d
                        01.10.2021 17:46
                        +1

                        А зачем вообще сравнивать два функтора на равенство? Равенство по ссылке вообще не очень интересно, равенство по поведению неразрешимо.


                      1. tyomitch
                        01.10.2021 18:28

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


                      1. PsyHaSTe
                        01.10.2021 19:07
                        +1

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


                        Звучит весьма хрупко


                      1. theoretician
                        01.10.2021 19:39
                        +1

                        Ребят, вы спорите ни о чём, нет разницы, в Java или не в Java. Во всех языках для лямбды/замыкания создаётся объект, просто в Java до версии 8 он создавался явно, чтобы эмулировать callback, вы так же могли его кэшировать в переменную, чтобы он не создавался каждый раз заново, где это колбэк нужен, а с Java 8, Scala, Kotlin, C#, да и вообще во всех языках, где есть объекты, для этого есть краткие синтаксические конструкции, но создают они концептуально то же самое, что и в старой яве. Даже в современном C++ лямбды [] () {} неявно создают классы с перегруженным operator()


                      1. 0xd34df00d
                        02.10.2021 02:29
                        +1

                        Даже в современном C++ лямбды [] () {} неявно создают классы с перегруженным operator()

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


                        Впрочем, это в любом случае несущественные детали.


                      1. 0xd34df00d
                        02.10.2021 02:24
                        +1

                        Практика показывает, что лучше кешировать функцию на уровне функции (ну, условно, выражаясь псевдокодом, написать memoize : (a -> a) -> a -> a), а не на уровне внешнего мира. Как минимум потому, что тогда ответственность за кеширование лежит в точке передачи функции, а не в точке её использования, что чище и правильнее (так как в джаве, как абсолютно верно рядом заметили, вы чистую функцию от нечистой всё равно не отличите).


                  1. theoretician
                    01.10.2021 15:43
                    +1

                    Какие трогательные отношения у вас с Пайтоном, что сами вызывают умиление. В ООП языках, и вашем любимом Python в том числе, создаётся объект-обёртка вокруг любой функции, в том числе и лямбды. То есть lambda в Python так же создаёт объект с методом `__call__` . А в C++ всюду, в том числе и в подключаемых библиотеках используется обобщённое определение функции - нечто такое, что можно вызывать через круглый скобки () - это может быть хоть обычная функция, хоть указатель на функцию, хоть объект с определённым методом operator(). И это нормально, больших накладных расходов с объектами-функциями нет, к тому же объекты позволяют захватывать значения переменных из внешнего окружения, превращая функцию в замыкание. Я писал здесь статью об этом в далёком 2012м (https://habr.com/ru/post/149882/), правда я там перемудрил малость, но не важно.


  1. surreum
    29.09.2021 21:47

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


  1. Yuribtr
    29.09.2021 22:08

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


  1. AlexLeonov
    30.09.2021 00:27
    +2

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


  1. z0ic
    30.09.2021 07:20

    Есть ещё term rewriting категория. Из представителей можно назвать Refal и Maude. Последний применялся NASA для верификации сложных систем. Чтобы доказать, что программа выполняется корректно, нужен анализ объектного терма. Самый популярный язык имеющий структурированное объектное пространство - Haskell, хотя Refal не уступает ему в области символьных вычислений.


  1. Ninako
    30.09.2021 10:02

    Марк, спасибо за статью!

    Очень познавательная, пиши еще!


  1. Viceroyalty
    30.09.2021 11:26

    Сегодня востребованы программисты на Python, Go, C#, Java.
    а как же JS? Количество работы на нем просто зашкаливает.


    1. PsyHaSTe
      30.09.2021 22:13
      +1

      JS автор занес в разряд "нишевых" языков. Чем несказанно меня повеселил, к слову.


      1. RC_Cat
        01.10.2021 00:53

        Ну а что не так?

        • Js используется для машинного обучения?

        • Ну тогда может в банковском секторе (и я не про веб морды)?

        • Может игры на нём пишут?

        Для чего используют JS по вашему?


        1. PsyHaSTe
          01.10.2021 00:57
          +2

          1. Используется (хотя не так активно, как питон какой-нибудь)
          2. И там
          3. Уу, ещё как пишут. Причем полагаю побольше, чем на том же С++

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


          1. RC_Cat
            01.10.2021 10:15

            А как тогда отличать нишевый язык от не нишевого? Вот Vala нишевый язык? На нем в основном для Gnome пишут.


            1. PsyHaSTe
              01.10.2021 13:05
              +2

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


  1. vladimircreator
    01.10.2021 05:42
    +1

    Языки низкого уровня .... К ним относят C, C++, Rust и, в какой-то мере, Go

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


    1. VictorF
      01.10.2021 08:51
      +1

      Уважаемый Vladimir, согласен. Про НУ, это да - амбициозное заявление. Даже с 'натяжкой', отнеся C к низкому уровню, остальное - не катит ни в какие ворота. Предположим, если это всё компилируемые языки - значит НУ ;). ('натяжечка' C: 1. это связано с историей его возникновения - для того, чтоб уменьшить мытарства с ассемблерами; 2. на заре, для простеньких наборов машинных команд, и не изощренных компиляторов - легко можно было предсказать итог компиляции кода C в команды CPU).


      1. PsyHaSTe
        01.10.2021 13:09

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


    1. PsyHaSTe
      01.10.2021 13:08
      +1

      Почему все коментаторы докапываются до формулировок — загадка.


      Смысла деления на высокий/низкий где в одну категорию попадает всего 1 язык, а в другую — все остальные — нет. Когда мы делим область знания на категории они должны иметь +- равный вес, иначе получается ерунда.


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


      1. VictorF
        01.10.2021 13:32
        +1

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

        PS: приятно было ознакомиться с Вашим мнением (суждением).


  1. Neural_Selforganizer
    01.10.2021 05:42

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


    1. Viceroyalty
      02.10.2021 03:50

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

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

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


    1. KvanTTT
      03.10.2021 15:52
      +1

      … и несуществующим.