В моей жизни разработчика я работал во многих проектах, каждый проект принес проблемы и знания, потому что они разные и имеют свои собственные требования, масштабы и видение. Работая, я изучил такие языки, как: Pascal/Delphi, C, C++, Java, PHP, JS, Ruby, Go и т. д. Вероятно, этот список со временем растет, поэтому я решил написать несколько советов о том, на чем вам нужно сосредоточиться, когда вы попробуй выучить язык программирования.

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

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

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

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

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

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

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

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

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

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

Цель

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

Одним из примеров является GO, у него есть только одна рабочая область, где ищут пакеты в приложениях (пакеты тоже), это определяется с помощью переменной среды, называемой $GOPATH. В других пакетах вы можете иметь рабочие области любым путем.

Другой пример — Rust, во многих современных языках есть концепция под названием Garbage Collector, но Rust в нее не верит и использует другой подход к управлению памятью.

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

Исполнение и среда

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

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

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

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

Экосистема

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

Есть люди, использующие R для веба (я их не осуждаю… ну может немного)

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

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

Функции

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

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

В середине 2019 года я решил изучить Web Assembly, просматривая некоторые примеры, я немного заметил это, почти все образцы были сделаны на C++ или Rust. Я спрашиваю себя: почему? Одной из целей этого формата является поддержка других языков для выполнения в браузере. Ответ на это был прост и имел смысл. Сборщик мусора не поддерживался, эта функция управляет памятью в других языках, таких как Java, C#, Go и т. д. В Rust и C++ делайте это под свою ответственность и не используйте сборщик мусора, у них другой подход к управлению памятью.

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

Организация

Одна из самых сложных задач при написании кода — организация кода (самое сложное — переменные имен), потому что #ArchitectureMatters.

Куда положить мой код, в один файл, папку с множеством файлов?

Иногда это расстраивает, потому что это сложно, когда ищешь, как это сделать, находишь много способов сделать это. Фреймворки отлично подходят для решения этой проблемы, потому что у них есть способ добиться цели. Помимо файловой системы, в языках есть способ организации кода, например, некоторые языки используют концепцию пакетов (java, go, c#), другие используют концепцию модулей (JS, Rust). Концепция модуля используется и в Go, но имеет другую область применения, и кто-то вроде JS в браузере «дает» поддержку организации модулей в вашем коде через системы сборки.

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

Документация и практика

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

Одно дело делать работу, а другое - делать ее правильно. Вы можете с 20-летним опытом сделать это неправильно.

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

Помните, что более важная цель программного обеспечения — делать что-то, а не сосредотачиваться на том, как это делается.

Начинать

  1. Настраивать
  2. Привет мир
  3. Тестирование

Эти 3 простых шага помогут вам начать и двигаться дальше. Со временем вы будете заниматься более интересными вещами. Рекомендую выполнять упражнения в CodeSignal или Hackerrank попробовать сделать примеры на нескольких языках, чтобы увидеть разницу между ними.

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

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

Мой последний совет и более важный:

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