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

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

Питон

Преимущества:

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

Наука о данных. Благодаря преимуществам всех предыдущих пунктов такие пакеты, как NumPy, SciPy, Scikit-Learn, TensorFlow, PyTorch, за последнее десятилетие сделали Python стандартным языком для обработки данных. Вы можете думать о науке о данных и машинном обучении как о новой парадигме программирования, и Python может возглавить этот переход к следующему поколению.

Идеи проекта:

  • Веб-скраппер. Вы можете легко написать веб-скрейпер, который находит, анализирует и сохраняет информацию из Интернета с помощью Python и таких библиотек, как requests, beautifulsoup4. Подумайте о какой-нибудь информации, которая вам нужна, и напишите программу, которая доставит ее для вас.
  • Приложение для машинного обучения. Изучайте науку о данных и машинное обучение с помощью Python — это очень интересно и популярно в наши дни. Начнем с того, что в документации популярных библиотек машинного обучения, таких как scikit-learn и PyTorch, есть много руководств по конкретным задачам машинного обучения.

JavaScript/TypeScript

Преимущества:

  • Функциональное программирование. Функциональное программирование основано на функциях, но не только на функциях. Это парадигма программирования, которая обрабатывает данные, создавая четкий поток преобразований данных, что часто упрощает ваше представление о логике программирования. JavaScript может быть не самым функциональным языком, но вы можете легко ознакомиться с его философией.
  • Система типов. И Python, и JavaScript практикуют утиную печать. Хотя это полезно, более статическая и строгая система типов имеет свои преимущества, заключающиеся в лучшем завершении кода, более быстрой оптимизации и более четкой архитектуре типов. TypeScript расширяет JavaScript объектно-ориентированной системой типов, которая в значительной степени демонстрирует эти практические эффекты хорошей системы типов.
  • Асинхронное программирование. С самого начала JavaScript имеет управляемую событиями природу для интерактивных вариантов использования, которая основана на асинхронном программировании в стиле обратного вызова. Позже, после того, как promise/async/await стали популярными, этот стиль асинхронного программирования сильно повлиял на то, как пишутся программы ввода-вывода и серверные программы. Асинхронное программирование в JavaScript легко понять и осмыслить, что дает хорошую возможность войти в мир асинхронности.
  • Модули и зависимости. Начиная с ES6, модульная система JavaScript превратилась в современный подход. Вместе со способом управления пакетами и зависимостями npm система модулей и пакетов JavaScript в значительной степени вдохновляет и влияет на более поздние языки программирования.
  • Несколько сред выполнения. JavaScript – один из немногих языков, который работает буквально везде. Это расширяет область применения JavaScript и позволяет языку поглощать блестящие идеи из разных областей.

Идеи проекта:

  • Визуализация данных. Используйте JavaScript для создания потока от данных к визуальным элементам, таким как SVG. Построение четкого потока данных может помочь вам понять мыслительный процесс функционального программирования, и результат также должен быть захватывающим.
  • Небольшая игра в браузере. Независимо от того, манипулируете ли вы DOM или рисуете на холсте HTML, вы всегда можете создать небольшую, но забавную игру в браузере с помощью JavaScript, практикуя управление состоянием.
  • Полнофункциональное веб-приложение. Благодаря JavaScript у вас есть возможность писать программы на одном языке как для браузера, так и для сервера. Попробуйте написать веб-сервер с Node.js / Deno в сочетании с каким-нибудь кодом браузера, который извлекает данные из него. Вам могут понадобиться некоторые фреймворки (экспресс, React и т. д.), чтобы упростить процесс, но идея здесь в том, что для завершения всего процесса может потребоваться только один язык.

C

Преимущества:

  • Та же философия, что и в Unix. Unix-подобные системы хорошо спроектированы и широко используются. Все они написаны на C и имеют определенную философию или культуру, которая побуждает писать программы для выполнения одной задачи, и делать ее хорошо. В языке C так много общих принципов с Unix, что стоит его изучить.
  • Ближе к голой машине. В коде C нет загадочной фоновой работы, такой как сборка мусора. Все напрямую связано с каким-то механизмом базовой машины. Это дает вам полный контроль над тем, что делает ваша программа, и часто помогает научиться лучше управлять ею.
  • Легкий для понимания процесс компиляции. Понимание деталей компиляции и выполнения языка действительно может помочь нам писать более качественные программы, и лучше всего начинать изучать, как именно работает язык, с простого языка более низкого уровня, такого как C. Абстракции высокого уровня легче понять только после того, как будет хорошо понят самый базовый механизм.

Идеи проекта:

  • Читайте Unix-программы. Существует много кода на C, написанного лучшими программистами, и прежде чем писать свой собственный, вы всегда можете извлечь из них уроки, прочитав их.
  • Реализовать программу оболочки. Эта и следующие идеи проекта взяты из известной книги Computer Systems: A Programmer’s Perspective. В книге представлено несколько проектов, позволяющих читателям практиковать то, что они узнают о компьютерных системах. Одним из них является написание оболочки, поддерживающей управление процессами, обработку сигналов и многое другое. Научившись писать его на C, вы сможете лучше понять операционные системы.
  • Написать прокси-сервер. Прокси-сервер – это программа, которая размещается между клиентом и сервером для отслеживания, фильтрации или другой обработки всего сетевого трафика другой программы. Как и предыдущий проект, это также один из книжных проектов для образовательных целей, и он действительно может помочь вам проникнуть в компьютерные сети.

Ржавчина

Преимущества:

  • Управление памятью. После того, как вы изучите Python, JavaScript и C, вы заметите, что предыдущие языки либо берут на себя полную ответственность за управление памятью (посредством сборки мусора), либо возлагают эту тяжелую ответственность непосредственно на вас, программиста. Rust использует другой подход. Вы будете контролировать свою память, но делать это безопасным и хорошо контролируемым способом. Хотя безопасность является серьезной проблемой, этот новый способ управления памятью может фактически дать вам совершенно новый взгляд на ваши данные, когда вы программируете. Вскоре вы обнаружите, что чем лучше вы знаете свои данные, тем лучшим программистом вы станете.
  • Система типов. После многих лет разработки системы типов в языках программирования больше не позволяют рассматривать все как объекты. Речь идет о соблюдении определенных правил формы и поведения различных конструкций компьютерной программы, таких как переменные, выражения, функции и т. д., чтобы убедиться, что вся программа (и программист) разделяет одинаковое понимание своих данных. С этой современной точки зрения на систему типов Rust моделирует данные и операции с солидным алгебраическим фоном и использует этот подход, который отличается, но во многих отношениях лучше, чем объектно-ориентированное программирование. Изучение способа Rust (перечисления, сопоставление с образцом, трейты, дженерики) может помочь вам писать программы с действительно высокой осведомленностью и уверенностью.
  • Дизайн API. Благодаря системе типов Rust, включающей трейты и алгебраические типы данных, 90 % требований можно смоделировать простым и элегантным способом. Это позволяет нам больше думать о выражении наших идей непосредственно в нашем дизайне и, в конечном итоге, создавать более простые и эргономичные API. Чтобы идеально смоделировать оставшиеся 10%, нам нужно усложнить систему типов до такой степени, что это может разрушить простоту дизайна API. Здесь Rust делает шаг назад и снижает сложность с помощью другого средства (макросов). Все эти варианты дизайна делают Rust идеальным языком для разработки API.
  • Инструментальная цепочка. Хотя сам язык Rust извлек уроки из многих языков, набор инструментов — это то, что действительно выделяет Rust среди других. Вместе Cargo вместе с clippy, miri, rust-analyzer и т. д. образуют очень тесную и компактную экосистему, чрезвычайно мощную и интуитивно понятную с точки зрения пользователя, а также хорошо структурированную и расширяемую с точки зрения языка.

Идеи проекта:

  • Многопоточный/асинхронный веб-сервер. Последний проект книги — многопоточный веб-сервер, демонстрирующий способ программирования на Rust на относительно небольшом примере. Я предлагаю вам изучить этот проект, а затем научиться использовать какой-нибудь крейт (actix-web, warp, axum и т. д.), чтобы делать то же самое.
  • Перепишите и протестируйте некоторые программы Unix. Учиться на C-программах — это хорошо, как мы говорили в предыдущем разделе, но их переработка на Rust и достижение той же производительности может оказаться сложной задачей. При этом используйте инструменты тестирования и бенчмаркинга из экосистемы Rust/Cargo, и в процессе вы многому научитесь.
  • Компилятор. Вы можете научиться создавать компилятор для C (или упрощенной/модифицированной версии C) с помощью Rust. Затем вы можете попробовать изобрести и реализовать свой собственный язык. Поступая таким образом, вы узнаете и оцените больше обо всех языках программирования, их вариантах дизайна и обо всех компромиссах.
  • Библиотека структур данных. Написание исполняемой программы больше связано с реализацией, но разработка библиотеки — это нечто большее. Я предлагаю вам начать с простой библиотеки, реализующей определенный тип структуры данных. Хотя правильная реализация может занять некоторое время, вы обнаружите, что больше думаете о дизайне API. Попытайтесь подумать о ее вариантах использования и повторите дизайн несколько раз, пока он не будет согласовываться со стандартной библиотекой или другими подобными ящиками.
  • Игра Bevy. Bevy — это игровой движок с открытым исходным кодом, построенный на Rust, и прекрасный пример использования базовых возможностей Rust для поддержки совершенно другой парадигмы программирования. Попробуйте использовать bevy, чтобы создать либо простую автономную игру, либо более сложную многопользовательскую игру с сетевой поддержкой.

Еще

Есть еще так много замечательных языков, которые стоит изучить, но здесь они не упомянуты (Kotlin, Scala, C#, Golang, Swift, Haskell, Julia, …). Однако я считаю, что после того, как вы изучите языки, которые я упомянул, у вас разовьется собственный вкус к языкам программирования. В конце концов, речь идет о том, что вы хотите сказать и сделать с ним, как и с естественным языком.