
Mikhail Matrosov ( mmatrosov ) es un ingeniero de desarrollo líder en la oficina de I + D de Moscú de Align Technology. Su especialización es muy inusual: está desarrollando un sistema CAD especializado para el diseño de aparatos de ortodoncia.
Mikhail ha estado participando en C ++ Rusia desde la primera conferencia. Este año, en C ++ Russia 2019 Piter, dará una presentación sobre "Calificadores, calificadores y plantillas" . También puede conocerlo en los cursos de Yandex "Fundamentos del desarrollo de C ++: Brown Belt" y "Fundamentos del desarrollo de C ++: Black Belt" en Coursera, en la creación de la cual Michael fue coautor.
La conferencia ya está a la vuelta de la esquina, pero por ahora, tome una entrevista con Mikhail, donde discutimos su trabajo en Align Technology, la migración del código heredado, la preparación de cursos e informes en línea, así como las características de C ++. Pavel Filonov (comité del programa C ++ Rusia) y Oleg Chirukhin (periodista del Grupo JUG Ru) hicieron preguntas.
En la unión de tecnología y medicina.
Pavel: Dime qué está haciendo tu empresa.
Michael: Align Technology es pionero y líder del mercado en ortodoncia limpia. Esto es algo que se está haciendo en todo el mundo ahora en lugar de aparatos ortopédicos. Si antes, se colocó un alambre de metal para enderezar los dientes, y corrieron con él, ahora en lugar de eso, se puso protectores bucales de plástico transparentes (revestimientos), que se hacen individualmente para cada paciente. Recientemente probé en mí mismo los productos de nuestra empresa, ¡una sensación muy divertida!
Pavel: ¿Entonces tienes comida para perros, sí?
Michael: Sí, más o menos. De hecho, si no lo sabe, es muy difícil darse cuenta de que la persona está en el revestimiento. A menos que al principio, por costumbre, aparezcan pequeños defectos del habla, pero incluso ellos son difíciles de notar.
Pavel: ¿Y qué tiene que ver C ++, de lo que hablaremos mucho hoy?
Michael: Gran pregunta Cuando la compañía estaba recién en pañales, dos pakistaníes alegres tomaron un plástico especial (no sé de dónde lo encontraron), que debería ser no tóxico e inerte con saliva y otras sustancias en la boca.
Luego tomaron un modelo de la mandíbula del paciente, lo que pudieron hacer durante mucho tiempo. Por ejemplo, para hacer coronas, a una persona se le dio una mordida de algo como una plastilina especial. Había un molde de dientes que estaba lleno de material. Entonces obtuvieron una copia de la mandíbula, y tiraron de plástico (de alguna manera la calentaron), y la boquilla está lista. Es decir, todo este mercado literalmente hace 20 años era completamente analógico.
Ahora el volumen de producción en la región de 300-400 mil revestimientos por día (evalúe la escala). Estas son manufacturas gigantescas, por lo tanto, están completamente automatizadas.
Para crear un revestimiento, imprimimos en un molde especial de impresora 3D. Esto es, de hecho, una copia de la mandíbula del paciente durante el tratamiento. Modelamos cómo se verá la mandíbula en una semana, dos, mes, año. Luego comenzamos el proceso de termoformado: tomamos una cinta de plástico, la calentamos y la colocamos en el molde. Cortar y obtener un forro de plástico.
Por el momento, nadie ya está enviando pacientes, y utilizan escáneres intraorales tridimensionales. Tenemos chicos haciendo esto en una oficina cercana. Esta es probablemente la parte más "guau" de nuestra producción. Allí, en tiempo real, una boquilla especial conduce a lo largo de la mandíbula y construye su forma. La información se carga en los servidores de la empresa, se procesa y se envía a nuestros especialistas (técnicos). Pueden editar el escaneo, eliminar el ruido.
Luego, el tratamiento se planifica en un sistema CAD especializado. Esto es algo muy complicado, porque nadie sabe cuál es la mordida correcta. Cada médico tiene su propia opinión sobre este asunto. Actualmente estamos trabajando para formalizar los enfoques de tratamiento, pero esto aún no está en el producto.
Pero volvamos a C ++. Existe tal problema, por ejemplo. Los moldes se imprimen en una impresora 3D especial con tecnología de estereolitografía láser. Hay una gran tina con un líquido fotopolímero especial. Brillan con un láser y se endurece. Primero, brillan en la parte inferior del modelo impreso, luego un poco más alto, incluso más alto, etc. Y así, dentro del fluido, aparece un modelo sólido de abajo hacia arriba en capas.
Imprimir un molde por uno no sería práctico. El tanque es bastante grande y puedes ponerle alrededor de cien moldes. Pero deben estar dispuestos de forma compacta. La forma del molde es similar a la de una herradura, es decir, no convexa y bastante compleja. Y todos son diferentes. Resulta una tarea interesante de mosaico de un rectángulo con figuras complejas.
Aquí, en este video de la marca de tiempo especificada, puede ver cómo se ve.
Este es solo un ejemplo, hay muchas tareas.
Pavel: Tus descripciones son como cálculos de alta tecnología. Idiomas como Fortran históricamente han tenido un buen desempeño en ellos. Al menos aún puedes ver los ecos. ¿Por qué exactamente C ++?
Michael: Bueno, no Fortran, sería muy poderoso. Al comienzo del desarrollo, el producto principal era este sistema CAD muy especializado: una aplicación de escritorio para Windows. Por lo tanto, se necesitaba un lenguaje para una computación eficiente y al mismo tiempo para desarrollar la aplicación en sí. No había muchas opciones en ese momento, solo C ++.
Ahora tenemos un zoológico de idiomas: JavaScript y TypeScript para la web, Java para aplicaciones móviles, Go para servidores, Python para automatización, y hay muchas cosas pequeñas. Básicamente, una pila estándar. Y en aplicaciones científicamente intensivas y computacionalmente complejas, C ++ permanece.
Cuanto más alta es la posición, más amplios son los horizontes.
Pavel: Mencionaste tu posición como ingeniero principal. Y entonces noté tal extrañeza. Si le preguntaran al desarrollador novato de C ++ de su empresa qué estaba haciendo, diría que estaba haciendo girar algún tipo de súper marco basado en plantillas, que basado en booststage equilibra el servidor, y la tecnología se caería inmediatamente.
Cuando se le pregunta qué está haciendo su empresa, comienza una historia completa sobre el negocio: dónde está el dinero, por qué es importante, etc. ¿Esto de alguna manera se correlaciona con tu posición? ¿Cuál es esta visión de procesos, tecnologías, herramientas?
Michael: Sí, tal vez. Pero además, si empiezo inmediatamente a contar cómo cruzo árboles (aunque no lo hago yo mismo), no será claro para todos. Por ejemplo, los tipos de Yandex, Kaspersky Lab pueden comenzar con la tecnología, porque todos conocen sus productos. Estamos hablando de revestimientos, de los cuales un pequeño número de personas saben. Por lo tanto, es necesario explicar qué es.
En cuanto a cómo esto se correlaciona con la publicación. En mi grado, al menos tengo que entender los elementos de nuestro flujo de trabajo de los sistemas actuales que trabajan juntos. Después de todo, si algo cambia, esto puede afectar la producción, el sitio de los médicos, la interfaz con la que interactúan técnicos, médicos y analistas de negocios. Es decir, sí, hay una correlación. Con el crecimiento de la calificación, necesita ver mejor lo que está sucediendo en la empresa.
Pavel: ¿Pensó cómo la introducción de nuevas tecnologías, por ejemplo, las relacionadas con C ++, afectaría el flujo de trabajo? Pocas personas ven las nuevas características del lenguaje. Y si no, cuéntenos cómo implementó recientemente las herramientas.
Michael: No recuerdo acerca de C ++ de improviso. Si tomamos las herramientas, lo último que arruinamos es un sistema de registro basado en la nube. Utilizamos específicamente Splunk para esto. Inicialmente, la plataforma estaba bajo el escritorio, y la migración a la nube ahora está en pleno apogeo. Por lo tanto, fijamos, en particular, el registro basado en la nube. Nuestro gerente aprendió rápidamente a hacer solicitudes y crear hermosos paneles, mostrar gráficos en tiempo real. Estaba muy contento Se lo envié a todos y dije: vean cómo variamos el tiempo de funcionamiento de un algoritmo tan complejo, ¿cuál es la razón? Comenzaron a comprender, nos dimos cuenta de que casi no tenemos subprocesos múltiples en agentes de prueba. Algo se introduce constantemente.
C ++, Legacy, multiplataforma y todo, todo, todo
Oleg: ¿Entiendo correctamente que tienes renderizado en el navegador?
Michael: Sí, lo hay.
Oleg: las tecnologías del navegador cambian constantemente. ¿De alguna manera afecta? Por ejemplo, el nuevo JS, Shading Language , algo así.
Michael: Afecta, pero aquí es un poco aburrido. En términos de renderizado, la escena es bastante simple. No tenemos efectos especiales increíbles.
Pavel: bien. Pero dijo que comenzó con una aplicación de escritorio, donde C ++ era la mejor solución que combinaba todas las ventajas. Cuando el negocio comenzó a crecer con el producto, comenzó a desarrollar otras plataformas. Algún código fue al navegador, otro al backend, otro a los teléfonos móviles. ¿Permaneció el núcleo "positivo" en todas las plataformas?
Michael: El movimiento a otras plataformas comenzó hace dos años, y para nuestra escala esto es poco tiempo. Por lo tanto, nuestra primera solución en la nube fue un monolito de escritorio, desde el cual, en términos generales, se lanzó la GUI. Hace aproximadamente un año y medio, aislamos el núcleo condicional y el enlace a su alrededor, por lo que pudimos compilarlo y ejecutarlo ya en Linux. Fue un gran avance. Linux era importante para nosotros principalmente porque las máquinas Linux en la nube son mucho más baratas.
Ahora queremos separar el núcleo informático en C ++, donde se realizarán todos los cálculos complejos, de la lógica empresarial que describe qué hacer y en qué orden, de dónde vino el caso, qué tipo de producto, qué tiene derecho el médico a hacer y qué no, y Eso es todo.
Pavel: Probablemente ya tenga una hoja de ruta de este proceso, ya que habla muy bien de ello.
Michael: Intentamos muchas veces crear una hoja de ruta. Entendemos a dónde parece que podemos movernos, teniendo en cuenta los 20 años de Legacy (no puedes llegar con medio dólar, debes pensarlo).
La interacción de proyectos positivos ahora se realiza de una manera simple. De estos, son las interfaces C ++ las que sobresalen, por lo que solo se unen para asegurarse de que haya un compilador. Un total de alrededor de 250 proyectos, cada uno yendo a su propia biblioteca dinámica. Y los combinamos de diferentes maneras para tareas específicas.
Unos 10 equipos trabajan en el sistema. Cada equipo recluta un subconjunto de estos proyectos, generalmente 50-70. Ahora nos estamos moviendo en la dirección en que se creará algún servicio en base a ellos. Definimos una API estricta para el servicio (basada en protobuf u otra cosa), y hacemos un esquema estándar de interacción entre servicios. Es difícil llamar al proceso la separación de la computación y la lógica, pero estos son los primeros intentos de componente.
Mi equipo y varios otros ya han comenzado a hacer esto. Inmediatamente sientes cuánto más divertido cuando recolectas un monolito de no solo 250 proyectos, sino solo de 70. Y ya no hay una situación en la que alguien haya cambiado otro módulo que interactúa con cosas aparentemente completamente no relacionadas, y algo se rompió . Tiene un efecto psicológico genial. Y mientras intentamos alejarnos de un monolito de escritorio saludable asignando condicionalmente 10 monolitos pequeños a nuestros servicios.
Pavel: ¿ Y durante este proceso no consideró si los módulos que están a punto de ser cargados de alguna forma pueden ayudarlo en alguno de los niveles?
Michael: Fue este proceso y el proceso de migración de Linux con el que Conan nos ayudó. Tuvimos un grave problema con la gestión de terceros. Hablé sobre cómo usamos Conan en C ++ Rusia 2019 en Moscú.
Los módulos "más" ayudarían a resolver algunos problemas con el tiempo de compilación, donde, de hecho, todo comenzó, por qué todos quieren los módulos. Reutilizar módulos positivos para interactuar con el servicio es una tontería, ya que se comunicarán en algún nivel de idioma independiente (protobuf), y con razón. Tal vez podríamos realizar componentes y no construir nuestros 250 proyectos desde la fuente cada vez, sino ponerlos en los paquetes de Conan. Y si, por ejemplo, doblar dlls es inconveniente por ciertas razones, entonces montar en módulos es una opción.
Pero no puedo decir que estamos esperando alguna característica que cambie nuestro enfoque del desarrollo.
Pavel: Usted mencionó que Conan lo ayuda a resolver problemas de administración de paquetes. En mi opinión, hace aproximadamente 3 años, la comunidad de C ++ solo habló de esto. Aparecieron los primeros informes, los primeros requisitos previos. Y ahora dices que ya funciona en producción.
Cuéntanos tu experiencia en la evolución del proyecto. ¿Fue doloroso y valió la pena el proceso de transición?
Michael: Definitivamente vale la pena. Estamos satisfechos con Conan. Hay algunos defectos allí, pero administrar dependencias en C ++ es una tarea muy difícil. Por lo tanto, es obvio que no habrá una herramienta simple para resolverlo.
Con Conan y el proceso en él, hemos logrado un equilibrio entre la tarea y la complejidad de la solución. Inicialmente dijimos: "Está bien, queremos resaltar tales y muchos conjuntos de compiladores y configuraciones, luego construir bibliotecas dinámicas (en lugar de las estáticas) de forma predeterminada, establecer un pequeño conjunto de restricciones", y comenzamos a construir un sistema dentro de este conjunto de restricciones. Tenemos una página wiki "Cómo crear una receta de Conan para una biblioteca", que tiene en cuenta todos los detalles de nuestro sistema. La página es bastante grande y no muy simple. Pero, nuevamente, hemos alcanzado un equilibrio de complejidad, así que estoy satisfecho con la transición.
Pavel: Y aquí, por cierto, en el próximo C ++ Russia 2019 Piter, Denis Panin de NVIDIA hablará sobre la alternativa representada por vcpkg . ¿Sería interesante para usted ir al informe y escuchar cómo les está yendo en otras herramientas?
Michael: Sí, sería interesante. Usé vcpkg un poco, pero, en mi opinión, hay muy poca flexibilidad en vcpkg. Y no puedo imaginar cómo podríamos construir un sistema con nuestros requisitos basados en vcpkg. Pero si necesito tomar y probar rápidamente algún tipo de biblioteca, entonces no la descargaré y leeré las instrucciones de compilación, que hay que especificar cómo registrar las dependencias, esto es toda la basura. Veré si está en los puertos vcpkg. Si lo hay, póngalo rápidamente, experimentando con él. Si todo está bien, voy a escribir una receta de Conan para ella.
Pavel: Continuemos con la introducción de nuevas herramientas y enfoques. ¿Te has encontrado con el hecho de que los ingenieros vienen corriendo con ojos ardientes de la conferencia, donde se les informó sobre algo nuevo y genial, y quieren insertarlo en el proyecto? ¿Cómo suele reaccionar ante tales cosas? ¿O entonces recurres después de cada conferencia?
Michael: Solo hay una gran historia. Cuando recién comencé a trabajar en la empresa, escribieron una función y fue necesario configurarla. Además, una característica puede tener varias versiones diferentes, y los valores de propiedades específicas se pueden revolver entre diferentes versiones. Y se me ocurrió un esquema genial basado en YAML donde había herencia y redefinición de propiedades. Lo escribió durante aproximadamente una semana, lo cubrió con pruebas. Y al principio, el gerente se me acercó y me dijo: "Escucha, Michael, ¿tal vez no necesites perder el tiempo ahora y hacer un esquema tan flexible?" Pero no pudo convencerme. Mis ojos estaban demasiado quemados.
Después de un par de años, miro este código y no entiendo por qué fue tan difícil de hacer. Esto sucede, pero, afortunadamente, desde entonces me he vuelto más inteligente. Además, por lo general, los desarrolladores son personas muy racionales, puedes hablar con ellos.
Solía ser que alguien estaba tomando decisiones dudosas de terceros. No está claro por quién están desarrollando, la última actualización fue hace 5 años, no se ha verificado si funciona con Linux, generan informes en un formato propietario que no se puede convertir a nada. Y estamos sentados y no entendemos qué hacer a continuación. La mayoría de estos terceros se agregaron hace muchos años, pero sucede que algo similar sucede ahora.
Por lo tanto, se nos ocurrió algo bastante simple: una lista de verificación de terceros. Si desea arrastrar a un tercero, simplemente revise los elementos de la lista de verificación: multiplataforma, nivel de soporte, licencia, qué análogos, nivel de soporte de desarrollo (cuántos mantenedores admiten, qué comunidad). Todos los puntos son obvios, pero hay muchos, y cuando escribes un tercero, no recordarás todo de inmediato. La situación ha mejorado y estamos viendo lo que se agrega.
También es genial que antes fuera fácil arrastrar a un tercero y ensamblarlo, por ejemplo, solo en un lanzamiento en "Windows" y 32 bits. Ahora, en principio, no existe tal posibilidad, ya que debes ponerlo en Conan. Y si arrastra a un tercero, tendrá que asegurarse o indicar explícitamente que en alguna configuración no lo hará. Gracias a esto, el tercero izquierdo comenzó a agregarse mucho menos.
Oleg: ¿Y qué hay del tercero, que vive muy poco? Por ejemplo, algo de pad izquierdo de JavaScript. Él va a tu lista de verificación. A menudo es actualizado, mantenido, hecho por paquetes.
Michael: No hay tal cosa. En C ++, los terceros suelen ser algo complicado. Y no se utilizan soluciones de terceros que realizan pequeñas funciones. De hecho, en C ++ no es tan simple agregar un tercero. Y esto no es JS, en el que cada uno tiene su propio módulo.
Condicionalmente hemos retirado 80 terceros, la mitad de los cuales nunca he visto. O algún tipo de geometría infernal que se escribió hace 15 años en alguna universidad, y lo tenemos.
Oleg: Con Conan, es fácil agregar un tercero.
Michael: Conan es más fácil, pero aún está lejos del mismo Python donde escribes pip install y listo. C ++ tiene un ecosistema muy complejo: diferentes sistemas operativos, compiladores, cadena de herramientas, bibliotecas, estándares. La mayoría de las bibliotecas tienen muchas opciones.
Les gusta preguntarnos: "¿Por qué escribes las recetas de tu biblioteca, pero no las tomas del centro de Conan?" Desde allí busqué periódicamente recetas, pero no nos satisfacen. Estamos mejor Por ejemplo, nuestras recetas se encargan de los símbolos de débito y agregan un enlace a las fuentes que contienen. Entonces, cuando obtiene una biblioteca de terceros del depurador de Visual Studio, las fuentes se cargan automáticamente.
Entonces con Conan es mucho mejor, pero aún lejos de la conveniencia de otros idiomas.
Oleg: ¿Hay alguna falla en el propio Conan que me gustaría corregir?
Michael: Sí, hay inconvenientes, pero técnicos.
Conan tiene métodos que condicionalmente son responsables de generar paquetes y de conectar los paquetes generados a su solución. Ideológicamente, estas son dos etapas diferentes, y puedo cambiar una sin cambiar la otra. Cuando cambio la forma en que se conectan los paquetes, no quisiera regenerar paquetes binarios, porque serán exactamente lo mismo. No puedes hacer esto en Conan, porque la receta es una entidad. Si cambiaste la receta, formalmente tienes que cambiar la versión y generar nuevos binarios, lo cual es inconveniente.
Características de la transición a nuevos estándares.
Pavel: Hablemos de nuevos estándares. Además, su producto ya tiene algo de historia.
Ahora llegamos a la conferencia, donde cada tres años nos cuentan sobre nuevas características maravillosas. Por ejemplo, en C ++ Russia 2019 Piter habrá tres informes sobre los próximos cambios en el idioma. ¿Tiene alguna experiencia migrando la antigua base de código, que correspondía a los estándares antiguos, a lo que se ofreció o se ofrecerá?
Mikhail: Sí, tuve esa experiencia, hablé un poco sobre ella en C ++ Rusia 2019. Tuvimos una migración de Visual Studio 2013 a Visual Studio 2017 y gcc, es decir, agregamos simultáneamente soporte de Linux y compiladores actualizados de Microsoft.
Los problemas en el código fueron mucho menores en comparación con los problemas organizativos, técnicos, de infraestructura, CI y el resto del ajuste. Y nuestros problemas en el código estaban principalmente relacionados con UB, que, después de actualizar el compilador, comenzó a dispararse. Aunque C ++ propaga la podredumbre durante años de compatibilidad con versiones anteriores, pero ayuda. Ahora compilamos todo en C ++ 17.
Los vorings no se sincronizan cuando los desarrolladores recopilan en Windows, ingresan a CI y solo después de eso comienzan a ensamblarse en Linux. Pero no hubo problemas significativos.
En C ++ 17, se eliminaron algunas cosas obsoletas, pero pasamos solo unas pocas horas eliminándolas. Por ejemplo, la biblioteca log4cplus usaba std :: auto_ptr en los encabezados, pero en las nuevas versiones ya estaba reemplazada por std :: unique_ptr, por lo que era suficiente simplemente actualizar la biblioteca.
Entonces, la migración al nuevo estándar fue relativamente indolora. Y dado el tamaño de nuestra base de código, me sorprende la cantidad de problemas que hemos encontrado.
Sobre el cinturón marrón y negro en C ++
Pavel: Tú y yo ya estamos hablando de los procesos existentes, donde los desarrolladores con experiencia ya trabajan. Pensemos en los desarrolladores noveles que recién están aprendiendo. ¿Con qué estándar de C ++ recomendarías comenzar?
Michael: Debemos tomar el último estándar de inmediato. No aprenderá STL en el mismo C ++ 98, ya que STL sin lambdas no tiene sentido. Si nos fijamos en los cursos "Fundamentos del desarrollo de C ++: Cinturón marrón" y "Fundamentos del desarrollo de C ++: Cinturón negro" en Coursera, entonces ya estamos escribiendo C ++ 17 allí. Por ejemplo, usamos enlaces estructurados.
: , . , . , ?
: , . , C++. , C++, , . , , . , , , , . , . , , , Align Technology.
: , , . Por qué
: -, — . , . , . , , , . -, , , . . -, - ( ), -, . . . . . . , , , , . , , tutorial . -, , .
: , . , . ?
: , . , .
: , «» . , . «» , ?
: , , . . , - . , .
C++ . , . , . , , . . - , .
, . , , , . , . « ?». , .
. C++ Russia . ?
: . , , . , , . , .
: , . , ? 2015, 2019 2020 ?
: , , , , . - . , , , . , , . , .
CppCon 2018 . , , . C++ . , , .
. , — , .
: ?
: const, volatile, static, constexpr, inline, extern . , , ..
: consteval constinit?
: . , , . , 3-4 , .
: , , Visual Studio constexpr?
: Visual Studio . , . , constexpr-.
: , : , , .
: Visual Studio , . , 2010 : , . Microsoft .
: . : const, constexpr, constinit, consteval , , final. final , , constfinal?
: final, , . . , constfinal, .
: , , , , . ?
: , , . , , .
: ?
: , JUG Ru Group , ().
: . ?
: , — . , , , . .
: . , ?
: , . , ().
C++ Russia 2019 Piter «, » . , .