Хочу войти в IT, что лучше, JavaScript или C++?
Мне 29, я не училась на программиста, но с математикой в школе было неплохо, и еще немного изучала на одной работе язык 1С. У меня есть идея программы и мечта создать её. А мой молодой человек сейчас переучивается на художника, чтобы рисовать для игр, и хочет в будущем создать игру на движке Unreal Engine, язык в котором, как известно, C++. Слышала, что C++ используется в играх и многих программах. Так что этот язык может быть полезен и мне и моему молодому человеку, если я буду делать вместе с ним игру. С другой стороны, в интернете пишут, что C++ очень сложный язык для новичка и на рынке труда джуниоры требуются не часто, а вот, например, JavaScript и вообще программирование сайтов — это сфера, через которую легче и быстрее всего можно войти в программирование, к тому же веб-разработка мне в принципе тоже интересна. Отсюда вопрос: стоит ли изучить JavaScript и быстрее войти в эту сферу, а потом переключиться на игры и программы или лучше не тратить время на другой язык и сразу углубиться в C++?
Лучший ответ
Насколько понял по описанию, вариантов по сути нет. Есть обычный мандраж перед неизвестностью. с++ не то, чтобы сложен, он многообразен, широк, глубок и полноценен. Можно сидеть в 4х стенах рядом с плитой и раковиной, а можно жить в лесу. среди диких зверей .Так что, вперёд и вверх
https://academiait.ru/course/uroki-unreal-engine-4/
«переучивается на художника». Смело сказано, жизнеутверждающе, бодрит.
ваша задумка грешит излишним оптимизмом. геймдев (в т. ч. на UE) доходов не принесёт, а вот для чсв это вполне нормальное времяпровождение.
Остальные ответы
Джаву учи. Там побольше возможностей, считаю. Он сложный, но того стоит.
На джаве тоже можно делать игры. Конечно не прям крутые, но можно.
КонстантинМастер (2497) 3 года назад
Ахаха, а чего не ассемблер! Чем современный Котлин хуже старогй Java-ы?
Hoodlum Гуру (3656) Константин, Так не говорил я что Котлин плохой, просто Джава как-то прогрессированная более, сложная, но имеет больше возможностей. Совмещает в себе все с других языков программирования. Хорошо это, или плохо, решать только вам, я держусь на позиции Джавы.
Голова РоботаПросветленный (36328) 3 года назад
Ява несложный язык. Ява проще, чем C#, и гораздо проще, чем C++. Сложность Явы в её фреймворках (J2EE, Spring)
с++ интересный язык, но мне например не подходят те области в которых он применяется, но чтобы понять принципы процедурного и объектно-ориентированного программирования рекомендую его выучить, это так сказать заложит базу
Чтобы изучать было проще, рекомендую канал на ютубе #simpleCode
Изучайте JavaScript, будет полезнее. Вы поможете с созданием игры даже без C++. Там есть более простая система Blueprints, которую вы помёте в любом случае.
C# лучше на старте. Он проще заходит и потом на С++ перейти не сложно. Если начинать с С++ это приятная боль.
Забей, если тебе не дается нихира не один язык ты всю жизнь будешь спрашивать тут. Начни учить алгоритмы, ТУПО АЛГОРИТМЫ! не поймешь их не поймешь ни один язык
JavaScript плохой язык для новичка, потому что он кривой. Недостаток C++ в том, что он очень сложный. Это не тот язык, который изучают, чтоб быстрее начать зарабатывать деньги.
Рекомендую C#, Java или Python. Из этих языков для игр годится только C# (с движком Unity).
Невозможно работать только со знаниями этих языков. Нужно ещё много чего знать.
Человек СкрытностьГуру (2863) 3 года назад
А где JavaScript кривой то? Уже сколько лет с ним работаю и ни разу не натыкался на логическую неувязку. Он весьма логичен, хоть и не похож синтаксисом ни на один другой язык. Тут я конечно соглашусь, перейти на другой язык с JS будет куда сложнее, нежели чем с C# или того же Python. Но где он кривой? я не понимаю.
Голова Робота Просветленный (36328) Человек Скрытность, > не похож синтаксисом ни на один другой язык как же не похож? Синтаксис частично заимствован из C++.
. Мне 29. А мой молодой человек.
Учи с МОЛОДЫМ язык камасутра.
А на остальное — наплюй: есть дырка промеж ног — вот и будь довольна.
С++, блин!
Редис АлександровичОракул (76393) 3 года назад
Сразу видно что ты первый в мире программист который зарабатывает дыркой и делится опытом!
psholty46 Искусственный Интеллект (136655) . Сразу видно что. Милейший, но очинно малограмотный в этих вопросах Редис Александрович. Вишь ли, ПРОГРАММИСТОМ можно ТОЛЬКО родиться — научиться без получения особых способностей при зачатии етому делу никак НЕвозможно. Впрочем, если ты под программистом подразумеваешь умельца по втыканию в системник мышки и клавы, тады. это подтверждает мою правоту в отношении тебя.
а) на jave можно — писать игрушки и приложения на андроид — не путать с javascript
б) javascript обычно вместе с html изучают и вдобавку css
javascript то он не много не логичен по сравнению с С++ java и с # sharp
в) c # sharp не помещает изхучить
но сначало надо браться за что нибудь одно
а то голова будет пухнуть и понимания будеть ноль
Какие ещё игры? Если как гта вы их сука 1000 лет будете делать.
Над такими (похожими играми работают сотни людей профессионалов, а не геймеров которые играют игры сука в 30 лет как дети не зная какой язык програмирования выбрать и не один год).
Начни с языка C.
Сравнение 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. Но остались не затронуты ещё многие аспекты:
Каждая из этих тем является достаточно обширной и будет раскрыта в дальнейшем в отдельной статье.
Какой язык программирования мне выбрать?
Евгений Картавец Программный директор SkillFactory.
При выборе профессии лучше всего ориентироваться на популярность, востребованность языка среди работодателей, сложность изучения и, конечно же, отрасли. Некоторые языки и наборы языков свойственны даже вполне определенным профессиям: например, Android-разработчику необходимы Java и Kotlin, а чтобы написать приложение на iOS, вам понадобится Swift. Вместе с программным директором SkillFactory Евгением Картавцом разбираем самые популярные языки программирования.
Как оценивают популярность языка программирования?
Почти всем известен индекс TIOBE, компании по разработке софта. Этот рейтинг основан на проценте запросов в поисковиках конкретного языка от запросов по всем языкам и ежемесячно составляется на основе данных из Google, Baidu, Wikipedia, Amazon и Ebay (внимание: Яндекс тут не учитывается). Он не показывает, какой язык лучше, а скорее помогает программистам проверить, насколько актуальные языки они используют.
Профессия / 12 месяцев
Fullstack-разработчик на Python
Создавайте веб-проекты самостоятельно
4 490 ₽/мес 7 483 ₽/мес
Индекс TIOBE — не единственный в своем роде. Вот еще несколько рейтингов, на которые можно опираться: PYPL (Popularity of Programming Language index) — рейтинг GitHub оценивает по Google Trends, к каким языкам чаще всего ищут уроки; Stack Overflow — сервис вопросов и ответов по теме программирования проводит масштабные исследования рынка и опросы разработчиков IEEE — Институт инженеров электротехники и электроники ежегодно публикует на своем сайте рейтинг языков программирования, основанный на 11 параметрах и восьми источниках, включающих соцсети и GitHub. Подробнее о популярности языков и причинах их роста мы писали на Habr. Если вы планируете изучать язык, чтобы потом найти работу с его применением, мы советуем оценивать его популярность по количеству вакансий в вашем городе. Заходите на hh.ru, набираете в поиске Python или C++, и видите количество вакансий с упоминанием языка. Пройдите наш тест и узнайте, какой язык подойдет вам лучше всего.
Какие языки проще, а какие сложнее?
Трудно объективно определить, какой язык проще, а какой сложнее, потому что это зависит не только от его особенностей, но и от вашего бэкграунда, желания разбираться в документации и т.д. Относительно универсальный критерий сложности — близость языка к программированию на машинном коде. Чем ближе к нему язык, тем более он низкоуровневый. Высокоуровневые языки, наоборот, лучше адаптированы для использования программистом. У высокоуровневых языков есть крупные стандартные библиотеки, а значит, большое количество разработанных доступных решений. Низкоуровневые языки предполагают работу с процессором, памятью и другими аппаратными ресурсами: можно контролировать всю изнанку, но из-за этого легче запутаться в синтаксисе. Впрочем, и такая классификация условна: на тему того, какой язык отнести к высокому, а какой к низкому уровню, ведутся споры.
В целом, сложность языка — довольно субъективный вопрос. Для изучения с нуля лучше всего подходят Python и JavaScript. PHP, Swift и Kotlin — немного сложнее. Java и C# — еще сложнее. C++, на мой взгляд, самый сложный. Go — достаточно простой язык, но у него сложная сфера применения, поэтому проще всего на него переходить с другого языка
Евгений Картавец,
ex-программный директор Skillfactory
Python
Сложность: подходит для неподготовленного новичка. Обилие готовых библиотек (многие из которых предназначены для работы с big data) и фреймворков, а также простой синтаксис позволяют практически сразу начать программировать. Профессии: Fullstack-разработчик / Data scientist / Data engineer / Data analyst. Продукты: Sims 4, YouTube, Instagram * , Dropbox, Bittorrent. Преимущество Python — в его многогранности и широком применении. Его можно использовать как в веб-разработке (фреймворк Django, например, достаточно прост для того, чтобы новичок быстро разобрался в основах его использования) и работе с данными, так и в написании скриптов. Вы можете заниматься анализом данных для банковских систем, автоматизацией простых задач, разрабатывать приложения, совершенствовать голосовые помощники или обучать нейросеть (для этого, кстати, есть веб-сервисы типа Google Colaboratory, где можно бесплатно пользоваться мощным процессором TPU). Python сейчас все активнее набирает популярность среди программистов. Из-за простоты кода его часто используют в командных проектах, что облегчает разработчикам жизнь: можно не тратить время на разбор чужого материала.
PHP
Сложность: по синтаксису PHP близок к С и Java. Но не стоит пугаться: на самом деле это относительно легкий, гибкий и доступный новичку язык. При базовых представлениях об HTML и CSS можно сразу написать простой одностраничный сайт. Продукты: WordPress, Facebook * , VK, Wikipedia. Профессии: Веб-разработчик PHP — серверный язык веб-разработок, он подходит для создания одностраничных или комплексных высоконагруженных сайтов. Он «оживляет» статичные HTML-страницы, поэтому на нем оптимально разрабатывать динамические сайты вроде соцсетей, форумов, интернет-магазинов и блогов. Мощный и высокопроизводительный PHP подходит и для проектирования баз данных тех же магазинов. Его можно использовать на многих операционных системах: язык ладит с Windows, Unix, Linux. При работе с ним нужно быть крайне внимательным, потому что из-за гибкости языка легко ошибиться в коде, а найти проблему потом бывает непросто. У PHP бесчисленное количество сообществ. На официальном сайте структурировали основные информационные рассылки. Почти в любой соцсети можно оперативно найти живое сообщество и обратиться за помощью.
Станьте веб-разработчиком и найдите стабильную работу на удаленке
Kotlin
Сложность: поскольку одной из целей создания языка было упростить Java, синтаксис Kotlin — интуитивно понятный и лаконичный. Профессии: Android-разработчик / Backend-разработчик. Продукты: Uber, Pinterest, Basecamp. Российская компания JetBrains представила язык Kotlin в 2016 году как альтернативу Java. Благодаря официальной поддержке Google он стал языком разработки приложений на Android. При этом он совместим с Java: код обоих языков можно использовать в одном и том же проекте. Помимо разработки Android, Kotlin используют и в серверных, и в клиентских приложениях для веб-разработок и backend. Сообщество Kotlin живое, хоть и немногочисленное, многие общаются на форумах или в Slack. Язык развивается не очень быстро, несмотря на открытость исходного кода.
Swift
Сложность: философия языка — простота и производительность, так что у него понятный, логичный и удобный синтаксис. В нем легко разбираться, если у вас уже есть база из высокоуровневых языков, но и без нее все не так сложно. Профессии: iOS-разработчик Продукты: Safari, Procreate, Kickstarter, VSCO На Swift создают продукты для экосистемы Apple: приложения для iOS, Mac, Apple Watch, Apple TV. В этом его преимущество и недостаток. С одной стороны, разработчики на iOS востребованы, их немного, поэтому можно будет быстро найти работу. С другой стороны, приложения сильно завязаны на своей экосистеме, и на других платформах они работают с трудом, на костылях. При этом делать функциональные и красивые приложения на Swift — проще. Разрабатывая их, вы будете сталкиваться и с UI-дизайном, и с дополненной реальностью. Swift многое взял из языка Objective-C, поэтому не лишним будет знакомство и с ним, чтобы в дальнейшем развиваться в направлении разработок для iOS. Обычно продукты Apple закрыты для сообщества, но у Swift открытый исходный код, что полезно как языку, так и комьюнити.
Go
Сложность: синтаксис Golang минимален, а широкая стандартная библиотека позволяет быстро разобраться в управлении командами. Профессии: Backend-разработчик Продукты: YouTube, архитектура Ozon, backend Wildberries Go разработали инженеры Google. Это (так же, как Swift и Kotlin) — компилируемый язык, который выступает альтернативой C++ для высоконагруженных приложений. На нем можно писать сетевые приложения на промышленном уровне, поэтому на Go все чаще обращают внимание крупные ритейлеры (вроде Ozon). По сравнению с остальными языками, этот — очень молодой (2009 год), но у него достаточно быстро растущее комьюнити, которое взаимодействует по Google-рассылке.
JavaScript
Сложность: можно выучить JavaScript быстро, главное — отрабатывать теорию на практике в тренажерах (подборка хороших интерактивов и обучалок). Уже за полгода можно освоить документацию, поскольку логика у него простая и гибкая. Язык мощный, а его инструменты просты и доступны Профессии: Frontend-разработчик / Fullstack-разработчик / Веб-девелопер. Продукты: Frontend сайтов программируют только на Javascript, так что он используется на большинстве сайтов. JavaScript — язык веб-разработок. Изначально на нем можно было программировать только frontend сайтов, но сейчас, благодаря Node.js, который выступает в роли веб-сервера, можно писать и серверные приложения. Язык делает сайты интерактивными и высокопроизводительными. А чтобы эффективно использовать возможности языка для создания красочных сайтов, нужно уметь пользоваться инструментами верстки HTML и CSS, знать один из популярных фреймворков (React, Vue или Angular). В веб-разработках сообщество большое, так как fullstack- и frontend-разработчики нужны всем. Сайтов огромное количество, мы пользуемся ими каждый день, и их всегда нужно улучшать. Кроме того, такие проекты можно вести самому с нуля вплоть до самого релиза, что тоже очень ценно, если вам привычнее инди-разработка.
Станьте Frontend-разработчиком
и создавайте интерфейсы сервисов, которыми пользуются все
C#
Сложность: C# изначально перенял синтаксические конструкции языков C++ и Java, так как его разработали специально, чтобы упростить последние. У него хороший набор фреймворков (.Net, Xamarin) и библиотек. Профессии: Разработчик игр / Fullstack-разработчик / Backend-разработчик. Продукты: Это универсальный язык программирования. На нем можно писать серверную часть сайтов, десктопные приложения, серверные приложения и даже игры. На российском рынке популярен движок Unity 3D, который позволяет на языке C# писать игры для любых платформ: для PC, мобильных устройств, приставок или VR. На нем удобно писать оконные приложения и веб-приложения или даже корпоративное программное обеспечение (например банковское обслуживание). Так как язык входит в пятерку самых популярных, он узнаваем, и в целом из-за обширной синтаксической семьи C# его сообщество масштабное и активное. Вы можете быть как инди-разработчиком, так и работать в команде — у вас всегда найдутся единомышленники и помощники.
C++
Сложность: синтаксис у C++ устроен сложнее, чем у тех же Python или C#. Однако использование языковых средств и концепций этого языка даст лучшее понимание теории программирования и может облегчить изучение других языков в дальнейшем. Профессии: C++ разработчик / Разработчик игр Продукты: на нем написан движок REDengine, на котором создали «Ведьмака» и Cyberpunk 2077, CCleaner, продукты Adobe, Autocad, Telegram, Microsoft 365 C++ — это один из фундаментальных языков программирования. Он быстрый, на нем вы можете заниматься оптимизацией, архитектурой ПО, решать задачи по автоматизации процессов, создавать системы моделирования. На нем можно писать с нуля программы, антивирусы, драйверы — все, что ближе к железу. Продукты, которые требуют более глубокого понимания основ программирования (роботы, нейросети), лучше создавать на C++. Из-за сложности языка сообщество программистов более сплоченное: активнее делится кодами и библиотеками языка. Можно даже наткнуться на горячие споры: кто-то считает, что C++ идеален в качестве первого языка, а другие относятся к языку со скепсисом и не видят смысла изучать его первым.
Java
Сложность: Сложнее, чем Python, но проще, чем C++. Довольно сильно похож на C# как по синтаксису, так и по сложности освоения. А большое количество обучающих материалов разного уровня доступно бесплатно. Профессии: Тестировщик ПО / Android-разработчик/ Java-разработчик. Продукты: архитектура Netflix, Spotify, Uber, веб-приложение Twitter Java стал вездесущим из-за своей универсальности и надежности. Про него слышали даже те, кто далек от программирования, потому что на языке написаны продукты, которыми мы пользуемся каждый день (Android-приложения, игрушки, десктопные ПО, банковские системы). Он кроссплатформенный, благодаря JVM (Java Virtual Machine) его можно запускать везде. Его чаще используют в компаниях, а не в инди-проектах. У Java одно из самых мощных сообществ. Вы сможете найти много разных проектов с открытым исходным кодом, обратиться за помощью и использовать готовые решения для своих кодов, развивая и совершенствуя их. Тест: Какой язык программирования вам подойдет? * Принадлежит компании Meta, деятельность которой признана экстремистской в России.
Java-разработчик
Java уже 20 лет в мировом топе языков программирования. На нем создают сложные финансовые сервисы, стриминги и маркетплейсы. Освойте технологии, которые нужны для backend-разработки, за 14 месяцев.
Евгений Картавец Программный директор SkillFactory.
Почему JavaScript работает быстрее, чем С++?
Да, вы не ослышались. Глючный, тупой, тормознутый JavaScript работает быстрее, чем С++. Подождите тянуться к return userKarmaVote(), дайте мне возможность всё объяснить. Адвокат!
Есть три вида лжи
Есть такой проект под названием Benchmarks Game. Ребята написали программы (обход бинарных деревьев, n-body и т.д.) на всех популярных языках программирования и разработали методику измерения скорости и потребления памяти. Прежде чем читать дальше, просьба ознакомиться с методологией измерений.
Реализация каждого алгоритма подробно описана (например, nbody). Это open-source и если вы считаете, что какой-то алгоритм реализован не самым оптимальным способом, то можете предложить собственное решение.
Из всех интерпретируемых языков JavaScipt работает быстрее других. Он в пять раз быстрее, чем Python и Ruby (в том числе JRuby).
На сегодняшний день JavaScript — это самый быстрый интерпретируемый язык в мире.
Возвращаясь к C++. По алгоритму regexdna JavaScipt отрабатывает чуть быстрее, чем C++. При этом нагружает CPU в два раза меньше, хотя и потребляет в два раза больше памяти.
По другим алгоритмам JavaScript, естественно, отрабатывает медленнее C++, но учитывая что они изначально в разных весовых категориях (компилируемый язык со статической типизацией против интерпретируемого языка с динамической), разница не такая уж большая.
Почему JavaScript такой быстрый?
Интерпретаторы для Python/Ruby были написаны ограниченным числом людей. Эти люди, возможно, безумно талантливы, но на стадии разработки у них не было никакой конкуренции. Они конкурировали только с собой, со своими представлениями о скорости и качестве. Интерпретатор же для JS родился в конкурентной борьбе лучших умов мира. Mozilla разработала SpiderMonkey, Google разработал V8, Microsoft открыли Chakra. Все они работали в жесточайшей конкурентной борьбе.
Когда у команды NodeJS встал вопрос о выборе движка для JS, они просто посмотрели бенчмарки, увидели что V8 намного быстрее и выбрали его. Если завтра Chakra от Microsoft будет работать быстрее Google V8, то не будет никакой проблемы перейти на него.
Почему JavaScript такой медленный?
Как было сказано выше, JavaScript как язык — быстрый. Однако считается, что «нативное» предназначение JS — манипуляции с DOM. На самом деле это уже давно не так и JS успешно используется на сервере, в мобильных устройствах и даже в микроконтроллерах. Но речь не об этом. Речь о том, что когда вы с помощью JavaScript работаете с DOM, то тормозит не JS, а DOM. Есть много причин, почему DOM такой медленный, но я позволю себе сузить фокус только на одной причине. Проблема в самой спецификации HTML. В разделе 1.1.1 The DOM Structure Model есть следующий абзац:
…objects in the DOM are live; that is, changes to the underlying document structure are reflected in all relevant NodeList and NamedNodeMap objects…
Смысл в том, что объекты в дереве DOM — «живые». Это означает, что при любом изменении любой части DOM эти изменения отражаются в каждом объекте DOM.
Крупные кампании, такие как Flipboard, упорно боролись с лагами DOM. В итоге у них ничего не получилось и они смогли добиться 60 FPS только заменив DOM на Canvas. JavaScript никуда не делся, а лаги пропали. По этой же причине Netflix отказались от DOM на своих TV-приставках, а Реакту пришлось придумывать свой «виртуальный DOM».
Еще раз: JavaScript на клиенте не лагает. Лагает медленный DOM (точнее манипуляции с DOM). Не важно чем вы будете менять DOM — джава-скриптом или ассемблером. DOM все равно будет притормаживать. Именно из-за тормознутости DOM, JavaScript стал считаться медленным языком. Это историческая несправедливость и от нее давно пора избавиться.
WebAssembly
В этой связи у многих существуют неоправданные ожидания от прихода WebAssembly. Дескать, придет WebAssembly порядок наведет и мы наконец-то откажемся от «тормознутого» JS. Во-первых, даже после прихода WebAssembly работа с DOM останется за JavaScript. Да, какие-нибудь фреймворки (типа AngularJS) получат возможность перенести тяжелую логику на C/C++, но суммарный прирост от этого будет минимальным. Во-вторых, когда WebAssembly сможет напрямую манипулировать DOM’ом, минуя JS, прироста по скорости не будет, т.к. тормозит DOM, а не JS.
Хейт
Я понимаю, что скорость работы — не главный критерий оценки языка. Нужно учитывать потребление памяти, нагрузку на CPU и т.д. Я понимаю, что одно дело — скорость работы каких-то академических алгоритмов, а другое дело — скорость работы настоящего продакшн-приложения. Я понимаю, что кроме алгоритмов есть еще паттерны и подходы, и что ваш асинхронный ASP.NET может работать быстрее асинхронного NodeJS.
Однако JavaScript уже достаточно подвергся нападкам (заслуженным и незаслуженным) за свое «странное» поведение, за свое отношение к типам, к наследованию и т.д. Но вешать на него еще и ярлык тормознутости — это перебор. Остановитесь!