Всегда завидовал, что существует ресурс roadmap.sh, где есть разные дорожные карты для разработчиков, а для MLщиков, NLP в частности, нет. Устал я это терпеть и решил сделать сам. С другой стороны, меня интересовали вопросы: а NLP Engineer это кто? А NLP Research engineer это уже другое? А это то же самое, что NLP Scientis? Чтобы хоть немного разобраться, я решил посмотреть, а что вообще сейчас требуется в вакансиях, где в заголовке фигурирует NLP. В результате вместо просто дорожной карты, получилось собрать еще парочку интересных диаграмм. Надеюсь тем, кто только смотрит в сторону NLP, она поможет сориентироваться, всем HR поможет в построении диаграмм компетенций, а специалистам поможет оценивать кандидатов на собеседовании.
Немного саморекламы
Я решил создать канал в телеге. Буду там постить выжимки из статей (может быть тогда очередь закончится), мысли, части вот таких статей и анонсы самих статей.
Материалы представляют собой 5 диаграмм в папке diagrams, которые были составлены из анализа около 50 вакансий с зарубежных и российских платформ поиска работы, а также на основе моего личного опыта. Отмечу только, что вакансий руководителя было очень мало в моей выборке, что-то около 5 штук. Диаграммы лежат в формате svg, но источником и местом для редактирования является файл `competencies_nlp.drawio. Разберем эти диаграммы.
Диаграммы навыков и обязанностей
Это диаграммы Венна, на которых отображены навыки и обязанности трех ролей: ML инженера/разработчика, ML исследователя/ученого и руководителя. Начнем с диаграммы навыков.
Расскажу как устроена диаграмма. Каждый прямоугольник представляет собой отдельный навык, а круг - одну из ролей. Навыки, находящиеся на пересечении кругов, принадлежат пересекающимся ролям. Встречаемость навыков в вакансиях отражена как удаленность от центра пересечениях всех трех окружностей: чем ближе к центру, тем чаще встречается. Например, опыт работы в Линуксе является более частым требованием для инженера, чем распределенное обучение моделей. Владение питон же - центр галактики. Кроме того, навыки промаркированы красным и желтым цветом. Красный цвет показывает, что навык встречается в блоке необходимых навыков в вакансии, а желтом в блоке "Плюсом будет". Кроме того, в окружности инженера есть отдельный блок инфраструктурных навыков, выделенный пунктирной окружностью.
Диаграмма обязанностей же составлена из описания обязанностей в вакансиях. Маркировка такая же. Однако, в отличие от навыков, обязанности обычно не делятся на обязательные и второстепенные.
Хочу подметить, что мне кажется, что есть некие скрытые зависимости между ролями и навыками. Например, несмотря на то, что умение пользоваться Линуксом указано только для инженера, оно точно также важно и для исследователя. Другой пример. Несмотря на то, что умение проводить EDA оказалось далеко от центра, полагаю, что данный навык подразумевается по умолчанию, поскольку NLP является подобластью машинного обучения, где производить анализ данных является одним из базовых навыком.
Также привожу список определений для навыков:
Разработка компонентов NLP - обучение моделей, решающих какую-то NLP задачу и оборачивание ее в сервис-компонент;
Тестирование компонентов - проводить тестирование поведения моделей в проде;
Производить исследования - придумывать новые подходы и искать способы улучшения имеющихся;
Способность работать в команде - быть в тесном взаимодействии с коллегами для эффективного решения проблем и задач;
Формулирование и объяснение ограничений - умение обосновать почему модель не решает задачу со стопроцентной точностью коллегам в смежных областях и руководителям;
Экстракция данных - создание пайплайнов сбора данных из разных источников;
Построение движка или пайплайна NLP/ML - разработка планов и экспертная оценка в вопросах проектирования систем NLP, как композиции отдельных компонентов;
Подготовка датасетов - формирование датасета из собранных данных, его обработка, формирование требований разметки;
Опыт работы по современным методологиям разработки ПО - знание таких методологий, как Kanban, Scrum, Agile;
Хорошие знания машинного обучения, глубокого обучения и NLP - базовые концепции, классические модели, типы нейронных сетей, классические архитектуры, методы оптимизации, трансферное обучение, эмбеддинги, обработка текстов и т.д.;
Распределенное обучение моделей - опыт обучения нейросетей с использованием нескольких GPU;
Знание state of the art (SOTA) моделей - знание подходов, показывающих лучшие результаты на данный момент на какой-то задаче;
Краткий вывод по вопросу "кто есть кто"
Как видно на диаграммах, я выделил три сущности: разработчик/инженер (developer/engineer), исследователь/ученый (researcher/scientist) и руководитель. Насчет руководителя особо и говорить нечего. Задача человека на этой позиции - обеспечить слаженную работу команды путем грамотного выстраивания процессов и коммуникации. Куда интереснее обстоят дела с первыми двумя. Попытаюсь дать какое-то определение для каждой роли в чистом виде:
Разработчик - это человек, который способен построить полный цикл создания модели из имеющихся требований и условий и сможет оценить границы применимости решения. Также, он может объяснить, почему ту или иную задачу решить нельзя в текущих условиях.
Исследователь - человек, целью которого является поиск и создание подходов или улучшение существующих методов для решения какой-то задачи. Часто результат их работы связывают с публикацией научных статей.
В реальности, эти позиции сильно связаны и определяются исключительно пропорцией задач, которые выполняет человек. Построив цикл создания модели, инженер может и будет искать способы улучшения качества модели. Для этого он будет читать тонны научной литературы и, матюгаясь, будет пытаться запустить приложенный к статьям код. В процессе адаптации каких-либо методов, инженер запросто может получить нетривиальный результат, который можно публиковать. И вот уже инженер стал ученым.
С другой стороны, любой исследователь, который захочет решать какую-то новую задачу должен сначала воспроизвести полный цикл разработки модели, чтобы получить точку отчета для улучшения.
В итоге мне кажется, что слова "инженер" и "исследователь" показывают процент какого направления в вакансии предлагается больше.
Граф навык-обязанность
Длинная картинка
Это двудольный граф, который показывает взаимосвязь навыков (слева) и обязанностей (справа) из вышеописанных диаграмм. Обращаю внимание, что граф был построен исключительно на моем понимании процессов и опыте.
Дорожная карта
Длинная картинка
Этот граф показывает дорожную карту или базу знаний, которую должен иметь любой разработчик NLP. Фиолетовые вершины обозначают основные ступени ваших знаний, а от каждой из них показаны различные темы, которые в них входят. Каждая вершина темы также промаркирована цветом: красный - обязательно, желтый - желательно, зеленый - опционально. Пожалуй, это самая дискуссионная диаграмма из всех.
UPD: недавно вышли другие дорожные карты по математике для ML, Python и SQL. Возможно, вам будет интересно.
Библиотеки Python
Наконец, на последней диаграмме перечислены библиотеки Python, которые используются в работе. Маркировка цвета у них такая же, как и у дорожной карты: красный - обязательно, желтый - желательно, зеленый - опционально.
Некоторые заметки
В 13 зарубежных вакансиях и только в 1 российской встретилось требование высшего образования в математике, статистике или смежной области (полагаю, любой технической). И еще наблюдались вот такие цифры опыта работы: опыт от 2 лет требовался в 6 вакансиях, от 3 лет в 3 вакансиях и от 5 в 2 вакансиях.
Как можно внести свой вклад
1. Вы можете открыть issue с предложением об изменении структуры или добавлении чего-либо в структуру диаграмм или все, что пришло вам в голову.
2. Вы можете предложить образовательный ресурс с указанием, к какому навыку или вершине дорожной карты он относится.
3. Рассказать об этой диаграмме коллегам HR для того, чтобы они могли формировать диаграммы компетенций.