SkillGridИзучай computer science на практике

Выбор языка: Python, JavaScript или Go

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

13 мин · 42 XP

Python, JavaScript и Go умеют складывать два числа, обходить список и описывать функцию. Так почему этих языков три, и почему работающие программисты спорят о них? Потому что язык — это не только способ записывать инструкции. Это ещё и сообщество, набор библиотек и набор приоритетов о том, что должно быть простым, а что сложным.

Python — язык данных и сценариев. Файлы, таблицы, статистика, машинное обучение, маленькие инструменты, склеивающие другие программы. Его синтаксис не мешает, поэтому на экране читается форма самой задачи. Расплата — скорость: Python обычно работает медленнее двух других, и для сценария, который запускается раз в ночь, это никого не волнует.

import csv

with open("sales.csv") as f:
    total = sum(float(row["price"]) for row in csv.DictReader(f))

print(total)Python: прочитать таблицу, сложить столбец, напечатать ответ. Девять строк.

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

document.querySelector("#total").textContent = "42"

button.addEventListener("click", () => {
  count = count + 1;
});JavaScript: изменить то, что на странице, а потом отреагировать на нажатие кнопки.

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

http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("ok"))
})

http.ListenAndServe(":8080", nil)Go: ответить на проверку здоровья и начать обслуживать порт. Две инструкции и работающий сервис.

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

same ideas, three spellings

value + type      name = "Ada"        const name = "Ada"     var name string
condition         if age >= 18:      if (age >= 18) {       if age >= 18 {
loop over list    for s in scores:   for (const s of ...)   for _, s := range ...
function          def f(a, b):       function f(a, b) {     func f(a, b) float64
map               {"soup": 2.50}     { soup: 2.50 }        map[string]float64{...}Одна строка на понятие. Четыре столбца записи, один столбец смысла.
youconceptsPythonJavaScriptGolearn loops, types, functionswrite them one waywrite them another waywrite them a third waythe concepts stayed, only the spelling changed

Первый настоящий фактор выбора — читаемость, и означает она вполне конкретное: как быстро человек, который этот код не писал, поймёт, что тот делает? Код читают гораздо чаще, чем пишут, и читают его усталые и спешащие люди. Язык, который делает обычный случай коротким и очевидным, заслуживает своё место. Это и есть честная причина, по которой Python популярен в обучении и в работе с данными, и по которой Go не позволяет записать одно и то же шестью разными способами.

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

Практика

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

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

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

    1. 1Проверить, что нужные задаче библиотеки существуют для языка, который мы можем взять
    2. 2Возвращаться к выбору только если в рабочей среде упрётся в настоящий предел
    3. 3Предпочесть язык, который команда уже умеет читать и поддерживать
    4. 4Спросить, что программа должна делать и где ей нужно выполняться
    5. 5Написать это, сохранив код читаемым для следующего человека
    Подсказки
    • Когда проект разрастается, первым ломается редко синтаксис.
    • Пользователь никогда не видит твой язык. Пользователь видит, открывается ли страница и работает ли кнопка.