Как сделать свою IDE уровня IDEA
Среди потока эмоциональных комментариев меня особо заинтересовал один — никем не замеченный, в котором пользователь VISTALL скромно сообщил, как он решил эту проблему для себя. Он сделал свой форк IDEA для .NET и C# — Consulo IDE. Для меня лично такое заявление стало полной неожиданностью. Извините, если кто-то не разделяет моего удивления, но для меня это совершенно непостижимо так же, как вездесущие вечные баги в PyCharm. Ведь IDE разрабатывают большие команды разработчков, а он решил сделать свой форк, пусть даже и форк, но свой, который нужно поддерживать и развивать самому… Как??? Этот вопрос я решил задать лично автору форка — Валерию Семенчуку, а заодно и много других вопросов. Слово за слово, получилось небольшое интервью, надеюсь, интересное не только мне…
— Валерий, давно ты знаком с IDEA?
— Честно говоря, уже забыл, когда познакомился с IDEA (вроде бы с IDEA 7, но не факт). Плагины я начал писать с IDEA 8. После появления IDEA Community Edition началась новая ветка в истории. Медленно я начал изучать платформу, что позднее вылилось в пулл-реквесты и в диалоги на трекере (и не только там). Но были и неприятные истории. Например плагин к Play 1: после какой то очередной правки со стороны платформы плагин стал вести себя нестабильно (toolwindow не закрывался, а превращался в светло-зеленый прямоугольник). Фикса не было, плагин сам был закрыт (его код). И вот вместо того, чтобы ждать фикс, я попросту написал плагин с нуля, т.к накипело. И с того времени я быстрее напишу свой плагин (или фикс), чем буду ждать исправлений.
— Сколько плагинов ты написал на текущий момент? Можешь перечислить самые интересные?
— К IDEA были написаны плагины Play, Lombok, и несколько безымянных плагинов. Также я пытался восстановить C++ плагин к IDEA, но был огорчен тем, что анализ был написан на С++ (и не был открыт авторами). Позднее почти все мои плагины переросли в плагины к моему форку IDEA. Также я написал более 10 новых плагинов. Самые интересные — это, конечно, поддержка .NET и C#.
— Как так получилось, что ты решил форкнуть IDEA?
— Первый мой публичный форк IDEA был для поддержки фреймворка Lombok. Первая проблема состояла в том что IDEA имеет свой анализ java файлов, и не было возможности расширить анализ без изменения самой Java реализации. Вторая проблема — это то, что Java прибита гвоздями в IDEA: нельзя просто заменить Java реализацию на пропатченую версию. Было много спорных вопросов в моем решении проблемы — в итоге дальше форка оно не ушло.
— А были еще и непубличные?
— Да. Я игрался с компилятором Java (javac) и поддержкой мною созданных фич в IDEA. С тех пор я практически всегда сидел на своих билдах IDEA.
— Я так понимаю, ты на этом не остановился?
— Да. Как автор плагинов я видел проблемы, и старался их исправить через патчи либо через пулл-реквесты. Часть была принята, а часть до сих пор находится в подвешенном состоянии.
— Видимо, это были архитектурные исправления? Я могу себе представить, насколько сложно добиться принятия таких патчей. Ведь у проекта есть свои архитекторы со своим мнением, у проекта есть свои планы, и твои патчи могут быть для них как минимум сомнительными, а то и вовсе несовместимыми с их точкой зрения.
— Большинство моих патчей были маленькие и не задевали глобальных вещей. Насчет больших изменений я поднимал несколько задач в трекере и на форуме. Из самых глобальных — я хотел выровнять Java реализацию с другими плагинами. Суть в том — что IntelliJ IDEA позиционируется в основном как среда для разработки на Java, в итоге часть интерфейса прибита гвоздями к Java-фичам.
Это можно увидеть, например, когда открываешь Project Structure в Node.js проекте, или в том же Node.js проекте видны пункты меню для Java.
— Чем тебе это мешало?
— Банальный вопрос — зачем пользователю скачивать весь Java стек разработки для того, чтобы работать с C#, например.
— А Rider для C# они на тот момент не предлагали?
— Нет. На данный момент Rider — это гибрид Resharper и IntelliJ. Назвать её полноценной IDE на базе IntelliJ я не могу, ибо весь анализ (и не только) лежит на плечах Resharper, который запускается параллельно с Rider. Он отвечает за все фичи, которые касаются .NET платформы.
— Что он из себя представляет твой форк?
— Главная задумка — это сделать универсальную IDE подобную IDEA, но Java будет плагином, а не частью платформы.
Также хотелось исправлять (по возможности) баги, которые находил. Закрытость почти всех плагинов создавала ощущение «раба» ситуации. Зарепортил баг — и ждешь. Даже если бага исправлена, нужно ждать либо EAP, либо релиз. В итоге было решено сделать полностью открытый проект.
— Над IntelliJ IDEA работает целая компания, а ты — один. Неужели реально одному пилить свою IDE, пусть даже и на готовой платформе?
— На деле я не сам. По технической части мне помогает знакомый, как и с тестами. А вот с разработкой плагинов тяжело. Приходится выбирать самое главное из того, что нужно сделать, и не распыляться. А желания сделать что-то новое — есть, например язык F#.
Также периодически переношу изменения из IDEA в Консулу, но не все. Очень много спорных фич, или мешает Kotlin, который сейчас они стараются принести в платформу.
— Чем тебе мешает Kotlin? Его зашивают так же жёстко, как и Java?
— Проблема в другом. Они начинаю писать часть кода на Котлине. С их точки зрения — это нормально. А как со стороны стороннего форка, иметь «новый» язык в платформе — это «тяжелый груз». При этом нужно учесть, что Kotlin-а ещё нет в Консуле.
— Когда-нибудь они полностью переведут свои IDE на Kotlin — что тогда? Как ты считаешь вообще, всё идёт к этому?
— На деле — код конвертируем. Конечно, большие кучки чего либо на Котлине я не переделываю. Да — рано или поздно так и будет. Если учесть, что Rider написан на Котлине, и не только он. Когда это наступит — это будет новая эра Консулы. Эра возрождения или вымирания — покажет время :)
— В прошлом своём посте я поднимал тему забагованности IDEA. Вот и ты говоришь, что отчасти баги и скорость их исправления натолкнули на создание форка. С чем пришлось столкнуться по мере исправления багов? Много ли их там? Как тебе вообще код IDEA в целом?
— Я унаследовал почти все баги IDEA, также я имею немного своих. Код IDEA, славящийся своей «документацией» (сарказм), вполне понятен. Но встречаются внутренние вещи, которые не понять, если ты не работаешь в JetBrains.
— Я вот замечал, что в некоторых меню первый знак подчёркивания не отображается. А вместо этого местами подчёркнутым отображается символ, идущий за потерянным знаком подчёркивания. Такое есть в разных местах: «File → Open Recent», «Run → Prifle», «Run → Concurrency Diagram». Только в последней версии это починили в «Open Recent», но проблема остаётся в «Run».
— Судя по проблеме — это лишняя обработка Mnemonic в тексте меню. Просто нужно запретить обработку mnemonic. Видимо, кто-то забыл, когда в очередной раз правил этот код. Не понимаю почему такие баги должны висеть долго. Беглым поиском проблемы находится вот такой коммит.
— Честно говоря, такие ошибки смотрятся ужасно непрофессионально. Интересно, насколько стары эти баги. Ты их успел зацепить в Consulo?
— Беглым тестом — немного. В Recent Projects я не вижу проблемы. А вот в Run Configurations я вижу эту багу. Фикс на эту багу займет где то 10 минут.
— Когда я открываю эти меню, я долго всматриваюсь, чтобы найти нужный элемент. Я мучался с «Open Recent» очень долго — не знаю сколько. Найденный мною тикет висел полтора года. А ты показываешь коммит, в котором добавлен всего один параметр. И неизвестно, сколько еще провисит ошибка в «Run». Какие тикеты, по твоим наблюдениям, в JetBrains закрывают быстрее? Добавление поддержки имодзи? :)
— Имодзи — часто запрашиваемая фича. И для ее реализации нужно править JRE. Я за то, что бы добавить, но не в ущерб другим.
— Поскольку ты переносишь изменения из IDEA, то, наверное, следишь за тем, какие фичи там добавляются. Есть ли такие фичи, которые ты не стал переносить из-за их принципиальной ненадобности в IDE?
— Editor Background Image. Я вовсе не понимаю смысл этой фичи. Из архитектурных соображений я не перенес реализацию External Compiler (jps внутри IDEA). Ибо спорная реализация, которая порождает дубликаты. Возможно, я верну эту подсистему, если решу архитектурные проблемы. К этому списку присоединяется прозрачный скролл. В редакторе это смотрится слишком ужасно. Со времен IDEA 8 я видел смены UI для скроллов в редакторе, пока что они ищут золотую середину. Но тестить на пользователях без возможности вернуться на старый UI — это плохо (у меня есть задача 2010 года где я жаловался на юзабилити скролла).
— А ты в своей Consulo как-то улучшаешь UI, помимо поддержки HiDPI?
— Да. Как известно, в IDEA нету возможности нормальной смены UI Theme (Laf), ибо много компонентов имеют «захардкоденную» отрисовку, а также цвета.
— А зачем это нужно? Вот я сижу, программирую, и вообще слабо понимаю, какая разница, какая тема у этой IDE. PyCharm со своей родной темой изначально смотрелся чужим на моём рабочем столе, но зато работу он делал лучше всех. А сейчас я уже привык? и не обращаю внимания на внешний вид.
— Когда-то «захаркоденная» отрисовка была одной из основных проблем на пути к появлению темной темы в IDEA. Но сделать хорошее решения у них не получилось, в итоге в IDEA есть два режима Light / Dark. И для каждого режима есть свой набор цветов которые никак не изменить (адекватно конечно). Хочется сделать нормальное решения чтобы дать юзерам возможность кастомизации интерфейса под себя. Есть несколько IDEA плагинов которые это делают. Но все же они встречают непреодолимые преграды для этого — очередной хардкод.
— Много там ещё такого неприятного хардкода встречается? В смысле, не в темах, а в чём-то ещё, что приходится переделывать.
— Да, приходится встречать призрак прошлого с тех времен, когда IDEA имела только Java реализацию. В платформе есть проверки на java language / java file например.
— На что ты делаешь упор при выборе новых фич? Каким фичам отдаешь предпочтение? Развитие какого функционала ты считаешь самым важным в Consulo, а какой приходится откладывать за недостатком ресурсов?
— В свое время я отложил все проблемы касаемые веб сервисов. И больше был занят поддержкой C# / Mono / Unity. Четыре месяца (сентябрь 2016) назад я решил переделать всю веб часть. Перешёл на Jenkins, написал сервис для пользователей и новый репозиторий для плагинов и платформы (в свою очередь это добавило возможность автоапдейта).
После закрытия беты второй Консулы я хочу сделать поддержку .NET Core.
— В чём ты видишь отличие своего подхода к разработке IDE от того, который используют в JetBrains? Кроме того, что ты ориентируешься на универсальную платформу.
— Первая разница — в том, что всё, что доступно для юзера, можно увидеть на гитхабе в виде исходников. Также можно влиять на саму разработку.
Второе — это более быстрые релизы. В текущий момент в канал «release» поступают билды каждый месяц (beta — каждую неделю, alpha — каждый день).
Я хочу добится более агрессивной смены API. Также активно поддерживать разработчиков сторонних плагинов. Сам помогаю разработчику Perl плагина к IDEA (и не только) — играю роль ходячей энциклопедии по платформе.
Это — из самых основных отличий.
— Ты говоришь «можно влиять на разработку». И никто не скажет юзеру «это наш бизнес», да? Один человек жаловался, что ему так и ответили, когда он предлагал что-то поменять в IDEA.
— Мне никто не платит, такое я не скажу. Да, могут быть спорные реквесты, но всё решаемо. Я не планирую продавать ни один из компонентов Консулы.
— Ты пробовал посчитать хотя бы примерно, сколько времени уже потратил на работу над Consulo? Есть ли в этом смысл? Может быть эффективнее было бы потратить это время на работу, за которую платят?
— Работаю над Консулой я с 2013 года. Смысл очень простой: Консула — моя основная среда для разработки. Если я встречаю баг — я исправляю его в течении дня, а не жду по несколько месяцев (очередной релиз IDEA например).
— Сколько сейчас человек пользуются Консулой на постоянной основе? Это возможно как-то достоверно подсчитать?
— Достоверно — нет. Увы сервис статистики у меня написан на коленке, и не даёт точной информации. А так — до 2 тысяч на первой версии, и более 400 человек на второй (которая с недавних пор доступна для скачивания, но имеет статус беты). С февраля 2017 года, первая версия больше не доступна для загрузки.
— Как часто пользователи присылают пулл-реквесты?
— Очень редко. Так как большинство пользователей у меня — это Unity (.NET платформа + C#), есть некие сложности в правке Java исходников. Также у меня хромает документация по всему проекту (более 100 репозиториев, и что в них — знаю только я), я очень медленно её дополняю. Но встречаются люди, которые делаю пулл-реквесты в несколько репозиториев одновременно (как общий фикс одной проблемы)
— А багрепорты и фича-реквесты? Как часто присылают, и как быстро ты на них реагируешь?
— Фичи — редко, баги — чаще. Сейчас я добился хорошей стабильности основного функционала, поэтому багов немного.
Реагирую я практически всегда в тот же день. Исправляю баги по мере приоритетности плагина, но если фикс простой — то исправляю в тот же день
— Как считаешь, по какой причине люди отдают предпочтения Consulo (те, кто отдают). Ты уже перечислил основные достоинства, но у меня ощущение, что это твоя точка зрения, то есть достоинства для тебя лично. А что нравится пользователям?
— Это просто. Консула была единственной нормальной средой C# для macOS. Хотя количество пользователей Windows + Linux догоняет macOS. Раньше была доступная только одна среда — это MonoDevelop (но это тихий ужас). Сейчас появились Visual Studio Code и Rider.
— Если пользователи продолжают прибывать, то, наверное, они находят в Consulo что-то такое, чего нет в других IDE? Что именно?
— Большая часть моей аудитории — это Unity разработчики, до сих пор нет хорошего аналога Консуле. Есть Rider который в статусе EAP, а в будущем будет платным.
— Не думал ли сделать свою платную версию с расширенным функционалом? Если это вообще возможно с имеющейся лицензией. Такой ход мог бы привлечь средства, необходимые для развития проекта.
— Не было, нет, и не будет. Это мое принципиальное решения по поводу закрытого функционала. Это одна из причин, почему я отошёл от IDEA. И возвращаться к этому я не собираюсь. Я хочу сделать открытый проект, а закрытый функционал будет мешать.
— А как на счёт пожертвований?
— Куда без них. У меня пока есть причины, которые мешают этому. В этом году постараюсь исправиться, и тогда наконец-то появится долгожданная кнопочка Donate.
— Каким бы ты хотел видеть будущее Консулы, и насколько, по-твоему, этого реально достичь?
— Вырасти в полноценную организацию/проект по разработке IDE (не только на Desktop). Реально ли? Да —, но силами одного человека очень долго.
Большое спасибо, Валерий, что согласился рассказать о своём опыте и разрешил опубликовать этот диалог. Я надеюсь, этот пост поможет найти тебе новых пользователей и единомышленников, и желаю тебе удачи и много терпения.
Больше IDE — хороших и разных!