5 языков программирования, которые стоит изучить, чтобы улучшить свой стиль программирования
«Почему этот код такой беспорядочный? Почему эту проблему ооочень сложно выразить? Что, черт возьми, творится в этом коде? »
Подобные вопросы много раз подталкивали меня к поискам Святого Грааля языков программирования. Я не нашел Грааля, но, как и с каждым путешествием, я становился мудрее и опытнее.
Программисты давно искали лучший способ выразить себя на компьютере. Среди всех когда-либо созданных языков лишь немногие стали широко распространенными отраслевыми стандартами.
Как и я, вы, вероятно, используете проверенную в боях, популярную технологию и пытаетесь заставить ее работать на вас наилучшим образом. Но все мы знаем, что вещи не идеальны - у них есть свои недостатки, которые действуют нам на нервы и терпение.
Вот краткий список языков, которые я пробовал и которые помогли мне в повседневной работе. Хотя я не был экспертом или даже постоянным пользователем большинства из них, я получил много удовольствия, экспериментируя с этими языками, и мне нравится думать, что они просто сделали меня лучшим программистом в целом.
Языки машинного обучения (F # / OCaml)
В качестве первой записи я хотел бы представить вам языки семейства ML. Это было не первое мое погружение в мир функционального программирования (ФП). Однако именно он принес мне настоящее практическое понимание того, как это должно работать.
Хотя оба языка поддерживают несколько парадигм, они лучше всего подходят для функционального программирования. Они не такие строгие и чистые, как Haskell, поэтому вы можете погрузиться в стиль функционального программирования без особых усилий и разочарований.
Мне очень нравится, как легко управлять потоком с помощью сопоставления и разрушения. F # отлично подходит для визуализации последовательности выполнения функции с первого взгляда. Это черта, которую я стараюсь включить в свой код независимо от языка.
Благодаря языкам машинного обучения я стал лучше разбираться в композиции и дизайне своих шрифтов. Несмотря на то, что F # будет пытаться угадать ваши типы из кода, который вы пишете по своей сути, это строго типизированный язык.
F # отлично подходит для изучения операций функционального стиля над последовательностями. Это общая черта любого первого языка FP. Складки, карты Zip и т. Д. Эквивалентны молотку в наборе инструментов программиста FP. Сильный акцент на этом элементе, поддерживаемый синтаксисом, упрощающим его использование, поможет вам научить свой мозг видеть проблемы, которые можно абстрагировать до операций последовательности.
Изучение F # - отличный первый шаг в мир функционального программирования, если у вас есть опыт работы с ООП (объектно-ориентированное программирование). Если вы застряли, вы всегда можете вернуться к своим повседневным предметам и занятиям. F # без особой суеты смешивает их с другим кодом.
Совместимость F # с .NET также очень помогает, если у вас есть опыт работы с C #. Вы по-прежнему можете использовать свои надежные инструменты .NET и пакеты nuget.
Я могу только порекомендовать вам попробовать. Это хорошее развлечение без очень крутого обучения.
Но если вы не боитесь крутой кривой обучения, вы можете сразу перейти к:
Haskell
Итак, Haskell был (и остается) проблемой, к которой я люблю возвращаться время от времени. Несмотря на то, что я никогда не заканчивал ни одного крупномасштабного проекта, мне всегда нравится умственная задача, связанная с работой с ним.
Вначале программирование на Haskell было тяжелым испытанием… и, честно говоря, до сих пор. Haskell - это не простой и удобный язык машинного обучения. Этот язык заставит вас программировать FP и правильно программировать.
Вы должны правильно проектировать свои типы. Вы должны точно планировать свои функции. И нет никакого мошенничества с реализацией, если вы сказали, что эта функция что-то сделает, вы должны выполнить свое обещание. Никаких половинных реализаций, никаких пропущенных случаев или «других».
Но главное - никаких скрытых побочных эффектов. Если вы сказали, что ваша функция получит строку и вернет ее обратно, то компилятор заставит вас выполнить свои обещания. Нет печати отладочной информации, нет чтения пользовательского ввода. Вы сказали, что получите веревку и вернете ее ТОЛЬКО, не так ли?
Работа с этим языком действительно настраивает ваш мозг на то, чтобы помнить о том, что вы обещали, объявив функцию (или метод).
Несмотря на то, что эта строгость не всегда хорошо переносится на такие языки, как C #, она сделает вас более осведомленными и подтолкнет к тщательному объявлению функций, чтобы у другого пользователя не было неприятных сюрпризов. И это избавит вас от некоторых ругательств, когда вы вернетесь к своему собственному коду через год или два.
Я знаю, что мой мозг мгновенно подает сигнал тревоги, когда я изменяю любые аргументы, передаваемые методу. Мне это было нужно? Предупредил ли я потенциального пользователя, что функция испортит его данные?
Когда я начал его изучать, Haskell был странным языком. Я уже знал, что программисты на Haskell сидят на верхнем этаже башни программирования из слоновой кости. Я также обнаружил, что над самой вершиной башни парят явно странные существа (шутка принадлежит ScottW).
И эти ребята программируют в:
Семейство LISP: Common LISP, Clojure, Scheme
Это действительно чуждо всем, кто, как и я, происходит из семьи C. Первый озадаченный взгляд на код, первый скрещенный взгляд, вызванный множеством фигурных скобок, обнимающих утверждения. Ах, воспоминания!
Мой первый шаг в мир LISP был через Clojure. Я просто просматривал книжный магазин, когда мое внимание привлекла книга о Clojure (ради любви, не помню, какая это была книга). Я забрал его домой, и приключение началось. Или, если быть точным, дни решения головоломки за головоломкой и попыток понять, как, черт возьми, использовать эту штуку. Я сдался через несколько недель, а через год вернулся к этому. И снова сдался. Затем я нашел Common LISP и снова отпустил его, но на этот раз с добавленной ценностью, обнаружив, что EMACS - это то, что я хочу от моего текстового редактора (и, возможно, операционной системы).
Я не помню, в какой момент этого цикла что-то щелкнуло. Скобки сливались с фоном, и то, что осталось, было просто ясностью. Если и есть что-то, что вы найдете в LISP, так это элегантность. Я бы ни за что не сказал, что могу писать первоклассный код на LISP, но чтение кода опытных программистов вызывает трепет и зависть. Я надеюсь, что однажды я смогу написать программы, которые так красиво объясняют себя.
Если я могу свидетельствовать об удивительных возможностях этих языков, то чаще всего, я могу понять цель программы, даже если у меня недостаточно знаний, чтобы написать ее самому.
Все это благодаря простому, но гибкому дизайну. Вдобавок ко всему существует не имеющая аналогов макросистема, о которой я знаю. Это дает вам возможность писать свои программы для решения задач, которые вы решаете, с поддержкой построения синтаксиса.
Еще одна важная особенность - интерактивное экспериментальное программирование с помощью REPL. Работа над живым кодом побуждает к экспериментированию и позволяет вам проверить множество идей, прежде чем переходить к одному проекту для своего кода.
Несмотря на то, что я не использую LISP в своей работе, он по-прежнему остается отличным инструментом, и я нашел истину в часто цитируемом предложении «Изучение LISP сделает вас лучшим программистом». Не знаю, стал ли я программистом лучше благодаря LISP, но он определенно расширил мои горизонты.
Ржавчина
Впервые я узнал о Rust, когда имел дело с любимым проектом на C ++. Я не ненавижу и не презираю C ++, но любой, кто его использует, знает, что иногда это может немного раздражать.
Сложность и свобода, которые предоставляет C ++, поразительны, но они также могут быть ошеломляющими, вплоть до потери надежды ...
Если вы никогда не писали в нем проект среднего / большого размера, позвольте мне сказать вам, что он может довольно быстро испортиться.
Основная идея этого гиганта языка заключается в том, что ни по какой причине разработчикам не следует запрещать стрелять себе в ногу… или 20 футов, которые случайно оказались там сейчас, и вы не знаете, как они сюда попали. Кроме того, где-то находится ваша оригинальная ступня, но вы уже не знаете, где именно.
В любом случае. Rust решает проблему строгости парадигмы RAII и самоуверенности AF. Подобно Haskell, компилятор следит за всем и обеспечивает правильную структуру вашей программы.
Основная цель: если он компилируется, он будет работать правильно.
Писать на Rust - все равно что работать с рассерженным тренером, который исправит вас в случае малейшей ошибки.
Это хорошая практика, особенно если вам сложно правильно управлять памятью.
Кажется, что Rust значительно улучшается каждый раз, когда я смотрю на него. Даже если он не заменит C ++ для языка общего назначения среднего уровня, все же хорошо иметь хорошего соперника.
Болтовня
Этот вариант мне порекомендовал мой друг в разгар дискуссии об объектно-ориентированной и функциональной парадигме. Подпитанный пивом, я занял позицию новичка в функциональном программировании, который думал, что эта новая парадигма решит все мои проблемы, если не проблемы всего мира.
Мне возразили простым аргументом:
Попробуйте Smalltalk и посмотрите, действительно ли объектно-ориентированное программирование бесполезно.
Так что я попробовал и был поражен. Оказывается, я понятия не имел, как делать объектно-ориентированные разработки. Smalltalk специфичен. Большинство реализаций: Pharo, Squeak и т. Д. Предоставят вам полноценную IDE, которая почти как небольшая операционная система, созданная только для разработки.
Он дает вам все инструменты для выполнения работы, но, что наиболее важно, он настоятельно предлагает рабочий процесс, который показывает вам, как развиваться так, как я бы назвал Smalltalk.
Итак, вы комментируете, вы пишете свои тесты. Вы заботитесь об именах и каталогизации ваших объектов и функций в соответствующих объектах, протоколах и пакетах.
Назовите меня сумасшедшим, но мне кажется, что Фаро почти гордится мной, когда я все делаю правильно.
Оказывается, правильный путь приносит большие деньги.
Сам язык очень прост, и вы можете легко изучить синтаксис менее чем за 15 минут. Никаких уловок, никакого синтаксического сахара. Он дает вам достаточно инструментов для выполнения работы, так что вы ее делаете. Ваш ум не блуждает, пытаясь найти, какие языковые инструменты вам следует использовать - выбора нет. Я чувствую, что это позволяет моему мозгу сосредоточить всю свою силу на текущей работе. У меня работает, может быть, у вас сработает.
Послесловие
Есть языки, которые я пропустил в этой статье. Некоторые из них настолько распространены, что вы, вероятно, видели их в другой форме, например Python / Java / C ++ / C # и т. Д.
Некоторых я не соблюдал, следуя правилу: если вам нечего сказать, ничего не говорите (я смотрю на ваш JavaScript, эхм).
Некоторые, такие как Ruby, Scala, Perl, я еще не пробовал. Я надеюсь, что узнаю их лучше в будущем.
Был ли у вас подобный опыт обучения или совершенно другой, я хотел бы услышать от вас в комментариях.
Ваше здоровье!