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

Содержание

Язык программирования — что это, виды: на чем пишут программы

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

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

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

Языков программирования в мире тысячи, востребованных на рынке – десятки.

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

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

Курс Уверенный старт в IT Поможем определить подходящую вам IT-профессию и освоить её с нуля. Вы на практике попробуете разные направления: разработку на разных языках, аналитику данных, Data Science, менеджмент в IT. Это самый подходящий курс для построения карьеры в IT в новой реальности. Хочу в IT!

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

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

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

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

Интерпретатор «переводит» код построчно и тут же инициирует его выполнение. Сначала он прочитает и отправит на исполнение первую строчку, затем вторую – и так далее.

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

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

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

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

Часто разные реализации одного и того же языка написаны на разных ЯП. Например, у JavaScript несколько интерпретаторов: на C, C++, Java и других языках.

Технологии не стоят на месте. В определенный момент сообщество разработчиков может обнаружить, что для его потребностей больше не хватает текущих языков – тогда рано или поздно появится новый, заточенный под актуальные задачи. Иногда языки «переписывают» и дополняют: так из JavaScript появился TypeScript, который отличается синтаксисом и особенностями, но преобразуется в тот же JavaScript.

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

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

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

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

Веб. Для веб-разработки используются JavaScript и его «потомки»: TypeScript и другие. Во фронтенде также понадобятся HTML и CSS, хотя это не совсем языки программирования, а в бэкенде — PHP. Иногда в вебе также применяют Python, Java и другие языки.

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

Сервисы и программы для разных ОС.

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

Для мобильной разработки еще применяют Kotlin и Swift. Первый — для программирования под Android, второй – под iOS и под macOS. Это универсальный язык от Apple.

В написании программ под macOS используется все тот же Swift, под другие ОС — разные языки, часто C-подобные. Это C, C++, C# и прочие. C/C++ используется в системном программировании и для создания быстрого, оптимизированного ПО.

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

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

Курс Уверенный старт в IT Поможем определить подходящую вам IT-профессию и освоить её с нуля. Вы на практике попробуете разные направления: разработку на разных языках, аналитику данных, Data Science, менеджмент в IT. Это самый подходящий курс для построения карьеры в IT в новой реальности. Хочу в IT!

Рейтинг языков программирования 2022. C# обошел Java, TypeScript сравнялся с PHP, а Dart – наиболее комфортный язык / Хабр

Python уже второй год подряд демонстрирует негативную динамику. Java тоже теряет позиции – в этом году она на третьем месте по популярности. На второе место поднялся язык C#. Доля JavaScript после небольшого падения в 2021 году снова растет. Но самая лучшая динамика у TypeScript (уже более 10% и прирост увеличился почти вдвое).

Украинский профильный ресурс DOU.UA провел очередной ежегодный опрос о языках программирования. На этот раз собрали 9245 анкет из Украины. Поехали.

Небольшое отступление и напоминание для тех кто пропустил, о том что DOU.UA в декабре 2021 года провел большой опрос среди украинских ИТ-специалистов о работе и зарплатах и оказалось, что медианные зарплаты у специалистов уровня Architect достигли отметки в $7200, зарплата у Senior увеличилась до $5500. Подробнее об этом можете прочитать в этой статье.

Коммерческое использование

Самым популярным языком среди украинских разработчиков остается JavaScript — 18,8%. На втором месте C# у него второй год подряд положительная динамика. Можно предположить, что это благодаря активному росту геймдев-индустрии. Далее следует Java, доля которой с 2017 года стабильно уменьшается.

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

Какой язык используете для работы сейчас

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

Какой язык используете для работы сейчас (2012–2021гг.)

Сферы использования

Если смотреть по отрасли применения, то ситуация другая: в бэкенд-программировании Java все еще доминирует, C# на третьем месте после PHP, а доля TypeScript и JavaScript не так уж велика, C# — также является популярным языком в геймдеве.

Языки программирования по сферам использования

На фронтенде TypeScript продолжает «откусывать» часть у JavaScript, но довольно медленно. Что касается обработки данных, то мы видим, что Python становится стандартом де-факто.

Ну и наконец интересно посмотреть на относительное количество респондентов в этих категориях.

В какой сфере в основном работаете

Личные предпочтения

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

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

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

Наиболее комфортным является Dart, далее в первом кластере Clojure, Kotlin, Rust, Swift, C#, Go и TypeScript.

Есть и неожиданность: перемещение Scala из первого кластера во второй. Относительно языков, которые рассматривают как альтернативные: из 80 человек, которые указали Scala как основной язык программирования, 50 начали бы проект им же, 9 перешли бы на Python. Возможно, это связано с тем, что Spark (написанный на Scala) достаточно активно работает над Python API для пользователей. Еще 8 не указали следующий язык, далее следуют Java(4), Rust(3), Go(2) и Swift(2). Еще по одному голосу у Kotlin и Clojure.

Если смотреть на направления миграции с Java — это, прежде всего, Kotlin, далее Go, Scala и Python, затем TypeScript и Dart. Еще интересное направление миграции из PHP, это преимущественно Go и JavaScript и Python.

Изучение новых языков

Около трети респондентов планируют выучить новый язык в течение следующего года. На этот раз фаворитом является Go.

Какие языки вы собираетесь изучать в следующем году

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

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

Похоже, первым языком у начинающих скоро станет JavaScript.

Первый язык новичков

Дополнительные языки

Среди дополнительных языков безоговорочный лидер – JavaScript (более 28%). Далее следует TypeScript (17%). У всех остальных языках менее 10%.

Какие языки вы используете как дополнительные

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

Какие языки используете в опенсорс-проектах

Финальная таблица

Дополнительные данные

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

Опыт работы программистом с динамикой (2012-2022 гг.)

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

Возраст разработчика в зависимости от языка
Опыт разработчика в зависимости от языка

Если у вас есть комментарии, предложения или замечания по статье 👉 переходите к обсуждению или пишите на [email protected].

Данные и скрипты обработки можно найти на GitHub
Анализ данных и текст: Руслан Шевченко
Инфографика: Игорь Яновский

Язык программирования Go

  • Посмотреть пример из практики

  • Посмотреть пример из практики

  • Посмотреть пример из практики

  • Посмотреть пример из практики

// Вы можете редактировать этот код! // Щелкните здесь и начните печатать.

основной пакет импортировать «фмт» основная функция () { fmt.Println(«Привет, 世界») }

 Привет, 世界 

Привет, мир! Игра жизни Конвея Замыкание Фибоначчи Целые числа Пеано Параллельное число pi Параллельное вычисление простых чисел SievePeg Solitaire Сравнение деревьев

  • Облачные и сетевые службы

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

  • Интерфейсы командной строки

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

  • Веб-разработка

    Благодаря повышенной производительности памяти и поддержке нескольких IDE Go поддерживает быстрые и масштабируемые веб-приложения.

  • DevOps и надежность сайта

    Благодаря быстрой сборке, компактному синтаксису, автоматическому форматированию и генератору документов Go поддерживает как DevOps, так и SRE.

  • Другие варианты использования arrow_forward

  • Учебные поездки с гидом

    Пошаговые руководства, чтобы намочить ноги

  • Онлайн обучение

    Просматривайте ресурсы и учитесь в своем собственном темпе

  • Избранные книги

    Прочтите структурированные главы и теории

  • Облако Самостоятельные занятия

    Перейти к развертыванию приложений Go на GCP

  • Ардан Лабс

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

  • Путеводители по сусликам

    Индивидуальные занятия Очные, дистанционные и онлайн-обучения. Обучение для разработчиков от разработчиков.

  • Босс Соус Креатив

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

  • Шиджу Варгезе

    Обучение Go на месте и консультации по архитектуре распределенных систем в Индии.

лучших языков программирования 2022 года — IEEE Spectrum

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

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

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

При функциональном программировании меньше значит больше

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

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

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

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

Шира Инбар

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

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

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

Обнуление проблем с нулевыми ссылками

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

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

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

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

Почти каждый популярный сегодня язык имеет этот недостаток. Первый ученый-компьютерщик Тони Хоар ввел нулевые ссылки в язык ALGOL еще в 19 году.65, а позже он был включен во многие другие языки. Хор объяснил, что сделал это «просто потому, что это было так легко реализовать», но сегодня он считает это «ошибкой на миллиард долларов». Это потому, что это вызвало бесчисленное количество ошибок, когда ссылка, которую программист считает действительной, на самом деле является нулевой ссылкой.

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

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

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

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

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

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

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

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

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

Функциональное программирование также требует, чтобы данные были неизменяемыми, а это означает, что если вы присвоите переменной какое-то значение, это значение останется навсегда. Переменные больше похожи на переменные в математике. Например, чтобы вычислить формулу, y = x 2 + 2 x – 11, вы выбираете значение для x и ни разу во время вычисления y означает, что x принимает другое значение. Таким образом, при вычислении x 2 используется то же значение для x , что и при вычислении 2 x . В большинстве языков программирования такого ограничения нет. Вы можете вычислить x 2 с одним значением, затем изменить значение x перед вычислением 2 x . Запрещая разработчикам изменять (мутировать) значения, они могут использовать те же рассуждения, что и на уроках алгебры в средней школе.

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

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

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

Позвольте мне привести пример того, насколько программирование небрежно по сравнению с математикой. Обычно мы учим новых программистов забывать то, что они узнали на уроках математики, когда они впервые сталкиваются с оператором х = х + 1 . В математике это уравнение не имеет решений. Но в большинстве современных языков программирования х = х + 1 не является уравнением. Это оператор , который дает компьютеру команду взять значение x , добавить к нему единицу и поместить обратно в переменную с именем x .

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

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

Функциональное программирование имеет крутую кривую обучения

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

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

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

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

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

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

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

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

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

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

Хотя такие учебные ресурсы могут только помочь, для того, чтобы этот переход произошел в широких масштабах, компании, работающие с программным обеспечением, должны больше инвестировать в свой самый большой актив: в своих разработчиков. В моей компании, Panoramic Software, где я являюсь техническим директором, мы сделали эти инвестиции, и вся новая работа выполняется либо на PureScript, либо на Haskell.

Мы начали переходить на функциональные языки три года назад, начав с еще одного чисто функционального языка под названием Elm, потому что это более простой язык. (Мы и не подозревали, что в конце концов перерастем его.) Нам потребовалось около года, чтобы начать пожинать плоды. Но с тех пор, как мы преодолели горб, это было замечательно. У нас не было ошибок рабочего времени выполнения, которые были так распространены в том, что мы раньше использовали, JavaScript на передней части и Java на задней. Это улучшение позволило команде потратить гораздо больше времени на добавление новых функций в систему. Теперь мы почти не тратим время на отладку производственных проблем.

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

Будущее функционального программирования

Моя компания небольшая. Он поставляет программное обеспечение правительственным учреждениям, чтобы они могли помочь ветеранам получать льготы от Департамент по делам ветеранов США. Это чрезвычайно полезная работа, но это не прибыльная сфера. При минимальной марже мы должны использовать все доступные нам инструменты, чтобы делать больше с меньшим количеством разработчиков. И для этого функциональное программирование — как раз то, что нужно.

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

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *