четверг, 22 января 2009 г.

I'm not standard. IDE?

Продолжение "I'm not standard". Тов.Чистяков, утверждает, что я не понимаю, зачем нужны навороченные IDE с интеллисенсом, рефакторингом и т.д.?

Не то, чтобы я не понимал, зачем нужны IDE вообще. Думаю, что я понимаю, зачем все эти комбайны со всеми примочками нужны людям. И я сам впечатлен тем, что могут выделывать современные IDE уровня IntelliJ IDEA.

Однако, вопрос не в том, зачем нужны IDE людям. Я бы даже сказал, среднестатическим разработчикам, на которых IDE, собственно, и рассчитаны. Вопрос в том, зачем эти IDE мне? Пойдем по порядку.

Интеллисенс. Он же автокомплит или, по-русски, автодополнение. Вещь хорошая, очень нужная. Но тут получается так: если я пишу программу прямо на компьютере и редактор начинает мне подсказывать название методов и порядок параметров, то я начинаю притормаживать. В прямом смысле этого слова. Т.е. я начинаю набирать имя метода, редактор мне его пишет полностью и даже ставит открывающую скобку. И тут я замираю в ожидании, когда редактор продолжит мой код. Ну а как же? Он же знает, какой метод я хотел вызвать, так неужели он не знает, что я хотел этому методу передать? А оказывается, что не знает. И вот такие вот переключения моего внимания с того, что мне подсказывает IDE на то, что я должен написать сам меня очень сильно выбивают из колеи. Поэтому, когда я пытался пользоваться IDE с такими возможностями (для Java это был, кажется, CodeGuide, для C++ -- Visual Studio, для Eiffel -- EiffelStudio) я вообще отключал интеллисенс. Ну а если я набираю программу с бумаги, то интеллисенс мне и вовсе не нужен, т.к. я уже знаю, что я вызываю и какие параметры передаю при вызове. Что очень помогает в наборе текста, так это автодополнение. Но автодополнение есть не только в IDE, но и в нормальных текстовых редакторах для программистов. Скажем, в gVim-е, коим я пользуюсь уже пятый год.

Рефакторинг. Он мне практически не нужен. Т.к. при программировании на бумаге уже происходит серьезный рефакторинг -- как на этапе записи кода на бумаге, так и при вводе его в компьютер. Поэтому, я практически не нуждаюсь в таких рефакторингах, как выделение фрагмента в отдельный метод или добавление в метод еще одного параметра. Другие типы рефакторингов, такие как переименование атрибутов/методов/классов/пространств имен, изменение иерархии классов и пр. требуются гораздо, гораздо реже. И здесь очень сильно помогают возможности нормальных текстовых редакторов для программистов. В том же gVim-е есть и grep, и мощные функции поиска/замены (в том числе и по регулярным выражениям), и функции записи/воспроизведения действий пользователей. Т.е., хорошо продуманный код и мощный текстовый редактор очень сильно компенсируют отсутствие в моем распоряжении тех средств рефакторинга, которые предлагают современные IDE.

Навигация по коду. Боюсь, что это достоинство современных IDE я не смогу в должной мере оценить. Поскольку так уж получилось, что я работал в небольших командах, в которых каждый занимался своей частью работы. Поэтому каждый хорошо знал собственный код и не нуждался в изучении чужого. Временами, при знакомстве с новой библиотекой или при разбирательствах с уже используемыми библиотеками, приходится копаться в чужом коде. Но, как ни странно, контекстный поиск (будь то grep или встроенный в FAR и Midnight Commander поиск) оказывается вполне достаточным.

Есть еще несколько факторов, которые снижают ценность IDE лично для меня.

Основными языками, которые на данный момент я использую в работе, являются C++ и Ruby. А особенностью данных языков является то, что для них создать настолько же продвинутые IDE, как для Java/C#, не реально. В C++ этому мешают шаблоны, внутри которых невозможно реализовать подсказки, автодополнение и, местами, рефакторинг. В Ruby -- динамическая типизация. Таким образом, для моих рабочих языков все равно нет достаточно продвинутых IDE.

Мне доводилось программировать на C++ под разные платформы. Если попробовать вспомнить в хронологическом порядке, то получится ряд из MS-DOS, Windows разных мастей, OS/2, Linux, OS-9000, Solaris, FreeBSD, NonStop Kernel. С помощью разных C++ компиляторов (Borland, Visual, Watcom, IBM, GCC, Compaq/HP). Подобный зоопарк приводит к нескольким последствиям.

Во-первых, кросс-платформенных IDE для C++ всегда было очень мало. В моем распоряжении их так практически и не было. Поэтому самым простым способом было использование обычных текстовых редакторов и инструментов, специфических для каждой из платформ. В конце-концов я стал пользоваться Vim-ом, который есть повсюду.

Во-вторых, каждая из IDE использует собственный формат проектных файлов. Поэтому, если нужно вести один и тот же проект в разных IDE, то приходится заниматься синхронизацией содержимого этих проектных файлов. Либо, вместо этого, использовать независимые от IDE системы сборки проектов. Вроде make. В результате, я пришел к использованию собственной build-системы (сейчас есть большой выбор подобных средств: SCons, Boost.Jam, CMake, MPC и т.д.), которая использует один и тот же проектный файл на всех платформах для всех компиляторов.

Получается, что на любой платформе я имею один и тот же привычный мне набор инструментов (очень мощный редактор Vim и адаптированную под мои нужды build-систему Mxx_ru). На мой взгляд, подобная мобильность так же компенсирует отсутствие в моем распоряжении IDE класса IntelliJ IDEA.

Резюмируя данный пункт я хочу подчеркнуть простую вещь: я не отговариваю кого бы то ни было от использования IDE. Но у меня, в моих условиях, получается успешно писать программы и без использования навороченных IDE.

6 комментариев:

Анонимный комментирует...

Сначала не понял, что имелось ввиду под этим:
"Но тут получается так: если я пишу программу прямо на компьютере и редактор начинает мне подсказывать название методов и порядок параметров, то я начинаю притормаживать. В прямом смысле этого слова. Т.е. я начинаю набирать имя метода, редактор мне его пишет полностью и даже ставит открывающую скобку. И тут я замираю в ожидании, когда редактор продолжит мой код. Ну а как же? Он же знает, какой метод я хотел вызвать, так неужели он не знает, что я хотел этому методу передать? А оказывается, что не знает. И вот такие вот переключения моего внимания с того, что мне подсказывает IDE на то, что я должен написать сам меня очень сильно выбивают из колеи."

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

Евгений Охотников комментирует...

2laperouse: >Но вот по поводу навигации не согласен. Навигация реально экономит время разработки. F12 - и ты переходишь к телу набранного только что метода. Привыкнув, уже тяжело без этого.

Навигация очень нужна, когда приходится знакомиться с чужим кодом. Или свой очень старый вспоминать. Тут да, средства grep-а очень примитивные. Но вот если нужно бегать по только что набранному коду, то контекстный поиск в vim-е очень и очень помогает. Плюс, vim позволяет бегать по истории изменений. Так что да, каких-то серьезных удобств навигации я лишен, но не сильно по этому поводу переживаю :)

Анонимный комментирует...

Но ведь для того, чтобы делать контекстный поиск, нужно парсить в аст код для каждого конкретного языка. Или как?
Я тоже емакс испльзую, но для развлечения больше, когда нужно побаловаться с каким-нибудь языком, не имеющим поддержки иде. Конечно,очень поначалу непривычно, но в конце концов можно привыкнуть и к нему :)

Евгений Охотников комментирует...

Наверное, я не точно выразился. Подразумевался инкрементальный поиск -- vim показывает мне подходящие фрагменты по мере ввода строки поиска.
emacs я освоить не смог. Какой-то он нелогичный, имхо, по сравнению с vim-ом. Да и клавиатурные сочетания там такие, что пальцы сломать можно. Однажды долго довелось сидеть под клоном emacs-а на платформе, где вообще ничего другого не было -- больше с emacs-ом связываться нет желания :)

Анонимный комментирует...

Notepad++ под windows по-моему самый сбалансированный вариант между отмороженными емаксами и IDE. Может все из того, что может реально полезного vim. Особенно радует фича подсветки одинаковых слов при выделении одного из них, навигация между ними, автодополнение слов есть.
Кстати, без отладчика как живешь? Или gdb с командной строки устривает?

Евгений Охотников комментирует...

Ну, сравнивать Notepad++ и vim не буду :) Для меня важно, что vim есть практически везде и в нем можно отлично работать в текстовом режиме через telnet/ssh (даже по медленным каналам).

А отладчиком время от времени пользуюсь. Поскольку временами он реально время экономит. В основном, под Windows запускаю VS. Под Unix-ами... Ну gdb бывало, но чаще valgrind-ом.