Про літнє стажування в 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) є можливість підстановки повного рядкового значення будь-якої частини тексту під час введення користувача.

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

Важливо, що історія накопичується протягом життя всього IDE (і не пропадає при закритті компонента командного рядка і відкритті його в іншомумісці).
6. Інтерфейс
У своєму новому вигляді плагін командного рядка представлений стійким компонентом. Він не пропадає при втраті фокусу або будь-яких інших діях, не пов'язаних з його явним закриттям або закриттям контейнера, що містить його (на відміну від pop-up компонентів).
Компонент може бути запущений у будь-якій візуальній області IDE, якщо користувач попередньо зробить її активною. Після цього командний рядок коректно реагуватиме на рухи та зміни розмірів в ієрархії компонентів, в яку вона виявиться включеною.

Приклад показує стратегію поведінки компонента в різних умовах. Наприклад видно, що він має мінімальний розмір і не виходить за межі IDE при екстремальному розтягуванні/стисканні вікна.
Таким чином, плагін почувається комфортно у вікні IDE.
Розвиток проекту
Невдовзі після закінчення стажування ми з Дмитром домовилися про продовження проекту вже в рамках навчальної семестрової практики від CS-центру. Як приблизні орієнтири були прийняті наступні оцінки:
40% часу:
- доопрацювання архітектурних складових
- покращення інтерфейсу
- розширення набору команд
Стажування
Тепер хотілося б трохи розповісти про те, як відбувалася моя робота у компанії JetBrains.

Моїми сусідами виявилася команда з трьох осіб, яка працювала над проектом «VMkit та MMTk», а також один із учасниківпроекту, пов'язаного з декомпіляцією JVM-байткод. Усіх сусідів, як і мене, курирував Дмитро Буличов.
На той момент Сергій теж проходив практику в JetBrains і потім виявилося, що ми сидимо в сусідніх кімнатах. Щоправда, в офісі з ним зустрілися лише кілька разів.
Місячне працевлаштування у компанії відбувалося за умов роботи full-time, що мало на увазі 8-годинний робочий день. Жорсткого графіка ми не мали, тому кожен становив режим, виходячи з власних переваг. За дивним збігом обставин усі мої сусіди виявилися жайворонками: вони розпочинали роботу рано – близько 10 години. Я ж зазвичай приходив з 12-ї до години, коли всі були вже в зборі. Але й закінчував набагато пізніше за інших.
В основний час практики спілкування із Дмитром відбувалося, як правило, з ініціативи самого студента. Ми проводили зустрічі в міру потреби та обговорювали все, що було актуально на той чи інший момент. Було одне глобальне завдання, яке ми докладно обговорили, після чого я мав достатньо самостійності в роботі. Тож працювати з Дмитром мені сподобалося. Та і все стажування вийшло чудовим!