Сравнение C# и JavaScript. Основы
Мой более-менее серьезный путь в программировании начался с написания программ на языке C#, иногда я пробовал писать на JavaScript, и то и дело впадал в ступор в таких ситуациях, когда неверно указывал имя переменной и узнавал об этом спустя много много лет час отладки, так как со мной рядом не было моего компилятора, который бы меня выручил в трудную минуту. Через некоторое время, помимо C# я начал писать много кода на JavaScript и в настоящее время могу делать это без особых трудностей, меня больше не смущает неявное приведение типов и динамическая типизация.
В данной статье я бы хотел систематизировать свои базовые знания об этих языках и рассмотреть их сходства и различия. Данная статья может служить руководством для C# разработчиков, которые хотят изучить JavaScript и наоборот. Также хочу заметить, что в данной статье описываются возможности клиентского JS, так как опыта разработки на Node.js у меня нет. Итак, если вы все ещё не потеряли интерес — приступим.
Namespace и js-модули
В каждой программе для избежания конфликтов в именах переменных, функций, классов или других объектов мы объединяем их в некоторые области. Таким образом, если две разные области будут содержать элементы с одинаковыми именами, конфликта не произойдет.
В C# для разбиения программы на части используются пространства имен. Для их объявления используется ключевое слово namespace . Например, если мы хотим создать набор компонентов пользовательского интерфейса, то логично поместить их все в одно пространство имен, например, Components . При этом принято чтобы пространство имен имело следующее именование [AssemblyName].[DirectoryName].[DirectoryName].[. ] . В каждом файле класс компонента пользовательского интерфейса необходимо поместить внутрь пространства имен:
Содержимое файла ComboBox.cs :
namespace AssemblyName.Components < public class ComboBox < // . >>
Для того, чтобы начать использовать компоненты необходимо импортировать их из пространства имён следующим образом using AssemblyName.Components . При данном способе подключения одной строкой мы импортируем все объекты в текущий файл.
В JS для этих же целей применяются ES-модули. При их использовании мы в какой-то степени эмулируем поведение пространств имен написанием дополнительного кода. Рассмотрим тот же пример с библиотекой компонентов. Допустим у нас есть папка Components , которая содержит компоненты пользовательского интерфейса ComboBox.js , Checkbox.js , Button.js и тд. Для того чтобы получить схожее поведение по сравнению с пространством имен в папке Components необходимо создать файл index.js , который будет содержать следующий код:
export < default as Dialog >from './ComboBox'; export < default as Button >from './Button'; export < default as Checkbox >from './Checkbox'; // .
Для того, чтобы использовать данные компоненты необходимо импортировать их в текущий файл. Это можно сделать следующим образом: import * as Components from ‘./../Components’ , после ключевого слова from нам необходимо указать путь к папке, в которой находятся все описанные компоненты.
Способы объявления переменных
Ключевое слово var
Как известно C# является строго типизированным языком программирования, поэтому при объявлении переменной компилятору должен быть известен её тип, для этого обычно он указывается перед её именем.
double pi = 3.14; User user = new User(); int[] a = new[] < 0, 1, 2 >;
Но мы также можем сказать компилятору, что он должен вывести тип самостоятельно из выражения, стоящего после знака присваивания. Это стало возможно благодаря введению в версии C# 3.0 ключевого слова var .
// i - int var i = 5; // a - int[] var a = new[] < 0, 1, 2 >;
С помощью var мы можем создавать объекты анонимного типа:
// anon - Анонимный тип только для чтения var anon = new < Name = "Terry", Age = 34 >; var type = anon.GetType();//"<>f__AnonymousType0`2"
В JavaScript для объявления переменных также можно использовать ключевое слово var , однако, в отличии от C# областью видимости данных переменных будет вся функция или объект window , если переменная была объявлена вне функции.
var a = 5 // область видимости - window function go() < var a = 6 // область видимости - функция go // . >
Хоть у вас и есть возможность объявлять переменные с помощью var в JavaScript, но сейчас этого делать не рекомендуется, после выхода стандарта ES6 было добавлено ключевое слово let , которое также позволяет объявлять переменные, но его преимуществом заключается в том, что их областью видимости будет являться блок, в котором они объявлены, а не вся функция.
Константы
Как в C#, так и в JavaScript для объявления константного поля используется ключевое слово const . Правда стоит отметить, что понятие константы в данном случае является различным для данных языков.
В C# константой называется выражение, которое может быть полностью вычислено на этапе компиляции, т.е. константы могут быть числами, логическими значениями, строками или нулевыми ссылками..
const int c1 = 5; const int c2 = c1 + 100; const string c3 = "Константа"; const bool c4 = true; const User human = null; const User human = new User(firstName); //недопустимо, ошибка компиляции
В JavaScript значение константы также нельзя изменять, однако нет ограничений, накладываемых на значение как в языке C#, ей можно присваивать любые значения/объекты/массивы. Однако, если в константу присвоен объект, то от изменения защищена сама константа, но не свойства внутри неё:
const c1 = 5; const c2 = c1 + 100; const c3 = "Константа"; const c4 = true; const user = < name: "Петя" >; user.name = "Петя"; // допустимо user = 5; // нельзя, будет ошибка
Ключевое слово void
Во время написания данной статьи, я экспериментировал в консоли с функциями и по првычке начал описывать функцию как в C# void SomeFunction. , и для меня было большой неожиданностью, когда я узнал, что в JavaScript есть ключевое слово void . Как оказалось void в JavaScript является унарным оператором, который вычисляет значение операнда, затем отбрасывает его и возвращает undefined .
alert("Привет!"); // "Привет!" alert(void "Привет!"); // undefined
Таким образом, можно сказать, что использование void явно указывает отсутствие возвращаемого значения, подробнее с примерами его использования вы можете ознакомиться в следующей статье статье.
В C# void не является оператором, однако по сути имеет схожее значение. Здесь он обозначает отсутствие возвращаемого значения функции:
public void SampleMethod() < // . >
Однако, как можно заметить в примере выше, void стоит в том месте, где обычно указывается тип возвращаемого значения, и это не случайно, ведь в C# void также является типом.
var t = typeof(void); t.Name // System.Void
void в качестве типа может использоваться только в небезопасном контексте при работе с указателями.
unsafe < void* identifier; //позволяется, но не рекомендуется >
Ключевое слово new
В JavaScript ключевое слово new является оператором, и используется привычным для многих C-подобных языков образом — для создания объекта.
function Animal() < //. >const animal = new Animal();
В C# new может использоваться для следующих целей:
- для создания объектов;
- для скрытия наследуемого члена базового класса;
- чтобы ограничить типы, которые могут использоваться в качестве аргументов для параметра типа в универсальном классе.
Первый случай аналогичен применению new в JavaScript.
class Animal < //. >var animal = new Animal();
Основные типы данных
В каждом языке имеются типы данных — примитивы, на основе которых строятся другие типы данных, давайте рассмотрим типы данных предоставляемые нам в C# и JavaScript.
Примитивные типы С#:
- Целочисленный со знаком: sbyte , short , int , long
- Целочисленный без знака: byte , ushort , uint , ulong
- Символы Unicode: char
- Набор символов Unicode: char
- Числа с плавающей запятой: float , double
- Десятичный с повышенной точностью: decimal
- Логическое значение: bool
Базовый классом является Object .
Примитивные типы данных:
- Число number
- Строка string
- Логический тип boolean
- Специальное значение null
- Специальное значение undefined
- symbol
Базовым типом является Object .
После изучения примитивов обоих языков можно придти к следующим выводам:
- Вместо достаточно большого набора числовых типов в JavaScript имеется единственный тип number ;
- В JavaScript отсутствует тип char , вместо него стоит использовать тип string ;
- В обоих языках базовым типом является Object ;
- Отличительной особенностью JS является то, что null и undefined выделены в отдельные типы, в то время как в C# null — это ключевое слово обозначающее отсутствие значения.
- В JS присутствует тип symbol , который используется в основном внутри самого стандарта JavaScript, для того чтобы иметь возможность добавлять новый функционал без конфликта с существующей кодовой базой.
Как правило, сейчас все больше приложений, в которых необходимо выполнять обработку данных на клиенте, для чего требуется большая точность в вычислениях. В настоящее время в JavaScript отсутствует встроенная возможность работы с большими числами, однако в недалеком будущем планируется добавить новый тип BigInt . Для решения аналогичных задач в C# имеется класс System.Numerics.BigInteger .
Проверка типа объекта
Проверка типа является достаточной типичной операцией для большинства языков программирования. Основываясь на типе, мы можем выполнять различные действия. Например, рассмотрим пример из жизни: вы слышите звонок в дверь, если к вам пришел пьяный сосед (объект с типом Пьяный Сосед) чтобы занять денег, то вы вряд ли откроете ему дверь, но если за дверью ваш лучший друг (объект с типом лучший друг), то вы не задумываясь впустите его в квартиру. C# и JavaScript также предоставляют средства для проверки типа объектов.
Оператор typeof
Для получения информации о типе как в C#, так и в JavaScript имеется оператор typeof . Давайте рассмотрим принцип его работы в обоих языках:
В С# оператор typeof применяется к типу и возвращает объект класса Type , который содержит всю информацию о типе.
namespace Zoo < public class Animal <>> Type t = typeof(Animal); t.Name // 'Animal' t.FullName // 'Zoo.Animall' t.GetMethods // Информация о методах t.GetFields // Информация обо всех полях // .
В JS typeof возвращает строку, указывающую тип операнда.
typeof 30 // 'number' typeof Symbol() // 'symbol' typeof undefined // 'undefined' // Объекты typeof new Animal() // object typeof null // 'object' typeof [1,2,3] // 'object' // Функции typeof function() <> // 'function'; typeof class C <> // 'function';
В примере выше можно заметить некоторые особенности работы данного оператора. Кажется логичным, если выражение typeof new Animal() возвращало бы строку ‘Animal’ , a typeof [1,2,3] — строку Array , однако как бы ни было парадоксально, результатом в обоих случаях является ‘object’ . Также в связи с тем, что классы в JS являются оберткой над функциями, то выражение typeof class C <> вернет ‘function’ вместо ‘class’ . Ещё одним интересным фактом является то, что выражение typeof null вернёт ‘object’ . В JavaScript данный оператор имеет большой недостаток: все не примитивные объекты для него на одно лицо, все они имеют один тип object .
Стоит заметить, что в JavaScript typeof можно применять к чему угодно: объектам, функциям, классам и т.д… В C# данный оператор применяется лишь к типам.
is и instanceof
Помимо получения информации о типе, порой бывает полезно проверить принадлежность объекта к определенному типу.
В C# для данных целей имеется оператора is .
class Person < >//Наследуем Programmer от Person class Programmer : Person < >var person = new Person(); var programmer = new Programmer(); person is Person //true person is Programmer //false programmer is Person //true programmer is Programmer //true
В JavaScript для того, чтобы выяснить к какому типу принадлежит объект необходимо использовать оператор — instanceof .
function Person() <> function Programmer() <> //Наследуем Programmer от Person Programmer.prototype = Object.create(Person.prototype); var person = new Person(); var programmer = new Programmer(); console.log(person instanceof Person); // true console.log(person instanceof Programmer); // false console.log(programmer instanceof Person); // true console.log(programmer instanceof Programmer); // true
Логические значения и проверка на null
Практически повсеместно, для того чтобы не получить Null reference exception , перед использованием переменной мы проверяем её на null , а в случае с JavaScript, ещё и на undefined .
В C# мы постоянно видим подобный код:
if(user != null && String.IsNullOrEmpty(user.name))
В JavaScript данную конструкцию можно записать несколько короче. Связано это с тем, что в отличии от C#, в JavaScript множество значений кроме false при приведении типов также расцениваются как false :
- null
- undefined
- «» (пустая строка)
- 0
- NaN (not a number)
Таким образом, приведенный выше код на C# можно записать следующим образом:
if (user && !user.name)
user && !user.name && user.setName("Петя");
В связи с тем, что проверки на null происходят повсеместно, в C# 6.0 был добавлен Null Propagation Operator .? .
if (user != null && user.parent != null && user.parent.parent != null)
С его помощью данный участок кода можно переписать следующим образом:
user?.parent?.parent?.SetName("Петя");
В JavaScript обычно делают следующим образом:
user && user.parent && user.parent.parent && user.parent.parent.setName("Петя");
Установка значений по-умолчанию
Ещё одной частой операцией является установка значений по-умолчанию, с версии 2.0 в C# появился Null Coalescing Operator — ?? .
Следующие две строки кода на C# являются эквивалентными:
var name = user != null && user.name != null ? user.name : "Петя"; var name = user?.name ?? "Петя";
В JavaScript подобную операцию обычно делают следующим образом.
var name = user && user.name || "Петя";
Однако мы можем применять операторы && и || только в том случае, если 0 , false и пустая строка не являются допустимыми значениями.
В обозримом будущем операторы ?. , ?? должны появиться и в JavaScript (в настоящее время они прошли стадию Stage0), подробнее об этих операторах в JavaScript можно прочитать в статье.
Ключевое слово this
Как в C#, так и в JavaScript имеется ключевое слово this . Обычно в C# понимание предназначения this не вызывает никакого труда, однако в JavaScript это является одной из самых сложных концепций языка. Далее рассмотрим применение this на примерах.
В C# ключевое слово this указывает на текущий экземпляр класса.
class User < public string Name < get; set; >public void PrintEmployee() < Console.WriteLine(this.name); >> var employee = new Employee(); E1.PrintEmployee();
В данном примере в выражении Console.WriteLine(this.name) , this указывает на переменную employee .
Так как this — текущий экземпляр класса, то его нельзя использовать в методах не привязанных к определенному типу, например в статических методах.
В JavaScript значение this называется контекстом вызова и будет определено в момент вызова функции. Если одну и ту же функцию запускать в контексте разных объектов, она будет получать разный this :
var user = < firstName: "Петя" >; var admin = < firstName: "Админ" >; function func() < alert( this.firstName ); >user.f = func; admin.g = func; // this равен объекту перед точкой: user.f(); // Петя admin.g(); // Админ func();// undefined - в данном случае this - глобальный объект window
К тому же, в JavaScript присутствует возможность явного указания значения this с помощью функций: call , bind , apply . Например, вышеприведенный пример можно переписать следующим образом:
var user = < firstName: "Петя" >; var admin = < firstName: "Админ" >; function func() < alert( this.firstName ); >// this равен объекту перед точкой: func.call(user); // Петя func.call(admin); // Админ func.bind(user)();// Петя func.bind(admin)();// Админ
Деструктуризация
Часто бывает необходимо присвоить несколько полей объекта локальным переменным. Например, как часто вы наблюдаете подобный код?
void Method(User user) < var firstName = user.FirstName; var lastName = user.LastName; //. >
Для подобных целей можно использовать деструктуризацию. Данную возможность в разной степени поддерживают оба языка.
В C# 7.0 для поддержки деструктуризации появился новый вид функций, называемый деконструкторами. Для того чтобы объявить деконструктор нам необходимо определить метод с именем Deconstruct , все параметры которого должны быть объявлены с модификатором out :
class Person < public string FirstName < get; set; >public string LastName < get; set; >// Объявление деконструктора public void Deconstruct(out string firstName, out string lastName) < firstName = this.FirstName; lastName = this.LastName; >> . Person person = new Person < FirstName = "Петя", LastName = "Петров" >; (string firstName, string lastName) = person; (string firstName, _ ) = person;
Поддержка деструктуризации или (destructuring assignment) в JavaScript появилась в шестом стандарте EcmaScript. С её помощь. можно присвоить массив или объект сразу нескольким переменным, разбив его на части.
let [firstName, lastName] = ["Петя", "Петров"]; let [firstName, _ ] = ["Петя", "Петров"]; let < firstName, lastName >= < firstName: "Петя", lastName: "Петров" >; let < firstName >= < firstName: "Петя", lastName: "Петров" >;
Стоит отметить, что деструктуризация в JavaScript имеет больше возможностей, чем в C#:
- Изменение порядка переменных;
- Отсутствие необходимости явного объявления деконструкторов;
- Поддержка деструктуризации массивов;
- Установки значений по-умолчанию;
- Присваивание свойств объекта в переменную с другим именем;
- Поддержка вложенной деструктуризации.
Заключение
В данной статье мы обсудили лишь самые основные концепции языков C# и JavaScript. Но остались не затронуты ещё многие аспекты:
Каждая из этих тем является достаточно обширной и будет раскрыта в дальнейшем в отдельной статье.
Хочу войти в IT, что лучше, JavaScript или C++?
Мне 29, я не училась на программиста, но с математикой в школе было неплохо, и еще немного изучала на одной работе язык 1С. У меня есть идея программы и мечта создать её. А мой молодой человек сейчас переучивается на художника, чтобы рисовать для игр, и хочет в будущем создать игру на движке Unreal Engine, язык в котором, как известно, C++. Слышала, что C++ используется в играх и многих программах. Так что этот язык может быть полезен и мне и моему молодому человеку, если я буду делать вместе с ним игру. С другой стороны, в интернете пишут, что C++ очень сложный язык для новичка и на рынке труда джуниоры требуются не часто, а вот, например, JavaScript и вообще программирование сайтов — это сфера, через которую легче и быстрее всего можно войти в программирование, к тому же веб-разработка мне в принципе тоже интересна. Отсюда вопрос: стоит ли изучить JavaScript и быстрее войти в эту сферу, а потом переключиться на игры и программы или лучше не тратить время на другой язык и сразу углубиться в C++?
Лучший ответ
Насколько понял по описанию, вариантов по сути нет. Есть обычный мандраж перед неизвестностью. с++ не то, чтобы сложен, он многообразен, широк, глубок и полноценен. Можно сидеть в 4х стенах рядом с плитой и раковиной, а можно жить в лесу. среди диких зверей .Так что, вперёд и вверх
https://academiait.ru/course/uroki-unreal-engine-4/
«переучивается на художника». Смело сказано, жизнеутверждающе, бодрит.
ваша задумка грешит излишним оптимизмом. геймдев (в т. ч. на UE) доходов не принесёт, а вот для чсв это вполне нормальное времяпровождение.
Остальные ответы
Джаву учи. Там побольше возможностей, считаю. Он сложный, но того стоит.
На джаве тоже можно делать игры. Конечно не прям крутые, но можно.
КонстантинМастер (2479) 3 года назад
Ахаха, а чего не ассемблер! Чем современный Котлин хуже старогй Java-ы?
Hoodlum Гуру (3643) Константин, Так не говорил я что Котлин плохой, просто Джава как-то прогрессированная более, сложная, но имеет больше возможностей. Совмещает в себе все с других языков программирования. Хорошо это, или плохо, решать только вам, я держусь на позиции Джавы.
Голова РоботаПросветленный (36278) 3 года назад
Ява несложный язык. Ява проще, чем C#, и гораздо проще, чем C++. Сложность Явы в её фреймворках (J2EE, Spring)
с++ интересный язык, но мне например не подходят те области в которых он применяется, но чтобы понять принципы процедурного и объектно-ориентированного программирования рекомендую его выучить, это так сказать заложит базу
Чтобы изучать было проще, рекомендую канал на ютубе #simpleCode
Изучайте JavaScript, будет полезнее. Вы поможете с созданием игры даже без C++. Там есть более простая система Blueprints, которую вы помёте в любом случае.
C# лучше на старте. Он проще заходит и потом на С++ перейти не сложно. Если начинать с С++ это приятная боль.
Забей, если тебе не дается нихира не один язык ты всю жизнь будешь спрашивать тут. Начни учить алгоритмы, ТУПО АЛГОРИТМЫ! не поймешь их не поймешь ни один язык
JavaScript плохой язык для новичка, потому что он кривой. Недостаток C++ в том, что он очень сложный. Это не тот язык, который изучают, чтоб быстрее начать зарабатывать деньги.
Рекомендую C#, Java или Python. Из этих языков для игр годится только C# (с движком Unity).
Невозможно работать только со знаниями этих языков. Нужно ещё много чего знать.
Человек СкрытностьГуру (2840) 3 года назад
А где JavaScript кривой то? Уже сколько лет с ним работаю и ни разу не натыкался на логическую неувязку. Он весьма логичен, хоть и не похож синтаксисом ни на один другой язык. Тут я конечно соглашусь, перейти на другой язык с JS будет куда сложнее, нежели чем с C# или того же Python. Но где он кривой? я не понимаю.
Голова Робота Просветленный (36278) Человек Скрытность, > не похож синтаксисом ни на один другой язык как же не похож? Синтаксис частично заимствован из C++.
. Мне 29. А мой молодой человек.
Учи с МОЛОДЫМ язык камасутра.
А на остальное — наплюй: есть дырка промеж ног — вот и будь довольна.
С++, блин!
Редис АлександровичОракул (74894) 3 года назад
Сразу видно что ты первый в мире программист который зарабатывает дыркой и делится опытом!
psholty46 Искусственный Интеллект (134764) . Сразу видно что. Милейший, но очинно малограмотный в этих вопросах Редис Александрович. Вишь ли, ПРОГРАММИСТОМ можно ТОЛЬКО родиться — научиться без получения особых способностей при зачатии етому делу никак НЕвозможно. Впрочем, если ты под программистом подразумеваешь умельца по втыканию в системник мышки и клавы, тады. это подтверждает мою правоту в отношении тебя.
а) на jave можно — писать игрушки и приложения на андроид — не путать с javascript
б) javascript обычно вместе с html изучают и вдобавку css
javascript то он не много не логичен по сравнению с С++ java и с # sharp
в) c # sharp не помещает изхучить
но сначало надо браться за что нибудь одно
а то голова будет пухнуть и понимания будеть ноль
Какие ещё игры? Если как гта вы их сука 1000 лет будете делать.
Над такими (похожими играми работают сотни людей профессионалов, а не геймеров которые играют игры сука в 30 лет как дети не зная какой язык програмирования выбрать и не один год).
Начни с языка C.
Что лучше: Java, C++ или Python?
Все три языка являются объектно-ориентированными. C++ известен своей эффективностью, скоростью работы и необходимостью ручного управления памятью. Java и Python являются кроссплатформенными языками. Java позволяет создавать надежные легко масштабируемые приложения. Высокий уровень абстракции Python позволяет быстро создавать и тестировать программные прототипы, а также решать алгоритмические задачи.
Сравнение Java, C++ и Python
| Java | C++ | Python | |
| Типизация | Статическая сильная явная. | Статическая слабая явная. | Динамическая сильная неявная. |
| Тип | Сначала компилируется в промежуточное представление — байт-код, который затем интерпретируется JVM. | Компилируемый. | Интерпретируемый. |
| Переносимость | Кроссплатформенный. | Платформенно-зависимый. | Кроссплатформенный. |
| Синтаксис | В конце каждой строки — точка с запятой, для определения блока кода используются фигурные скобки. | В конце каждой строки — точка с запятой, для определения блока кода используются фигурные скобки. | Для определения блока кода используется отступ (индентация), точка с запятой в конце каждой строки не требуется. |
| Производительность | Уступает С++ по скорости выполнения, но быстрее, чем Python. | Высокопроизводительный, один из самых быстрых языков, используемых в системном программировании. | Значительно уступает Java и C++ по скорости выполнения. |
| Управление памятью | Автоматическое, обеспечивается сборщиком мусора (Garbage Collector). | Ручное управление памятью. | Автоматическое, обеспечивается сборщиком мусора (Garbage Collector). |
| Простота использования | Относительно прост в использовании; встроенные средства надежности и безопасности минимизируют ошибки. | Более сложен в использовании из-за необходимости прямого управления памятью, что также может приводить к ошибкам. | Считается простым в использовании; легко читаемый; менее подвержен ошибкам, чем С++. |
| Многопоточность | Поддерживает многопоточность на уровне языка. | Поддерживает многопоточность на уровне языка (начиная со стандарта С++11). | Имеет встроенную поддержку многопоточности, но использует GIL (Global Interpreter Lock), что может ограничивать эффективность многопоточного приложения. |
| Множественное наследование | Не поддерживает множественное наследование классов. Однако возможно реализовать множественное «наследование» (реализацию) интерфейсов. | Поддерживает множественное наследование классов. | Поддерживает множественное наследование классов. |
| Перегрузка операторов | Не поддерживает перегрузку операторов. | Полная поддержка. | Частичная поддержка. |
Стоит учесть, что каждый из этих языков имеет свои особенности, свои сильные и слабые стороны, поэтому выбор языка должен основываться на требованиях и целях проекта.
Какой язык программирования выбрать новичку
Выбирайте по уровню спроса у работодателей и направлению в программировании.

Виктория Дербенченко
Автор статьи
24 февраля 2022 в 20:17
Новичкам сложно разобраться в технических характеристиках языков. Лучше выбирать их по принципу востребованности на рынке и личным предпочтениям. В статье изучим популярные рейтинги, расскажем о востребованных языках программирования и поможем понять, с какого из них лучше стартовать в профессии.
По каким критериям выбирать язык программирования
Популярность у разработчиков и пользователей — гарантирует актуальность профессии на рынке, наличие туториалов и живого комьюнити, где можно задать вопросы.
Уровень спроса у работодателей — дает понимание о конкуренции и количестве вакансий.
Направление в программировании — в конкретных сферах выбор уже ограничен 1-2 языками.
Изучаем рейтинги популярности
Рейтинги дают приблизительное представление о положении языков на рынке и будущих тенденциях. Руководствоваться только этим может тот, у кого нет цели попасть в определенное направление разработки. В этом случае выбирайте язык из пятерки лидеров.
TIOBE
Индекс Tiobe учитывает языки программирования, у которых:
- есть страница в Википедии;
- полнота по Тьюрингу;
- не менее 5 000 запросов в Google с названием языка.
В 2021 году самый востребованный язык программирования в этом рейтинге — Python. За ним идут C, Java, C++, C#.

PYPL
Рейтинг от GitHub рассчитывается по схожему принципу с индексом Tiobe, но только учитывают запросы пользователей к обучающим материалам по языкам программирования.
Это исследование считается более точным, потому что показывает практический интерес и исключает из поиска блоги, новости, полумертвые страницы о старых языках. В 2021 году в рейтинге лидируют Python, Java, JavaScript, C#, C, C++.

Stack Overflow
Stack Overflow составляет подборку популярных языков на основе опроса разработчиков из 181 страны. В 2021 году по данным платформы, чаще использовали JavaScript, HTML/CSS, Python, SQL и Java.

GitHub
Рейтинг от GitHub основан на предпочтениях пользователей этого хостинга. Учитывает, сколько обновлений и репозиториев выпустили разработчики и какими языками программирования они пользовались. В топ-5 за 2021 год вошли JavaScript, Python, Java, Typescript, C#.
Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT


RedMonk
Объединенный рейтинг по данным порталов GitHub и Stack Overflow. График показывает соотношение реального использования языка и интереса к нему и возможные тенденции в программировании.
В рейтинге на август 2021 года лидируют JavaScript, Python, Java, PHP и CSS. По сравнению с 2020 годом, повысил свои позиции TypeScript, но станет ли он более востребованным в будущем, судить сложно.

Исключаем неактуальные языки программирования
Согласно тем же рейтингам, в 2021 году мало используют Perl, Haskell, Fortran, Visual Basic. Некоторые из этих языков повысили свои позиции за 2021 год и хорошо оплачиваются, но вакансий почти нет.
Изучаем запросы работодателей
Определите количество вакансий и предложений, например, на hh.ru и Habr Карьера. В строке поиска введите соответствующий запрос. Это косвенные данные, но представление о конкуренции вы получите.
Выбираем язык по направлению работы
Backend
Бэкенд-разработчики создают серверную, «внутреннюю» часть игр, приложений, сайтов, банкинга и других продуктов. Они отвечают за разработку функций и компонентов, которые пользователь не видит напрямую. Например, интеграцию с платежным шлюзом, связку корзины и формы оплаты, хранение и сбор информации в базе данных.
Для работы в этом направлении нужны серверные языки. Для веб-разработки — PHP и Python, для игр — С++, для сайтов с большими базами данных и сложными задачами — Java. Если хотите начать с простого языка, попробуйте Python.
Frontend
Фронтэнд-программист превращает макет в работающий продукт. Он отвечает за то, как пользователь видит сайт, интерактивные элементы, адаптивность к мобильным устройствам, работу калькуляторов и отправку форм. Направление подойдет тем, кто хочет работать на стыке с дизайном и UX.
Из языков программирования понадобятся простые в изучении JavaScript, HTML и CSS. Со знанием JavaScript можно пробовать себя и в других направлениях, например: серверная разработка на Node JS, разработка десктопных приложений.
Курс Skypro «Веб-разработчик» обучает основам работы фронтенда и бэкенда с нуля за 12 месяцев. Это 330 часов теории и практики, разбор ошибок, общение с преподавателями во время живого вебинара и в командном чате, помощь наставников и карьерных консультантов. Всё, что потребуется, — желание получить знания, разобраться в тонкостях профессии и 12-15 часов в неделю. В программе только те знания и навыки, которые требуют работодатели от начинающих специалистов.
Мобильная разработка
В этом направлении программист пишет интерфейс, внутреннюю логику и тестирование приложений для iOS или Android. Некоторые компании включают в задачи создание технической документации, отрисовку интерфейса и улучшение производительности приложения.
iOS-разработчики изучают Swift, который считается простым для новичков. Как дополнительный язык — Objective-C. Он актуален для старых масштабных проектов, которые не переписали на Swift.
Для создания Android-приложений нужны Java или Kotlin. Оба языка универсальные и помогут перейти в другое направление. А Swift мало востребован за пределами мобильной разработки.
Gamedev
Разработка игр для ПК, браузеров, мобильных устройств, консолей. В крупных проектах функции разделяют между разными разработчиками. Геймдев-девелоперы отвечают за архитектуру игры, программирование уровней, анимацию.
Нужно изучить Java, C# или C++. Первый язык более востребован на рынке. Также понадобится знание SQL для обмена данных игр с сервером. С# — сложный язык, но на его базе будет просто выучить другие.
На курсе Skypro «Java-разработчик» за 11 месяцев можно изучить язык на уровне продвинутого новичка. В программе — 440 часов теории и практики, индивидуальные и командные проекты. После обучения получите диплом установленного образца, а центр карьеры подготовит к собеседованию, чтобы вы быстро нашли работу по новой специальности.
Разработка десктоп-приложений
Направление Desktop связано с созданием приложений для Windows, Linux, MacOS. Это браузеры, редакторы текстового/аудио/видеоконтента, CRM, системы для сложных расчетов. Иногда в задачи входит доработка существующих продуктов с открытым кодом.
Для старта в профессии изучают один из языков: C++, C#, Python, Java, Go, Swift.
C++ подойдет, чтобы создавать программы любой сложности — IoT, системы обработки статистики, игр. Учить его с нуля сложно, поэтому реализация проекта затянется. Python проще для новичков, не замедляет процесс и подходит для создания кроссплатформенных приложений.
