Среда разработки и инструменты
Среда разработки – это набор инструментов для разработки программного обеспечения. В основе среды разработки лежит редактирование текста вместе с сопутствующими возможностями: подсветкой синтаксиса, проверкой типов, форматированием кода и автодополнением. Интегрированные среды разработки (IDE), такие как VS Code, объединяют всё это в одном приложении. Терминальные рабочие процессы разработки сочетают такие инструменты, как tmux (мультиплексор терминала), Vim (текстовый редактор), Zsh (командная оболочка (shell)) и специфичные для языка инструменты командной строки, например Ruff (линтер и форматтер кода для Python) и Mypy (средство проверки типов для Python).
У IDE и у терминальных рабочих процессов есть свои сильные и слабые стороны. Например, графические IDE могут быть проще в освоении, и в современных IDE, как правило, лучше работает интеграция с ИИ «из коробки», например ИИ-автодополнение; с другой стороны, терминальные рабочие процессы легковесны и могут оказаться единственным вариантом в средах, где у вас нет графического интерфейса или нельзя установить программы. Мы рекомендуем базово освоить и то и другое, а хотя бы одним из подходов овладеть в совершенстве. Если у вас ещё нет любимой IDE, советуем начать с VS Code.
В этой лекции мы рассмотрим:
- Редактирование текста и Vim
- Интеллектуальная работа с кодом и языковые серверы
- Разработка с помощью ИИ
- Расширения и другие возможности IDE
Редактирование текста и Vim
При программировании большую часть времени вы перемещаетесь по коду, читаете его фрагменты и вносите правки, а не пишете длинные потоки текста и не читаете файлы сверху донизу. Vim – это текстовый редактор, оптимизированный именно под такое распределение задач.
Философия Vim. В основе Vim лежит красивая идея: его интерфейс сам по себе является языком программирования, созданным для навигации по тексту и его редактирования. Нажатия клавиш (с мнемоническими названиями) – это команды, и эти команды можно комбинировать. Vim избегает мыши, потому что она слишком медленная; Vim избегает даже клавиш со стрелками, потому что до них слишком далеко тянуться. В результате получается редактор, который ощущается как интерфейс «мозг – компьютер» и поспевает за скоростью вашей мысли.
Поддержка Vim в другом ПО. Чтобы пользоваться заложенными в Vim идеями, не обязательно использовать сам Vim. Многие программы, в которых есть хоть какое-то редактирование текста, поддерживают «режим Vim» – либо как встроенную функцию, либо через плагин. Например, у VS Code есть плагин VSCodeVim, в Zsh есть встроенная поддержка эмуляции Vim, и даже в Claude Code есть встроенная поддержка режима редактора Vim. Скорее всего, любой инструмент, которым вы пользуетесь и в котором есть редактирование текста, так или иначе поддерживает режим Vim.
Модальное редактирование
Vim – модальный редактор: у него есть разные режимы работы для разных классов задач.
- Normal (обычный): для перемещения по файлу и внесения правок
- Insert (вставка): для ввода текста
- Replace (замена): для замены текста
- Visual (визуальный; обычный, строчный или блочный): для выделения фрагментов текста
- Command-line (командная строка): для выполнения команды
В разных режимах нажатия клавиш означают разное. Например, буква 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 также называют «существительными», потому что они обозначают фрагменты текста.
- Базовое перемещение:
hjkl(влево, вниз, вверх, вправо) - Слова:
w(следующее слово),b(начало слова),e(конец слова) - Строки:
0(начало строки),^(первый непробельный символ),$(конец строки) - Экран:
H(верх экрана),M(середина экрана),L(низ экрана) - Прокрутка:
Ctrl-u(вверх),Ctrl-d(вниз) - Файл:
gg(начало файла),G(конец файла) - Номера строк:
:{number}<CR>или{number}G(строка {number})<CR>означает возврат каретки / клавишу Enter
- Разное:
%(парный элемент, например круглая или фигурная скобка) - Поиск символа:
f{character},t{character},F{character},T{character}- найти {character} / перейти к нему, вперёд / назад по текущей строке
,/;для перехода между совпадениями
- Поиск:
/{regex},n/Nдля перехода между совпадениями
Выделение
Визуальные режимы:
- Visual:
v - Visual Line:
V - Visual Block:
Ctrl-v
Для выделения можно использовать клавиши перемещения.
Правки
Всё, что вы раньше делали мышью, теперь вы делаете с клавиатуры – командами редактирования, которые комбинируются с командами перемещения. Именно здесь интерфейс Vim начинает походить на язык программирования. Команды редактирования в Vim также называют «глаголами», потому что глаголы действуют на существительные.
iперейти в режим вставки- но для изменения/удаления текста хочется чего-то большего, чем Backspace
o/Oвставить строку ниже / вышеd{motion}удалить {motion}- например,
dw– удалить слово,d$– удалить до конца строки,d0– удалить до начала строки
- например,
c{motion}изменить {motion}- например,
cw– изменить слово - то же, что
d{motion}, а затемi
- например,
xудалить символ (эквивалентноdl)sзаменить символ (эквивалентноcl)- Визуальный режим + действие
- выделите текст, затем
d, чтобы удалить его, илиc, чтобы изменить
- выделите текст, затем
uотменить,<C-r>вернуть отменённоеyскопировать / «выдернуть» (yank) (некоторые другие команды, напримерd, тоже копируют)pвставить- Учить предстоит ещё многое: например,
~меняет регистр символа, аJобъединяет строки
Счётчики
Существительные и глаголы можно сочетать со счётчиком – тогда действие будет выполнено заданное число раз.
3wпереместиться на 3 слова вперёд5jпереместиться на 5 строк вниз7dwудалить 7 слов
Модификаторы
С помощью модификаторов можно изменить смысл существительного. Примеры модификаторов: i – «inner» или «inside» (внутри) и a – «around» (вокруг).
ci(изменить содержимое внутри текущей пары круглых скобокci[изменить содержимое внутри текущей пары квадратных скобокda'удалить строку в одинарных кавычках вместе с самими кавычками
Собираем всё вместе
Вот сломанная реализация 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):
- Функция main нигде не вызывается
G, чтобы перейти в конец файлаo, чтобы открыть (open) новую строку ниже- Набрать
if __name__ == "__main__": main()- Если в вашем редакторе есть поддержка Python, он может сам расставить отступы в режиме вставки
<ESC>, чтобы вернуться в обычный режим
- Отсчёт начинается с 0, а не с 1
/, затемrangeи<CR>, чтобы найти «range»ww, чтобы переместиться вперёд на два слова (words; можно было бы использовать и2w, но на практике для небольших счётчиков принято повторять клавишу, а не пользоваться счётчиком)i, чтобы перейти в режим вставки (insert), и добавить1,<ESC>, чтобы вернуться в обычный режимe, чтобы перейти в конец (end) следующего словаa, чтобы начать дописывать (append) текст, и добавить+ 1<ESC>, чтобы вернуться в обычный режим
- Для чисел, кратных 5, печатается «fizz»
:6<CR>, чтобы перейти к строке 6ci", чтобы изменить (change) содержимое внутри (inside) ‘“’, заменить на"buzz"<ESC>, чтобы вернуться в обычный режим
Изучение Vim
Лучший способ выучить Vim – освоить основы (то, что мы разобрали выше), а затем просто включить режим Vim во всех своих программах и начать пользоваться им на практике. Не поддавайтесь соблазну потянуться к мыши или клавишам со стрелками; в некоторых редакторах клавиши со стрелками можно вовсе отвязать, чтобы заставить себя выработать правильные привычки.
Дополнительные ресурсы
- Лекция о Vim из предыдущего выпуска этого курса – там мы разобрали Vim подробнее
vimtutor– это туториал, который поставляется вместе с Vim: если Vim установлен, вы сможете запуститьvimtutorпрямо из командной оболочки- Vim Adventures – игра для изучения Vim
- Vim Tips Wiki
- Vim Advent Calendar – подборка разных советов по Vim
- VimGolf – это код-гольф, только языком программирования здесь служит интерфейс Vim
- Vi/Vim Stack Exchange
- Скринкасты по Vim
- Practical Vim (книга)
Интеллектуальная работа с кодом и языковые серверы
Поддержку конкретных языков, требующую семантического понимания кода, IDE обычно обеспечивают через расширения, которые подключаются к языковым серверам (language servers), реализующим Language Server Protocol. Например, расширение Python для VS Code опирается на Pylance, а расширение Go для VS Code – на gopls, который разрабатывают сами авторы языка. Установив расширение и языковой сервер для языков, с которыми вы работаете, вы получите в своей IDE множество специфичных для языка возможностей, например:
- Дополнение кода. Более качественное автодополнение и подсказки – например, возможность увидеть поля и методы объекта, набрав
object.. - Встроенная документация. Документация показывается при наведении курсора и в подсказках автодополнения.
- Переход к определению. Переход от места использования к определению – например, от обращения к полю
object.fieldк определению этого поля. - Поиск использований. Обратная операция: найти все места, где используется тот или иной элемент, например поле или тип.
- Помощь с импортами. Упорядочивание импортов, удаление неиспользуемых, пометка отсутствующих.
- Качество кода. Соответствующие инструменты можно использовать и отдельно, но часто эту функциональность предоставляют и языковые серверы. Форматирование кода автоматически расставляет отступы и приводит код к единому виду, а средства проверки типов и линтеры находят ошибки в коде прямо по мере набора. Подробнее этот класс функциональности мы разберём в лекции о качестве кода.
Настройка языковых серверов
Для некоторых языков достаточно установить расширение и языковой сервер – и всё готово. Для других, чтобы получить от языкового сервера максимум пользы, нужно рассказать 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, отсортированные по популярности.
- Контейнеры для разработки (development containers): поддерживаются популярными IDE (например, поддерживаются в VS Code); dev-контейнеры позволяют запускать инструменты разработки внутри контейнера. Это может пригодиться для переносимости или изоляции. Подробнее контейнеры разбираются в лекции об упаковке и доставке кода.
- Удалённая разработка: разработка на удалённой машине по SSH (например, с помощью плагина Remote SSH для VS Code). Это удобно, например, если вы хотите писать и запускать код на мощной GPU-машине в облаке.
- Совместное редактирование: правка одного и того же файла в стиле Google Docs (например, с помощью плагина Live Share для VS Code).
Упражнения
- Включите режим Vim во всех программах, которыми вы пользуетесь и которые его поддерживают, например в редакторе и в командной оболочке, и в течение следующего месяца редактируйте весь текст только в режиме Vim. Всякий раз, когда что-то кажется неэффективным или когда вы думаете: «Наверняка есть способ получше», попробуйте погуглить – скорее всего, способ получше действительно есть.
- Пройдите задание на VimGolf.
- Настройте расширение IDE и языковой сервер для проекта, над которым вы работаете. Убедитесь, что вся ожидаемая функциональность, например переход к определению для библиотечных зависимостей, работает как надо. Если у вас нет кода, подходящего для этого упражнения, возьмите какой-нибудь open source проект с GitHub (например, вот этот).
- Просмотрите список расширений IDE и установите то, которое покажется вам полезным.
Лицензия CC BY-NC-SA.