- BrainTools - https://www.braintools.ru -
Начну с краткого рассказа о себе.
@dataclass class Speaker: name: str = "Дмитрий Аникин" job_title: str = "Data Science Team Lead" employer: str = "Kaspersky" skill_years: int = 6 tg_username: str = "uncle_dijkstra" email: str = "dmitry.anikin@kaspersky.com"
Как я уже отметил, в «Лаборатории Касперского» я работаю шесть лет и сейчас руковожу командой анализа данных. В наших продуктах много ML (чуть подробнее об этом есть в моей предыдущей статье [3]): он используется в детектировании новых видов атак и аномалий, обеспечивает оптимизацию труда аналитиков и так далее. У нас даже есть хайпующие сейчас большие языковые модели. И мне нравится работать с этим, быть причастным к чему-то классному и чувствовать себя супергероем, который борется с киберпреступностью.
Идея моего рассказа пришла мне в голову, когда я пересматривал «Хоббита». Я увидел некую метафору в том, что человек, начинающий работать в роли стажера, похож на Бильбо Бэггинса, которому предстоит целое приключение: эдакий обряд инициации — преодоление множества препятствий, прежде чем он станет героем мифа. А назад он возвращается с богатым опытом и багажом знаний, которые получил по пути.
В своем рассказе я пройду тот самый путь Хоббита: сначала от стажера до сеньора, останавливаясь на каждом переходе и подсвечивая, какой аспект помог мне в тот или иной момент карьеры. А потом пойду в обратном направлении, чтобы уже с высоты текущей позиции посмотреть на каждый из этапов и объяснить, какие, на мой взгляд, моменты могли бы помочь на каждой из ступеней.
Disclaimer: все изложенное ниже — мой личный опыт, и я не претендую на истину в последней инстанции. Также не забывайте, что я смотрю на все это через призму анализа данных, поскольку в команде Data Science есть свои нюансы и особенности. Ну а если вы не согласны, велкам в комментарии — буду только рад :)
Первый шаг — неопытный герой ищет работу. Скорее всего, это студент университета, который устраивается стажером и стремится стать джуном. Девиз на этом пути — «трудолюбие и отвага».
Герой сразу сталкивается с разрывом между тем, какими навыками и знаниями он обладает в действительности, и тем, что ожидает от него команда.
Что есть в действительности:
А вот привычные ожидания с противоположной стороны:
На той самой культуре я еще остановлюсь подробнее в самом конце, ну а сейчас нам пора дальше.
На шаге «джун — мидл» мне хочется подсветить девиз «ответственность».
Когда я был джуном, один менеджер мне сказал: «Ответственность — это выносить мусор не тогда, когда тебя попросят, а когда он пахнет». Это о том, что не нужно сваливать проблемы на людей, которые работают с тобой в команде. Следует понимать, что ты, цитируя героя еще одного фильма, — часть команды и часть корабля, а где-то и самому брать дополнительную ответственность.
Еще одна история из личного опыта джуна. В рамках одного из проектов мы должны были задеплоить в продакшн новую модель. Модель крутилась где-то на виртуальной машине, и нужно было развернуть ее в Kubernetes. К сожалению, человек, который этим занимался — мой ментор, — по личным обстоятельствам ушел из компании, и в результате проект начал подвисать. А у лида и без того было достаточно своей головной боли [8]. В итоге я проактивно взял эту задачу на себя — искал проблемы, исправлял их, допиливал до конца модель — и успешно ее задеплоил. Все это оказалось вдвойне полезно: я получил новый опыт, а меня по совокупности заслуг грейданули.
Словом, если вы видите, что где-то что-то горит, то задумайтесь: возможно, именно вам следует на это отреагировать. В конце концов, ответственность — это ускоренный путь к опыту. Можно «не высовываться» и делать рутинные задачи в тепличных условиях, просто привыкая к имеющимся инструментам. А можно попытаться выйти за рамки и получить дополнительный опыт. Выход за рамки расширяет сознание, помогает разглядеть что-то новое и искать нетривиальные пути решения задач. Все это будет полезно на уровне сеньора.
И еще несколько моментов про ответственность:
Набравшись опыта и собрав портфолио проектов, мы выходим на тропу «мидл — сеньор». И здесь я выделил бы способность не только предлагать, но и доводить до конца.
Можно читать много статей о Data Science, рассматривать State-of-the-Art модели, но все это имеет нулевую ценность, если это никак не реализовано в продакшене и не приносит пользу бизнесу. Поэтому здесь важно брать ответственность за свои идеи и драйвить их — добиваясь этим результата, который приносит реальную пользу бизнесу.
Вот что еще важно для сеньора:
А теперь вернемся с высоты сеньора к менее опытным позициям и поговорим о тех аспектах, которые я осознал далеко не сразу. А было бы классно, если бы кто-то подсветил их еще на пути «Туда»…
Это можно переформулировать так: «Костыли — это плохо. Нужно находить проблемы и устранять их, а не пытаться латать дыры». Скажу честно: мы с командой осознали этот постулат не сразу. Зато, когда осознали, существенно повысили качество исследовательских шагов…
Предположим, у нас есть какая-то проблема. Она преобразуется в тикеты и попадает на конвейер — то есть в наши канбан-доски, где мы работаем. И здесь может произойти дрейф от истинной проблемы: мы можем ухватиться за решения каких-то прокси-проблем, которые образуются из задач, а про изначальную — забыть…
В моей практике был кейс, когда мы начали обучать модель и увидели, что она плохо ведет себя на новых данных. Оказалось, что в обучающей выборке есть неоднозначность в разметке, то есть кейсы, которые одни аналитики отмечают как опасные, а другие — как безопасные. Неудивительно, что модель на таких кейсах путается: у нее просто нет однозначного понимания, как их обрабатывать.
Можно попробовать отфильтровать такие кейсы из обучающей выборки, чтобы модель училась на однозначных данных; но тут происходит подмена понятий — мы решаем не изначальную проблему загрязнения выборки, а проблему ошибок модели, то есть косвенную. Если мы продолжим так работать, к нам все еще будут приходить неоднозначные данные (и это плохо).
Как поступить? Мы могли бы пойти к аналитикам и выяснить, откуда берутся разногласия в разметке данных. Поняв причины, можно предложить новую договоренность — допустим, что такие неоднозначные кейсы мы будем всегда помечать как опасные. Тогда и в хранилище не придется делать никаких заплаток. Весь кусок взаимодействия изначально будет здоровым.
Словом, не забывайте, что есть задачи, а есть проблемы. Проблемы порождают задачи, но решаете-то вы все-таки проблемы…
На пути от джуна к мидлу мне было бы полезно знать, что вопросы — это на самом деле ответы. Да-да :)
Я про то, что грамотно сформулированный вопрос — это лучшее, что может случиться. А вопросы можно задавать к чему угодно: к данным, к процессам, к задачам, к заказчикам, к наставникам — вообще ко всему. Вопросы бывают разные, но плохих или бесполезных вопросов не бывает в принципе!
Про вопросы нужно помнить некоторые моменты.
Ну и кроме того, не все понимают обсуждение одинаково. Люди пытаются распарсить контекст и часто интерпретируют какие-то вещи по-своему, не обращая на это внимания. Парадоксально, но такое вот свойство «почемучки» может выгодно на вас отразиться — коллеги полюбят в вас зануду эту привычку, потому что вы будете делать неявное явным.
В этом контексте хочу порекомендовать книжку «Спроси маму» — о том, как задавать вопросы в бизнесе. Книга учит нескольким полезным вещам:
Финальный момент пути «Обратно» — это скепсис. Это не о неуверенности в своих компетенциях и не о синдроме самозванца. Это о том, что все мы — люди и можем ошибаться.
Так вот, хорошо иметь людей, на которых хочется равняться. Но в то же время надо задавать вопросы, быть критичным и понимать, что есть нюансы, в которых они также могут заблуждаться. И да, ROC AUC не чувствителен к дисбалансу, верите? :)
Как обещал, возвращаюсь к культуре в команде.
Когда более опытные специалисты нанимают себе в команду других коллег или стажеров, у них есть определенные ожидания. Ведь в команде есть процессы и либо пайплайны, либо понимание, как должны решаться те или иные задачи. Однако их ожидания — это, как говорил современник, их личные проблемы.
Чтобы все это работало, команда должна одинаково смотреть на многие вопросы, в частности на используемые фреймворки и алгоритмы. А следовательно, надо формировать определенную культуру в команде. Но это не всегда легко; иногда придется преодолеть некоторые слои сопротивления. Как правило, мы все тугие на перемены, поэтому важно объяснить, в чем ценность предлагаемых процессов.
Если вы хотите ввести практику регулярных код-ревью, нужно объяснить коллегам, в чем их ценность. Причем объяснить так, чтобы они прочувствовали их необходимость, преодолев то самое сопротивление. Иногда для этого нужно много терпения, потому что даже если люди сделают первый раз так, как вы их просили, это не значит, что они поймут ценность процесса и будут поступать так регулярно.
Допустим, есть джун, который пишет код, понятный ему самому. Он в принципе даже использует правильный нейминг, но делает функции по 50 строк кода. Другим в таких функциях разобраться сложно. Можно объяснить на словах, что функции надо дробить на части (написать ему об этом в код-ревью). Он это прочитает и, возможно, даже исправит, подумав про себя, что это просто «дед ворчит»; ему-то код понятен! Но вряд ли это закрепится в виде практики и войдет в культуру команды. Другой подход — предложить ему сниппет нарочито плохо написанного кода и попросить рассказать, что в нем происходит. Когда он будет долго читать код и в итоге не въедет, что там происходит, он прочувствует всю эту проблему, что называется, на своей шкуре. И тогда-то станет понятно, что «ворчащий дед» имел в виду на код-ревью…
Или, напротив, можно «замедлить» внедрение каких-то новых практик, чтобы они прижились в команде. Например, вы хотите проводить ревью гипотез, а писать многоступенчатые отчеты сложно и долго. Начните с простого, с baby step: просто созванивайтесь с коллегой, когда заводите задачу, и обсуждайте словами, что хотите сделать. Возможно, вам идея кажется настолько крутой, что вы не замечаете моментов, которые ограничивают ее применение…
И конечно, устраивайте «движуху», то есть всевозможную командную и межкомандную активность за рамками работы. Это могут быть совместные курсы, семинары, книжные клубы, брейнштормы. Да, не все бывает гладко (например, по этой ссылке [14] можно прочитать про парочку фейл-кейсов нашей команды), но как бы то ни было, такие практики настраивают всех на общий лад и помогают смотреть на вещи под одним углом.
Например, мы с командой сейчас читаем Fluent Python. Делаем это очень лениво — по одной главе за две недели, так что, по моим расчетам, мы должны закончить книгу где-то за девять месяцев. Да, мы потратим на это много времени, но зато в код-ревью можно все чаще видеть моменты, которые мы подсветили именно в ходе дискуссий в книжном клубе. Так что здесь тоже работают терпение и baby steps.
И финальное. Если вам все это откликнулось, приходите к нам в «Лабораторию Касперского». От себя, как питониста, подсвечу вакансии, связанные с Python в продуктах, с которыми мы в основном работаем [15], и, конечно, вакансии в нашем департаменте Data Science & Big Data [1] — будем расти вместе :)
Автор: uncle_dijkstra
Источник [16]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/10753
URLs in this post:
[1] Machine Learning Technologу Research «Лаборатории Касперского»: https://kas.pr/bfe9
[2] опыт: http://www.braintools.ru/article/6952
[3] в моей предыдущей статье: https://kas.pr/s9mm
[4] мотивация: http://www.braintools.ru/article/9537
[5] интерес: http://www.braintools.ru/article/4220
[6] обучения: http://www.braintools.ru/article/5125
[7] логично: http://www.braintools.ru/article/7640
[8] боли: http://www.braintools.ru/article/9901
[9] пайплайн повышения: https://kas.pr/2mpe
[10] добро пожаловать к нам: https://kas.pr/q8yv
[11] реагирования: http://www.braintools.ru/article/1549
[12] внимание: http://www.braintools.ru/article/7595
[13] мышление: http://www.braintools.ru/thinking
[14] по этой ссылке: https://kas.pr/h371
[15] вакансии, связанные с Python в продуктах, с которыми мы в основном работаем: https://kas.pr/78im
[16] Источник: https://habr.com/ru/companies/kaspersky/articles/868880/?utm_campaign=868880&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.