Rendez C ++ génial à nouveau! .. dans Tula

Il n'y a pas si longtemps, sur la base de notre bureau, nous avons organisé un cours gratuit de conférences «C ++ moderne et efficace» et les avons enregistrées sur vidéo. Le cours a été conçu pour les nouveaux arrivants dans notre équipe de programmeurs, de stagiaires et de tous les arrivants. Dans cet article, nous aimerions souligner l'objectif de ce cours, le processus de préparation, pour résumer. Nous espérons que pour certains d'entre vous notre cours sera intéressant et vous apprécierez notre travail. Nous vous souhaitons une agréable visualisation des rapports!


Comment est venue l'idée


Notre société PVS-Studio développe un analyseur de code statique qui identifie les erreurs et les vulnérabilités potentielles dans le code source des programmes écrits en C, C ++, C # et Java. Et ce n’est un secret pour personne que nous souhaitons attirer de jeunes spécialistes. Il arrive souvent que les étudiants qui souhaitent acquérir une expérience professionnelle dans le domaine de la programmation et qui manquent encore de connaissances dans ce domaine suivent une formation pratique. De plus, nos spécialistes nouvellement arrivés ont également besoin d'aide pour leur évolution professionnelle. Compte tenu de ce qui précède, il a été décidé de préparer un cours sur la programmation et de le conduire. Cette idée poursuivait au moins trois objectifs: montrer aux jeunes professionnels et stagiaires comment écrire du code de manière plus précise, plus efficace et plus sûre; vulgariser le C ++ en dehors du bureau et démontrer que le langage est prometteur du point de vue de l'apprentissage et de la poursuite du travail avec lui; pour populariser notre entreprise en tant qu'employeur intéressant. Après avoir déterminé les objectifs et inspiré par l'idée, nous avons entrepris de faire du rêve une réalité.

La préparation


Avec une discussion plus approfondie de notre idée, tant de questions et si peu de réponses ont commencé à apparaître (étonnamment, oui?). À l'ordre du jour étaient: l'heure et le lieu, qui préparera le cours, qui le dirigera, quels sujets devraient être couverts, enregistrerons-nous le cours sur vidéo, comment le ferons-nous, comment le promouvoir et où est-il préférable de le faire et il y a encore un énorme le nombre de questions que nous avons discutées pendant encore deux semaines et répétées comme un tiret avec les mots: "Et comment ...?", "Et qui ...?", "Et où ...?".

Et donc, lorsque les pensées et les idées de chacun se sont «synchronisées», il a été décidé que le cours serait conçu pour 12 conférences 2 fois par semaine du 9 juillet au 15 août. Andrei Karpov et Philip Handelyants ont été sélectionnés comme conférenciers.

Sur notre chaîne YouTube, nous avons rassemblé toutes les vidéos dans une liste de lecture distincte pour une visualisation facile. Nous avons également un groupe VKontakte , qui contient toutes les informations sur les conférences. Ainsi, il était possible d'aller à la page d'une conférence séparée, de voir de quoi il s'agissait, de s'enregistrer et plus tard de regarder également un enregistrement de conférence si quelque chose voulait être répété ou si une personne ne pouvait pas être présente en personne.

Arrêtons-nous sur les sujets des conférences et leur contenu.

Innovations standard C ++ 11


C ++ 11 ... combien de sens il y a dans ces cinq personnages ... La première conférence s'est avérée être la plus longue et, peut-être, informative, car en près de deux heures, Philip et les gars ont discuté de beaucoup de questions. Ils ont donc commencé par examiner le langage C ++ et la pertinence de son utilisation. Ils sont ensuite passés directement aux changements mêmes de la norme C ++ 11. Au cours de cette partie, l'extension du noyau du langage a été envisagée, à savoir:

  • initialisation universelle;
  • déplacer la sémantique;
  • expressions constantes généralisées (constexpr) ;
  • changements dans la définition du type POD;
  • listes d'initialisation (std :: initializer_list <T>) ;
  • inférence de type via auto et decltype ;
  • plage pour ;
  • fonctions lambda;
  • syntaxe de fonction alternative;
  • sortie du type de retour de la fonction;
  • constructeurs délégués;
  • spécificateurs par défaut / supprimer pour les fonctions;
  • remplacer / qualificatifs finaux lors de l'utilisation du polymorphisme;
  • nullptr_t et nullptr ;
  • et bien plus encore.

Après avoir discuté des extensions du noyau, Philip a parlé des extensions de la bibliothèque standard, qui incluent:

  • mise à jour de la bibliothèque standard pour refléter les changements dans le langage principal;
  • multithreading: threads ( std :: thread ), mutex ( std :: mutex, ... ), variables conditionnelles ( std :: conditional_variable, ... );
  • Wrappers RAII ( std :: lock_guard, std :: unique_lock );
  • tuples ( std :: tuple) ;
  • tables de hachage ( std :: unordered (_set / _multiset / _map / _multimap );
  • expressions régulières ( std :: regex );
  • pointeurs intelligents ( std :: unique_ptr, std :: shared_ptr, std :: faible_ptr );
  • générateurs de nombres pseudo aléatoires au lieu de rand () ;
  • encapsuleurs de liens ( std :: reference_wrapper );
  • wrapper généralisé pour les fonctions ( std :: function );
  • traits ( type_traits ).

Bien sûr, il vaut la peine de comprendre qu'une telle quantité d'informations ne peut pas être couverte en détail en deux heures, donc certains points ont été expliqués plus en détail, tandis que d'autres avaient une fonction plus familière.


Innovations standard C ++ 14


La deuxième conférence était consacrée à l'examen des innovations de la norme C ++ 14. Il n'y a pas eu beaucoup de changements, donc les auditeurs n'ont «pas souffert» pendant 2 heures, mais seulement 40 minutes :-). Comme dans la première leçon, l'attention a été portée sur deux points principaux: changer le noyau C ++ et changer la bibliothèque standard.

Voici ce dont ils ont parlé:

  • sortie du type de retour pour les fonctions sans spécifier explicitement la déclaration finale du type de retour (type de retour de fin );
  • decltype (auto) ;
  • assouplissement des restrictions pour constexpr ;
  • variables variables;
  • initialisation agrégée;
  • littéraux binaires
  • séparateurs de numéros;
  • lambdas généralisés;
  • lambda capture la liste des fonctions avec initialisation;
  • attribut [[obsolète]] , std :: shared_timed_mutex;
  • recherche hétérogène de conteneurs associatifs;
  • littéraux utilisateur standard (s pour std :: string ; h, min , s , ms , us , ns pour std :: duration , if , i , il pour la partie imaginaire de std :: complex );
  • std :: get peut maintenant obtenir la valeur de std :: tuple par type;
  • std :: make_unique ;
  • std :: integer_sequence ;
  • fonctions libres std :: begin, std :: end, std :: cbegin, std :: cend, std :: rbegin, std :: rend, std :: crbegin, std :: crend ;
  • std :: exchange .


Inférence de type en C ++


Après avoir mis en évidence les innovations des normes C ++ 11 et C ++ 14, nous nous sommes concentrés sur le thème de l'inférence de type en C ++. Pourquoi était-ce sur ce sujet? Avant C ++ 11, peu de gens réfléchissaient à fond à ce que c'était et à son fonctionnement, à l'exception des rédacteurs et des développeurs de compilateurs «magiques de modèles».

Les temps passent et le programmeur C ++ doit maintenant prendre en compte les innovations acceptées par les normes: auto , liens de transfert , decltype , liste de capture lambd, inférence de type par valeur de retour, etc.

Les innovations ont commencé à être activement utilisées par les développeurs dans le nouveau code, et il est très important de comprendre ce que cela signifie et ce que le compilateur fera dans cette situation.


Innovations standard C ++ 17


En parlant de C ++ moderne, il était impossible de ne pas mentionner le dernier standard C ++ existant. La narration a été présentée selon le schéma déjà établi: les changements dans le noyau, puis dans la bibliothèque standard, ont été considérés. Ainsi, nous avons considéré:

  • sortie de types de classes modèles à partir de constructeurs;
  • throw () est considéré comme noexcept et marqué comme déprécié ;
  • noexcept fait désormais partie du système de types et est désormais pris en compte lors du choix des surcharges de fonctions;
  • copier l'élision ;
  • convolution ( expression de pli );
  • if / switch avec initialiseur;
  • si constexpr , liaisons structurées ;
  • espaces de noms imbriqués;
  • nouveaux attributs [[ fallthrough ]], [[peut- être_unused ]] et [[ nodiscard ]];
  • littéraux réels hexadécimaux;
  • static_assert accepte le message comme paramètre facultatif au lieu d'un paramètre obligatoire;
  • le nom de type est désormais autorisé dans les options de modèle de modèle ;
  • Une autre nouvelle règle pour la sortie de type automatique avec brace-initializer-list ;
  • variables en ligne ;
  • auto peut être utilisé dans les paramètres du modèle;
  • directive du préprocesseur __has_include ;
  • s'inscrire est devenu un mot réservé et n'est pas encore utilisé;
  • std :: string_view ;
  • std :: facultatif ;
  • std :: any ;
  • std :: variant ;
  • std :: byte ;
  • std :: uncaught_exceptions au lieu de std :: uncaught_exception ;
  • boost :: filesystem avec des changements inondés comme std :: filesystem ;
  • try_emplace et insert_or_assign pour les tableaux associatifs;
  • fonctions libres std :: size , std :: empty et std :: data ;
  • variables de modèle pour type_traits ( std :: * _ v <T ...> ).


STL: concept, conteneurs, itérateurs


La cinquième conférence était entièrement consacrée à la bibliothèque de modèles standard. Nous avons discuté de l'histoire de STL, en quoi elle consiste et comment commencer à l'utiliser. Nous avons parlé plus en détail des conteneurs standard ( vector , list , forward_list , deque , ...), des conteneurs d'adaptateurs ( stack , queue , priority_queue , heap ) et des types d'itérateurs ( entrée , sortie , transfert , bidirectionnel , aléatoire , contigu ).


STL: algorithmes, wrappers, objets fonctionnels


Dans cette conférence, ils ont continué à travailler sur la STL. Philip a parlé du fait que vous n'avez pas besoin de vous engager dans le cyclisme et qu'il est temps de commencer à utiliser des algorithmes STL standard. Différentes catégories d'algorithmes, wrappers fonctionnels utiles ( plus , moins , ...) ont été considérés.


L'analyse statique en tant que partie intégrante du développement lors de l'écriture de programmes C ++


Philip a décidé de se détendre un peu :-), et notre directeur technique, Andrey Karpov, a tenu la septième conférence. Il a parlé de l'analyse statique en général, et pourquoi il est nécessaire de l'utiliser dans le travail. Andrei a expliqué la relation directe entre l'utilisation d'un analyseur statique et l'amélioration de la qualité du code lors du travail sur un grand projet. Il serait stupide de parler d'analyse statique sans exemples de notre réalité de travail, donc, naturellement, des exemples d'erreurs détectées par PVS-Studio ont également été inclus dans la conférence. Nous avons parlé des bonnes et des mauvaises façons d'utiliser les outils d'analyse de code.


Norme de codage PVS-Studio et techniques générales pour développer des diagnostics C ++ efficaces


Philip est toujours au repos, et Andrei et ses élèves ont jeté un coup d'œil à la cuisine interne de PVS-Studio, considérant deux sujets.

Tout d'abord, nous avons parlé un peu de la norme de codage adoptée par notre équipe, et pourquoi nous avons décidé de concevoir le code de cette manière, et pas autrement.

Deuxièmement, nous avons discuté de quelques méthodes de microoptimisation de code que nous utilisons lors du développement de l'analyseur. Nous avons discuté de la célèbre phrase "l'optimisation prématurée est la racine de tout mal". Le sujet a été abordé en passant, mais Andrei prévoit bientôt de lui consacrer un rapport séparé " L'optimisation prématurée est mauvaise! Vive l'optimisation prématurée! " Lors de la conférence C ++ Russia. Nous invitons donc tout le monde à cette merveilleuse conférence et au rapport d'Andrey.

La conférence était principalement destinée aux stagiaires de notre entreprise et à ceux qui souhaitaient éventuellement les devenir. Concernant le contenu, de tels moments de la norme de codage PVS-Studio ont été discutés ici:

  • dispositions générales;
  • Rangées
  • dénomination des variables;
  • dénomination du type;
  • dénomination des fonctions;
  • alignement du code;
  • disposition de la table d'un état difficile;
  • séparer les espaces;
  • optimisation prématurée;
  • optimisation des tailles et des structures des classes;
  • variables avec des durées de vie courtes et plus.


Métaprogrammation en C ++: modèles, calculs constexpr, etc.


Philip s'est reposé, a pris de la force et a parlé de «magie magique». Tout le monde sait que la métaprogrammation avec chaque version d'un nouveau standard devient de plus en plus difficile et incompréhensible, dans les bases de code la quantité de "magie de modèle" est en constante augmentation. La conférence a fixé la tâche de se tenir à jour, décrivant les principaux aspects de la métaprogrammation:

  • fonctions de modèle;
  • Classes de modèles
  • spécialisation complète et partielle des modèles;
  • modèles variables;
  • convolution.

Auditeurs après 30 minutes:


Mais ce n'était pas tout! Philip a décidé de les terminer avec un dernier discours sur le calcul et la manipulation de type au stade de la compilation, sur le modèle CRTP (Curieusement recurrent template pattern), SFINAE et les détecteurs.


Assemblage de projets C / C ++ et son optimisation


Les survivants de la conférence précédente ont appris comment boire moins de café et se battre moins avec des épées pendant la compilation de leur projet.


Les aspects suivants ont été soulevés:

  • phases de traduction en C / C ++;
  • les dépendances;
  • modèles externes;
  • en-têtes précompilés;
  • compilation parallèle et distribuée;
  • cache du compilateur;
  • remplacement des composants de traduction: préprocesseur, compilateur, éditeur de liens;
  • Unité de compilation unique (SCU);
  • modules.


Comportement indéfini ou comment se tirer une balle dans le pied


«Certaines personnes pensent qu'elles savent comment se comportent C et C ++ lorsqu'elles jouent avec des débordements ou des pointeurs nuls. Non, ils ne savent pas. Et personne ne le sait. Ici commence un comportement indéfini, et le mot «indéfini» signifie que nous ne pouvons faire aucune supposition ou supposition. Il est tout simplement impossible d'écrire des programmes dans lesquels il existe un comportement indéfini, point final. Considérez le sujet du comportement indéfini et quelques exemples de code qui y mènent », quelque chose comme ça était le début de la leçon 11, dans laquelle Andrei a de nouveau succédé à Philip et a souligné les points clés de ce sujet, y compris la terminologie:

  • comportement indéfini et non spécifié;
  • aller à l'étranger le tableau;
  • manque de destructeur virtuel;
  • supprimer l' opérateur
  • pointeurs nuls;
  • quarts;
  • débordement d'entier (erreurs 64 bits);
  • débordement d'entier (somme de contrôle).


C ++ 20 et l'avenir prévisible


Nous n'avons pas pu terminer notre cycle de cours avec une histoire sur la sortie imminente de la dernière norme C ++ 20. L'accent principal a été mis sur les concepts ( concepts ), une bibliothèque de gammes ( gammes ), les coroutines (coroutines), les modules ( modules ), les contrats ( contrats ), un opérateur d'opérateur de comparaison à trois <=> ( opérateur de vaisseau spatial ), des macros pour tester la fonctionnalité ( test de fonctionnalité macros ), attributs ( Attributs ), std :: format , std :: jthread et bien plus encore ...


Et donc, quand tous les problèmes d'organisation ont été réglés, le moment est venu de réaliser l'idée.

Implémentation


Bien sûr, nous appellerions cette étape «attente-réalité», car, comme cela arrive généralement, tout ce qui est pensé aux étapes de la planification change un million de fois au stade de la mise en œuvre. Naturellement, nous étions conscients de ce fait et étions prêts ( non ) à ce que quelque chose se passe mal. Le principal problème pour nous était les voisins ci-dessous, qui réparaient activement les locaux qu'ils louaient, et dans notre bureau, il y avait un temps de perforation (sans commentaire), qui ne pouvait qu'affecter l'enregistrement des conférences. À cet égard, près de la moitié des conférences du cours ont été réécrites ou certaines parties de la vidéo ont été filmées. Et si dans le cas d'Andrei, il n'y avait rien à réécrire, puisque ses conférences duraient environ une heure et que nous avions suffisamment de temps pour que l'entreprise ne procède pas à des travaux d'installation par le bas, alors nous devions souffrir des conférences de Philip, car 1,5 à 2 heures par conférence ne fonctionnaient pas. chaque programmeur survivra et tous les travailleurs ne peuvent pas attendre autant sans travailler. Cette situation était peut-être la plus imprévue, sinon il n'y avait pas de problèmes graves.

Parlons maintenant du début du cours. Environ 20 participants se sont inscrits à notre première conférence, mais en fait 11 étudiants y ont assisté. Bien sûr, nous avons compris que juger par le premier événement était stupide et avons décidé de regarder ce qui se passerait ensuite. Le nombre d'étudiants pour l'ensemble du cours est en constante évolution: il augmente ou diminue. Cependant, nous avons apprécié le fait qu'une certaine «colonne vertébrale» du groupe ait été formée, qui était présente à chaque conférence. Parmi les pros, vous pouvez également mettre en évidence l'activité des participants. Comme dans tout nouveau groupe, au début, tout le monde était gêné et écoutait silencieusement la conférence, mais quelque part autour de 3-4 conférences, cette contrainte est passée et les cours se sont déroulés sous une forme plus active - questions, discussions, communication en direct après la conférence - et il y a eu des cas, quand une personne a continué à communiquer avec le conférencier pendant encore 40 à 50 minutes, car elle est très intéressée par le sujet et veut vraiment évoluer dans ce sens. Cela ne pouvait que se réjouir, car nous avons compris que nous y avions contribué en partie (+100 au karma).


Les plus persistants ont obtenu des certificats.


Résumé


Un indicateur clé de l'efficacité de notre entreprise est la réalisation des objectifs. Est-il devenu plus facile de travailler pour de jeunes spécialistes et stagiaires dans notre équipe en termes de socialisation et d'amélioration des compétences professionnelles? Certainement - oui, car les conférences étaient basées sur des exemples spécifiques que nos programmeurs rencontrent en travaillant. De plus, cette forme de formation a contribué à l'accélération du processus d'adaptation au sein de l'équipe pour les nouveaux collaborateurs. Pourrions-nous vulgariser le langage C ++ en dehors du bureau? Franchement, nous pensons qu'il y a 50/50. D'un côté, il y avait des personnes très intéressées qui non seulement ont assisté à nos conférences, mais les ont également révisées plus tard, ont cherché des informations supplémentaires sur un sujet particulier et sont arrivées complètement armées pour la prochaine conférence. Oui, il y a de la préparation! Il y a eu un cas où il pleuvait beaucoup et un homme est venu mouillé pour ne pas manquer la leçon. Je comprends cela - du zèle! D'un autre côté, au départ, il y avait plus de personnes souhaitant suivre notre cours «de l'extérieur» qu'à la fin. J'ai au moins trois raisons à cela:

  1. La base de l'AC était les étudiants et, peut-être, s'étant inscrits au cours, ils avaient une certaine idée sur le sujet, mais leurs attentes ne coïncidaient pas avec la réalité, car, malgré le fait que le cours couvrait les aspects généraux de la programmation en C / C ++, beaucoup de questions étroitement ciblées et spécialisées.
  2. Le cours a eu lieu au plus fort de l'été (oui, nous savons que cette année n'est pas un argument, surtout si vous habitez en Russie centrale). Beaucoup ont simplement quitté la ville et n'ont pas pu suivre le cours, même s'ils s'y intéressaient.
  3. Il y avait des programmeurs syndicaux qui savent tout sans notre cours :)

En conclusion, je voudrais dire que nous considérons l'idée de créer notre propre petit cours de programmation comme un succès, car cette expérience a aidé notre entreprise à optimiser certains processus de travail internes et à montrer clairement nos normes aux futurs candidats.

Si vous avez des questions, peut-être même des suggestions ou des idées, n'hésitez pas à laisser des commentaires - nous en parlerons :). Et oui, merci d'avoir lu cet article.

Lien vers la sélection de rapports: "C ++ moderne et efficace" Vkontakte et YouTube . Nous vous serions reconnaissants si vous les partagez sur les réseaux sociaux.

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


All Articles