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

Аватарка пользователя Таня Цвирова
для
Логотип компании Яндекс Практикум
Яндекс Практикум
Отредактировано

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

9К открытий10К показов

Разработчики и авторы курсов в Яндекс.Практикуме на примере C++, Java, Python и Go рассказывают, когда знание последней версии языка программирования критично, а когда ― нет.

C++

C++ разрабатывает международный комитет ISO по стандартизации. Он выпускает документы, регламентирующие язык, свод правил о том, как должны работать компиляторы и программы на C++. Эти официальные документы называются Стандартами. Каждый Стандарт включает две части: ядро и стандартную библиотеку. Ядро ― это синтаксис языка. Стандартная библиотека ― это набор функций и классов, которые должны быть доступны в компиляторе по умолчанию, без необходимости устанавливать что-то ещё.

В отличие от многих других языков C++ разрабатывает не та же организация, что компилятор. Поэтому у C++ нет эталонного компилятора, как во многих других языках. Есть несколько основных компиляторов, разработчики которых стремятся выполнить требования Стандартов, принятых комитетом.

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

C++ выходит из языка C со слабыми возможностями и стандартной библиотекой. Синтаксис Cи примитивен, не отвечает современным требованиям. В то время как C++ воплощает многие современные тенденции. Начиная с 2011 года в нём развивается функциональная составляющая, вводится поддержка корутин, обсуждается рефлексия.

Стандартная библиотека — это отдельная боль. С одной стороны, она постоянно совершенствуется. С другой стороны, в ней всё ещё отсутствуют многие нужные элементы, например работа с сетью. Эти отсутствующие элементы реализуют в сторонних библиотеках, переносимых и непереносимых. Из-за этого развёртывание программ усложняется, ведь нужно позаботиться обо всех зависимостях. К тому же библиотеки разрабатываются ограниченным кругом авторов и не проходят такую комплексную проверку качества, как это делается в комиссиях, отвечающих за Стандарт C++.

Постепенно необходимые возможности добавляют в Стандарт. При этом комитет руководствуется двумя правилами:

  1. Части стандартной библиотеки должны быть максимально общими. Алгоритмы стандартной библиотеки предназначены для работы с любыми пользовательскими типами данных и с любыми особенностями. Они допускают тонкую настройку и разные версии для типов с разными характеристиками. Стандартная библиотека спроектирована так, что автоматически будет выбираться наиболее оптимальный алгоритм. Например, когда в стандартную библиотеку добавили файл random для работы со случайными числами, в неё включили самый общий Вихрь Мерсенна, параметры которого можно настраивать вручную.
  2. Стандартная библиотека не должна иметь оверхед, где это возможно, то есть должна быть максимально производительной. Оверхед ― это лишние затраты ресурсов, которые возникают в программе в связи с использованием современных средств, так называемого синтаксического сахара. Иными словами, оверхед ― это ухудшение производительности при переходе к более удобному коду.

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

Последний Стандарт C++20 выпустили в 2020 году. Но пока он плохо реализован в компиляторах. Хорошо поддерживаемый компиляторами Стандарт ― это C++17. Предыдущий «революционный» Стандарт ― это C++11, с него начинается отсчёт современного C++. Поэтому большинство работодателей требуют владения как минимум C++11. Знание C++17 желательно, к тому же переход на него с C++11 куда проще, чем переход с C++03 на C++11. Если специалист устраивается на позицию джуна, то скорее всего ему простят незнание C++17 при знании C++11. А вот на более высоких позициях ― вряд ли.

В ближайшее время ждём поддержки C++20 в компиляторах. Там много значительных и даже революционных изменений, некоторые существенно облегчат работу программиста и повысят надёжность программ. В феврале мы проводили вебинар для студентов Яндекс.Практикума, где подробно разбирали нововведения C++20. А в блоге Яндекс.Практикума на Хабре уже вышла расшифровка этого вебинара в шести частях.

Следующий Стандарт, C++23, дополнит C++20 и введёт новые возможности. Пока ожидается, что это будут рефлексия, работа с сетью, контракты, полноценные корутины. Самая долгожданная опция ― это корутины. Они помогут улучшить производительность и упростить код во многих программах, например веб-серверах. Но для повседневных нужд они также могут быть полезны.

На мой взгляд, за обновлениями нужно следить обязательно. Тезис, будто новые фичи нужны только синьор-разработчикам, для разработчиков C++ не работает. Каждый новый Стандарт вводит возможности, которые помогают даже в самых простых, повседневных вещах. Например, в C++20 в стандартную библиотеку добавили календарь — он нужен во многих программах.

Ещё один пример упрощения ― новый взгляд на привычные циклы по диапазону:

C++98 — C++17

			for(int i = 0; i < 10; ++i) {
 std::cout << "Hello, C++!" << std::endl;
}
		

C++20

			for(int i : rng::iota(0,10)) {
 std::cout << "Hello, C++!" << std::endl; 
}
		

C++98 — C++17

			str1.size() >= str2.size() && str1.substr(str1.size() - str2.size()) == str2
		

C++20

			str1.ends_with(str2)
		

Java

Разработка виртуальной машины Java ― JDK ― сейчас ведётся на Github. Это значит, что любой член сообщества может участвовать в развитии платформы при соблюдении Contribution-гайда. Раньше разработкой Java занималась компания Oracle. Сейчас ими всё ещё добавляется значительная часть кода, но другие компании, заинтересованные в развитии JDK, тоже начали вносить свой вклад в развитие платформы.

Существует множество версий JDK. На Github ведётся разработка OpenJDK — это базовая версия JDK. Отдельно размещаются OracleJDK, LibericaJDK и ещё около пяти-шести популярных версий. В том числе несколько проприетарных (недоступных широкой аудитории). Лицензия OpenJDK позволяет абсолютно легально создавать такие версии. Например, Dragonwell — JDK от Alibaba — была долгое время проприетарной, но сейчас её может скачать любой желающий.

Сама по себе виртуальная машина Java — это реализация спецификации. Гипотетически любой желающий может взять и реализовать её с нуля без OpenJDK. Это только вопрос времени.

В Java по-разному устроены алгоритмы добавления новых фич и реализации уже запланированных. Участие в гитхабе — это про реализацию. Новые идеи о том, что нужно добавить в язык, обрабатывает отдельный процесс — JEP (Java Enchantment Process). Самые популярные по мнению контрибьютеров или комитетов входят в один из следующих релизов.

Обычно новые версии Java содержат:

  • изменения или исправления старой функциональности;
  • новый функционал, новые подходы или изменения старых API;
  • оптимизации в JDK или в коде самой платформы.

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

Новые версии вносят множество изменений, незаметных для разработчика. Например, происходит оптимизация среды исполнения самого языка. Можно ничего не делать и получить прирост производительности. Такое, например, произошло при миграции с Java SE (Standard Edition) 8 на Java SE 9 с компактными строками. Удобно!

Большая часть изменений относится к одному из видов:

  • Исправление старых API. Если со временем оказывается, что старый API плох, непонятен и приводит к ошибкам, имеет смысл поменять его на новый. Например, при переходе с Java SE 7 на Java SE 8 появился новый API java.time для удобной и простой работы с датой и временем;
  • Добавление новых API. Например, CompletableFuture, который появился в Java SE 8, предоставил базу, на основе которой теперь возможно выстраивать удобные и понятные асинхронные программы;
  • Исправления в JDK. Изменения, незаметные для обычного разработчика. Это может быть оптимизация стандартных классов и структур, новые приватные API для упрощения разработки платформы и прочие функции. К этому классу можно также отнести исправление уязвимостей.

Начиная с Java 9, каждая новая версия выходит раз в полгода, а каждая шестая версия становится LTS (Long Term Support) — это значит, что она будет поддерживаться длительное время — до следующей LTS, то есть три года. Версии между LTS поддерживаются только полгода. В этих случаях под поддержкой понимается официальная поддержка со стороны сообщества и Oracle. При этом частные компании могут поддерживать свои версии JDK на собственных условиях.

Текущая актуальная LTS версия — Java SE 11, которая вышла в сентябре 2018 года. Следующая LTS Java SE 17 планируется к выходу в сентябре 2021 года.

Заметные изменения в последних версиях:

  • Java SE 9: оптимизация строк. Раньше каждый символ в строке занимал два байта в памяти. Теперь вместо двух используется один. Это позволяет сократить объём памяти, потребляемый программой;
  • Java SE 11: появился стандартный HTTP-клиент. Это значит, что вам больше не требуется добавлять зависимость на HTTP-клиент — он уже есть в стандартной библиотеке;
  • Java SE 16: добавление Records и sealed-классов в режиме инкубатора. Records — это особые классы, задача которых — хранить и передавать данные. Такой подход позволяет создавать неизменяемые структуры данных всего в несколько строчек кода. Sealed-классы упрощает работу с иерархиями классов в программе. Оба этих изменения — старые, хорошо опробованные во многих языках техники, которые помогут Java меньше отставать от других языков.

Большая часть работодателей по-прежнему использует Java 8, вторая по популярности среди работодателей версия — Java SE 11. Лишь небольшой процент компаний обновляет версию раз в полгода вместе с очередным релизом. Принципиальной разницы в том, какую версию выбрать для изучения, нет: 95% функционала Java не менялось с восьмой версии. Учить язык хотя бы с версии Java 8, а затем по необходимости читать про дополнения, внесённые в последующих релизах, ― хорошая тактика для джуна.

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

Джуну не обязательно следить за каждым обновлением и стараться сразу внедрить новую фичу в работу, но это должно быть ему интересно. Следить можно на Open JDK.

Go

Одна из концепций Go ― это минимализм. Только после долгого и тщательного обсуждения в язык вносятся новые конструкции.

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

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

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

Последнее значимое обновление в Go ― 1.16. С ним в язык добавили эмбеддинг бинарных данных и абстракцию над файловой системой. Эмбеддинг — возможность вшивать произвольные файлы прямо внутрь бинарного файла приложения. Это позволяет распространять программы без дополнительных внешних зависимостей. Раньше такой функциональности не было вообще.

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

Мы надеемся, что через два обновления, в 1.18, добавят дженерики ― тогда появится новая для языка парадигма программирования. Но срочно переходить на новую версию нет необходимости — лучше действовать постепенно, аккуратно, хоть в Go и реализована обратная совместимость.

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

Python

По сравнению с другими языками программирования Python чрезвычайно прост в освоении. Секрет кроется в конструкции самого языка:

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

В Python существует две принципиальные версии — Python 2 и Python 3. Версия 2 устарела, поэтому при приёме на работу джуну необходимо владеть версией 3. Самая распространённая рабочая версия сейчас — это Python 3.7.

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

Начиная с версии 3.9, обновления будут выходить ежегодно. Последний релиз 3.9 был в апреле 2021. Если коротко, революции не произошло, добавился лишь «синтаксический сахар» для работы со словарями и аннотациями типов.

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

Нововведения предыдущих версий:

  • Python 3.5: аннотация типов. В этой версии появился специальный синтаксис для объявления типов параметров функций и их возвращаемых значений (PEP 484). В Python 3.6 эта возможность была расширена — стало возможным объявление типов переменных вообще в любом месте программы (PEP 526). С каждой новой версией языка эта функциональность улучшается, и писать аннотации типов становится всё проще, удобнее и естественнее. Но не все работодатели используют аннотацию типов в продакшене, поэтому на собеседовании об этом спрашивают редко;
  • Python 3.7: классы данных (Data classes). Они нужны для автоматической генерации кода классов, которые используются для хранения данных. Как и в случае с аннотацией типов, знание именно этой версии будет актуально только для работодателей, которые используют Data classes в своей работе;
  • Python 3.8 + Django 3.2: асинхронность. Повторимся, в случае с Python важно следить не только за версиями языка, но и за версиями фреймворков. Если в вакансии требуется владение асинхронным программированием (а в последнее время это требование стало появляться всё чаще), то понадобятся версии Python 3.8 и Django 3.2. Асинхронный запуск позволяет эффективнее организовывать работу кода, основное преимущество асинхронности — быстродействие. Пока длится долгое действие, параллельно можно сделать несколько быстрых действий. Модуль Async IO на самом деле впервые появился в Python 3.4. Но в версию 3.8 добавили крупные изменения, и часть функционала из 3.4 уже успела устареть.

Главное про версии в Python — быть в курсе сути обновлений и продемонстрировать работодателю свою вовлечённость в тему. За новостями и событиями вокруг Python удобно следить на официальной странице.

Следите за новыми постами
Следите за новыми постами по любимым темам
9К открытий10К показов