Продолжение "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.