Про літнє стажування в JetBrains

Наразі нікого не дивує, що в IT компаніях для студентів організовуються стажування. При цьому самі роботодавці мають різні цілі: вибрати серед студентів найкращих для подальшої роботи, познайомити новачків зі своїм робочим процесом або навіть просто задовольнити потребу університету в тому, щоб прилаштувати до себе на літо студентів. У нас у минулі роки спеціальних програм стажувань не було: якщо один із наших співробітників викладає в освітній установі, і в потоці є дуже тямущий студент, то згодом його курсова робота може перерости на щось більш пов'язане з нашою діяльністю.

З роками у нас з'явилося багато освітніх програм, які ми підтримуємо (Computer Science Center, програма магістрів при АУ РАН, Лабораторія JetBrains при Математико-механічному факультеті СПбДУ та ін.) та багато студентів, які бажають пройти стажування у нас. В результаті цього літа ми провели масштабний проект літніх практик.

Ось що розповідає один із стажистів про свою практику, студент Computer Science Center та Політехнічного університету, Кононов Кирило:

КИРИЛ КОНОНОВ:

Все почалося з того, що одного разу у моєму виші (СПбДПУ) всьому курсу оголосили про необхідність проходити літню «виробничу практику». Ця процедура передбачає місячне працевлаштування в якусь компанію, яку студенту потрібно супроводжувати поряд документів та форм звітності.

На нашій кафедрі є кілька стандартних варіантів – це три заводи: «ЗМК», «Аврора» та «Кризо». Туди хлопців відправляють за умовчанням, якщо вони не виявляють бажання проходити практику в іншому місці. Але всі ці варіанти були мені нецікаві, до того ж я чув безліч негативних відгуків про роботу в цих місцях. Як правило, студенти там виконуютьдуже примітивні завдання (на зразок сканування папірців) і, за великим рахунком, нікому не потрібні.

Виникла думка, що якщо вже я навчаюся в CS-центрі, то мені варто взяти стажування в одній із дружніх компаній. Тим самим я вирішив поєднати необхідне з корисним.

Я хотів у JetBrains, тому зв'язався з Андрієм Івановим (JetBrains COO) і в листі розповів про бажання отримати стажування. Андрій Володимирович запросив мене до офісу на розмову. Я розповів про себе, про вуз, про процедуру виробничої практики та про своє навчання у CS-центрі. Тоді ж я й познайомився з Дмитром Буличовим – він готовий взяти мене в один із проектів.

Проект Command Line Plugin

Це був той самий проект, який я хотів отримати ще восени 2012 року. Але вийшло так, що в Академічному університеті презентації практик відбулися раніше, ніж у CS-центрі, і Command Line Plugin дістався студентам з АУ – Сергію Савенку та Павлу Чаднову. Таким чином, до початку моєї літньої стажування вже був певний прототип плагіна. Мені належить його вивчити, а потім продовжити розробку.

Ось основні пункти, які були зроблені до мене:

  • організація плагінадля IDEA з необхідними складовими (у тому числі extension point)
  • прототип архітектури, що має на увазіпозиційні аргументи
  • вбудований набір ізчотирьох команд
  • прототип можливостіавтодоповнень
  • інтерфейс у вигляді компонентаpop-up
Слід зазначити, що Сергій та Павло проробили чималу роботу. Навіть перший пункт сам собою досить ємний для розробника, який пише плагін вперше. Проте не все у тодішньому стані проекту було працездатним. Більше того, в обговоренні із Дмитром ми вирішилибагато в чому змінити архітектуру.

Новий варіант плагіна характеризується наступним:

  • архітектура, заснована наіменних аргументах
  • ефективнийінкрементальний парсинг
  • повноцінна підтримкаавтодоповнень
  • багатоаспектнавалідація
  • історіявикористаних команд
  • інтерфейс у виглядістійкого компонента
Далі я коротко розповім про те, як було реалізовано кожен із цих пунктів.

1. Іменні аргументи

Використання іменних аргументів дозволяє забезпечити значно більшу гнучкість, ніж використання позиційних. Було прийнято наступний формат:

літнє

Усього можливо шість варіантів - у тому числі підтримуються і довгі значення в лапках (вони можуть містити будь-які символи, включаючи пробіли).

2. Інкрементальний парсинг

команд

У цьому прикладі зі старого стану буде видалено аргумент v3 разом зі своїм значенням, а в новий – доданий аргумент v4 (без очищення та повторного розбору команди, аргументів v1 та v2).

Таким чином, на довгих командах з безліччю аргументів досягається значно вища ефективність парсингу, адже насправді зміна введення практично завжди відбуватиметься на кінці рядка: користувач стрімко набирає команду, і після кожної натиснутої клавіші немає необхідності проводити повний парсинг.

3. Автодоповнення

Автодоповнення (Autocompletion) є можливість підстановки повного рядкового значення будь-якої частини тексту під час введення користувача.

команди

Пропонуються варіанти для доповнення:

  • імені команди
  • імені варіанта аргументу
  • значення аргументу (колиможливо)
Підказки за першими двома напрямками очевидні: плагін має власний набір команд, має набір команд, отриманих з розширень за допомогоюextension point, і для кожної команди має фіксований набір варіантів аргументів.

У випадку зі значеннями є два варіанти:completionможе з'явитися зі стандартного провайдера значень типу (як у прикладі, коли для даного типу ми можемо перерахувати всі доречні значення) або ж бути передбачений розробником команди. Другий випадок реалізується, наприклад, якщо значенням має бути якийсь шлях до файлу з оточення. У випадку String доповнити не вийде, але у контексті конкретної команди і конкретного варіанта аргументу можна запропонувати подібні підказки.

4. Валідація

Валідацією тут називається визначення коректності введення команди разом із її аргументами. Вона включає розбір випадків:

  • неправильної команди, варіанта чи значення аргументу
  • взаємовиключних аргументів
  • відсутності обов'язкового аргументу
  • відсутності залежного аргументу щодо вже введеного
Останні три види аналізу реалізовані так, щоб їх можна було легко використовувати для типових випадків. Однак, окрім цього, розробник команди може вручну реалізувати будь-яку складнішу логіку валідації. З точки зору інтерфейсу результат валідації в кожний момент часу можна визначити станом кнопки «Execute» у компоненті плагіна: якщо є проблема, то кнопка буде недоступною.

5. Історія команд

jetbrains

Важливо, що історія накопичується протягом життя всього IDE (і не пропадає при закритті компонента командного рядка і відкритті його в іншомумісці).

6. Інтерфейс

У своєму новому вигляді плагін командного рядка представлений стійким компонентом. Він не пропадає при втраті фокусу або будь-яких інших діях, не пов'язаних з його явним закриттям або закриттям контейнера, що містить його (на відміну від pop-up компонентів).

Компонент може бути запущений у будь-якій візуальній області IDE, якщо користувач попередньо зробить її активною. Після цього командний рядок коректно реагуватиме на рухи та зміни розмірів в ієрархії компонентів, в яку вона виявиться включеною.

літнє

Приклад показує стратегію поведінки компонента в різних умовах. Наприклад видно, що він має мінімальний розмір і не виходить за межі IDE при екстремальному розтягуванні/стисканні вікна.

Таким чином, плагін почувається комфортно у вікні IDE.

Розвиток проекту

Невдовзі після закінчення стажування ми з Дмитром домовилися про продовження проекту вже в рамках навчальної семестрової практики від CS-центру. Як приблизні орієнтири були прийняті наступні оцінки:

40% часу:

  • доопрацювання архітектурних складових
  • покращення інтерфейсу
60% часу:
  • розширення набору команд
Перший пункт потрібен, тому що ще залишилися незавершені деталі і в архітектурі, і в інтерфейсі. Розширення ж набору команд є наступним етапом, реалізація якого спиратиметься на життєздатну інфраструктуру, зроблену раніше.

Стажування

Тепер хотілося б трохи розповісти про те, як відбувалася моя робота у компанії JetBrains.

jetbrains

Моїми сусідами виявилася команда з трьох осіб, яка працювала над проектом «VMkit та MMTk», а також один із учасниківпроекту, пов'язаного з декомпіляцією JVM-байткод. Усіх сусідів, як і мене, курирував Дмитро Буличов.

На той момент Сергій теж проходив практику в JetBrains і потім виявилося, що ми сидимо в сусідніх кімнатах. Щоправда, в офісі з ним зустрілися лише кілька разів.

Місячне працевлаштування у компанії відбувалося за умов роботи full-time, що мало на увазі 8-годинний робочий день. Жорсткого графіка ми не мали, тому кожен становив режим, виходячи з власних переваг. За дивним збігом обставин усі мої сусіди виявилися жайворонками: вони розпочинали роботу рано – близько 10 години. Я ж зазвичай приходив з 12-ї до години, коли всі були вже в зборі. Але й закінчував набагато пізніше за інших.

В основний час практики спілкування із Дмитром відбувалося, як правило, з ініціативи самого студента. Ми проводили зустрічі в міру потреби та обговорювали все, що було актуально на той чи інший момент. Було одне глобальне завдання, яке ми докладно обговорили, після чого я мав достатньо самостійності в роботі. Тож працювати з Дмитром мені сподобалося. Та і все стажування вийшло чудовим!