Torne o C ++ ótimo de novo! .. in Tula

Há não muito tempo atrás, com base em nosso escritório, realizamos um curso de palestras gratuitas “Modern and Effective C ++” e as gravamos em vídeo. O curso foi projetado para chegar recentemente em nossa equipe de programadores, estagiários e todos os participantes. Neste artigo, gostaríamos de destacar o objetivo deste curso, o processo de preparação para o mesmo, resumir. Esperamos que, para alguns de vocês, nosso curso de palestras seja interessante e que você aprecie nosso trabalho. Desejamos a você uma visualização agradável dos relatórios!


Como surgiu a ideia


Nossa empresa PVS-Studio está desenvolvendo um analisador de código estático que identifica erros e possíveis vulnerabilidades no código fonte de programas escritos em C, C ++, C # e Java. E não é segredo para ninguém que estamos interessados ​​em atrair jovens especialistas. Muitas vezes acontece que os estudantes que desejam adquirir experiência profissional no campo da programação e que ainda não possuem conhecimento nesse campo passam por treinamento prático. Além disso, nossos especialistas recém-chegados também precisam de ajuda com o crescimento profissional. Em vista do exposto, decidiu-se preparar um curso de palestras sobre programação e conduzi-lo. Essa ideia buscava pelo menos três objetivos: mostrar aos jovens profissionais e estagiários como escrever código com mais precisão, eficiência e segurança; popularizar C ++ fora do escritório e demonstrar que a linguagem é promissora do ponto de vista da aprendizagem e trabalhar com ela; popularizar nossa empresa como um empregador interessante. Tendo determinado os objetivos e inspirados pela idéia, decidimos tornar o sonho realidade.

Preparação


Com uma discussão mais aprofundada sobre nossa idéia, muitas perguntas e poucas respostas começaram a aparecer (surpreendentemente, sim?). Na agenda estavam: hora e local, quem preparará o curso, quem o conduzirá, quais tópicos devem ser abordados, gravaremos o curso em vídeo, como faremos, como promovê-lo e onde é melhor fazê-lo e ainda há uma enorme o número de perguntas que discutimos por mais duas semanas e repetimos como uma pitada com as palavras: "E como ...?", "E quem ...?", "E onde ...?".

E assim, quando os pensamentos e as idéias de todos "sincronizaram", foi decidido que o curso seria projetado para 12 palestras 2 vezes por semana, de 9 de julho a 15 de agosto. Andrei Karpov e Philip Handelyants foram selecionados como conferencistas.

Em nosso canal do YouTube, reunimos todos os vídeos em uma lista de reprodução separada para facilitar a visualização. Também temos um grupo VKontakte , que contém todas as informações das palestras. Assim, foi possível ir para a página de uma palestra separada, ver do que se tratava, registrar-se e depois assistir também a uma palestra gravando se algo queria ser repetido ou se uma pessoa não poderia estar presente pessoalmente.

Vamos nos debruçar sobre os tópicos das palestras e seu conteúdo.

Inovações padrão do C ++ 11


C ++ 11 ... qual o significado desses cinco caracteres ... A primeira palestra acabou sendo a mais longa e, talvez, informativa, porque em quase duas horas Philip e os caras discutiram muitas perguntas. Então eles começaram examinando a linguagem C ++ e a relevância de seu uso. Então eles foram diretamente para as próprias mudanças no padrão C ++ 11. Nesta parte, foi considerada a extensão do núcleo da linguagem, a saber:

  • inicialização universal;
  • mover semântica;
  • expressões constantes generalizadas (constexpr) ;
  • mudanças na definição do tipo de POD;
  • listas de inicialização (std :: initializer_list <T>) ;
  • inferência de tipo via auto e decltype ;
  • intervalo para ;
  • funções lambda;
  • sintaxe de função alternativa;
  • saída do tipo de retorno da função;
  • delegando construtores;
  • padrão / excluir especificadores para funções;
  • substituir / qualificadores finais ao trabalhar com polimorfismo;
  • nullptr_t e nullptr ;
  • e muito, muito mais.

Depois de discutir as extensões do kernel, Philip falou sobre as extensões da biblioteca padrão, que incluem:

  • atualizar a biblioteca padrão para refletir as mudanças no idioma principal
  • multithreading: threads ( std :: thread ), mutexes ( std :: mutex, ... ), variáveis ​​condicionais ( std :: condicional_variable, ... );
  • Wrappers RAII ( std :: lock_guard, std :: unique_lock );
  • tuplas ( std :: tupla) ;
  • tabelas de hash ( std :: unordered (_set / _multiset / _map / _multimap );
  • expressões regulares ( std :: regex );
  • ponteiros inteligentes ( std :: unique_ptr, std :: shared_ptr, std :: weak_ptr );
  • geradores de números pseudo-aleatórios em vez de rand () ;
  • wrappers de link ( std :: reference_wrapper );
  • wrapper generalizado para funções ( std :: function );
  • traços ( type_traits ).

Certamente, vale a pena entender que uma quantidade tão grande de informações não pode ser abordada em detalhes em duas horas; portanto, alguns pontos foram contados com mais detalhes, enquanto outros tinham uma função de familiarização.


Inovações padrão do C ++ 14


A segunda palestra foi dedicada à revisão das inovações do padrão C ++ 14. Como não houve muitas mudanças, os ouvintes “sofreram” não por 2 horas, mas apenas 40 minutos :-). Como na primeira palestra, foi dada atenção a dois pontos principais: alterar o kernel C ++ e alterar a biblioteca padrão.

Aqui está o que eles falaram:

  • saída do tipo de retorno para funções sem especificar explicitamente a declaração final do tipo de retorno ( tipo de retorno à direita );
  • decltype (automático) ;
  • flexibilizando restrições para constexpr ;
  • variáveis ​​variáveis;
  • inicialização agregada;
  • literais binários
  • separadores de números;
  • lambdas generalizadas;
  • lista de captura lambda de funções com inicialização;
  • atributo [[obsoleto]] , std :: shared_timed_mutex;
  • busca heterogênea por contêineres associativos;
  • literais de usuário padrão (s para std :: string ; h, min , s , ms , us , ns para std :: duration , se , i , il para a parte imaginária de std :: complex );
  • std :: get agora pode obter o valor de std :: tuple por tipo;
  • std :: make_unique ;
  • std :: sequência inteira ;
  • funções livres std :: begin, std :: end, std :: cbegin, std :: cend, std :: rbegin, std :: rend, std :: crbegin, std :: crend ;
  • std :: exchange .


Inferência de tipo em C ++


Tendo destacado as inovações dos padrões C ++ 11 e C ++ 14, focamos no tópico de inferência de tipo em C ++. Por que foi sobre esse tópico? Antes do C ++ 11, poucas pessoas pensavam minuciosamente sobre o que é e como ele funciona, com exceção dos escritores da “template magic” e dos desenvolvedores de compiladores.

Os tempos passam e agora o programador C ++ precisa levar em conta as inovações aceitas pelos padrões: automático , links de encaminhamento , decltype , lista de captura lambda, inferência de tipo por valor de retorno etc.

As inovações começaram a ser ativamente usadas pelos desenvolvedores em código novo, e é muito importante entender o que isso significa e o que o compilador fará nessa situação.


Inovações padrão do C ++ 17


Falando sobre C ++ moderno, era impossível não mencionar o último padrão C ++ existente. A narração foi apresentada de acordo com o esquema já estabelecido: foram consideradas as alterações no kernel e depois na biblioteca padrão. Assim, consideramos:

  • saída de tipos de classes de modelo de construtores;
  • throw () é considerado sem exceção e marcado como desprovido ;
  • noexcept tornou- se parte do sistema de tipos e agora é levado em consideração na escolha de sobrecargas de funções;
  • copiar elisão ;
  • convolução ( expressão de dobra );
  • if / alterna com inicializador;
  • se constexpr , ligações estruturadas ;
  • namespaces aninhados;
  • novos atributos [[ avanço ]], [[ talvez não utilizado ]] e [[ nodiscard ]];
  • literais reais hexadecimais;
  • static_assert aceita a mensagem como um parâmetro opcional em vez de obrigatório;
  • typename agora é permitido nas opções de modelo ;
  • Outra nova regra para saída automática de tipo com brace-initializer-list ;
  • variáveis ​​em linha ;
  • auto pode ser usado em parâmetros de modelo;
  • diretiva de pré-processador __has_include ;
  • registrar tornou-se uma palavra reservada e ainda não é usada;
  • std :: string_view ;
  • std :: opcional ;
  • std :: any ;
  • std :: variant ;
  • std :: byte ;
  • std :: uncaught_exceptions em vez de std :: uncaught_exception ;
  • boost :: filesystem com alterações inundadas como std :: filesystem ;
  • try_emplace e insert_or_assign para matrizes associativas;
  • funções livres std :: size , std :: empty e std :: data ;
  • variáveis ​​de modelo para type_traits ( std :: * _ v <T ...> ).


STL: conceito, contêineres, iteradores


A quinta palestra foi inteiramente dedicada à biblioteca de modelos padrão. Discutimos a história do STL, em que consiste e como começar a usá-lo. Falamos com mais detalhes sobre contêineres padrão ( vetor , lista , lista_encaminhada , deque , ...), contêineres adaptadores ( pilha , fila , fila_de_ prioridade , pilha ) e tipos de iteradores ( entrada , saída , encaminhamento , bidirecional , aleatório , contíguo ).


STL: Algoritmos, Wrappers, Objetos Funcionais


Nesta palestra, continuamos a trabalhar no STL. Philip falou sobre o fato de que você não precisa praticar ciclismo e é hora de começar a usar algoritmos STL padrão. Várias categorias de algoritmos, wrappers funcionais úteis ( mais , menos , ...) foram considerados.


Análise estática como parte integrante do desenvolvimento ao escrever programas C ++


Philip decidiu relaxar um pouco :-), e nosso diretor técnico, Andrey Karpov, realizou a sétima palestra. Ele falou sobre a análise estática em geral e por que é necessário usá-la no trabalho. Andrei explicou a relação direta entre o uso de um analisador estático e a melhoria da qualidade do código ao trabalhar em um grande projeto. Seria tolice falar sobre análise estática sem exemplos de nossa realidade de trabalho; portanto, naturalmente, exemplos de erros detectados pelo PVS-Studio também foram incluídos na palestra. Conversamos sobre as maneiras certas e erradas de usar ferramentas de análise de código.


Padrão de codificação PVS-Studio e técnicas gerais para desenvolver diagnósticos C ++ eficazes


Philip ainda está descansando, e Andrei e seus alunos olharam um pouco para a cozinha interna do PVS-Studio, considerando dois tópicos.

Primeiramente, conversamos um pouco sobre o padrão de codificação adotado por nossa equipe e por que decidimos projetar o código dessa maneira, e não o contrário.

Em segundo lugar, discutimos alguns métodos de otimização de código que usamos ao desenvolver o analisador. Discutimos sobre a famosa frase "otimização prematura é a raiz de todo mal". O tópico foi abordado de passagem, mas Andrei planeja dedicar um relatório separado a ele: " A otimização prematura é má! Viva a otimização prematura! " Na conferência C ++ Rússia. Por isso, convidamos todos a esta maravilhosa conferência e ao relatório de Andrey.

A palestra foi destinada principalmente aos estagiários de nossa empresa e àqueles que eventualmente desejam se tornar eles. Em relação ao conteúdo, esses momentos do padrão de codificação PVS-Studio foram discutidos aqui:

  • disposições gerais;
  • Linhas
  • nomeação de variáveis;
  • nomeação de tipo;
  • nomeação de função;
  • alinhamento de código;
  • layout da tabela de uma condição difícil;
  • separando espaços;
  • otimização prematura;
  • otimização de tamanhos e estruturas de classes;
  • variáveis ​​com vida útil curta e muito mais.


Metaprogramação em C ++: modelos, cálculos constexpr, etc.


Philip descansou, ganhou força e pediu a “magia mágica”. Todo mundo sabe que a metaprogramação a cada lançamento de um novo padrão está se tornando cada vez mais complicada e incompreensível. Nas bases de código, a quantidade de "magia de modelo" cresce constantemente. A palestra estabeleceu a tarefa de manter-se atualizado, informando sobre os principais aspectos da metaprogramação:

  • funções de modelo;
  • Classes de modelos
  • especialização total e parcial de modelos;
  • modelos variáveis;
  • convolução.

Ouvintes após 30 minutos:


Mas isso não foi tudo! Philip decidiu encerrá-los com uma palestra final sobre computação e manipulação de tipos na fase de compilação, sobre CRTP (padrão de modelo curiosamente recorrente), SFINAE e detectores.


Montagem de projetos C / C ++ e sua otimização


Os sobreviventes da palestra anterior foram instruídos a beber menos café e lutar menos com espadas enquanto o projeto estava sendo compilado.


Os seguintes aspectos foram levantados:

  • fases de tradução em C / C ++;
  • vícios;
  • modelos externos;
  • cabeçalhos pré-compilados;
  • compilação paralela e distribuída;
  • cache do compilador;
  • substituição de componentes de tradução: pré-processador, compilador, vinculador;
  • Unidade de compilação única (SCU);
  • módulos.


Comportamento indefinido ou como dar um tiro no próprio pé


“Algumas pessoas pensam que sabem como C e C ++ se comportam quando brincam com estouros ou ponteiros nulos. Não, eles não sabem. E ninguém sabe. Aqui o comportamento indefinido começa, e a palavra "indefinido" significa que não podemos fazer suposições ou suposições. É simplesmente impossível escrever programas nos quais há um comportamento indefinido, ponto final. Considere o tópico do comportamento indefinido e alguns exemplos de código que o levaram ”, algo como isso foi o início da aula 11, na qual Andrei novamente substituiu Philip e destacou os principais pontos desse tópico, incluindo a terminologia:

  • comportamento indefinido e não especificado;
  • indo para o exterior a matriz;
  • falta de destruidor virtual;
  • operador de exclusão
  • ponteiros nulos;
  • turnos;
  • estouro de número inteiro (erros de 64 bits);
  • estouro de número inteiro (soma de verificação).


C ++ 20 e o futuro previsível


Não foi possível terminar o ciclo de palestras com uma história sobre o lançamento iminente do mais recente padrão C ++ 20. A ênfase principal foi colocada em conceitos ( conceitos ), uma biblioteca de intervalos ( faixas ), corotinas (corotinas), módulos ( módulos ), contratos ( contratos ), um operador de comparação de três vias <=> ( operador de nave espacial ), macros para testar a funcionalidade ( teste de recurso macros ), atributos ( Atributos ), std :: format , std :: jthread e muito mais ...


E assim, quando todas as questões organizacionais foram resolvidas, chegou o momento de concretizar a ideia.

Implementação


Certamente, chamaríamos esse estágio de “Expectativa-Realidade”, porque, como geralmente acontece, tudo o que é pensado nos estágios de planejamento muda um milhão mais de vezes no estágio de implementação. Naturalmente, estávamos cientes desse fato e estávamos prontos ( não ) para que algo desse errado. O principal problema para nós eram os vizinhos abaixo, que estavam consertando ativamente as instalações que alugavam e, em nosso escritório, houve um tempo de perfuração (sem comentários), que não podia deixar de afetar a gravação de palestras. Nesse sentido, quase metade das palestras do curso foram reescritas novamente ou algumas partes do vídeo foram filmadas. E, no caso de Andrei, não havia nada a ser reescrito, já que suas palestras duravam cerca de uma hora e tínhamos tempo suficiente para a empresa não realizar os trabalhos de instalação a partir de baixo, então tivemos que sofrer com as palestras de Philip, porque 1,5 a 2 horas por palestra não todo programador sobreviverá e nem todo trabalhador poderá esperar tanto sem trabalhar. Talvez essa situação fosse a mais imprevista, caso contrário não havia problemas sérios.

Agora vamos falar sobre o início do curso. Cerca de 20 participantes se inscreveram para a nossa primeira palestra, mas na verdade 11 alunos compareceram. Obviamente, entendemos que julgar pelo primeiro evento é estúpido e decidimos observar o que acontece a seguir. O número de alunos durante todo o curso estava mudando constantemente: estava aumentando ou diminuindo. No entanto, gostamos do fato de uma certa “espinha dorsal” do grupo ter sido formada, presente em cada palestra. Dos profissionais, você também pode destacar a atividade dos participantes. Como em qualquer novo grupo, inicialmente todos ficaram envergonhados e ouviram silenciosamente a palestra, mas em torno de 3-4 palestras essa restrição passou e as aulas prosseguiram de forma mais ativa - perguntas, discussões, apenas comunicação ao vivo após a palestra - e houve casos, quando uma pessoa continuou a se comunicar com o professor por mais 40 a 50 minutos, porque está muito interessada no tópico e realmente quer se desenvolver nessa direção. Isso não podia deixar de se alegrar, pois entendemos que em parte contribuímos para esse fato (+100 ao carma).


Os mais persistentes receberam certificados.


Sumário


Um indicador chave da eficácia de nosso empreendimento é o alcance de metas. Tornou-se mais fácil trabalhar para jovens especialistas e estagiários de nossa equipe em termos de socialização e aprimoramento das habilidades profissionais? Definitivamente - sim, uma vez que as palestras foram baseadas em exemplos específicos que nossos programadores encontram enquanto trabalham. Além disso, essa forma de treinamento contribuiu para a aceleração do processo de adaptação da equipe para novos funcionários. Poderíamos popularizar a linguagem C ++ fora do escritório? Francamente, pensamos que há 50/50. Por um lado, havia pessoas muito interessadas que não apenas assistiram às nossas palestras, mas também as revisaram mais tarde, buscaram informações adicionais sobre um tópico específico e vieram totalmente armadas para a próxima palestra. Sim, há preparação! Houve um caso em que chovia muito e um homem se molhou para não perder a lição. Isso eu entendo - zelo! Por outro lado, inicialmente havia mais pessoas desejando participar do nosso curso “de fora” do que no final. Eu tenho pelo menos três razões para isso:

  1. A base da CA eram os alunos e, talvez, tendo se inscrito no curso, eles tinham uma certa idéia sobre o tema, mas suas expectativas não coincidiam com a realidade, porque, apesar de o curso cobrir aspectos gerais da programação em C / C ++, muitas questões estreitamente focadas e especializadas.
  2. O curso ocorreu no auge do verão (sim, sabemos que este ano não é uma discussão, especialmente se você mora na Rússia central). Muitos simplesmente deixaram a cidade e não puderam participar do curso, mesmo que estivessem interessados ​​nele.
  3. Havia programadores de trabalho que sabem tudo sem o nosso curso :)

Concluindo, gostaria de dizer que consideramos bem-sucedida a idéia de criar nosso próprio pequeno curso de programação, porque essa experiência ajudou nossa empresa a otimizar alguns processos internos de trabalho e mostrar claramente nossos padrões aos futuros candidatos.

Se você tiver alguma dúvida, talvez até sugestões ou idéias, fique à vontade para deixar comentários. Falaremos :). E sim, obrigado por ler este artigo.

Link para a seleção de relatórios: "C ++ moderno e eficaz" Vkontakte e YouTube . Ficaremos gratos se você os compartilhar nas redes sociais.

Source: https://habr.com/ru/post/pt469493/


All Articles