Ровные зубы, C++ и математика — как они связаны? Разговор с Align +42




Иногда мне кажется, что чем больше я смотрю на ИТ- индустрию, тем примитивнее становится в голове общая картина. Как будто ИТ — это либо серьезный rocket science, либо очередной сервис, который «позволяет сделать *что-нибудь-еще* всего в один клик». А за пределами этого представления все еще остались нетронутые новыми технологиями занятия. Сходить к тому же зубному — ну причем здесь ИТ?

Какое же это заблуждение.

Сегодня дантист назначает лечение, а за его решением может крыться работа нескольких сотен инженеров по всему миру. Программисты, математики, техники, аналитики, спецы по ML, менеджеры, заводы с 3D-принтерами — все ради сверкающих голливудских улыбок.

Зачем столько людей, чем конкретно они заняты, и как математики и знатоки C++ помогают делают зубы ровными, мы поговорили с Align Tech — огромной международной компанией, которая массово производит капы для ортодонтического лечения.

Align Technology Inc. получила на «Моём круге» среднюю оценку 4,5 от своих сотрудников, которые выше всего оценили компанию за интересные задачи, социальный пакет, комфортные условия и за то, что она помогает делать мир лучше!



— Что за вещь вы делаете?

Андрей Максимов: Это ортодонтическое лечение. Если говорить совсем просто — мы занимаемся тем, что двигаем зубы в правильное положение.

У любого человека есть дефекты: неправильный прикус или неровные зубы. Для решения проблемы можно поставить, например, брекеты. У нас был придуман иной способ решения этой проблемы — с помощью невидимых алайнеров. Эта такая капа, которая изготавливается под конкретного человека. Она оказывает давление на необходимые зубы, и зубы двигаются.



Мы, как компания, предоставляем решение по изготовлению кап. В начале лечения, доктор делает слепок зубов или проводит сканирование с помощью интраорального 3D-сканера, отправляет данные нам, и мы превращаем их в 3D-модель.

— А что у вас за сканер?

Сергей Валиев: Представьте себе электрическую зубную щетку. На ней есть головка, которая вертится и чистит зубы. У нас вместо этой головки стоит видеокамера высокого разрешения. На основе ее показаний строится 3D-модель. Основная сложность в том, что это должно делаться точно и быстро — все-таки пациент лежит с открытым ртом на кресле. Сканирование занимает где-то 3-5 минут.



Есть еще сложности с запотеванием камеры, с брызгами, жидкостями. И вот инженеры занимаются этими тонкостями.

— Как из видеозаписи получается 3D-модель? Это фотограмметрия?

АМ: Мы используем конфокальный способ получения 3D-сканов, то есть, используем лазер и оптический метод получения информации.



Когда отпечаток или скан попадает к нам, мы его обрабатываем специальными алгоритмами. Программа понимает где зубы, где все остальное. Через нашу программу ClinCheck доктор может смотреть на полученную 3D-модель зубов пациента и тоже виртуально двигать их на правильную позицию. В программе также встроены измерительные и диагностические инструменты.

— Какими алгоритмами вы понимаете, как должно быть после лечения?

АМ: Есть ортодонтические нормы, по которым должны быть расставлены зубы. У нас огромная база правильных позиций зубов, и с ее помощью, мы подсказываем это докторам. По сути, автоматизируем их работу.



— Просто сравнение зубов пациента с тем, как должно быть по учебнику?

АМ: У людей всего 32 зуба, и они должны стоять так, чтобы друг другу не мешать. Соответственно, с помощью алгоритмов мы их выставляем определенным образом. Доктор проверяет, вносит корректировки, и если ему все нравится, он утверждает план лечения, и мы начинаем процесс изготовления алайнеров.

— Как устроен этот процесс?

Михаил Матросов: Для наших специально обученных сотрудников (техников) мы делаем программу Treat, в которой они готовят алайнеры к печати по данным от докторов. Вот техник получает данные с челюстью пациента и рекомендациями доктора, как лечить каждый конкретный случай. А понятие «лечить» — неформализованное, и кейсы очень отличаются.



Сама программа — это 3D CAD система. В ней видно исходное состояние зубов пациента. Далее можно сформировать желаемое состояние после лечения и рассчитать промежуточные стадии — как зубы пациента будут ехать из исходного состояния в желаемое. Наконец, в программе можно указать, что пациенту на определенные зубы следует прикрепить незаметные выпуклости («аттачменты»), которые помогут алайнеру развить правильные силы. Без них было бы, например, практически невозможно вытянуть некоторые зубы из десны.



Каждый из этих шагов выполняется в полуавтоматическом режиме. Техник задает необходимые настройки в соответствии с пожеланиями доктора, а программа генерирует результат. За каждый шаг отвечает своя команда разработчиков.

После CAD системы идет CAM (computer-aided manufacturing). Она вычисляет полную модель челюстей пациента на каждой стадии (промежуточных и финальной). Эти модели для каждой стадии печатаются на 3D принтере. Затем на отпечатанные формы натягивается пленка, по сложной траектории проводится отрезка этой пленки лазером и получается алайнер. И для всех этапов нужно очень много программного обеспечения, которое разрабатывается внутри Align. Вот зачем нам так много программистов.



АМ: В день мы делаем 300 тысяч уникальных алайнеров. Таких масштабов никто из конкурентов не достиг, потому что в основном у всех это ручной процесс. А вручную огромных оборотов никак не достигнуть.

— Где эти триста тысяч алайнеров производятся?

— АМ: На заводах в Мексике и Китае. Они делаются из специального пластика, который тоже разрабатывается в Алайне. Там особая химическая формула, поскольку проводилось тестирование на биосовместимость. Материал — тоже ноу-хау, он оказывает влияние на результат лечения.



После этого доктору присылают готовый набор, он приглашает пациента и объясняет, как ими пользоваться. Алайнеры носят почти все время, даже ночью, и снимают только во время еды. Каждые две недели капу меняют на новую.



Зубы и машинное обучение


Некоторые дантисты не так хорошо разбираются в ортодонтии, как редкие специалисты. Поэтому мы помогаем решить им некоторые простые кейсы. Если зубы надо подвинуть незначительно, мы предлагаем им воспользоваться нашим автоматическим лечением.

Чтобы доктор понял, может он лечить некоторые кейсы или нет, мы специальной программой распознаем ситуацию, делаем некоторую диагностику и выдаем заключение — может или нет. И вот под такие задачи нам нужно много специалистов — по ML, C++. Так как у нас автоматизация, нужны бэкенд специалисты.

Сначала операцию по оценке кейса делали люди, а искусственный интеллект обучался. Сейчас почти 100% таких операций делает машина. Мы пробовали много подходов. Ребята пробовали составлять 3D модель с фотографии и находить некоторые расхождения. Это работало не очень удачно.

Полтора года назад была выпущена первая итерация ML модели. Насколько я знаю, команда использовала Python и TensorFlow. Оценка делается по нескольким категориям того, что доктор лечит. У пациента могут быть скученные зубы или наоборот, когда они расходятся в стороны. Это разные проблемы с зубами и для них действуют разные модели. Они самые распространенные и мы начали с них, потом перешли к более частным кейсам.

В следующем релизе мы выкатим модели уже на все возможные типы проблем с зубами. Какое-то время мы будем отслеживать все проблемные случаи и разбирать ошибки. Для этого будет оставаться резерв из команды ручной оценки.

Полный процесс обучения моделей занял примерно два года.

Еще машинное обучение используется для работы с фото. Мы пробуем показать человеку, как будет выглядеть его улыбка после лечения. Для этого берем фотографию пациента, рендерим 3D-модель его зубов, и потом программа пытается способом, близким к реальности, встроить ее в фотографию, чтобы человек увидел, как будет красиво выглядеть его улыбка.




Как Align появился в России


— АМ: Около 15 лет назад. В Калифорнии учились люди из Москвы, и во время учебы они устроились работать в офис Align. В те времена это была небольшая компания. Когда они закончили учебу, вернулись в Москву, но с ними сохранились контрактные отношения. Просто они были очень хорошими программистами. И чтобы им было удобнее работать, в Москве открыли небольшой офис. Дальше он разросся до очень больших масштабов. Сейчас здесь больше 400 человек.



В Новосибирске офис открылся так же, как и в Москве. Человек, который очень хорошо себя зарекомендовал, был родом оттуда и решил вернуться в свой город. Он предложил работать удаленно, но ему поручили создать маленький офис. Там сейчас около сорока человек.

СВ: Что интересно, еще год назад в Москве было около 200 человек. За год мы почти удвоились.

— Как ваши люди распределены между всеми этими проектами?

— АМ: У нас есть команда инженеров, которая занимается бэкендом. Есть команда, которая занимается программой ClinCheck для докторов. Самая большая команда занимается программным обеспечением для техников, которое используется только внутри. Есть отдельные команды QA и DevOps. Команда iTero делает ПО для сканеров.

— Насколько команды самостоятельны технически?

— АМ: Бизнес-задачи к командам поступают из маркетинга, но технические решения принимаются самостоятельно здесь, в Москве. Для них не надо особых разрешений из штаб-квартиры. Если мы меняем архитектуру между системами, то должны по крайней мере рассказать об этом и получить согласие. Но на функциональном уровне у нас полная самостоятельность.

Андрей Зайцев: У нас есть такой процесс, который называется Architecture review board. Даже если мы достаточно свободны в выборе, мы должны его обосновать перед ведущими архитекторами.

Например, у нас сейчас основной язык разработки — Java. Но команда выражала большой интерес к Kotlin. Один из наших разработчиков в течение полугода готовил презентации с обоснованием, учетом рисков найма, рисков утечки данных, проблем в языке. Он провел презентацию на совете по архитектуре, мы получили апрув, и у команды появился дополнительный язык разработки. Теперь для новых микро-сервисов мы используем Kotlin вместо Java. То есть, мы свободны, но все надо обосновать. Нельзя просто так внезапно перейти на какой-нибудь Haskell.

— А как построено общение с другими офисами?

— АМ: Со взаимодействием сложностей нет. Мы постоянно ездим в R&D-офис в Роли в Северной Каролине, США, и в штаб квартиру в Сан-Хосе.



— АЗ: В бэкенде у нас шесть SCRUM команд. Одна находится в израильском офисе, в Тель-Авиве, другая в Роли, остальные в Москве. Мы дважды в неделю синхронизируемся, тимлиды обсуждают текущий процесс, ближайшие релизы, взаимодействия между командами, новые технические решения, изменения в общих модулях. А так — стандартная корпоративная коммуникация. У нас у всех Microsoft teams, при необходимости можно набрать любого коллегу и с ним пообщаться.

Раньше была проблема, что офис в Сан-Хосе находится в противоположном часовом поясе от Москвы, и когда они приходят на работу, мы как раз уходим. Поэтому митинги проходили обычно поздно вечером. С офисом в Роли проще, с ними митинги начинаются в районе четырех часов вечера по Москве.

— АМ: Так как моя команда разрабатывает программу для докторов, мы должны по окончанию спринтов показывать демки докторам, которые работают у нас в компании. Они сидят в Сан-Хосе, США, поэтому иногда приходится начинать демонстрации не раньше семи вечера.



Какие технологии делают зубы ровными


— Расскажите, кто что с помощью чего делает?

— АМ: ClinCheck, который разрабатывает моя команда существует в двух формах. Первая — десктоп приложение. Оно сделано на С++ и Qt для пользовательского интерфейса. Десктоп был написан очень давно. С ним проблема такая: доктора совершенно не ИТ-люди. Несмотря на то, что они классные специалисты в области ортодонтии, им очень трудно поддерживать компьютер в хорошем состоянии. И когда мы выпускаем апдейт, начинается много технических трудностей.

Вторая проблема — половина ортодонтов используют Маки, а наш десктоп есть только под Windows. Если доктор хочет использовать программу, ему приходится устанавливать виртуальную машину. Это неудобно — они и с компьютером плохо справляются, а уж управлять виртуальной машиной вообще.

Поэтому мы переводим приложение в веб, чтобы оно работало везде. Правда по функциональности оно еще не догнало десктопную версию. Как только догонит, мы свернем десктоп.

В разработке используем TypeScript и ReactJS. Тайпскрипт выбрали в первую очередь из-за возможности статической проверки типов. Что интересно, некоторая часть фронтендеров перешла из C++, поэтому было желание и дальше использовать статическую типизацию.



— Но другие сервисы у вас пишут на JavaScript?

— АМ: Да, команда, которая делает коммерческий веб-портал, пишет его на JS и TypeScript.

— Когда вы решили взять TypeScript, вам не говорили, что раз в компании уже используют JS, то лучше бы и вам его взять?

— АМ: Естественно, нам приходилось отстаивать выбор, но мы объяснили, что TypeScript обладает рядом преимуществ. Здесь все было в точности то же самое, как и в случае с Kotlin.

— АЗ: команда Андрея делает фронт, то что видят доктора. Моя команда делает для этого бэкенд, чтобы было где хранить и обрабатывать данные. Мы начали делать свою систему в 2014 году. На тот момент в компании было несколько крупных систем энтерпрайзного уровня, но они медленно развивались, были монолитные, с очень долгими релизными циклами, много приходилось тестировать, и не всякий билд был успешен.

Как раз тогда становился очень популярен микросервисный подход, и мы попытались его реализовать нашей командой. То есть, разрабатываем небольшие приложения с четко выделенной целью, четкой зоной ответственности.

Основной стек у нас — это Java. В качестве фреймворка используем Spring и многие вещи, которые есть под его зонтиком — безопасность, работа с базой, различные облачные сервисы для обеспечения надежности, обработки ошибок. Мы его хорошо знаем, нам все нравится и менять его пока не собираемся. Используем его как ядро любого нашего сервиса.

Сейчас у нас порядка 20-25 сервисов. Они поделены между шестью командами, и в зоне ответственности каждой получается 3-5 микросервисов. Ресурсы чтобы переписывать Java на Kotlin мы не тратим, но все новые сервисы и тесты пишем на Котлине. Сейчас соотношение где-то 95/5. Пока только три сервиса пишутся на Котлине, потому что мы его начали активно использовать только с конца прошлого года.

— Как команда воспринимает переход? Все хотят?

— АЗ: В целом воспринимают положительно, ребята с удовольствием разбираются. Есть, скажем так, несколько Kotlin-чемпионов — те, кто реально много написал, и они помогают остальным при code review.

Хочется выработать понимание, как именно должно работать API на Котлине, чтобы это был не просто код, переписанный автоматом. И ребята пытаются выработать некий архетип, который потом будет использоваться везде.

В целом, мы стараемся тиражировать хорошие решения. Поскольку у нас два десятка сервисов, определенные вещи, вроде безопасности, работы с базой, работы с cloud-провайдерами — они везде повторяются, поэтому у нас есть общая кодовая база. Там разные модули, которые шарятся между компонентами, что позволяют пустой микросервис без бизнес-функциональности поднимать буквально за день. И там есть все, что нужно для работы. Это очень помогает двигаться вперед.

На уровне базы обычно берем Postgress либо какое-нибудь noSQL. Есть немного Python для бдд-тестов. Для разных запросов на выгрузку данных мы пишем на нем скрипты.

Все сервисы развернуты в облаке. Основное — это Амазон. Берем приложение, пакуем его в Docker-контейнер, потом разворачиваем в рамках одного из оркестраторов. Несколько лет назад мы выбрали Rancher и сейчас его и используем.

— Когда ты только пришел, не столкнулся с тем, что у проекта большое и сложное легаси. Все-таки это продукт, который начался с конца 90-х.

— АЗ: К борьбе с болшими легаси-монстрами мы подошли так: сначала писали некое прокси, которое оборачивает в микросервисы с REST-интерфейсом, и уже потом пытались разбивать внутри и рефакторить. То есть, мне не приходилось сидеть неделями, чтобы разобраться в кодовой базе на двести тысяч строк.

Многие вещи мы пишем с нуля, некоторые переписываем. На новых проектах стараемся поддерживать качество кода. Команде уже пятый год, и мне кажется, мы пока неплохо справляемся.



Найм математиков и знатоков C++




— Вам надо разбираться в ортодонтии?

— АМ: Нисколько не надо. Это нереально — найти людей, которые имеют такой бэкграунд. В самой работе приходится так или иначе изучать. Разным командам требуется разное понимание. Команде ClinCheck больше, потому что мы разговариваем с докторами, и нам надо хотя бы понимать их слова.

Но на собеседованиях мы никогда не спрашиваем про это — мы ищем людей, которые в первую очередь разбираются в программировании.

— На что вы будете смотреть, чтобы это понять?

— АМ: На первом этапе смотрим на резюме, оцениваем опыт работы. Потом организуем интервью по телефону, которое длится минут 30. Задаем простые вопросы про технологии, с чем и как работал. И если человек себя хорошо показал, мы приглашаем его в офис.

Там мы обычно даем задачу на программирование. Она не академическая, не надо писать всякие алгоритмы сортировки. Даем практическое задание, например, как реализовать приложение типа Twitter. Человек минут 20-30 пишут код и дальше мы по этому коду задаем вопросы.

В формулировке задачи заложено несколько подводных камней, которые человек должен попытаться обойти. Если он опытный — сразу видит эти проблемы и либо решает их в коде, либо говорит об этом нам. Если не замечает — мы ему указываем и тоже смотрим, как будет решать.

В целом, интервью длится около двух часов. А весь найм от и до занимает где-то две недели.

ММ: Для найма на внутренние сервисы мы в первую очередь смотрим на C++ и на математику. В зависимости от команды, есть смещение либо в одну сторону, либо в другую. Команда, которая строит модель распределения сил на алайнере — там, конечно, в первую очередь математика.

Команда 3D-платформы, в которой я работаю, занимается не продуктовыми вопросами (которых очень много), а поддерживает движок системы, делает C++ библиотеки. Там в первую очередь С++ и знание алгоритмов.

— Наверное, сложно искать людей в такую команду?

И да, и нет. Сложно, потому что нужно хорошее знание плюсов, понимание как работает софт и железо. Но чуть проще, потому что нам хотя бы не так нужна математика. Если человек чуть-чуть помнит линал, это уже более чем достаточно — просто чтобы не впадать в ступор, если увидит, что вектор умножается на матрицу.

У нас процесс найма похожий: отбор резюме, созвон на полчаса. По телефону спрашиваем про структуры данных и чем они отличаются друг от друга. Самые простые алгоритмы, про сложность сортировки, как происходит управление памятью, что такое виртуальная функция. В общем, базовые вещи.

— Когда вы ищете человека со знанием C++ и математики, его софт скиллы будут сильно важны?

Обычно, если у человека хороши C++ и математика, то его недостаток софт скилов скорее будет не в том, что он конфликтный и ссорится с командой, а в закрытости. Например мощный интроверт, который любит углубляться в задачи и не особо любит разговаривать с людьми.

С такими редко бывают конфликты. Проблема, которая может случиться — ты хочешь, чтобы он тебе рассказал, как это работает, а он скажет всего пару слов, в полной уверенности, что остальное очевидно. Но если продолжать расспрашивать, в итоге можно выудить всё, что тебе нужно. И даже если у него плохо получается что-то объяснить, то он точно может записать, приложить комментарии и пояснения в документе.





— Вы пробовали сами пользоваться алайнерами?

Пользовались. Нам компания полностью компенсирует производство алайнеров. Но, к сожалению, приходится платить за работу доктору. В России это половина стоимости. В Америке работа доктора — это большая часть. 5-6 тысяч долларов все лечение.

— Бывает, что разработчики не хотят идти к вам, просто потому что «это какая-то стоматология, а не ИТ»?

СВ: Это самый частый вопрос на интервью — «причем тут вообще ИТ». И когда объясняешь, что мы не стоматологическая компания, а просто делаем реальный продукт — не какие-то абстрактные таск-трекеры — которым пользуются реальные доктора, то люди сразу вовлекаются.




К сожалению, не доступен сервер mySQL