
Mikhail Matrosov ( mmatrosov ) é um engenheiro de desenvolvimento líder no escritório de pesquisa e desenvolvimento de Moscou da Align Technology. Sua especialização é muito incomum - ele está desenvolvendo um sistema CAD especializado para o design de aparelhos ortodônticos.
Mikhail participa do C ++ Russia desde a primeira conferência. Este ano, no C ++ Russia 2019 Piter, ele fará uma apresentação sobre "Qualificadores, Qualificadores e Modelos" . Você também pode conhecê-lo nos cursos da Yandex "Fundamentos do desenvolvimento de C ++: faixa marrom" e "Fundamentos do desenvolvimento de C ++: faixa preta" na Coursera, na criação da qual Michael foi co-autor.
A conferência já está chegando, mas por enquanto, pegue uma entrevista com Mikhail, onde discutimos seu trabalho na Align Technology, a migração de código legado, a preparação de cursos e relatórios on-line, além dos recursos do C ++. Pavel Filonov (comitê de programa C ++ Rússia) e Oleg Chirukhin (jornalista do Grupo JUG Ru) fizeram perguntas.
Na junção de tecnologia e medicina
Pavel: Diga-me o que sua empresa está fazendo.
Michael: A Align Technology é pioneira e líder de mercado em ortodontia limpa. Isso é algo que está sendo feito em todo o mundo agora, em vez de aparelhos. Se antes, um fio de metal era colocado para alisar os dentes e eles corriam com ele. Agora, em vez disso, você coloca protetores bucais de plástico transparentes (forros), feitos individualmente para cada paciente. Recentemente, testei em mim os produtos da nossa empresa, um sentimento muito engraçado!
Pavel: Então você tem comida de cachorro, sim, acontece?
Michael: Sim, mais ou menos. De fato, se você não sabe, é muito difícil perceber que a pessoa está nos forros. A menos que a princípio, por hábito, pequenos defeitos de fala apareçam, mas mesmo eles são difíceis de perceber.
Pavel: E o que o C ++ tem a ver, sobre o qual falaremos muito hoje?
Michael: Ótima pergunta. Quando a empresa estava na sua infância, dois paquistaneses alegres usaram um plástico especial (não sei de onde o encontraram), que deve ser não-tóxico e inerte com saliva e outras substâncias na boca.
Depois, eles fizeram um modelo da mandíbula do paciente, que eles sabiam fazer por muito tempo. Por exemplo, para fazer coroas, uma pessoa era mordida por algo como uma plasticina especial. Havia um elenco de dentes que estava cheio de material. Então eles pegaram uma cópia da mandíbula e puxaram plástico (de alguma forma aqueceram) e o bocal está pronto. Ou seja, todo esse mercado, literalmente, há 20 anos, era completamente analógico.
Agora, o volume de produção na região de 300-400 mil forros por dia (por favor, avalie a escala). Estes são fabricantes gigantescos, portanto, são completamente automatizados.
Para criar um revestimento, imprimimos em um molde especial para impressora 3D. Esta é, de fato, uma cópia da mandíbula do paciente durante o tratamento. Modelamos a aparência da mandíbula em uma semana, dois, mês, ano. Então iniciamos o processo de termoformação - pegamos uma fita plástica, aquecemos e puxamos para o molde. Corte e pegue um forro de plástico.
No momento, ninguém já está lançando pacientes e eles usam scanners intraorais tridimensionais. Temos caras fazendo isso em um escritório próximo. Esta é provavelmente a parte mais "uau" da nossa produção. Lá, em tempo real, um bico especial conduz ao longo da mandíbula e cria sua forma. As informações são carregadas nos servidores da empresa, processadas e enviadas aos nossos especialistas (técnicos). Eles podem editar a verificação, remover ruídos.
Em seguida, o tratamento é planejado em um sistema CAD especializado. Isso é uma coisa muito complicada, porque ninguém sabe qual é a mordida certa. Cada médico tem sua própria opinião sobre esse assunto. Atualmente, estamos trabalhando para formalizar abordagens ao tratamento, mas isso ainda não está em andamento.
Mas voltando ao C ++. Existe um problema, por exemplo. Os moldes são impressos em uma impressora 3D especial usando a tecnologia de estereolitografia a laser. Existe um tanque grande com um líquido especial de fotopolímero. Eles brilham com um laser e endurece. Primeiro, eles brilham na parte inferior do modelo impresso, depois um pouco mais alto, mais alto etc. E assim, dentro do fluido, um modelo sólido aparece de baixo para cima em camadas.
Imprimir um molde por um seria impraticável. O tanque é muito grande e você pode colocar cerca de cem moldes nele. Mas eles devem ser organizados de forma compacta. A forma do molde é semelhante a uma ferradura - isto é, não convexa e bastante complexa. E eles são todos diferentes. Acontece uma tarefa interessante de ladrilhar um retângulo com figuras complexas.
Aqui neste vídeo, de data e hora especificadas, você pode ver como fica.
Este é apenas um exemplo, há muitas tarefas.
Pavel: Suas descrições são como cálculos de alta tecnologia. Idiomas como o Fortran historicamente tiveram um bom desempenho neles. Pelo menos você ainda pode ver os ecos. Por que exatamente C ++?
Michael: Bem, não Fortran, seria muito poderoso. No início do desenvolvimento, o principal produto era esse sistema CAD muito especializado - um aplicativo de desktop para Windows. Portanto, era necessária uma linguagem para computação eficiente e, ao mesmo tempo, para o desenvolvimento do próprio aplicativo. Não havia muita escolha naquele momento - apenas C ++.
Agora, temos um zoológico de linguagens: JavaScript e TypeScript para a Web, Java para aplicativos móveis, Go para servidores, Python para automação, e há muitas coisas pequenas. Basicamente, uma pilha padrão. E em aplicativos de ciência intensiva e computacionalmente complexos, o C ++ permanece.
Quanto maior a posição, mais amplos os horizontes.
Pavel: Você mencionou sua posição como engenheiro líder. E então eu notei tal estranheza. Se perguntassem a um desenvolvedor iniciante em C ++ da sua empresa o que ele estava fazendo, ele diria que estava rodando algum tipo de superestrutura baseada em modelos que, com base no estágio de reforço, equilibram o servidor e as tecnologias caem imediatamente.
Quando lhe perguntam o que sua empresa está fazendo, toda uma história começa sobre o negócio: onde está o dinheiro, por que é importante etc. Isso de alguma forma se correlaciona com a sua posição? Qual é essa visão de processos, tecnologias, ferramentas?
Michael: Sim, talvez. Além disso, se eu começar a contar imediatamente sobre como atravesso árvores (apesar de não fazer isso sozinho), não ficará claro para todos. Por exemplo, caras da Yandex, a Kaspersky Lab pode começar com a tecnologia, porque todo mundo conhece seus produtos. Estamos falando de navios, sobre os quais um pequeno número de pessoas conhece. Portanto, é necessário explicar o que é.
Sobre como isso se correlaciona com a postagem. Na minha nota, eu tenho que entender pelo menos os elementos do nosso fluxo de trabalho dos sistemas atuais que trabalham juntos. Afinal, se algo mudar, isso poderá afetar a produção, o local dos médicos, a interface com a qual técnicos, médicos e analistas de negócios interagem. Ou seja, sim, existe uma correlação. Com o crescimento da nota, você precisa ver melhor o que está acontecendo na empresa.
Pavel: Você pensou como a introdução de novas tecnologias, digamos, relacionadas ao C ++, afetaria o fluxo de trabalho? Poucas pessoas observam os novos recursos do idioma. Se não, conte-nos como você implementou ferramentas recentemente?
Michael: Não me lembro do C ++ de antemão. Se pegarmos as ferramentas, a última coisa que estragamos é um sistema de registro baseado em nuvem. Nós usamos especificamente o Splunk para isso. Inicialmente, a plataforma estava sob a área de trabalho e a migração para a nuvem está agora em pleno andamento. Portanto, fixamos, em particular, o log baseado em nuvem. Nosso gerente aprendeu rapidamente a fazer solicitações e criar belos painéis, exibir gráficos em tempo real. Fiquei muito satisfeito. Enviei a todos e disse: veja como variamos o tempo de operação de um algoritmo tão complexo, qual o motivo? Eles começaram a entender, percebemos que quase não havia multithreading nos agentes de teste. Algo está sendo constantemente apresentado.
C ++, legado, multiplataforma e tudo, tudo, tudo
Oleg: Entendo corretamente que você processou no navegador?
Michael: Sim, existe.
Oleg: As tecnologias do navegador estão mudando constantemente. Isso de alguma forma afeta? Por exemplo, o novo JS, Shading Language , algo assim.
Michael: Isso afeta, mas é um pouco chato aqui. Em termos de renderização, a cena é bem simples. Não temos efeitos especiais incríveis.
Pavel: Bom. Mas você disse que começou com um aplicativo de desktop, em que o C ++ era a melhor solução que combinava todas as vantagens. Quando os negócios começaram a crescer com o produto, você começou a desenvolver outras plataformas. Alguns códigos foram para o navegador, outros para o back-end, outros para celulares. O núcleo “positivo” permaneceu em todas as plataformas?
Michael: O movimento para outras plataformas começou há dois anos e, para nossa escala, isso é pouco tempo. Portanto, nossa primeira solução em nuvem foi um monólito de desktop, do qual, grosso modo, a GUI foi lançada. Cerca de um ano e meio atrás, isolamos o kernel condicional e a ligação em torno dele, para que pudéssemos compilar e executá-lo já no Linux. Foi um grande avanço. O Linux era importante para nós principalmente porque as máquinas Linux em nuvem são muito mais baratas.
Agora, queremos separar o núcleo de computação em C ++, onde todos os cálculos complexos ocorrerão, da lógica de negócios que descreve o que fazer e em que ordem, de onde veio o caso, que tipo de produto, o que o médico tem o direito de fazer e o que não, e isso é tudo.
Pavel: Você provavelmente já tem um roteiro desse processo, já que fala muito bem sobre isso.
Michael: Tentamos várias vezes criar um roteiro. Entendemos para onde parecemos poder nos mudar, levando em consideração os 20 anos do Legacy (não é possível chegar lá com meio dólar, é preciso pensar nisso).
A interação de projetos positivos agora é feita de maneira simples. Dessas, são as interfaces C ++ que se destacam, então elas só se reúnem para garantir que haja um compilador. Um total de cerca de 250 projetos, cada um indo para sua própria biblioteca dinâmica. E nós os combinamos de maneiras diferentes para tarefas específicas.
Cerca de 10 equipes trabalham no sistema. Cada equipe recruta um subconjunto desses projetos, geralmente de 50 a 70. Agora estamos caminhando na direção em que algum serviço será criado com base. Definimos uma API estrita para o serviço (com base no protobuf ou em qualquer outra coisa) e fazemos um esquema padrão de interação entre os serviços. É difícil chamar o processo de separação entre computação e lógica, mas essas são as primeiras tentativas de componente.
Minha equipe e vários outros já começaram a fazer isso. Você imediatamente sente o quanto é engraçado quando coleciona um monólito não apenas de 250 projetos, mas apenas de 70. E não há mais uma situação em que alguém mudou outro módulo que interage com coisas aparentemente completamente não relacionadas, e algo quebrou . Tem um efeito psicológico legal. E enquanto tentamos fugir de um monólito de área de trabalho saudável, alocamos condicionalmente 10 pequenos monólitos para nossos serviços.
Pavel: E durante esse processo, você não considerou se os módulos que estão prestes a ser carregados de alguma forma podem ajudá-lo em qualquer um dos níveis?
Michael: Foi nesse processo e no processo de migração do Linux que Conan nos ajudou. Tivemos um problema sério com o gerenciamento de terceiros. Falei sobre como usamos o Conan no C ++ Russia 2019 em Moscou.
Os módulos "mais" ajudariam a resolver alguns problemas com o tempo de compilação, onde, de fato, tudo começou, por que todo mundo quer os módulos. Reutilizar os módulos positivos para interagir com o serviço é uma tolice, porque eles se comunicam em algum nível independente de idioma (protobuf), e com razão. Talvez possamos executar a componenteização e não construir nossos 250 projetos a partir da fonte de cada vez, mas colocá-los nos pacotes de Conan. E se, por exemplo, dobrar DLLs for inconveniente por certos motivos, a montagem em módulos é uma opção.
Mas não posso dizer que estamos esperando por algum recurso que mudará nossa abordagem para o desenvolvimento.
Pavel: Você mencionou que o Conan ajuda a resolver problemas de gerenciamento de pacotes. Na minha opinião, há cerca de 3 anos, a comunidade C ++ apenas falou sobre isso. Os primeiros relatórios apareceram, os primeiros pré-requisitos. E agora você diz que já trabalha em produção.
Conte-nos sobre sua experiência na evolução de projetos. O processo de transição foi doloroso e valeu a pena?
Michael: Definitivamente vale a pena. Estamos satisfeitos com Conan. Existem algumas falhas, mas gerenciar dependências em C ++ é uma tarefa muito difícil. Portanto, é óbvio que não haverá uma ferramenta simples para resolvê-lo.
Com Conan e o processo, alcançamos um equilíbrio de complexidade de tarefas e soluções. Inicialmente, dissemos: “Ok, queremos destacar esse e muitos conjuntos de compiladores e configurações, depois criar bibliotecas dinâmicas (em vez de estáticas) por padrão, fazer um pequeno conjunto de restrições” e começamos a criar um sistema dentro desse conjunto de restrições. Temos uma página wiki "Como criar uma receita Conan para uma biblioteca", que leva em consideração todas as especificidades do nosso sistema. A página é bastante grande e não muito simples. Mas, novamente, alcançamos um equilíbrio de complexidade, por isso estou satisfeito com a transição.
Pavel: E aqui, a propósito, no próximo Citer Russia 2019 Piter, Denis Panin, da NVIDIA , falará sobre a alternativa representada pelo vcpkg . Seria interessante você ir ao relatório e ouvir como eles estão se saindo em outras ferramentas?
Michael: Sim, seria interessante. Usei um pouco o vcpkg, mas, na minha opinião, há muito pouca flexibilidade no vcpkg. E não consigo imaginar como poderíamos construir um sistema com nossos requisitos baseados no vcpkg. Mas se eu precisar pegar e testar rapidamente algum tipo de biblioteca, não baixarei e leio as Instruções de compilação, para que você precise especificar como registrar dependências, isso é tudo. Vou ver se está nas portas do vcpkg. Se houver, coloque rapidamente, experimentando. Se tudo estiver bem, vou escrever uma receita de Conan para ela.
Pavel: Vamos continuar com a introdução de novas ferramentas e abordagens. Você encontrou o fato de que os engenheiros vêm correndo com os olhos ardentes da conferência, onde foram informados sobre uma coisa nova e interessante e querem inseri-la no projeto? Como você costuma reagir a essas coisas? Ou então você recorre após cada conferência?
Michael: Há apenas uma ótima história. Quando eu comecei a trabalhar na empresa, eles escreveram um recurso, e era necessário fazer uma configuração para ele. Além disso, um recurso pode ter várias versões diferentes e os valores de propriedades específicas podem ser revistados entre diferentes versões. E criei um esquema legal baseado em YAML, onde havia herança e redefinição de propriedades. Ele escreveu por cerca de uma semana, cobriu-o com testes. E, no início, o gerente veio até mim e disse: "Ouça, Michael, talvez você não precise perder tempo agora e faça um esquema tão flexível?" Mas ele não conseguiu me convencer. Meus olhos estavam muito queimados.
Depois de alguns anos, olho para este código e não entendo por que era tão difícil de fazer. Isso acontece, mas, felizmente, desde então eu me tornei mais inteligente. Além disso, geralmente os desenvolvedores são pessoas muito racionais, você pode conversar com eles.
Antes, alguém tomava decisões duvidosas de terceiros. Não está claro por quem eles estão desenvolvendo, a última atualização foi há cinco anos, não foi verificado se funciona no Linux, eles geram relatórios em um formato proprietário que você não pode converter em nada. E estamos sentados e não entendemos o que fazer a seguir. A maioria desses terceiros foi adicionada há muitos anos, mas acontece que algo semelhante acontece agora.
Portanto, criamos uma coisa bastante simples - uma lista de verificação de terceiros. Se você deseja arrastar terceiros, basta acessar os itens da lista de verificação: multiplataforma, nível de suporte, licença, quais análogos, nível de suporte ao desenvolvimento (quantos mantenedores suportam, qual comunidade). Todos os pontos são óbvios, mas existem muitos e, quando você digita terceiros, não se lembra de tudo imediatamente. A situação melhorou e estamos assistindo o que é adicionado.
Também é legal que antes era fácil arrastar terceiros e montá-los, por exemplo, apenas em uma versão em "Windows" e 32 bits. Agora, em princípio, não existe tal possibilidade, pois você deve colocá-lo em Conan. E se você arrastar terceiros, precisará garantir ou indicar explicitamente que, em algumas configurações, isso não ocorrerá. Graças a isso, o terceiro esquerdo começou a ser adicionado muito menos.
Oleg: E quanto a terceiros, que vivem muito pouco? Por exemplo, alguns botões esquerdos do JavaScript. Ele vai na sua lista de verificação. Muitas vezes, é atualizado, mantido, feito por pacotes.
Michael: Não existe. Em C ++, terceiros geralmente são uma coisa grossa. E soluções de terceiros que executam pequenas funções não são usadas. De fato, em C ++ não é tão simples adicionar terceiros. E esse não é o JS, no qual cada um tem seu próprio módulo.
Contratamos condicionalmente 80 terceiros, metade dos quais nunca vi. Ou algum tipo de geometria infernal que foi escrita há 15 anos em alguma universidade, e nós a temos.
Oleg: Com Conan, é fácil adicionar terceiros.
Michael: Conan é mais fácil, mas ainda está longe do mesmo Python em que você escreve a instalação do pip e está pronto. O C ++ possui um ecossistema muito complexo: diferentes sistemas operacionais, compiladores, ferramentas, bibliotecas e padrões. A maioria das bibliotecas tem várias opções.
Eles gostam de nos perguntar: "Por que você está escrevendo as receitas da sua biblioteca, mas não as retirando do centro de Conan?" Olhei periodicamente a partir daí as receitas, mas elas não nos convêm. Estamos melhorando. Por exemplo, nossas receitas cuidam dos símbolos de débito e adicionam uma ligação às fontes neles. Portanto, quando você obtém uma biblioteca de terceiros do depurador do Visual Studio, as fontes são carregadas automaticamente.
Portanto, com Conan é muito melhor, mas ainda está longe da conveniência de outros idiomas.
Oleg: Existem falhas no próprio Conan que eu gostaria de corrigir?
Michael: Sim, existem desvantagens, mas técnicas.
Conan possui métodos que são condicionalmente responsáveis por gerar pacotes e por conectar os pacotes gerados à sua solução. Ideologicamente, esses são dois estágios diferentes, e eu posso mudar um sem alterar o outro. Quando altero a maneira como os pacotes estão conectados, não gostaria de gerar novamente os pacotes binários, porque eles serão exatamente iguais. Você não pode fazer isso em Conan, porque a receita é uma entidade. Se você alterou a receita, formalmente precisará alterar a versão e gerar novos binários, o que é inconveniente.
Características da transição para novos padrões
Pavel: Vamos falar sobre novos padrões. Além disso, seu produto já possui um histórico.
Agora chegamos à conferência, onde a cada três anos eles nos falam sobre novos recursos maravilhosos. Por exemplo, no C ++ Russia 2019 Piter, haverá três relatórios sobre as próximas mudanças no idioma. Você tem alguma experiência em migrar a base de código antiga, que correspondia aos padrões antigos, para o que foi oferecido ou será oferecido?
Mikhail: Sim, eu tive essa experiência, conversamos um pouco sobre isso no C ++ Russia 2019. Tivemos uma migração do Visual Studio 2013 para o Visual Studio 2017 e o gcc, ou seja, adicionamos simultaneamente o suporte ao Linux e os compiladores atualizados da Microsoft.
Os problemas no código eram muito menores em comparação com os problemas organizacionais, técnicos, de infraestrutura, IC e o restante do ajuste. E nossos problemas no código estavam relacionados principalmente ao UB, que, após atualizar o compilador, começou a disparar. Embora o C ++ espalhe a podridão por anos de compatibilidade com versões anteriores, ele ajuda. Agora compilamos tudo no C ++ 17.
Os vorings não são sincronizados quando os desenvolvedores coletam no Windows, acessam o CI e somente depois começam a montar no Linux. Mas não houve problemas significativos.
No C ++ 17, algumas coisas obsoletas foram removidas, mas passamos apenas algumas horas cortando-as. Por exemplo, a biblioteca log4cplus usava std :: auto_ptr nos cabeçalhos, mas nas novas versões já era substituída por std :: unique_ptr, portanto bastava atualizar a biblioteca.
Portanto, a migração para o novo padrão foi relativamente indolor. E, dado o tamanho da nossa base de código, estou surpreso com o número de problemas que encontramos.
Sobre a faixa marrom e preta em C ++
Pavel: Você e eu já estamos conversando sobre os processos existentes, onde desenvolvedores com experiência já trabalham. Vamos dar uma ideia para desenvolvedores iniciantes que estão apenas aprendendo. Qual padrão C ++ você recomendaria começar?
Michael: Devemos seguir o padrão mais recente imediatamente. Você não aprenderá STL no mesmo C ++ 98, pois STL sem lambdas não faz sentido. Se você observar os cursos “Fundamentos de desenvolvimento em C ++: faixa marrom” e “Fundamentos de desenvolvimento em C ++: faixa preta” no Coursera, então já escrevemos em C ++ 17 lá. Por exemplo, usamos ligações estruturadas.
: , . , . , ?
: , . , C++. , C++, , . , , . , , , , . , . , , , Align Technology.
: , , . Porque
: -, — . , . , . , , , . -, , , . . -, - ( ), -, . . . . . . , , , , . , , 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 «, » . , .