anstarovoyt

30 марта 2020, spb

# Понедельник 11 твитов

Всем привет! Меня зовут Старовойт Андрей @anstarovoyt и я разработчик @WebStormIDE в @jetbrains. На этой неделе рас… twitter.com/i/web/status/1…

9:17

Чтобы не возникло недопонимания — я Java-разработчик и знаком с веб-разработкой именно со стороны поддержки в IDE.… twitter.com/i/web/status/1…

9:25

А что бы вы хотели услышать от меня на этой неделе? У меня, конечно, есть план, но я могу его не придерживаться, ес… twitter.com/i/web/status/1…

10:19
@jsunderhood Были ли моменты, когда хотелось рвать, метать и кричать "Что эти разработчики библиотек себе позволяют… twitter.com/i/web/status/1…
11:15

Для начала разберемся с понятиями.
IDE — Integrated Development Environment. Если совсем простым языком, то это тек… twitter.com/i/web/status/1…

12:10

WebStorm — “JavaScript IDE by JetBrains”. На самом деле, языком JavaScript дело не ограничивается. Мы пишем поддерж… twitter.com/i/web/status/1…

12:11

Практически все IDE от JetBrains выросли из одного продукта Intellij IDEA — и представляют из себя некоторый набор… twitter.com/i/web/status/1…

12:12

Архитектурно весь код WebStorm (и других упомянутых выше IDE) можно разделить на базовый (платформенный) и код, отв… twitter.com/i/web/status/1…

15:51

Весь платформенный код у нас открыт и лежит на гитхабе как часть IntelliJ IDEA Community Edition github.com/JetBrains/inte… (осторожно, Java!)

15:52

Про платформу и задачи, которые там возникают есть несколько очень крутых докладов Алексея Кудрявцева… twitter.com/i/web/status/1…

15:52

Многие языковые фичи могут иметь общую часть. Возьмем, например, Postfix Completion.
Есть общая часть, которая лежи… twitter.com/i/web/status/1…

18:37

# Вторник 14 твитов

На мой взгляд самое крутое, что почти все IDE (плагины) лежат в одном репозитории, вместе с платформой. Нет никаких… twitter.com/i/web/status/1…

7:39

Сегодня хотел бы поговорить про поддержку языков в IDE. Можно выделить два подхода:
Первый это — реализация парсер… twitter.com/i/web/status/1…

10:37

Понятно, что существуют еще некоторые промежуточные варианты, но про них я расскажу чуть позже

10:37

В WebStorm и других IDE от JetBrains мы обычно реализуем парсер языка. Имея на руках синтаксическое дерево, можно д… twitter.com/i/web/status/1…

10:40

Понятно, что только парсером дело не ограничивается. Мы практически пишем в IDE компилятор языка (в плане понимания семантики)

10:54

У написания собственного парсера есть свои плюсы и свои минусы (тред)

11:20

  • Полный контроль на реализацией: к примеру, мы можем написать парсер так, чтобы он было более толерантен к ошибкам… twitter.com/i/web/status/1…
  • 11:25

  • Прямая работа с деревом: почти все рефакторинги требуют изменений на уровне дерева. Но если дерево есть только у… twitter.com/i/web/status/1…
  • 11:33

  • Переиспользование кода: у нас есть платформенный код, который оперирует базовыми интерфейсами, общими для всех по… twitter.com/i/web/status/1…
  • 11:58

  • Кросс-языковая интеграция: к примеру, для JSX-тегов у нас отрабатывает полноценная поддержка HTML, включая инспек… twitter.com/i/web/status/1…
  • 12:09

  • Боль и страдания: для новых синтаксических конструкций нужно менять парсер в IDE. Если новая версия языка выходит… twitter.com/i/web/status/1…
  • 13:02

  • Высокая сложность: кроме парсера (что уже не тривиально) мы вынуждены реализовать вывод типов и логику разрешения… twitter.com/i/web/status/1…
  • 14:53

    Раз уж мы начали говорить о поддержке языков, расскажите какая языковая фича JavaScript/TypeScript вас больше всего… twitter.com/i/web/status/1…

    19:06
    @jsunderhood Очень долго привыкал к феномену "оператор запятая"

    const f = x => (g(x), x)

    21:17

    # Среда 17 твитов

    Вторая вещь, которая меня сильно удивила несколько лет назад — это то, что метки можно использовать с любым stateme… twitter.com/i/web/status/1…

    8:12
    @jsunderhood Как попадают в разработку IDE? Это не самая распространенная предметная область

    Разработка IDE такая же область, как и любая другая. Можно прислать нам CV и попасть в команду, если у вас достаточ… twitter.com/i/web/status/1…

    @jsunderhood Как попадают в разработку IDE? Это не самая распространенная предметная область

    8:43

    Может у вас истории поинтереснее?
    @art_spb, @en_Dal, @alex_zolotov

    8:48
    @jsunderhood @art_spb @alex_zolotov Я учился на матмехе СПбГУ, где преподавал @mshafirov, и многие его ученики прих… twitter.com/i/web/status/1…
    11:40
    @jsunderhood @en_Dal @alex_zolotov Моя ещё скучнее - я хотел в @jetbrains, мне предложили @phpstorm, и я согласился… twitter.com/i/web/status/1…
    11:40
    @jsunderhood @art_spb @en_Dal @alex_zolotov Я до JetBrains особо этим не занимался. Ничем не хуже чем любое другое… twitter.com/i/web/status/1…
    12:10

    Еще немного о поддержке языков. Как я уже писал выше, синтаксического дерева недостаточно для полноценной поддержки… twitter.com/i/web/status/1…

    12:21

    Чтобы обработать эту конструкцию нужно:

    12:22

    В этом плане с TypeScript дело обстоит гораздо лучше, чем с JavaScript. В нем есть более-менее строгие правила разр… twitter.com/i/web/status/1…

    12:27

    В TypeScript вы, конечно, тоже можете написать такой код, но компилятор его не поймет и покажет ошибку в месте обра… twitter.com/i/web/status/1…

    12:34

    Для JavaScript мы по возможности стараемся использовать вывод типов TypeScript (например, если есть файл “.d.ts”).… twitter.com/i/web/status/1…

    13:09

    Для многих языков, помимо парсера и механизма вывода типов, мы еще реализовываем Control Flow граф. Этот граф позво… twitter.com/i/web/status/1…

    14:40

    Интересный факт, что реализация CF графа для TypeScript и JavaScript полностью совпадает. Потому что TypeScript не… twitter.com/i/web/status/1…

    14:43

    CF граф также используется для Type Guard (механизма сужения типов) в TypeScript

    14:45

    Чуть подробнее о том, как строится граф и как используется в TypeScript я рассказывал вот здесь:
    youtube.com/watch?v=qddYQL…

    15:02

    Простой пример CF графа pic.twitter.com/WtFD6G9mFH

    16:08

    Возвращаясь к вопросам синтаксиса языков.

    В TypeScript довольно развитая система типов. Используете ли вы Mapped t… twitter.com/i/web/status/1…

    16:33

    # Четверг 12 твитов

    Сегодня расскажу про команду и то, как мы работаем

    10:25

    Над WebStorm трудятся 16 человек. Помимо разработки и тестирования, есть еще Product Manager, Product Marketing Man… twitter.com/i/web/status/1…

    10:35

    Команда рассредоточена по разным локациям. Есть люди, которые работают в офисах Питера, Мюнхена, Амстердама. Один р… twitter.com/i/web/status/1…

    10:37

    Благодаря такой распределенности мы, на мой взгляд, довольно просто смогли перейти на удаленную работу. Нам ведь и… twitter.com/i/web/status/1…

    10:42

    В разработке сложились зоны ответственности. Мы их называем подсистемами. Каждой подсистемой, в зависимости от разм… twitter.com/i/web/status/1…

    11:44

    Но, конечно, никто не мешает тебе прийти в другую подсистему и сделать там хорошо (с код ревью)

    11:46

    Так же есть некоторая внутренняя ротация. Если тебе надоело заниматься чем-то одним, можно договориться о смене отв… twitter.com/i/web/status/1…

    12:42

    Для коммуникаций внутри и между командами мы используем в основном Slack.
    Некоторые команды уже перешли на Space

    13:40

    О, вспомнил еще один вопрос про синтаксис TypeScript.
    Используете ли вы namespace (раньше использовалось слово mod… twitter.com/i/web/status/1…

    13:51
    @jsunderhood Иногда удобно функции для работы с enum'ом положить в namespace с таким же названием. MyEnum.fromSomeApi(valueFromServer)
    14:13
    @jsunderhood Глобальный манки-патчинг. Такие вещи как express или cypress позволяют на лету добавлять свойства в об… twitter.com/i/web/status/1…
    14:22

    # Пятница 26 твитов

    О, вспомнил еще один вопрос про синтаксис TypeScript.
    Используете ли вы namespace (раньше использовалось слово mod… twitter.com/i/web/status/1…

    Из ответов можно сделать вывод, что те, кто использует namespace, делают это для склеивания деклараций

    О, вспомнил еще один вопрос про синтаксис TypeScript.
    Используете ли вы namespace (раньше использовалось слово mod… twitter.com/i/web/status/1…

    10:08

    Сегодня продолжаем говорить о том, как мы работаем. В частности, обсудим, откуда мы берем задачи

    10:08

    У нас открытый issue tracker, куда кто-угодно может прийти с жалобой или просьбой добавить новую фичу. В трекере ес… twitter.com/i/web/status/1…

    10:16

    Линк youtrack.jetbrains.com/issues/WEB вдруг кому интересно :)

    10:18

    В трекере

    95% задач, над которыми мы работаем, открыты для всех, их можно посмотреть, покомментировать, проголосов… twitter.com/i/web/status/1…

    10:48

    В этом плане все очень близко к тому, как разрабатываются Open Source проекты

    10:48

    В команде есть Product Manager Катя, которая старается следить за новостями в мире JavaScript. Она помогает решить,… twitter.com/i/web/status/1…

    11:49

    Кроме того, у владельцев подсистемы обычно есть глубокое понимание всего, что в ней происходит. Исходя из этого по… twitter.com/i/web/status/1…

    11:51

    Например, люди, которые занимаются поддержкой JavaScript, сами понимают, что нужно следить за предложенными фичами… twitter.com/i/web/status/1…

    11:55

    Еще один источник информации это Developer Advocate’ы, которые часто делятся с нами обратной связью (либо своей, либо от пользователей)

    12:11

    И последнее, и на мой взгляд, очень крутое — это EAP (Early Access Program)
    Здесь будет небольшой тред о том, что это

    12:59

    EAP — это версия IDE, которой может воспользоваться любой желающий (там встроена лицензия на один месяц)

    12:59

    В активной стадии разработки мы стараемся выпускать EAP каждую неделю, прямо из девелоперской ветки (с некоторой пр… twitter.com/i/web/status/1…

    13:00

    EAP-программы позволяют быстро протестировать новые фичи на небольшой группе пользователей и получить обратную связ… twitter.com/i/web/status/1…

    13:01

    Кроме тестирования новой функциональности, EAP-версии также помогают быстро узнать о каких-то регрессиях

    13:03

    Благодаря EAP-ам пользователь может непосредственно влиять на то, как будет выглядеть фича в финальной версии

    13:04

    Многие пользователи предпочитают именно EAP-версии. Потому что кроме того, что они бесплатны, они всегда содержат с… twitter.com/i/web/status/1…

    13:08

    Очевидные минусы:
    Сами версии ограничены по времени. Даже если у вас есть лицензия, вам придется обновляться через… twitter.com/i/web/status/1…

    13:11

    У VSCode, кстати, что-то подобное называется Insiders

    13:21

    Если говорит про внутренние источник задач, то поскольку команда постоянно работает с продуктом, то у них тоже част… twitter.com/i/web/status/1…

    15:05

    В JetBrains есть несколько frontend-команд, которые пользуются WebStorm и тоже дают обратную связь

    15:07

    Про то, откуда появляются задачи поговорили. Остался вопрос приоритетов.
    Основные факторы влияния:
    Актуальность и п… twitter.com/i/web/status/1…

    15:18

    Нужно понимать, что у нас в трекере тысячи задач и мы никогда не сможем закрыть их все. И дело не в том, что продук… twitter.com/i/web/status/1…

    15:19

    Поддерживая новую технологию, мы практически сразу получаем фидбек в несколько десятков bugs и feature requests

    15:20

    Иногда их статус неоднозначен: с точки зрения разработчика, он просто не поддержал какую-то функциональность (напри… twitter.com/i/web/status/1…

    15:20

    Почему не делаем какие-то задачи*
    Нет уверенности о реальной потребности
    Слишком мало пользователей
    Противоречие с… twitter.com/i/web/status/1…

    15:24

    # Суббота 23 твита

    Сегодня хочу продолжить разговор о поддержке языков, но поговорить об альтернативных способах поддержки и немного о… twitter.com/i/web/status/1…

    10:28

    Тот самый альтернативный способ — это использование некоторого Language Server, например, LSP (но им дело не ограничивается)

    10:29

    Тред про достоинства и недостатки Language Server

    10:30

  • Универсальность. Написав сервер один раз, можно относительно легко добавить поддержку технологии в огромное количество редакторов
  • 10:30

  • Один источник правды. LS обычно делается поверх компилятора, поэтому получаемые данные всегда согласованы с результатами компиляции
  • 10:30

  • Изолированность. LS обычно представляет из себя внешний процесс, с которым IDE общается посредством некоторого ин… twitter.com/i/web/status/1…
  • 10:32

  • Простота. Это скорее относиться к LSP. Для базовой реализации сервера нужно написать поддержку всего 10-15 команд
  • 10:34

  • Изолированность (да, это еще и минус). Поскольку поддержка технологии “сама в себе”, то она ничего не знает о дру… twitter.com/i/web/status/1…
  • 10:35

  • Ограниченность. IDE может получить только ту функциональность, которая есть в Language Service. Например, если LS… twitter.com/i/web/status/1…
  • 10:35

  • Скорость. На запуск процесса и поднятие модели требуется довольно много времени. Коммуникация между процессами тоже не мгновенная
  • 10:35

    Есть еще одна тонкость, связанная с использование LS:
    обычно хочется, чтобы подсветка кода в редакторе была момента… twitter.com/i/web/status/1…

    10:43

    Под "подсветкой кода" я имею ввиду подсветку ключевых слов и других синтаксических элементов

    11:46

    Ответ такой: обычно есть какой-то отдельный механизм, отвечающий за синтаксическую подсветку. VSCode, например, исп… twitter.com/i/web/status/1…

    14:14
    @jsunderhood Так же, как в редакторах, которые ничего не знают про LS? :)
    14:14

    Один из примеров использования LS у нас — это Dart.
    Протокол взаимодействия WS и Dart Analysis Server был разработ… twitter.com/i/web/status/1…

    15:00

    Но несмотря на то, что в Dart используется LS, там все же реализован парсер языка на стороне IDE, для решения вопро… twitter.com/i/web/status/1…

    15:01

    В поддержке TypeScript мы получаем и показываем в редакторе сообщения об ошибках из TypeScript Language Server, но… twitter.com/i/web/status/1…

    15:14

    Плавно переходим к вопросам поддержки фреймворков, на примере Angular

    16:38

    У Angular есть свой языковой сервис Angular Language Service.
    WebStorm какое-то время использовал Angular LS, но… twitter.com/i/web/status/1…

    16:40

    Поддержка состоит из модель проекта и понимания синтаксиса

    16:46

    Модель проекта хранят информацию о модулях, компонентах и связях между ними.
    Благодаря этому могут работать такие ф… twitter.com/i/web/status/1…

    16:50

    Для понимания синтаксиса у нас написан специальный парсер шаблонов Angular. Парсер строит обычное HTML дерево, но с… twitter.com/i/web/status/1…

    16:52

    И небольшой опрос в предверии завтрашней темы разговора. Если вы используете Yarn, перешли ли вы на Yarn 2 (berry)

    17:16

    # Воскресенье 42 твита

    Сегодня я хотел бы поговорить о том, как менялись web-технологии за последние 5+ лет, в контексте разработки IDE

    10:54

    Логично начать разговор с JavaScript (точнее ECMAScript).
    Как вы думаете, что за язык на приложенной картинке? pic.twitter.com/HnD74JwytI

    11:05

    Многие узнают ActionScript 3. Но на самом деле, это еще и ECMAScript 4, спецификация языка, которая так и не была в… twitter.com/i/web/status/1…

    11:13

    В TS и ES6 используется немного другой синтаксис (без ключевого слова function) pic.twitter.com/V35hq2w9CN

    11:15

    Кроме ES4 также была спецификация ES4X, которая предлагала синтаксис работы с XML в JavaScript коде, подобный JSX в… twitter.com/i/web/status/1…

    11:19

    А теперь самое интересное: эти спецификации были написаны в 2003-2004 годах. Получается, что многие идеи, на которы… twitter.com/i/web/status/1…

    11:23
    @jsunderhood E4X. Была реализована в SpiderMonkey и у нас всё ещё жива в древнем XSLT-легаси. Из интересного, там есть свой аналог XPath
    11:24

    А еще все эти скриншоты были сделаны в WebStorm, потому что WS поддерживает ES4 и E4X...
    Хорошо, что все это было н… twitter.com/i/web/status/1…

    11:36

    Наличие классов, интерфейсов, XML-выражений в ES4/E4X на начальных этапах помогло быстро добавить поддержку подобны… twitter.com/i/web/status/1…

    11:48

    Ну и для тех, кто не знаком с историей ES4: спецификацию сочли слишком революционной, и вместо нее приняли ES5. Ча… twitter.com/i/web/status/1…

    11:52

    Между ES4 и ES6 прошло больше 10 лет. Все это время разработчики пытались облегчить себе жизнь и самостоятельно сде… twitter.com/i/web/status/1…

    12:05

    Про TypeScript вроде все понятно, а вот про Babel и CoffeeScript хочу написать подробнее

    12:06

    Babel — это головная боль разработчика IDE. Любой может добавить в JavaScript недостающую ему синтаксическую констр… twitter.com/i/web/status/1…

    12:10

    Все поддержать невозможно. Мы стараемся поддерживать самые популярные плагины и драфты спецификации ES, когда они выходят из Stage 1

    12:17

    CoffeeScript для меня язык-загадка. Его синтаксис довольно сильно отличается от JavaScript, но каким-то образом он… twitter.com/i/web/status/1…

    12:27

    Мой любимый пример популярности этого языка — вот этот pull request в Node.js "Use CoffeeScript!":
    github.com/nodejs/node-v0…

    12:28

    Понятно, что это шутка, но все же

    12:35

    Кроме того, у CoffeeScript были диалекты, развивающие его идеи:
    Coco
    LiveScript
    IcedCoffeeScript

    Этим не каждый язык может похвастаться

    12:36

    Cвою популярность CoffeeScript потерял примерно так же стремительно, как и набрал. Есть предположение, что просто п… twitter.com/i/web/status/1…

    12:44

    В WS есть поддержка CoffeeScript, но до диалектов мы так и не дошли — популярность технологии сошла на нет.
    В 2017… twitter.com/i/web/status/1…

    12:47
    @jsunderhood Я однаждый фиксил баги в проекте на RedScript, там даже подсветки синтаксиса не было.

    Вот список тог… twitter.com/i/web/status/1…

    12:51

    Мы подошли к одной из главных революций в web. В 2015 году вышел ES6 (ECMAScript 2015). Кроме языковых фич был еще… twitter.com/i/web/status/1…

    13:29

    Теперь, язык релизится раз в год, и в него попадают все готовые на данный момент новые фичи

    13:30

    В настройках WS есть опция выбора версии языка (раньше пунктов было гораздо больше).
    Этот выбор нужен для того, чт… twitter.com/i/web/status/1…

    13:31

    При новой модели этот список стал менее актуален, потому что реализация фичи (в Babel или в одном из браузеров, или… twitter.com/i/web/status/1…

    13:32
    @jsunderhood Хотелось бы отметить что изначально редактор atom был полностью написан на coffeescript
    13:32

    Поэтому сейчас просто есть разделение “новые фичи ES6+”, ES5 и некоторые специфичные диалекты

    13:34

    С переходом на новую модель релизов появилась некоторая определенность в том, как и куда будет язык развиваться; ка… twitter.com/i/web/status/1…

    13:39

    Теперь небольшой тред про то, как я помню развитие Node.js

    14:09

    Я пришел в команду WS в 2014 из Java Enterprise разработки. Меня очень удивило, что такая экспериментальная техноло… twitter.com/i/web/status/1…

    14:09

    В наши дни, я думаю, даже самые ортодоксальные backend-разработчики знают, что весь веб использует Node.js для решения самых разных задач

    14:10

    У нас в кодовой базе можно проследить повышение популярности Node.js для разработки веба по тому, как постепенно ча… twitter.com/i/web/status/1…

    14:11

    Сейчас Node.js плагин добавляет очень специфичные для Node.js разработки вещи, вроде run-конфигураций и дополнитель… twitter.com/i/web/status/1…

    14:12

    Наверно, один из поворотных моментов в развитии Node.js был кризис, связанный с появлением io.js

    14:22

    В двух словах, для тех, кто не знаком с этой историей: в конце 2014 часть людей из команды Node.js сделала форк из-… twitter.com/i/web/status/1…

    14:22

    Форк просуществовал не очень долго — примерно полгода. Но в результате этого Node.js вышел из версии 0.xx и стал развиваться гораздо быстрее

    14:23

    Нам в свое время пришлось оперативно добавить поддержку io.js, а потом так же быстро выпилить ее.

    Но я сегодня пр… twitter.com/i/web/status/1…

    14:29

    Ну а теперь Looking forward to Deno

    Расскажите, что вы думаете о Deno?
    Пробовали / нет?
    Взлетит / нет?

    14:37
    @jsunderhood Мне всегда казалось (могу ошибаться), что популярность CoffeeScript была в первую очередь обусловлена… twitter.com/i/web/status/1…

    Возможно, но мне казалось, что этим дело не ограничивается.

    Кстати, поддержку CoffeeScript у нас писала команда Ru… twitter.com/i/web/status/1…

    @jsunderhood Мне всегда казалось (могу ошибаться), что популярность CoffeeScript была в первую очередь обусловлена… twitter.com/i/web/status/1…

    14:46
    @jsunderhood Причём все так дико спорили (включая Крофорда, топившего против), что в итоге сильно устали и решили п… twitter.com/i/web/status/1…
    15:11

    Моя трансляция подошла к концу. Спасибо всем, было интересно 🙂
    С вами эту неделю был Старовойт Андрей @anstarovoyttwitter.com/i/web/status/1…

    19:10

    В напутствие, обращаюсь к тем, кто использует наши IDE. По статистике только 20-30% пользователей используют одну и… twitter.com/i/web/status/1…

    19:11

    other