Что такое программирование: доступное объяснение для абсолютных новичков

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

  1. Для тех, кто заинтересован в программировании, но не знает, как начать и следует ли продолжать.
  2. Для тех, кто работает напрямую с программистами и желает понять основы того, что они делают.
  3. Для тех, кто только начал свой путь в программировании и хочет познакомиться с базовыми понятиями.
  4. Для тех, кто видел программистов только в фильмах и не представляет, что они делают на самом деле.

Компьютерная программа

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

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

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

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

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

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

Набор инструментов для работы

Инструментарий типичного программиста чаще всего состоит из следующих вещей:

  • компьютер;
  • интернет (прежде всего он нужен для поиска всего неизученного и неизвестного в любом из известных поисковых сервисов);
  • редактор кода (или IDE — комплекс программных средств, используемый программистами для разработки программного обеспечения), который поможет упорядочить всё, что вы создаёте;
  • компилятор или интерпретатор. Это программа, которая читает ваш код и пытается найти в нём ошибки. Затем он собирает ваш код в единый пакет и передаёт компьютеру для выполнения;
  • наушники. Возможно, вас будут отвлекать внешние шумы, а наушники — один из простых способов оградить себя от шумов.

Вы можете использовать свободное программное обеспечение для начала работы с кодом. Таковым является Atom и Notepad++. Вы также можете попробовать SublimeText, однако этот редактор является платным программным обеспечением.

Языки программирования

В мире существует более тысячи разных языков программирования. Многие из них чуть меньше, чем полностью бесполезны. У вас может быть замечательная карьера, если вы владеете 3-4 языками программирования. Но не пугайтесь, они не такие сложные, как человеческие языки.
Языки программирования зачастую описываются своей парадигмой, которая является способом категоризации видов функций. Например, JavaScript — язык, который может быть запущен в любом веб-браузере, также он заслуженно занимает лидирующие позиции в рейтинге популярности. Он имеет разнообразный набор функций: поддерживает императивные, структурируемые, объектно-ориентированные и управляемые событиями парадигмы. Пока что это может звучать странно для вас, но если вы углубитесь в языки программирования, то поймёте, что значат все эти понятия.

У языков программирования есть одна особенность — если два языка имеют сходство в парадигмах, то, как правило, они схожи и в синтаксисе. После изучения JavaScript вы сможете понять до 75 % кода на Python или Ruby, так как они похожи.

Опытные разработчики рассматривают проблемы с точки зрения алгоритмов — серии шагов, которые нужно выполнить для достижения определённой цели, даже если детали меняются. Давайте разберем это на основе реальных примеров. Рассмотрим сервис покупок Amazon. Каждый раз, когда вы что-либо покупаете, то совершаете примерно одинаковые шаги: откладывание покупок в корзину, выбор способа оплаты, прописывание адреса для доставки, выбор скорости доставки и подтверждение заказа. Для каждой покупки используется один и тот же код (он же алгоритм в данном случае). Разнятся лишь данные (детали). Таким образом, можно прийти к мысли, что алгоритмы могут быть созданы на любом нормальном языке программирования. Вы же помните, что не все они хороши и полезны? Когда вы научитесь выстраивать своё мышление в виде алгоритмов, то язык программирования будет всего лишь вашим инструментом. Иначе говоря, у вас могут быть инструменты для создания космического корабля, но из-за отсутствия правильных мыслей и идей у вас получается создать только дверь для дома, которая должна быть космическим кораблём. Конечно, хорошее знание языка на высоком уровне играет важную роль. Но важнее уметь описывать правильно все процессы.

Введение в программирование на основе JavaScript

С этого момента будет использоваться язык программирования JavaScript для приведения конкретных примеров.

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

Пропорциональный текст

Непропорциональный текст

В предложениях присутствуют следующие ошибки: лишний пробел после слова for, лишний апостроф после слова Alice, а также пропущенная буква в слове without. Возможно, вы все ошибки заметили сразу, но обратите внимание, что их проще заметить на второй картинке, где расположен непропорциональный текст.

Работа с данными в коде

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

  1. Вам зачастую не известно, что будет скрываться под переменной. Например, Facebook не знает, когда у вас день рождения, поэтому он использует переменную с общим названием donalds_birthday для обозначения даты или обозначения её отсутствия. (Переменные не могут содержать пробелы, поэтому следует разграничивать слова другими символами.) Переменная присваивается любой дате, которую вы введёте, и дальше программа продолжает использовать ваши данные, скрывая их за переменной.
  2. Вам может быть сложно вспомнить, что значит та или иная переменная. Например, нужно указать компьютеру, что 86-е декабря не является реальной датой. Следовательно, мы где-нибудь должны указать, что в декабре 31 день. Но 31 — это число (данные), поэтому если вы будете использовать 31 во всём своём коде, чтобы таким образом обозначить количество дней в этом месяце, то однажды запутаетесь. Ведь у нас существуют прочие месяцы. Таким образом, можно присвоить числу 31 имя the_number_of_days_in_december. Теперь вы точно не запутаетесь. Отлично, идём дальше!

Примечание в названиях переменных нельзя использовать апострофы.

Чтобы переменная существовала, её нужно объявить. Объявление переменных служит в роли свидетельства о «рождении» для данных. Давайте посмотрим на пример:

var the_number_of_days_in_december

Ключевое слово var означает переменную (сокращение от variable). Использование сокращений ускоряет работу с кодом.

Также переменной нужно присвоить значение:

var the_number_of_days_in_december = 31

Всё очень просто. Объявляете переменную, присваиваете ей значение и используете везде в коде, например, the_number_of_days_in_december вместо числа 31.

Следует помнить, что вы также можете объявлять переменные для данных, которые ещё не существуют. Давайте вернёмся к примерам. Вы можете объявить var donalds_birthday и сообщить приложению, чтобы оно ожидало ввода значения. Всё, что будет введено пользователем для этой переменной, будет использоваться в тексте под именем donalds_birthday.

Переменные могут содержать не только даты и числа. Например, вы можете объявить целую строку или фрагмент текста:

var great_song_lyrics = ‘pasito a pasito, suave suavecito’

Теперь можно где угодно в коде написать great_song_lyrics и компьютер поймёт, что речь идёт о 'pasito a pasito, suave suavecito'.

Как насчёт проверки этих утверждений? Давайте протестируем всё, что было сказано выше. Откройте консоль в Google Chrome нажатием клавиши F12 (для владельцев Mac рекомендуется ознакомиться с этой статьёй). Перед вами появится следующее окно:

Убедитесь, что выбрана вкладка «Console», кликните на пустом поле рядом со знаком «больше» (>), объявите переменную и присвойте ей значение, а затем нажмите клавишу ввода.

В консоли отображается сообщение undefined из-за того, что строка кода не вывела какие-либо данные, чего, собственно, делать и не должна. Теперь введите название своей переменной в строку и нажмите кнопку ввода.

Примите поздравления! Консоль (которая также служит в роли интерпретатора) понимает вашу переменную. Её значение было выведено в виде текста, который вы ей присвоили. Кстати, вы могли заметить, что были использованы одинарные кавычки, но вы также можете использовать двойные. Только не смешивайте их (т. е. не следует делать ‘так”).

Многие языки программирования требовательны к конкретной информации о том, какую именно переменную вы объявляете. Например, в C++ ключевое слово var отсутствует. В C++ слово int используется для объявления небольших целых чисел; long используется для объявления больших целых чисел; float и double используются для объявления десятичных чисел, а string используется для объявления текста. Но пока что вам не стоит в это вникать, вы сможете подробнее ознакомиться с C++ позже.

Комплексные типы данных

Объекты

Важной частью разработки кода является изучение организации данных. Возьмём, например, Facebook. Социальная сеть хранит сотни миллионов записей о днях рождения (и прочих датах), которые хранятся на серверах. Но как алгоритм понимает, к чему та или иная дата относится и для чего она вообще указана? Давайте разберёмся в этом.

Facebook не просто хранит миллионы произвольных дат, он связывает все ваши данные с уникальным идентификатором (id). Можете провести аналогию с паспортом. Все данные о прописке, возрасте, имени и половой принадлежности привязываются к номеру паспорта, по которому вас могут идентифицировать. То же самое происходит при создании учётной записи в Facebook. Для социальной сети вы являетесь пользователем под каким-либо случайным (или не очень) номером.

В Javascript объекты объявляются почти так же, как и переменные:

var human = {
    id: 12884002,
    age: 28,
    name: 'Bob',
    favorite_song: 'Photograph, by Nickelback'
}

На самом деле, всё, что мы сделали — это объявили четыре переменные: два числа и две строки. Но все они организованы вместе, поэтому мы сможем найти их, когда захотим узнать что-нибудь о human. Всё, что вы видите в фигурных скобках, разграничивается на две части: слева прописываются поля, а справа указываются свойства для них. Объект может иметь любые свойства до тех пор, пока они находятся внутри {фигурных скобок}.

Мы можем использовать объект human и ссылаться на него точно так же, как и на любую другую переменную. Компьютер поймёт, что нужно сослаться на какое-либо определённое свойство, если мы его напишем через точку:

human.id
human.name
human.age
human.favorite_song

Каждый из элементов сверху может быть изменён и ссылаться на другое свойство. Например, давайте изменим имя (name):

human.name = ‘Alice’

Массивы

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

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

var tweets = ['Hello, Twitter!', 'My friends are so cool', 'Does anyone want a LaCroix?']

Помните, как используются объекты в {фигурных скобках}. Сейчас мы работаем с массивами, и для них принято использовать [квадратные скобки]. Рассматриваемый массив имеет три строки, разделённые запятыми. И да, это также можно считать чем-то вроде переменной. Вы можете использовать tweets в любом месте вашего кода, ссылаясь на массив, который только что был определён.

Примечание Счёт массивов начинается с нуля, но не с единицы.

Если вы хотите обратиться к какому-то отдельному твиту, то можно сделать следующее:

tweets[0]
tweets[1]
tweets[2]

В примере выше используется имя массива tweets, а затем внутри квадратных скобок мы пишем номер (индекс) твита (элемента), к которому желаем обратиться.

Каждое из приведённых выше выражений — переменная. Вы можете присвоить им какое-нибудь новое значение, чтобы поэкспериментировать:

tweets[2] = 'I regret literally everything I have ever said'

Что произошло с предыдущим значением? Правильно! Оно было заменено на новое, теперь tweets[2] будет ссылаться на новое значение.

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

Массивы также могут быть свойствами объектов. Объект может иметь свойство, которое представляет собой массив объектов. Звучит, словно описание матрёшки, но именно так и структурируются данные.

var nested_object = {
    an_array: [
        {
            another_array: [
                {
                    yet_another: [
                        {
                            message: 'Blink twice if you need help'
                        }
                    ]
                }
            ]
        }
    ]
}

Чтобы обратиться к message, вы можете написать следующее:

nested_object.an_array[0].another_array[0].yet_another[0].message

И компьютер поймёт, что вы имеете в виду ‘Blink twice if you need help’

Объекты (продолжение)

В JavaScript всё немножко является объектами. Например, наши твиты tweets имеют свойство, которое мы никогда не объявляли:

tweets.length

Что такое length? Это длина нашего массива. В нём содержится три элемента. Это свойство обновляется автоматически.

API

API — набор свойств и методов (целевых фрагментов кода), которые имеют свои имена, как переменные. Вы можете ссылаться на них по имени и позволять им работать.

Массивы JavaScript также имеют свой собственный API. Свойство length является частью этого API. Другая его часть — метод push, который добавляет элементы в конец массива:

tweets.push('Man I hate good attitudes')

Метод похож на свойство, потому что к нему можно получить доступ через точку. Он отличается от свойства тем, что после него нужно поставить (круглые скобки). В этих круглых скобках хранятся данные, которые мы хотим добавить в наш массив. Теперь в tweets четыре элемента. Это выглядит вот так:

['Hello, Twitter!', 'My friends are so cool', 'I regret literally everything I have ever said', 'Man I hate good attitudes']

Однако помните, что вам следует начинать считать элементы с нуля. Поэтому индексом последнего элемента будет 3 — tweets[3].

В API JavaScript существует множество разных методов, но до них вы уже дойдёте сами, когда придёт время. Но на досуге можете ознакомиться с ними по ссылке.

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

Функции

Функция — ещё одно название метода. Это всего лишь фрагмент кода, который что-то выполняет и имеет имя. Функции можно легко объявлять:

function giveMeOne() {
    return 1
}

Объявление функции начинается с ключевого слова, затем ей даётся имя. Похоже на переменную, не так ли? В примере выше используются заглавные буквы для разграничения слов. Затем фигурные скобки, внутри которых записан код, который нужно будет извлечь при вызове функции.

Слово return — ещё одно ключевое слово. Оно заставляет значение «выпрыгивать» из функции. Затем функция завершается (если вы напишете код после return, то он не будет выполнен). Таким образом, вы можете сделать следующее:

var the_loneliest_number = giveMeOne()

Не слишком сложно, не так ли? Мы объявляем переменную с именем the_loneliest_number. Часть нашей команды вызывает функцию giveMeOne() и так как функция говорит return 1, выводится единица. Наша переменная будет содержать цифру 1. Теперь попробуйте ввести в браузере первый блок с функцией, затем блок с переменной, а затем ввести the_loneliest_number и нажать кнопку ввода. Вы увидите единицу.

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

Функция giveMeOne() похожа на tweets.push(). Основные различия:

  •  giveMeOne() — функция, которая была создана нами, а push() — это функция, которую написал кто-то, а не мы;
  •  push() — метод массива tweets (а так же любого другого массива). giveMeOne() является глобальной, поэтому нам не нужно ссылаться на другие объекты, чтобы использовать её.

Как вы могли заметить, есть ещё одно небольшое различие: giveMeOne() использует пустые круглые скобки, а push() ожидает, что мы введём что-нибудь внутри круглых скобок. Фактически, push() будет бесполезен, если мы ничего не добавим в наш массив. Часть данных, которую мы добавляем в функции, называется аргументом. Объявление функции, которая может ожидать аргументы, выглядит так:

function addTheseNumbersTogetherPlz(number1, number2) {
    return number1 + number2
}

Эта функция не сильно отличается от giveMeOne(). В ней вместо пустоты в скобках записаны имена переменных, разделённые запятой. Это наши аргументы. Оператор return складывает number1 и number2, а затем выдаёт результат. Можно было бы в шутку назвать это таким образом: addTheseNumbersTogetherPlz(3, 4) и было бы выведено число 7.

Вам же нравится математика, не так ли? Почти во всех языках программирования вы можете писать математические выражения так же, как и на калькуляторах.

Давайте посмотрим, что можно сделать с «калькулятором» JavaScript:

+ используется для сложения;
- используется для вычитания;
* используется для умножения;
(круглые скобки) служат для принудительного выполнения порядка операций;
% используется для получения остатка деления.

Вы могли бы записать предыдущую функцию таким образом:

function addTheseNumbersTogetherPlz(number1, number2) {
    var sum = number1 + number2
    return sum
}

Эта функция делает всё то же, что и предыдущая, только в неё введена переменная в качестве посредника.

Логические ветви и сравнения

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

Предположим, мы пишем приложение, которое определяет, разрешено ли конкретному человеку войти в ночной клуб. Представим, что в JavaScript API есть метод, который получает возраст пользователя. Мы назовём его getUserAge(). Также предположим, что существуют два других метода: allowThemInTheNightClub() и throwThemOutOnTheirButt(). Как мы можем помочь нашей программе решить, какой из этих двух методов нужно вызвать, исходя из возвращаемого значения первого метода?

var age = getUserAge()
if (age >= 21) {
    allowThemInTheNightclub()
} else {
    throwThemOutOnTheirButt()
}

Вы уже знаете, что делает первая строка. age (возраст) может варьироваться от 7 до 101. Теперь нам нужно определить больше значение age, чем 21 или нет. Если больше, то посетители могут развлекаться, если нет, то должны будут покинуть клуб.

Мы делаем это с помощью оператора if(если) — ключевого слова, похожего на метод. Аргумент, который он ожидает, представляет собой какое-то выражение (обычно сравнение). Сравнения принимают два значения и сравнивают их друг с другом. В результате чего выбирается одно из следующих ключевых слов: true — в случае соответствия правилу и false — в случае несоответствия. Это называется логическим выражением.

В JavaScript есть возможность 6 видов сравнения:
=== сравнивает значения. Если они одинаковы, то вы увидите true. Например, 6 === 6 было бы true;
!== сравнивает значения на неравенство. Если они не равны, то вы увидите true. Например, 6 !== 3 было бы true;
> проверяет, больше ли значение слева. Если больше, то вы увидите true. Например, 6 > 3 было бы true;
< проверяет, больше ли значение справа. Если больше, то вы увидите true. Например, 3 < 6 было бы true;
>= проверяет, больше или равна правая часть левой. Если больше или равна, то вы увидите true. Например, выражения 6 >= 6 и 6 >= 5 были бы true;
<= проверяет, меньше или равна правая часть левой. Если больше или равна, то вы увидите true. Например, выражения 6 <= 6 и 6 <= 7 были бы true.

Оператор if оценивает сравнение. Если выводится true, то код выполняется внутри блока сравнения. Если выводится false, код не выполняется и игнорируется.

Оператор if также может работать с оператором else(то). Он содержит в себе блок кода, который будет выполнен, если сравнение вернёт false. Теперь взгляните снова на код, относящийся к ночному клубу, и вы поймёте, как он работает (если нет, перечитайте этот фрагмент ещё раз)

Циклы

Иногда, когда вы работаете с массивом, вам может понадобиться выполнить какой-то блок кода несколько раз подряд. В таких случаях следует использовать циклы. Простейшим видом цикла JavaScript является while(пока):

var the_real_slim_shady = ['My name is', 'My name is', 'My name is', 'Waka waka Slim Shadyyy']
var index = 0
while (index < the_real_slim_shady.length) {
    rap(the_real_slim_shady[index])
    index = index + 1
}

Цикл while использует тот же синтаксис, что и оператор if: нём используются круглые скобки, вы проходите через сравнение и т. д. Но блок if выполняет код внутри только один раз, а блок while повторяется раз за разом. Он выполняет условие до тех пор, пока оно не станет false . Если оно соответствует true, блок запускается снова и снова. Давайте ознакомимся с примером выше. Был использован вымышленный API с методом rap(), но всё остальное — настоящий JavaScript.

Сколько раз будет выполняться цикл? Что же, в первый раз он оценит сравнение и проверит меньше ли index (который равен 0), чем the_real_slim_shady[0]. Если сравнение выведет true, то будет запущен цикл, так как index равен нулю. С этого момента цикл будет выполняться до тех пор, пока блок index не будет равен 4, так как the_real_slim_shady[4] не существует, вы же помните, что массивы начинаются с нуля, а не единицы?

Null и Undefined

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

Области применения

Функции очень эгоистичны. Если вы объявите переменную внутри функции, то вы не сможете ею воспользоваться где-нибудь за пределами функции. Пример:

function whatHappensInVegas() {
    var wildIndiscretions = ['partied', 'danced']
    return 'I admit nothing'
}
whatHappensInVegas()
whatHappensInVegas()
whatHappensInVegas()
if (wildIndiscretions.length > 0) {
    getADivorce()
}

У нас очень простая функция. В ней объявлена переменная wildIndiscretions. Мир за пределами функции не знает о существовании переменной. Даже оператор if не может ничего сделать в этом случае. Оператор if сработает только внутри функции, если поместить его перед return.

Комментирование кода

Не всегда бывает понятно, что выполняет тот или иной код. Поэтому всегда следует комментировать свой код. Так как, возможно, вам придётся работать с ним снова и вы не сможете что-то вспомнить или же другим людям нужно будет заглянуть в ваш код. В JavaScript комментарии начинаются с двух слешей — //:

var age = 21{
// переменная равна 21.
// Если она не равна 21, пожалуйста, измените на 21.
// Что сделать: добавить больше переменных.
}

Предлагаем вам познакомиться с примерами комментирования кода в нашей специальной статье.

Заключение

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

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

Перевод статьи «When you finish reading this, you’ll know how to code»