Среда разработки и инструменты

Среда разработки – это набор инструментов для разработки программного обеспечения. В основе среды разработки лежит редактирование текста вместе с сопутствующими возможностями: подсветкой синтаксиса, проверкой типов, форматированием кода и автодополнением. Интегрированные среды разработки (IDE), такие как VS Code, объединяют всё это в одном приложении. Терминальные рабочие процессы разработки сочетают такие инструменты, как tmux (мультиплексор терминала), Vim (текстовый редактор), Zsh (командная оболочка (shell)) и специфичные для языка инструменты командной строки, например Ruff (линтер и форматтер кода для Python) и Mypy (средство проверки типов для Python).

У IDE и у терминальных рабочих процессов есть свои сильные и слабые стороны. Например, графические IDE могут быть проще в освоении, и в современных IDE, как правило, лучше работает интеграция с ИИ «из коробки», например ИИ-автодополнение; с другой стороны, терминальные рабочие процессы легковесны и могут оказаться единственным вариантом в средах, где у вас нет графического интерфейса или нельзя установить программы. Мы рекомендуем базово освоить и то и другое, а хотя бы одним из подходов овладеть в совершенстве. Если у вас ещё нет любимой IDE, советуем начать с VS Code.

В этой лекции мы рассмотрим:

Редактирование текста и Vim

При программировании большую часть времени вы перемещаетесь по коду, читаете его фрагменты и вносите правки, а не пишете длинные потоки текста и не читаете файлы сверху донизу. Vim – это текстовый редактор, оптимизированный именно под такое распределение задач.

Философия Vim. В основе Vim лежит красивая идея: его интерфейс сам по себе является языком программирования, созданным для навигации по тексту и его редактирования. Нажатия клавиш (с мнемоническими названиями) – это команды, и эти команды можно комбинировать. Vim избегает мыши, потому что она слишком медленная; Vim избегает даже клавиш со стрелками, потому что до них слишком далеко тянуться. В результате получается редактор, который ощущается как интерфейс «мозг – компьютер» и поспевает за скоростью вашей мысли.

Поддержка Vim в другом ПО. Чтобы пользоваться заложенными в Vim идеями, не обязательно использовать сам Vim. Многие программы, в которых есть хоть какое-то редактирование текста, поддерживают «режим Vim» – либо как встроенную функцию, либо через плагин. Например, у VS Code есть плагин VSCodeVim, в Zsh есть встроенная поддержка эмуляции Vim, и даже в Claude Code есть встроенная поддержка режима редактора Vim. Скорее всего, любой инструмент, которым вы пользуетесь и в котором есть редактирование текста, так или иначе поддерживает режим Vim.

Модальное редактирование

Vim – модальный редактор: у него есть разные режимы работы для разных классов задач.

В разных режимах нажатия клавиш означают разное. Например, буква x в режиме Insert просто вставит символ «x», в режиме Normal – удалит символ под курсором, а в режиме Visual – удалит выделение.

В конфигурации по умолчанию Vim показывает текущий режим в левом нижнем углу. Начальный режим (по умолчанию) – Normal. Как правило, большую часть времени вы будете проводить, переключаясь между режимами Normal и Insert.

Режимы переключаются так: нажатие <ESC> (клавиша Escape) возвращает из любого режима в режим Normal. Из режима Normal в режим Insert можно перейти с помощью i, в режим Replace – R, в режим Visual – v, в режим Visual Line – V, в режим Visual Block – <C-v> (Ctrl-V, иногда также записывается как ^V), а в режим Command-line – :.

При работе с Vim клавиша <ESC> нужна очень часто: подумайте о том, чтобы переназначить Caps Lock на Escape (инструкция для macOS) или назначить для <ESC> альтернативное сочетание – какую-нибудь простую последовательность клавиш.

Основы: ввод текста

Из обычного режима (Normal) нажмите i, чтобы перейти в режим вставки (Insert). Теперь Vim ведёт себя как любой другой текстовый редактор – до тех пор, пока вы не нажмёте <ESC>, чтобы вернуться в обычный режим. Этого, вместе с основами, описанными выше, уже достаточно, чтобы начать редактировать файлы в Vim (хотя и не особенно эффективно, если всё время проводить в режиме вставки).

Интерфейс Vim – это язык программирования

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

Перемещение

Большую часть времени вы должны проводить в обычном режиме, передвигаясь по файлу с помощью команд перемещения. Перемещения в Vim также называют «существительными», потому что они обозначают фрагменты текста.

Выделение

Визуальные режимы:

Для выделения можно использовать клавиши перемещения.

Правки

Всё, что вы раньше делали мышью, теперь вы делаете с клавиатуры – командами редактирования, которые комбинируются с командами перемещения. Именно здесь интерфейс Vim начинает походить на язык программирования. Команды редактирования в Vim также называют «глаголами», потому что глаголы действуют на существительные.

Счётчики

Существительные и глаголы можно сочетать со счётчиком – тогда действие будет выполнено заданное число раз.

Модификаторы

С помощью модификаторов можно изменить смысл существительного. Примеры модификаторов: i – «inner» или «inside» (внутри) и a – «around» (вокруг).

Собираем всё вместе

Вот сломанная реализация fizz buzz:

def fizz_buzz(limit):
    for i in range(limit):
        if i % 3 == 0:
            print("fizz", end="")
        if i % 5 == 0:
            print("fizz", end="")
        if i % 3 and i % 5:
            print(i, end="")
        print()

def main():
    fizz_buzz(20)

Чтобы исправить ошибки, мы используем следующую последовательность команд, начиная с обычного режима (Normal):

Изучение Vim

Лучший способ выучить Vim – освоить основы (то, что мы разобрали выше), а затем просто включить режим Vim во всех своих программах и начать пользоваться им на практике. Не поддавайтесь соблазну потянуться к мыши или клавишам со стрелками; в некоторых редакторах клавиши со стрелками можно вовсе отвязать, чтобы заставить себя выработать правильные привычки.

Дополнительные ресурсы

Интеллектуальная работа с кодом и языковые серверы

Поддержку конкретных языков, требующую семантического понимания кода, IDE обычно обеспечивают через расширения, которые подключаются к языковым серверам (language servers), реализующим Language Server Protocol. Например, расширение Python для VS Code опирается на Pylance, а расширение Go для VS Code – на gopls, который разрабатывают сами авторы языка. Установив расширение и языковой сервер для языков, с которыми вы работаете, вы получите в своей IDE множество специфичных для языка возможностей, например:

Настройка языковых серверов

Для некоторых языков достаточно установить расширение и языковой сервер – и всё готово. Для других, чтобы получить от языкового сервера максимум пользы, нужно рассказать IDE о вашем окружении. Например, если указать VS Code ваше окружение Python, языковой сервер сможет видеть установленные у вас пакеты. Подробнее об окружениях мы поговорим в лекции об упаковке и доставке кода.

В зависимости от языка у языкового сервера могут быть свои настройки. Например, поддержка Python в VS Code позволяет отключить статическую проверку типов для проектов, которые не используют необязательные аннотации типов Python.

Разработка с помощью ИИ

С момента появления GitHub Copilot на основе модели Codex от OpenAI в середине 2021 года LLM получили широкое распространение в разработке ПО. Сейчас в ходу три основных формата: автодополнение, встроенный чат (inline chat) и агенты для программирования.

Автодополнение

ИИ-автодополнение по форме ничем не отличается от традиционного автодополнения в вашей IDE: оно предлагает варианты дополнения в позиции курсора по мере того, как вы печатаете. Иногда им пользуются как пассивной функцией, которая «просто работает». Помимо этого, ИИ-автодополнению обычно задают промпт с помощью комментариев в коде.

Например, напишем скрипт, который скачивает содержимое этого конспекта лекции и извлекает из него все ссылки. Начать можно так:

import requests

def download_contents(url: str) -> str:

Модель автоматически допишет тело функции:

    response = requests.get(url)
    return response.text

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

def extract(contents: str) -> list[str]:

Модель допишет что-то вроде этого:

    lines = contents.splitlines()
    return [line for line in lines if line.strip()]

Мы можем направить дополнение через комментарии в коде:

def extract(content: str) -> list[str]:
    # extract all Markdown links from the content

На этот раз модель выдаёт дополнение получше:

    import re
    pattern = r'\[.*?\]\((.*?)\)'
    return re.findall(pattern, content)

Здесь мы видим один из недостатков этого ИИ-инструмента для программирования: он умеет предлагать дополнения только в позиции курсора. В данном случае правильнее было бы вынести import re на уровень модуля, а не оставлять внутри функции.

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

Для наглядности допишем скрипт до конца:

print(extract(download_contents("https://raw.githubusercontent.com/missing-semester/missing-semester/refs/heads/master/_2026/development-environment.md")))

Встроенный чат

Встроенный чат (inline chat) позволяет выделить строку или блок кода и прямо на месте попросить ИИ-модель предложить правку. В этом режиме взаимодействия модель может изменять уже существующий код (в отличие от автодополнения, которое лишь дописывает код после курсора).

Продолжим пример выше: допустим, мы решили не использовать стороннюю библиотеку requests. Можно выделить соответствующие три строки кода, вызвать встроенный чат и написать что-нибудь вроде:

use built-in libraries instead

Модель предлагает:

from urllib.request import urlopen

def download_contents(url: str) -> str:
    with urlopen(url) as response:
        return response.read().decode('utf-8')

Агенты для программирования

Агенты для программирования подробно разбираются в лекции об агентном программировании.

Рекомендуемое ПО

Из популярных ИИ-IDE можно назвать VS Code с расширением GitHub Copilot и Cursor. GitHub Copilot сейчас доступен бесплатно для студентов, преподавателей и мейнтейнеров популярных open source проектов. Эта область стремительно развивается. У многих ведущих продуктов функциональность примерно одинаковая.

Расширения и другие возможности IDE

IDE – мощные инструменты, а расширения делают их ещё мощнее. Мы не можем охватить все эти возможности в одной лекции, но дадим здесь несколько ориентиров по паре популярных расширений. Советуем исследовать эту область самостоятельно: в интернете полно списков популярных расширений для IDE, например Vim Awesome для плагинов Vim и расширения VS Code, отсортированные по популярности.

Упражнения

  1. Включите режим Vim во всех программах, которыми вы пользуетесь и которые его поддерживают, например в редакторе и в командной оболочке, и в течение следующего месяца редактируйте весь текст только в режиме Vim. Всякий раз, когда что-то кажется неэффективным или когда вы думаете: «Наверняка есть способ получше», попробуйте погуглить – скорее всего, способ получше действительно есть.
  2. Пройдите задание на VimGolf.
  3. Настройте расширение IDE и языковой сервер для проекта, над которым вы работаете. Убедитесь, что вся ожидаемая функциональность, например переход к определению для библиотечных зависимостей, работает как надо. Если у вас нет кода, подходящего для этого упражнения, возьмите какой-нибудь open source проект с GitHub (например, вот этот).
  4. Просмотрите список расширений IDE и установите то, которое покажется вам полезным.

Редактировать страницу.

Лицензия CC BY-NC-SA.