Редактор или IDE? Очередная попытка анализа
Хотелось бы в очередной раз поднять эту довольно спорную тему.
С тех пор, как я начал заниматься программированием, этот вопрос не даёт мне покоя, а многочисленные темы на форумах и хабре ясности не внесли. Плюс к этому, мне кажется, некоторые аргументы как за одну, так и за другую сторону не были приведены. А у тех, что приведены, неверно расставлены приоритеты и упущен контекст.
В статье я постараюсь исправить это упущение и расставить ещё немного точек над «ё».
Приглашаю всех поучавствовать в поисках идеального инструмента.
О моём опыте
Программировать я начинал ещё в ДОС. на Turbo Pascal-е. Причём, почему-то, IDE мы тогда использовали только для отладки, и то достаточно редко. Для писания кода предпочитали использовать некий безымянный edit.exe без всякой подсветки синтаксиса в связке с Volkov Commander. И этого хватало. Этим же способом я позже занимался ассемблером и, частично, C++.
Продолжая изучать C++ я перешел на Windows и, соответственно, Visual Studio — куда же без него. Застал версии, если не ошибаюсь, с 5 до 7. После простенького редактора это было нечто — кодогенерация и автодополнение вызывали восторг. Правда, во всём этом сгенерированном добре разобраться было практически невозможно, но это казалось неважным.
Через некоторое время я пересел на Linux и занялся веб-разработкой на php. Здесь параллельно изучал vim и для разработки использовал ZendStudio. В какой-то момент начал использовать только Vim для всего — превратил его, в соответствии с многочисленными руководствами в маленькую ide. В нём же написал свою первую велосипедную CMS на php.
Замечу, что до этого программирование не было основным видом моей деятельности. Да, я и для работы писал различные мелкие утилитки, делал темы для для WordPress, но основным родом деятельности было администрирование.
Как только я занялся разработкой профессионально — возможностей vim мне перестало хватать. Был сначала eclipse, потом netbeans, сейчас — phpstorm.
Последние пол-года героически пытаюсь освоить emacs, в т.ч. в качестве основной рабочей среды.
Так что у меня есть с чем сравнивать и, надеюсь, моё мнение будет достаточно обоснованным и агрументированным.
IDE? IDE…
Я долго думал, в какой форме привести сравнение преимуществ и недостаков сторон. Список для этого не очень подходит, т.к. простое перечисление не вполне отражает суть вопроса. Редактор и IDE не противоположности, а инструменты, чья область применения перекрывается в некоторой области. Преимущества редактора далеко не всегда является недостатками среды и наоборот. По этой причине дальше идут более-менее структурированные рассуждения на тему.
Начну, пожалуй, с одного из бесспорных преимуществ редактора — его богатых возможностей по работе с текстом и возможности всё делать не отрывая рук от клавиатуры. Cреды в большинстве своём так не умеют. Только вот нужны ли такие возможности при написании кода? При написании статьи или письма, думаю, удобно одним нажатием клавиши поменять местами 2 слова или передвинуть абзац вверх страницы. Но в тексте программы это, в большинстве случаев бессмысленно и требует рефакторинга. А платить за это приходится либо пальцедробительными сочетаниями клавиш emacs, либо не менее мозгодробительными командами в vim. А ведь это всё нужно поминать! То, что просто решается одним движением мыши, вроде перемещения окна или изменения их размеров, превращается в целый квест. Да даже выделить текст проще мышкой — точнее, быстрее, и на надо считать сколько там слов до нужнго места в тексте. Нет, программисту тоже могут быть полезны эти функции, но дело в том, что его временные затраты на собственно редактирование кода ничтожны, так что выгоды во времени не будет практически никакой. А вот значительное усложнение инструмента — налицо.
Программист 80% своего времени тратит на понимание написанного кода и перемещению по нему. Причём перемещению именно по коду, а не по тексту! И здесь ему редактор не может помочь абсолютно ничем. Список параметров метода во всплывающей подсказке не покажет, перейти к определению метода не позволит, синтаксис не проконтролирует. А IDE, даже самые простые, с этим справляются просто и элегантно. Я недавно потратил минут 10 на поиск определения одного метода в проекте при помощи silversearcher из emacs. Оказалось, класс был определён в другом модуле и т.п. 10 минут, вместо одного клика мышкой! Я в emacs, конечно, недостаточно опытен, поэтому пусть будет 5 минут, даже минута. Но всё равно соотношение впечатляет.
И вот здесь IDE показывает свой, пожалуй, единственный, но очень жирный плюс — это наличие синтаксического анализатор языка программирования. Среда «понимает» что она редактирует код. Редактор — нет. А это и автодополнение, и навигация, и подсветка синтаксических, а, иногда, и семантических ошибок. Кажется, излишество, приятная мелочь, баловство. Но оно, превращается в необходимость после того, как размер проекта привысит некоторый предел. А с учётом объемных современных фреймворков — этот предел наступает практически сразу.
Да, на проекте из десятка файлов и пары тысяч строк, этот плюс не проявляет себя во всей красе. Редактор тоже может выполнять то же самое автодополнение, но он никогда не отсеет бессмысленные, варианты. И если размер проекта приближается к 100 тыс строк и состоит из тысяч файлов не считая библиотек, то становится проблемно выбирать нужное название из мешанины из названий переменных, методов других классов, да и просто слов из комментариев (было такое в vim-е у меня, не знаю, может, исправили). Интеллектуальные подсказки избавляют от необходимости помнить названия нужных функций и их параметры. Часто это просто физически невозможно.
Кстати о проектах. Во всех IDE есть такое понятие. К нему привязываются настройки, ресурсы, можно осуществлять поиск и т.п. В редакторах это в лучшем случае открытый каталог файловой системы. Иногда чуть больше.
Интеграция с отладчиком в редакторах тоже оставляет желать много лучшего. Юнит-тестирование, логирование в какой-то мере спасают ситуацию, но, иногда без отладчика никуда.
Кто-то может возразить, что в современных редакторах многие из этих функций уже реализованы и ничем не уступают самым навороченным IDE. Не соглашусь. Во-первых, полноценных реализаций нет. Не работают они, как должны. Во-вторых, установка всего этого уже достаточно сложная задача. Да даже конфигурация внутренних функций редактора уже нетривиальна. Попробуйте, скажем, включить нумерацию строк в том же emacs! Плюс ко всему, часто нужный функционал реализуется десятком плагинов непонятно как между собой взаимодействующих. А часто ещё и имеющих десяток версий и веток, не всегда совместимых, странно настраиваюхся и т.п. Можно, конечно, потратить месяц, всё настроить и установить (что тоже удел энтузиастов), но это всего лишь приблизит редактор к уровню IDE. К примеру, вернёмся к тем же проектам — я пробовал и Project под vim и projectile под emacs и ещё некоторые плагины. Если Project ещё более-менее отвечает моим требованиям (хотя в последней версии мне вообще не удалось создать проект из-за багов), то projectile оставил исключительно негативные впечатления.
И тем не менее, у редакторов есть несколько областей применения, где они, как минимум, составляют достойную конкуренцию средам разработки.
Во-первых, они себя лучше показывают на мелких проектах. Нет смысла загружать IDE-комбайн для работы с проектом в 10–20 файлов. Проще в редакторе подправить 3–4 строки.
Во-вторых, в некоторых специфических областях все преимущества IDE нивелируются. Например, низкоуровневая разработка для linux. Я этим не занимался, но, судя по структуре кода и предпочтениям разрабочиков (около 70% — emacs и клоны, 25% — vim, 5% — какая-то экзотика вроде jed), IDE там делать нечего. Весь нужный код, с которым происходит работа, собран, как правило в одном-двух файлах, и не нужно прыгать в пределах всего проекта. Да и не сильно поможет автодополнение при выборе из десятка-двух функций с почти одинаковыми названиями.
В-третьих, редакторы могут работать не только с кодом. Всю их мощь можно задействовать при работе с csv или xml файлами. Либо чего-то другого, в чём иногда возникает необходимость, вроде статьи или письма. И не нужно переучиваться, искать удобную программу или запоминать горячие клавиши — всё под рукой, всё одинаковое.
В-четвёртых, возможность работы с языками, для которых нет вменяемой IDE. Скажем, с тем же ruby мне среда не сильно помогла. SublimeText-а оказалось достаточно. Хотя с большим ruby проектом я не работал, возможно, там бы IDE себя показала.
И в-пятых, пресловутая возможность расширения. При наличии хороших плагинов редактор становится очень удобным! Плюс специфическое удовольствие непрерывного тюнига своего основного инструмента и ощущение полного контроля над ним — дорогого стоит.
Итого
Я не очень люблю IDE, хотя так могло показаться по предыдущему тексту. Считаю их довольно монструозными, с кучей ненужных функций, медленными и требовательными к ресурсам. Да и лучшие из них довольно дорогие. Кроме того, я считаю, использование IDE расслабляет, и привязывает к себе. У редакторов, соответственно, всё наоборот. Плюс доступность и возможности тонкой доводки под себя. По крайней мере vim и emacs. В конце концов, они мне просто нравятся. Эту статью, например, я пишу в Emacs.
Но индустрия (и начальство) диктует свои требования. Если не использовать IDE, производительность значительно упадёт. Но никто не даст вам пол-часа на поиск пропущенной запятой в 10 тыс строках кода. Это всё должно выполняться автоматически и автоматически же исправляться. Мне тоже иногда нравится покопаться в коде без всяких инструментов —, но на работе это непозволительная трата времени.
После всех своих проб и ошибок я сделал такой вывод — редактор можно использовать для разработки, но с IDE, после определённого предела он не сравнится и использование редактора для чего-то, за что вам платят — непозволительная роскошь. Да, если использовать правильные практики разработки, правильно проектировать/документировать код, следовать стандартам — можно сгладить врождённые недостатки редакторов. Но мы живём далеко не в идеальном мире, поэтому использование IDE — необходимость, независимо от нашего желания.