воскресенье, 18 декабря 2011 г.

Emacs для разработки на Java

Меня, как и многих других Java-программистов, сильно не устраивает наша основная IDE: Eclipse. Несмотря на то, что это хорошая IDE, в ней есть серьезный недостаток: крайне убогий текстовый редактор. Он работает по тем же принципам, по которым работают все текстовые редакторы во всех крупных IDE уже лет пятнадцать. Еще во время учебы в школе, когда я программировал в свое удовольствие на Delphi 3.0, уже тогда у меня была IDE по своему функционалу ничуть не уступавшая сегодняшнему Eclipse. И, откровенно говоря, это здорово раздражает: языки развиваются, а инструменты редактирования -- нет.
Сегодня мне от IDE нужно очень многое: и контекстно-зависимый рефакторинг, и автоматическая генерация кода, и умное дополнение. Но самое главное, чего мне не хватает: полная автоматизация всей рутины. Java -- язык крайне многословный. Чтобы реализовать самую небольшую часть функционала зачастую приходится писать массу повторяющегося кода. Даже несмотря на ООП, т.к. не все удается решить наследованием и полиморфизмом в том виде, в котором эти механизмы реализованы в Java.
Уже несколько месяцев я пользуюсь Emacs для написания Java-кода. Это просто потрясающий текстовый редактор! Его так легко расширять новым функционалом, что я делаю это не задумываясь!
Сегодня у меня автоматизированы все повторяющиеся операции. Например, чтобы добавить в код всего одну локализованную строку, необходимо отредактировать минимум три файла: 1) файл Messages.properties, где ключу нужно сопоставить текст; 2) файл Messages.java, где нужно объявить функцию, достающую текст по ключу из файла properties; 3) в файле с описанием UI нужно вызвать этот созданный метод из класса Messages. Как же меня раздражало раньше, когда я делал это вручную! Описываешь формочку из десяти элементов, каждому нужно задать title. И, вместо того, чтобы задумываться над задачей, приходится отвлекаться на поиск этих долбаных Messages.properties и Messages.java и писать туда код богомерзким копи-пейстом! Сейчас мне для этого досточно одного клавиатурного сочетания, и Emacs всё сделает за меня сам. Может быть, я стал слишком ленивым? Знаете, все-таки, это неповторимое ощущение, когда кто-то пишет твой код за тебя!
И так во всём. В каждом проекте есть свои повторяющиеся заморочки. Писать для этого плагин Eclipse -- слишком уж сложно. Вы пишете свои плагины Eclipse для каждого проекта? И я -- нет. Я пишу плагины Emacs.
У Emacs, конечно, есть свои проблемы. Например, достаточно больная тема -- это именно разработка на Java. Все существующие решения для Emacs или безнадежно устарели давно (JDEE), или устарели и больше не поддерживаются совсем недавно (malabar-mode). Емаксеры обычно пишут на C/C++, Java у них не в почете. Но есть один плагин, который закрывает практически все мои потребности в IDE. Это emacs-eclim.
На самом деле, этот плагин -- надстройка над другим замечательным проектом: eclim, который умеет интегрироваться с Eclipse. Разработал Eclim в 2005-м году американский программист Эрик Ван Девостин (Eric Van Dewoestine) для своих нужд. Он хотел сделать интеграцию Eclipse и GVim. Затем опубликовал исходник, и другой программист, Ивес Сенн (Yves Senn), разработал аналогичный плагин к Emacs.
Emacs-eclim умеет практически всё то же самое, что и Eclipse: контекстно-зависимое дополнение кода, рефакторинг (переименование классов, пакетов и т.д.), подсветка ошибок после компиляции, автоматизированый импорт классов, автоматическая реализация интерфейсов и т.д. На изображении показано, как выглядит моё рабочее окружение Emacs.
Мне удалось побеседовать с Эриком об Eclim. Ниже -- перевод моего небольшого интервью, оригинал которого -- в конце статьи.

Я: Привет, Эрик! Расскажи немного о себе. Сколько тебе лет, чем занимаешь, где живешь?
Эрик: Мне 33 года, я работаю программным инженером, живу в Лос Анжелесе, занимаюсь в основном веб-разработкой. Еще со школы я пользовался Java, типичным JEE-стеком и т.д. Но примерно лет пять назад я переключился на python, в основном на Python/Django. Вообще, я довольно открыт к различным языкам программирования, хотя и не пробовал ruby до сих пор.
Я: Ага, понял. Так что же тебя заставило разработать eclim? Если программируешь на Java, то у тебя полно чудесных IDE.
Эрик: В школе (судя по всему, имеется в виду "высшая школа". -- примечание автора), когда я проходил курс по структурам данных с применением С++, все наши лабораторные работы должны были компилироваться и запускаться на Solaris. Поэтому я пользовался vi для всего моего кода. После того, как я достаточно "вьехал" в vi, заметил, что стал гораздо более продуктивным.
Я: Но Java... Для неё же в самом деле нужны IDE для управления проектами, контекстно-зависимого автодополнения и рефакторинга...
Эрик: Потом я перешел на Java и пользовался Borland-ом какое-то время еще в школе, затем попробовал Forte (позже переименованный в NetBeans), т.к. мне нужна была бесплатная IDE. Еще через несколько лет я открыл для себя GVim (vi + подсветка синтаксиса и прочие "плюшки") и сразу же стал им пользоваться. Как ты заметил, GVim-у не хватает многих возможностей IDE.
Я: Так что ж ты не воспользовался Eclipse или NetBeans?
Эрик: Потому что у них слишком сложный интерфейс текстового редактора по сравнению с GVim. А я тратил намного больше времени на набор текста, чем на использование инструментов IDE.
Я: Какие особенности IDE тебя раздражали больше всего?
Эрик: У них нету режимов (имеются в виду режимы редактора vim: режим вставки, навигации, визуальный режим и т.д. -- примечание автора). Сегодня почти у всех программ есть специальные режимы (vim, vimperator, irsii, readline + много инструментов командной строки). Я обнаружил, что когда убираю пальцы с home row (строка на клавиатуре, где находятся клавиши asdfghjkl. -- примечание автора) сразу же падает моя продуктивность.
Я: Ага, ОК. Значит, были две основные причины, из-за которых те не пользовался IDE:
1) IDE не позволяет управлять курсором из home row;
2) отсутствие режимов, как в vim.
Кстати, примерно поэтому же и я не пользуюсь IDE. Есть еще одна причина для меня: для IDE очень сложно писать свои плагины :-)
Эрик: Да, это основные причины, по которым я предпочитаю vim. Действительно, входной порог в написание плагинов для IDE слишком высокий, особенно для Java IDE.
Я: Мои друзья, использующие GVim или Emacs, обычно также используют и IDE. Что думаешь про такой способ?
Эрик: Я предпочитаю использовать один интерфейс для разработки. Мне уже приходится переключаться между командной строкой, редактором и броузером (иногда и другими инструментами). Так что добавить еще и IDE -- это не самый лучший выбор.
Я: ОК. Тебе помогали в разработке Eclim? Как отреагировало коммьюнити на твой проект?
Эрик: Это был сольный проект. Я начал его как proof of concept и продолжил наращивать функционал. У меня было пару коллег, которые в самом начале пробовали Eclim, вот, пожалуй, и всё. Что до реакции коммьюнити... Я никогда не анонсировал Eclim и не пиарил его. Я обнаружил, что те, кому была нужна функциональность вроде Eclim, так или иначе найдут его. С годами (а я начал Eclim в 2005-м) я видел весь спектр мнений по поводу Eclim. Я никогда не ожидал, что он подойдет каждому, так что несколько негативных комментариев не сильно меня удивили. В конце концов, я написал Eclim для себя, а то, что он пригодился другим людям, -- просто дополнительный бонус.
Я: А ты всё еще пользуешься Eclim-ом? Ну просто если ты кодишь на python, то зачем тебе Eclim и Java?
Эрик: Я добавил в Eclim поддержку разных языков, включая python, так что я использую Eclim каждый день. И, конечно же, я прдолжаю разрабатывать Eclim :-)
Я: О, это отличная новость! Потому что я нахожу возможности Eclim фантастическими: контекстно-зависимое дополнение кода, подсветка ошибок компиляции и т.д.
Эрик: Всегда приятно слышать, что Eclim нравится людям! :-)
Я: Ну а каких возможностей в Eclim не хватает? Что бы ты хотел туда добавить?
Эрик: У меня огромный todo list, в котором пунктов намного больше, чем я когда-либо смогу выполнить. Я получаю от пользователей разные запросы и стараюсь приоритезировать их в зависимости от того, насколько запрошенная функциональнасть нужна мне или другим людям.
Я: Можшь назвать три главных по приоритету пункта?
Эрик: Исправление ошибок почти всегда выходит на первое место, так что главный приоритет теперь -- несколько ошибок из создания проектов в CDT (C/C++). Второй приоритет -- несколько фич (сигнатуры методов и классов + документация для запрошенного элемента (как во всплывающей подсказке Eclipse), перенос поддержки python из rope (библиотека для python) в pydev. Остальное -- это множество мелких исправлений и дополнений. Думаю, нужно еще упомянуть то, что я заканчиваю мои scala- и android- ветки.
Я: что было самым сложным для тебя в Eclim? Тебе кто-нибудь помогал впоследствии или только слвлаи запросы на функциональность?
Эрик: Самое сложное для меня -- это Eclipse API (там полно недокументированной функциональности) и поиск способов хоть как-то заставить этот API работать.
Я: Да, там отстойный API. Я тоже пробовал в нем разобраться, но быстро оставил эту затею. Так что насчет коммьюнити? Тебе кто-нибудь помогает сейчас?
Эрик: Eclim хотсится на github, но до сих пор никто не выступил как крупный контрибютер. Так что сейчас я до сих пор единственный разработчик с правами коммита. У меня было несколько pull request-ов или патчей, но они довольно мелкие. Думаю, самое сложное для других программистов -- это Eclipse API. Сообщения об ошибках и активность в e-mail рассылке, также, как и обсуждения в IRC носит эпизодический характер.
Я: ОК, понял. Я уже почти закончил свой список вопросов, остался последний.
Эрик:...так что, конечно, есть коммьюнити пользователей Eclim, но разрабатываю Eclim в основном я сам.
Давай, жги :-)
Я: Единственная причина, по которой я перешел с Vim на Emacs, был VimScript. Emacs Lisp показался мне гораздо мощнее. Что скажешь об этом?
Эрик: Я никогда не пользовался elisp-ом, так что не могу ничего сказать о нем. Думаю, VimScript с версии 7.0 (когда в него добавили списки, словари и прочие фишки) вполне годится для использования, хотя он все еще далек от идеала. Думаю, наибольшая проблема в том, что я и другие пытаются писать сложные плагины и встречаются с тем фактом, что vim -- однопоточный, и не может нормально общаться с долго работающими процессами (netbeans интерфейс к vim не решает этой проблемы). Слыхал, что у с этим Emacs дела намного лучше.
Я: ОК, спасибо за твое время и особенно за Eclim! Мне действительно нравится Eclim, и это мой главный инструмент в работе!
Эрик: Спасибо, я очень рад слышать, что Eclim делает жизнь проще.

Оригинал:

<dbushenko> could you please tell a bit about you? How old are your, where do you live and what do you do?
<ervandew> I'm 33, a software engineer living and working in Los Angeles working primary on web based platforms. Out of school I was using Java using the typical JEE stack, etc. but about 5 years ago I switched to python, primarily django based.
 I'm pretty open language wise, but I haven't dabbled much in ruby yet.
<dbushenko> aha, I see
 but what did make you to start eclim?
 bcs if you program in java
 you have many wonderfull IDEs
<ervandew> While in school I was taking a data structures class using c++ where all our submissions had to compile and run on the a solaris box, so I picked up vi to write all my code.
 After getting past the learning curve I quickly found myself more productive.
<dbushenko> but java... it really needs some IDEs for better project management, context-sensitive autocompletion and refactoring...
<ervandew> I later moved to Java and used Borland for a bit while still in school and switch to Forte (later renamed to NetBeans) since I wanted a free IDE.
<ervandew> A few years later I discovered gvim (vi + syntax highlighting and other goodies) and switch almost immediately.
<ervandew> As you mentioned though gvim was missing all the IDE goodies.
<dbushenko> and why didn't you just switch to eclipse or netbeans?
<ervandew> Because their editing interface was some cumbersome when compared to gvim, and I spent way more time typing than using the IDE's additional tools
 *so cumbersome
<dbushenko> which features of the IDE's editor did you hate most?
<ervandew> That they are all modeless. Today almost every program I use has modes (vim, vimperator, irssi, readline + many command line tools)
 I find taking my finger off the home row results in an immediate drop in productivity.
<dbushenko> aha, ok...
 so there were two major reasons:
 1) IDEs didn't allow to browse with the home row
 2) absence of vim-modes
 right?
 btw, this is mostly the same reasons for me, but I have one more: IDEs really hard to extend with your own plugins :-)
<ervandew> yeah those are the core reasons I prefer editing via vim
 true, extending an IDE typically has a higher barrier to entry, especially java IDEs
<dbushenko> My friends who also use gvim or Emacs usually try to use both: an editor and an IDE. what do you think about that way?
<ervandew> I prefer to use one interface for my coding. I already have to switch between a terminal, editor, and browser (sometimes other things) so adding an IDE to the mix is not ideal for me.
<dbushenko> ok, next:
 did anyone help you with eclim when you've started it? and what was the communitiy's response to it?
<ervandew> It was a solo project. It started as a proof of concept and grew from there. I had a couple of coworkers that were early adopters but that was about it.
 As far as the communities response...
 I never went out and announced eclim or marketed in any way. I figured if people wanted something like it, they would find it and I'd let word get out organically. Over the years (I started writing eclim in 2005) I seen various response all along the spectrum. I never expected eclim to be for everybody so the occasional negative comment doesn't surprise me. Ultimately I wrote eclim for myself, helping other people is just an added bonus.
<dbushenko> and do you still use eclim for your needs? I mean, if you code mostly python, do you still need eclim and java?
<ervandew> I've added support for various languages into eclim including python so I still use it every day and I of course use eclim to continue my work on eclim :)
<dbushenko> oh, this is great news! :-)
 bcs I've found that eclim is fantastic:
 it has context-sensiteve autocompletion, compilation errors, etc.
<ervandew> It's always good to hear that people find it useful :)
<dbushenko> but what features does it lack? what do you think you would like to add to it soon?
<ervandew> I have a huge todo list with far more on it that I could ever actually get done. I get various requests from users here and there and I try to prioritize features based on whether I'd use it or if other people would find it useful.
<dbushenko> can you mention 3 highest priorites from your todo list?
<ervandew> Bugs almost always come first, so the highest priority are a couple CDT (c/c++) project creation bugs, but features wise: method/class signature + docs for the requested element (like a hover type info), moving python support from rope (python library) to pydev.  Those are two big ones. The rest of my high priority stuff is a lot of small things to help solidify eclim and work out kinks on other platforms or configurations.
 I suppose I should also mention finishing up my scala and android branches
<dbushenko> what was the most difficult to you while developing eclim? do people commit to the project or just send you bug reports and features request?
<ervandew> the most difficult thing was wrapping my head around the eclipse APIs (they don't document most of the parts eclim has to hook into) and finding ways to get some features to work in a headless environment since a lot of things are closely tied to the UI
<dbushenko> yeah, it's a crappy API! I tried to used and gave it up completely!
 so what about community? is it involved into the project now?
<ervandew> Eclim is hosted on github and no one has stepped up as a large contributor so I'm currently the only one with commit rights to the repos. I get the occasional pull request or patch, but they tend to be few and far between. I think the biggest barrier being those eclipse APIs. Issue reports and email activity is bursty, as is activity on the eclim IRC channel.
<dbushenko> ok, I see...
 and I've already finished my list of questions. the last one:
<ervandew> So there is definitely a community of users, but on the development end it's primarily just me
 fire away
<dbushenko> The only reason to me when I switched from gvim to Emacs was VimScript. Emacs Lisp seemed much more powerfull to me. what is your attitude to Emacs Lisp comparing to VimScript?
<ervandew> I haven't used elisp so I can't comment on that. I think vim script post 7.0 (where lists, dictionaries, and other features were introduced) is livable but far from ideal. I think the biggest issue that myself and others attempting to write complex plugins face is the fact that vim is single threaded and has no good way to interact with long running processes (the netbeans interface in vim doesn't solve that problem).
 I've heard that emacs shines in that area
<dbushenko> Ok. Thanks for your time and especially for Eclim! I really love Eclim, it's my major tool for my job!
<ervandew> My pleasure, and again I'm happy to hear eclim has helped make life easier :)

2 комментария:

  1. I've heard that emacs shines in that area

    Дада... блистает просто :)

    The only reason to me when I switched from gvim to Emacs was VimScript.

    ErgoMode? После vim только вот это:
    http://gitorious.org/evil

    ОтветитьУдалить
  2. Дмитрий, а как вы организовали компиляцию и юнит-тестирование? В emacs-eclim я не нашел ничего, чтобы напоминало результат компиляции у вас

    ОтветитьУдалить