Углубленный взгляд на различные языки программирования и многое другое

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

Что означает это «Изучение программирования»?

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

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

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

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

Кроме того, новичку сложно ответить на вопрос, каково это — научиться программировать? Если меня об этом спрашивают (или даже если меня не спрашивают, мэм), я обычно даю своим ученикам такой ответ:

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

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

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

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

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

Скажем, в Java вы можете найти все эти структуры данных в Java Collections Framework, и среди его методов есть лучшие реализации алгоритмов. То же самое верно и для других популярных языков. Однако, если вы хотите стать не просто кодером, а действительно хорошим программистом, рекомендую уделить достаточно пристальное внимание алгоритмам и структурам данных.

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

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

Теперь давайте посмотрим, как выбрать язык программирования.

Какой язык имеет смысл выучить в первую очередь?

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

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

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

  • Веб-сайты (интерфейс) — JavaScript, TypeScript
  • Веб-сайты (серверная часть) — Python, PHP, JSNode, Ruby
  • Веб-приложения: Java, C#, Python
  • Мобильные приложения: Java, Kotlin (для Android), Swift (для iOS)
  • Видеоигры: C++, C#, игровые движки
  • Корпоративные проекты: Java, C#
  • Научные проекты: Java, Python
  • Операционные системы, драйвера: C, C++
  • Встроенные системы: Java

Это общие рекомендации; они не универсальны. Игры в браузере, например, можно писать на JavaScript, и никто не мешает вам создать операционную систему на Java.

Далее, давайте посмотрим, насколько полезным будет выбор.

Я еще не решил…

Однако чаще всего я слышу самые разные ответы на этот вопрос:

  • — Я еще не решил.
  • "Не знаю точно. Может быть…» И тут последовал один из вариантов выше. Большинство людей вообще не уверены в том, чего они хотят.

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

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

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

Сегодня школьников часто знакомят с программированием на визуальном языке Scratch. Это очень приятный инструмент и, надо сказать, довольно мощный. Но он нужен именно для изучения и создания образовательных проектов. Вряд ли он вам понадобится в работе (если только вы не хотите присоединиться к команде его разработчиков… ну или учить детей программированию).

Если человек еще не знает, чем именно он хочет заниматься как программист, имеет смысл выбрать один из популярных универсальных языков программирования. «Универсальный» означает, что его можно использовать в различных областях и типах программирования. Если вы посмотрите на список из предыдущего пункта, то увидите, что несколько языков повторяются довольно часто. Это Java, Python, C# и C++. Пожалуй, все эти языки, кроме C++, подходят для начинающих.

Почему не С++?

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

Короче говоря, если вы хотите создавать высокопроизводительные приложения или ААА-игры, вам нужен C++…, но не сразу. Лучше сначала выучить один из трех других языков, о которых я писал.

Питон?

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

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

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

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

a = 5
b = 7

Нам нужно поменять местами a и b. Обычно эта проблема решается с помощью дополнительной переменной. Попутно грамотный репетитор объяснит, что a и b — это имена, которые относятся к областям памяти, где записаны значения \u200b\u200bof переменных (или немного по-другому, в зависимости от языка).

Обычно это решается так (на любом языке): представьте, что ваши значения находятся в двух контейнерах, a и b. Для решения создается переменная буфера tmp, то есть третий временный контейнер.

На первом шаге ему передается одно из значений, например, 5. Далее значение из b, то есть 7, помещается в «освобожденный» контейнер a, а затем переменная из временного контейнера переносится в контейнер b. Вот как это выглядит в псевдокоде. Обратите внимание, что знак = — это не равенство, а оператор присваивания (он одинаков почти во всех языках программирования).

a = 5
b = 7
tmp = a
a = b
b = tmp

Теперь переменная tmp сделала свое дело. Переменная a имеет 7, а переменная b имеет 5. Эту простую задачу очень важно хорошо понять с самого начала вашего пути программиста. Примерно эта задача решается в любом языке программирования.

Эту проблему также можно решить с помощью двух временных переменных:

a = 5
b = 7
tmp1 = b
tmp2 = a
a = tmp1
b = tmp2

Никто не удосуживается решить это так в Python. Однако синтаксический сахар позволяет вам написать решение так:

a, b = 5, 7
a, b = b, a

Вот и все, задача решена. Здесь есть и обмен, и временные переменные (скорее всего, даже две), но кто решит задачу первыми двумя способами, если ее можно решить кратко вот так? И это здорово. Но многие важные аспекты для понимания сути программирования при таком решении ускользают. И таких примеров в Python очень много. И именно поэтому я бы не рекомендовал Python в качестве вашего первого языка программирования, если вы изучаете его самостоятельно.

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

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

  • Python чаще всего используется в веб-разработке. Для него написано множество фреймворков: FastAPI, Flask, Tornado, Pyramid, TurboGears, CherryPy и, самый популярный, Django. Они также пишут парсеры на Python для сбора информации с веб-страниц.
  • DevOps. Python незаменим для любых скриптов, которые пишут такие специалисты.
  • Научные исследования и машинное обучение. Благодаря лаконичности, простому синтаксису и богатому набору инструментов Python стал любимым языком ученых. Для Python есть специальные библиотеки, которые позволяют строить графики, проводить исследования и делать расчеты.
  • Тестирование. Еще одна область применения Python — автоматизация тестирования. Многие специалисты по автоматизации QA выбирают Python из-за его простоты. Это отлично подходит для тех, у кого мало опыта в разработке приложений. Развитое сообщество, логичный синтаксис и читабельность упрощают процесс обучения.

Джава? Джава!

Java преподается во многих университетах, которые специализируются именно на ИТ. Этот язык не лишен недостатков. Скажем так, это довольно многословно. Особенно по сравнению с Python. Однако его логика достаточно проста для понимания, а по сложности он ближе к средним или даже простым языкам. Важно, что будет легко выучить более простые языки (типа Python) и более сложные, вроде C++.

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

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

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

Как и Python, Java является языком общего назначения. Однако даже у языков общего назначения есть традиционные сильные стороны:

  • В первую очередь Java используется для создания серверных приложений, которые получают данные с одного сервера, обрабатывают их и отправляют дальше. Чаще всего это большие распределенные приложения уровня предприятия, для разработки и обслуживания которых требуется много программистов. Серверная часть торговых и финансовых приложений. В этих сферах традиционно нужна надежность, поэтому в них часто задействована Java,
  • В мобильной разработке много Java. Изначально Android был заточен под Java. Теперь к нему добавился еще и Kotlin. Игры для смартфонов часто пишутся с использованием движка Unity, который поддерживает язык C#.
  • Большие данные. Hadoop и другие технологии работы с большими данными так или иначе используют Java, например Apache Hbase и Accumulo или ElasticSearch. Хотя Java не доминирует в этой области, некоторые технологии, такие как MongoDB, написаны на C++. У Java есть потенциал занять большую долю этой растущей области, если Hadoop или ElasticSearch расширятся.
  • Встроенные системы. Java также широко используется в области встроенных систем. Вы можете увидеть, на что способна платформа. Вам нужно всего 130 КБ для использования Java (на смарт-картах и ​​датчиках). Изначально Java разрабатывался для встраиваемых систем. Эта область была частью первоначальной кампании Java «напиши один раз, работай где угодно», которая, кажется, приносит свои плоды.
  • Научное программирование. Достаточно большая доля приходится на Java, хотя исторически лидером в этой области был Python.
  • Автоматизация тестирования. Тестировщик Java — один из лучших вариантов для тех, кто хочет стать тестировщиком.
  • Программные средства. Многие полезные программы и средства разработки написаны и разработаны на Java, например, Eclipse, IntelliJ Idea и Netbeans IDE.

Что насчет С#?

Я долго не буду говорить о C#. Этот язык очень похож на Java. Он был создан как ответ Microsoft на появление Java. У них почти такие же достоинства и недостатки, только Java несколько популярнее. Пожалуй, я рекомендую изучать C#, если вы решили заняться разработкой игр.

Этот язык поддерживает один из самых популярных игровых движков Unity, а также растущую мощь Godot. На этих движках и крупных проектах можно делать мобильные и инди-проекты. Всем остальным я рекомендую придерживаться Java.

Чему именно вы должны научиться?

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

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

  • Синтаксис
  • ООП
  • Каркас коллекций
  • Обработка исключений
  • Потоки ввода/вывода Java
  • Многопоточность/параллелизм в Java
  • Лямбда-выражения

Где изучить основные темы Java

CodeGym — один из моих любимых онлайн-курсов по Core Java. Это очень ориентировано на практику. Существует более 1200 задач по кодированию с проверкой кода и советами, которые помогут учащимся решать задачи. Кроме того, он содержит короткие лекции, охватывающие все основные темы Java (на данный момент кроме лямбда-выражений).

Лямбда-выражения на jenkov.com. Здесь вы можете найти хороший учебник со всем, что вам нужно знать о лямбда-выражениях.

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

Алгоритмы и структуры данных

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

Поскольку эти алгоритмы обсуждались много раз, в качестве руководства можно использовать книги. Например, Алгоритмы Роберта Седжвика и Кевина Уэйна. У этих авторов также есть онлайн-курс на Coursera. Это один из моих любимых, и он использует Java.

Утилиты и полезные компоненты

Этот пункт не о программировании вообще, а о хорошем знании рабочего инструмента, которым являются библиотеки и компоненты. Рекомендую изучать все это только после Core Java и алгоритмов, или, если вы спешите, одновременно.

  • Сервлеты — это программные компоненты Java, которые расширяют возможности сервера.
  • JDBC — это независимый от платформы стандарт взаимодействия между Java-приложениями и базами данных. JDBC реализован в виде пакета java.sql, который поставляется с Java SE (стандартная версия).
  • log4j — самая известная библиотека для регистрации сообщений. Это позволяет вам писать вызовы библиотеки в коде Java, а затем гибко настраивать его, не изменяя уже написанный код.
  • Джексон/JSON. JSON (JavaScript Object Notation) — чрезвычайно популярный открытый стандартный формат файлов и формат обмена данными, а Jackson — высокопроизводительный процессор JSON для Java.

Текстовый учебник о log4j на tutorialspoint

У CodeGym есть некоторые темы JSON, log4j, JDBC и упражнения в их курсе Core Java.

Сервлеты Java на edureca

Весна/спящий режим

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

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

Лучший способ изучить Spring и Hibernate — найти курсы с небольшой командой и репетитором, но это не всегда возможно. Я нашел несколько интересных ресурсов для их изучения. Дайте им шанс.

Весенний урок на Baeldung

Весеннее практическое задание

Учебник Spring и Руководство по весенней загрузке на spring.io

Спящий режим и весна на Udemy

RESTful API на Udemy

Дизайнерские и архитектурные шаблоны и принципы программирования

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

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

Также было бы полезно почитать про простой и читаемый код, согласно принципам KISS, DRY и SOLID. Честно говоря, их легко понять, но их применение на практике требует времени.

Где узнать и прочитать о шаблонах и принципах:

Спасибо, что прочитали!

Следите за новостями.