Machen Sie C ++ wieder großartig! .. in Tula

Vor nicht allzu langer Zeit haben wir auf der Grundlage unseres Büros einen kostenlosen Vorlesungskurs „Modern and Effective C ++“ durchgeführt und diese auf Video aufgezeichnet. Der Kurs wurde für kürzlich in unserem Team von Programmierern, Praktikanten und allen Ankömmlingen angekommen. In diesem Artikel möchten wir den Zweck dieses Kurses, den Vorbereitungsprozess, zusammenfassen. Wir hoffen, dass für einige von Ihnen unser Vorlesungskurs interessant ist und Sie unsere Arbeit schätzen werden. Wir wünschen Ihnen eine angenehme Anzeige der Berichte!


Wie ist die Idee entstanden?


Unsere Firma PVS-Studio entwickelt einen statischen Code-Analysator, der Fehler und potenzielle Schwachstellen im Quellcode von Programmen identifiziert, die in C, C ++, C # und Java geschrieben wurden. Und es ist für niemanden ein Geheimnis, dass wir daran interessiert sind, junge Fachkräfte anzuziehen. Es kommt häufig vor, dass Studierende, die Berufserfahrung auf dem Gebiet der Programmierung sammeln möchten und noch keine Kenntnisse auf diesem Gebiet haben, eine praktische Ausbildung absolvieren. Darüber hinaus benötigen unsere neu angekommenen Spezialisten Hilfe bei der beruflichen Weiterentwicklung. In Anbetracht des Vorstehenden wurde beschlossen, einen Vorlesungskurs über Programmierung vorzubereiten und durchzuführen. Diese Idee verfolgte mindestens drei Ziele: jungen Fachleuten und Praktikanten zu zeigen, wie sie Code genauer, effizienter und sicherer schreiben können; Popularisieren Sie C ++ außerhalb des Büros und zeigen Sie, dass die Sprache unter dem Gesichtspunkt des Lernens und der weiteren Arbeit mit ihr vielversprechend ist. unser Unternehmen als interessanten Arbeitgeber bekannt zu machen. Nachdem wir die Ziele festgelegt und von der Idee inspiriert hatten, machten wir uns daran, den Traum Wirklichkeit werden zu lassen.

Vorbereitung


Mit der weiteren Diskussion unserer Idee tauchten so viele Fragen und Antworten auf (überraschenderweise ja?). Auf der Tagesordnung standen: Zeit und Ort, wer wird den Kurs vorbereiten, wer wird ihn durchführen, welche Themen sollten behandelt werden, werden wir den Kurs auf Video aufzeichnen, wie werden wir ihn machen, wie wir ihn fördern und wo ist es besser, ihn zu machen, und es gibt immer noch einen großen Kurs die Anzahl der Fragen, die wir noch zwei Wochen besprochen und wie ein Strich mit den Worten wiederholt haben: "Und wie ...?", "Und wer ...?", "Und wo ...?".

Als alle Gedanken und Ideen „synchronisiert“ wurden, wurde beschlossen, den Kurs vom 9. Juli bis 15. August zweimal pro Woche für 12 Vorlesungen zu gestalten. Andrei Karpov und Philip Handelyants wurden als Dozenten ausgewählt.

Auf unserem YouTube-Kanal haben wir alle Videos in einer separaten Wiedergabeliste gesammelt, um sie einfach anzeigen zu können. Wir haben auch eine VKontakte-Gruppe , die alle Informationen zu den Vorlesungen enthält. So war es möglich, auf die Seite einer separaten Vorlesung zu gehen, zu sehen, worum es ging, sich dafür zu registrieren und später auch eine Vorlesungsaufzeichnung anzusehen, wenn etwas wiederholt werden wollte oder wenn eine Person nicht persönlich teilnehmen konnte.

Lassen Sie uns auf die Themen der Vorlesungen und deren Inhalt eingehen.

C ++ 11 Standardinnovationen


C ++ 11 ... wie viel Bedeutung diese fünf Zeichen haben ... Die erste Vorlesung erwies sich als die längste und vielleicht informativste, da Philip und die Jungs in fast zwei Stunden viele Fragen diskutierten. Zunächst untersuchten sie die C ++ - Sprache und die Relevanz ihrer Verwendung. Dann gingen sie direkt zu den Änderungen im C ++ 11-Standard. In diesem Teil wurde die Erweiterung der Kernsprache betrachtet, nämlich:

  • universelle Initialisierung;
  • Semantik verschieben;
  • verallgemeinerte konstante Ausdrücke (constexpr) ;
  • Änderungen in der Definition des POD-Typs;
  • Initialisierungslisten (std :: initializer_list <T>) ;
  • Typinferenz über Auto und Decltype ;
  • Reichweite für ;
  • Lambda-Funktionen;
  • alternative Funktionssyntax;
  • Ausgabe des Rückgabetyps der Funktion;
  • Konstruktoren delegieren;
  • Standard- / Löschspezifizierer für Funktionen;
  • Override / Final Qualifiers bei der Arbeit mit Polymorphismus;
  • nullptr_t und nullptr ;
  • und vieles mehr.

Nachdem Philip die Kernel-Erweiterungen besprochen hatte, sprach er über Erweiterungen der Standardbibliothek, darunter:

  • Aktualisieren der Standardbibliothek, um Änderungen in der Kernsprache widerzuspiegeln;
  • Multithreading: Threads ( std :: thread ), Mutexe ( std :: mutex, ... ), bedingte Variablen ( std :: conditional_variable, ... );
  • RAII-Wrapper ( std :: lock_guard, std :: unique_lock );
  • Tupel ( std :: tuple) ;
  • Hash-Tabellen ( std :: unordered (_set / _multiset / _map / _multimap );
  • reguläre Ausdrücke ( std :: regex );
  • intelligente Zeiger ( std :: unique_ptr, std :: shared_ptr, std :: schwach_ptr );
  • Pseudozufallszahlengeneratoren anstelle von rand () ;
  • Link Wrapper ( std :: reference_wrapper );
  • verallgemeinerter Wrapper für Funktionen ( std :: function );
  • Eigenschaften ( type_traits ).

Natürlich ist es wichtig zu verstehen, dass eine so große Menge an Informationen nicht in zwei Stunden detailliert behandelt werden kann. Daher wurden einige Punkte ausführlicher behandelt, während andere eine vertrautere Funktion hatten.


C ++ 14 Standardinnovationen


Die zweite Vorlesung befasste sich mit der Überprüfung der Innovationen des C ++ 14-Standards. Es gab nicht viele Änderungen, so dass die Zuhörer nicht 2 Stunden, sondern nur 40 Minuten „gelitten“ haben :-). Wie in der ersten Vorlesung wurde auf zwei Hauptpunkte geachtet: Ändern des C ++ - Kernels und Ändern der Standardbibliothek.

Hier ist, worüber sie gesprochen haben:

  • Ausgabe des Rückgabetyps für Funktionen ohne explizite Angabe der endgültigen Deklaration des Rückgabetyps ( nachfolgender Rückgabetyp );
  • decltype (auto) ;
  • Lockerung der Beschränkungen für constexpr ;
  • variable Variablen;
  • aggregierte Initialisierung;
  • binäre Literale
  • Zahlentrennzeichen;
  • verallgemeinerte Lambdas;
  • Lambda-Capture-Liste der Funktionen mit Initialisierung;
  • Attribut [[veraltet]] , std :: shared_timed_mutex;
  • heterogene Suche nach assoziativen Containern;
  • Standardbenutzerliterale (s für std :: string ; h, min , s , ms , us , ns für std :: duration , wenn , i , il für den Imaginärteil von std :: complex );
  • std :: get kann jetzt den Wert von std :: tuple nach Typ abrufen ;
  • std :: make_unique ;
  • std :: integer_sequence ;
  • freie Funktionen std :: begin, std :: end, std :: cbegin, std :: cend, std :: rbegin, std :: rend, std :: crbegin, std :: crend ;
  • std :: exchange .


Typinferenz in C ++


Nachdem wir die Innovationen der Standards C ++ 11 und C ++ 14 hervorgehoben hatten, konzentrierten wir uns auf das Thema Typinferenz in C ++. Warum ging es um dieses Thema? Vor C ++ 11 haben nur wenige Leute gründlich darüber nachgedacht, was es ist und wie es funktioniert, mit Ausnahme von "Template Magic" -Schreibern und Compiler-Entwicklern.

Die Zeiten vergehen, und jetzt muss der C ++ - Programmierer die von den Standards akzeptierten Innovationen berücksichtigen: Auto , Weiterleitungslinks , Dekltyp , Lambda-Erfassungsliste, Typinferenz nach Rückgabewert usw.

Innovationen werden von Entwicklern in neuem Code zunehmend aktiv eingesetzt, und es ist sehr wichtig zu verstehen, was dies bedeutet und was der Compiler in dieser Situation tun wird.


C ++ 17 Standardinnovationen


In Bezug auf modernes C ++ war es unmöglich, den letzten existierenden C ++ - Standard nicht zu erwähnen. Die Erzählung wurde nach dem bereits etablierten Schema präsentiert: Die Änderungen im Kernel und dann in der Standardbibliothek wurden berücksichtigt. Daher haben wir überlegt:

  • Ausgabe von Arten von Vorlagenklassen von Konstruktoren;
  • throw () wird als noexcept betrachtet und als beraubt markiert.
  • noexcept ist Teil des Typsystems geworden und wird jetzt bei der Auswahl von Funktionsüberladungen berücksichtigt.
  • Elision kopieren ;
  • Faltung ( Faltenausdruck );
  • if / switch mit Initialisierer;
  • wenn constexpr , strukturierte Bindungen ;
  • verschachtelte Namespaces;
  • neue Attribute [[ fallthrough ]], [[ vielleicht_unused ]] und [[ nodiscard ]];
  • hexadezimale reelle Literale;
  • static_assert akzeptiert die Nachricht als optionalen Parameter anstelle eines erforderlichen Parameters.
  • Typname ist jetzt in Vorlagenvorlagenoptionen zulässig.
  • Eine weitere neue Regel für die automatische Ausgabe mit Klammer-Initialisierer-Liste ;
  • Inline- Variablen;
  • auto kann in Vorlagenparametern verwendet werden;
  • Präprozessor-Direktive __has_include ;
  • register ist zu einem reservierten Wort geworden und wird noch nicht verwendet;
  • std :: string_view ;
  • std :: optional ;
  • std :: any ;
  • std :: variante ;
  • std :: byte ;
  • std :: uncaught_exceptions anstelle von std :: uncaught_exception ;
  • boost :: filesystem mit Änderungen, die als std :: filesystem überflutet wurden;
  • try_emplace und insert_or_assign für assoziative Arrays;
  • freie Funktionen std :: size , std :: empty und std :: data ;
  • Vorlagenvariablen für type_traits ( std :: * _ v <T ...> ).


STL: Konzept, Container, Iteratoren


Die fünfte Vorlesung war ganz der Standardvorlagenbibliothek gewidmet. Wir haben die Geschichte von STL besprochen, woraus es besteht und wie man es benutzt. Wir haben ausführlicher über Standardcontainer ( Vektor , Liste , Vorwärtsliste , Deque , ...), Adaptercontainer ( Stapel , Warteschlange , Prioritätswarteschlange , Heap ) und Iteratortypen ( Eingabe , Ausgabe , Weiterleitung , bidirektional , zufällig , zusammenhängend ) gesprochen.


STL: Algorithmen, Wrapper, funktionale Objekte


In dieser Vorlesung haben wir weiter an STL gearbeitet. Philip sprach über die Tatsache, dass Sie sich nicht mit dem Fahrradbau beschäftigen müssen und es Zeit ist, Standard-STL-Algorithmen zu verwenden. Verschiedene Kategorien von Algorithmen, nützliche funktionale Wrapper ( Plus , Minus , ...) wurden berücksichtigt.


Statische Analyse als integraler Bestandteil der Entwicklung beim Schreiben von C ++ - Programmen


Philip beschloss, sich etwas zu entspannen :-), und unser technischer Direktor, Andrey Karpov, hielt den siebten Vortrag. Er sprach über statische Analysen im Allgemeinen und warum es notwendig ist, sie in der Arbeit zu verwenden. Andrei erklärte die direkte Beziehung zwischen der Verwendung eines statischen Analysators und der Verbesserung der Codequalität bei der Arbeit an einem großen Projekt. Es wäre dumm, über statische Analysen ohne Beispiele aus unserer Arbeitsrealität zu sprechen, daher wurden natürlich auch Beispiele für erkannte Fehler von PVS-Studio in die Vorlesung aufgenommen. Wir haben über die richtigen und falschen Methoden zur Verwendung von Code-Analyse-Tools gesprochen.


PVS-Studio-Codierungsstandard und allgemeine Techniken zur Entwicklung einer effektiven C ++ - Diagnose


Philip ruht sich immer noch aus, und Andrei und seine Schüler werfen einen kleinen Blick auf die interne Küche des PVS-Studios und betrachten zwei Themen.

Zunächst sprachen wir ein wenig über den von unserem Team verabschiedeten Codierungsstandard und warum wir beschlossen haben, den Code auf diese Weise und nicht anders zu gestalten.

Zweitens haben wir einige Methoden zur Code-Mikrooptimierung diskutiert, die wir bei der Entwicklung des Analysators verwenden. Wir diskutierten über den berühmten Satz "Vorzeitige Optimierung ist die Wurzel allen Übels". Das Thema wurde im Vorbeigehen angesprochen, aber Andrei plant bald, ihm einen separaten Bericht zu widmen: „ Vorzeitige Optimierung ist böse! Es lebe die vorzeitige Optimierung! “ Auf der C ++ Russia-Konferenz. Deshalb laden wir alle zu dieser wunderbaren Konferenz und zu Andreys Bericht ein.

Der Vortrag richtete sich in erster Linie an die Praktikanten unseres Unternehmens und an diejenigen, die sie später werden wollen. In Bezug auf den Inhalt wurden solche Momente des PVS-Studio-Codierungsstandards hier diskutiert:

  • allgemeine Bestimmungen;
  • Zeilen
  • Variablennamen;
  • Typbenennung;
  • Funktionsbenennung;
  • Code-Ausrichtung;
  • Tabellenlayout eines schwierigen Zustands;
  • Räume trennen;
  • vorzeitige Optimierung;
  • Optimierung von Klassengrößen und -strukturen;
  • Variablen mit kurzer Lebensdauer und mehr.


Metaprogrammierung in C ++: Vorlagen, Constexpr-Berechnungen usw.


Philip machte eine Pause, gewann an Kraft und sagte für "Template Magic". Jeder weiß, dass die Metaprogrammierung mit jeder Veröffentlichung eines neuen Standards immer schwieriger und unverständlicher wird. In den Codebasen wächst die Menge an "Template Magic" ständig. In der Vorlesung wurde die Aufgabe gestellt, auf dem neuesten Stand zu bleiben und die wichtigsten Aspekte der Metaprogrammierung zu erläutern:

  • Vorlagenfunktionen;
  • Vorlagenklassen
  • vollständige und teilweise Spezialisierung von Vorlagen;
  • variable Vorlagen;
  • Faltung.

Zuhörer nach 30 Minuten:


Das war aber noch nicht alles! Philip beschloss, sie mit einem abschließenden Vortrag über Berechnung und Typmanipulation in der Kompilierungsphase, über CRTP (Curiously Recurring Template Pattern), SFINAE und Detektoren abzuschließen.


Zusammenstellung von C / C ++ - Projekten und deren Optimierung


Den Überlebenden der vorherigen Vorlesung wurde gesagt, wie sie weniger Kaffee trinken und weniger mit Schwertern kämpfen sollen, während ihr Projekt zusammengestellt wird.


Folgende Aspekte wurden angesprochen:

  • Übersetzungsphasen in C / C ++;
  • Sucht;
  • externe Vorlagen;
  • vorkompilierte Header;
  • parallele und verteilte Zusammenstellung;
  • Compiler-Cache;
  • Austausch von Übersetzungskomponenten: Präprozessor, Compiler, Linker;
  • Single Compilation Unit (SCU);
  • Module.


Unbestimmtes Verhalten oder wie man sich in den Fuß schießt


„Einige Leute glauben zu wissen, wie sich C und C ++ verhalten, wenn sie mit Überläufen oder Nullzeigern spielen. Nein, sie wissen es nicht. Und niemand weiß es. Hier beginnt unbestimmtes Verhalten, und das Wort "unbestimmt" bedeutet, dass wir keine Annahmen oder Vermutungen anstellen können. Es ist einfach unmöglich, Programme zu schreiben, in denen es ein unbestimmtes Verhalten gibt. Betrachten Sie das Thema unbestimmtes Verhalten und einige Codebeispiele, die dazu führen. “So etwas war der Beginn von Vorlesung 11, in der Andrei erneut Philip übernahm und wichtige Punkte dieses Themas hervorhob, einschließlich der Terminologie:

  • unbestimmtes und nicht spezifiziertes Verhalten;
  • ins Ausland gehen das Array;
  • Mangel an virtuellem Destruktor;
  • Operator löschen
  • Nullzeiger;
  • Verschiebungen;
  • Ganzzahlüberlauf (64-Bit-Fehler);
  • Ganzzahlüberlauf (Prüfsumme).


C ++ 20 und die absehbare Zukunft


Wir konnten unseren Vorlesungszyklus nicht mit einer Geschichte über die bevorstehende Veröffentlichung des neuesten C ++ 20-Standards beenden. Der Schwerpunkt lag auf Konzepten ( Konzepten ), einer Bibliothek von Bereichen ( Bereichen ), Coroutinen ( Coroutinen ), Modulen ( Modulen ), Verträgen ( Verträgen ), einem Drei-Wege-Vergleichsoperator Operator <=> ( Raumschiffoperator ) und Makros zum Testen der Funktionalität (Funktionstest) Makros ), Attribute ( Attribute ), std :: format , std :: jthread und vieles mehr ...


Als alle organisatorischen Probleme geklärt waren, kam der Moment, um die Idee zu verwirklichen.

Implementierung


Natürlich würden wir diese Phase „Expectation-Reality“ nennen, da sich, wie es normalerweise der Fall ist, alles, was in der Planungsphase gedacht wird, in der Phase der Implementierung noch eine Million Mal ändert. Natürlich waren wir uns dieser Tatsache bewusst und waren bereit ( nein ), dass etwas schief gehen würde. Das Hauptproblem für uns waren die Nachbarn unten, die die von ihnen gemieteten Räumlichkeiten aktiv reparierten, und in unserem Büro gab es eine Bohrzeit (ohne Kommentar), die die Aufzeichnung von Vorträgen nur beeinflussen konnte. In diesem Zusammenhang wurde fast die Hälfte der Vorlesungen des Kurses erneut umgeschrieben oder einige Teile des Videos wurden gefilmt. Und wenn es im Fall von Andrei nichts umzuschreiben gab, da seine Vorlesungen ungefähr eine Stunde dauerten und wir genug Zeit hatten, damit das Unternehmen keine Installationsarbeiten von unten durchführen konnte, mussten wir unter Philipps Vorlesungen leiden, da 1,5 bis 2 Stunden pro Vorlesung dies nicht taten Jeder Programmierer wird überleben und nicht jeder Arbeiter kann so viel warten, ohne zu arbeiten. Vielleicht war diese Situation die unvorhergesehenste, sonst gab es keine ernsthaften Probleme.

Lassen Sie uns nun über den Beginn des Kurses sprechen. Ungefähr 20 Teilnehmer haben sich für unsere erste Vorlesung angemeldet, aber tatsächlich haben 11 Studenten teilgenommen. Natürlich haben wir verstanden, dass es dumm ist, nach dem ersten Ereignis zu urteilen, und beschlossen, zu beobachten, was als nächstes passiert. Die Anzahl der Studenten während des gesamten Kurses änderte sich ständig: Sie nahm zu oder ab. Es hat uns jedoch gefallen, dass ein bestimmtes „Rückgrat“ der Gruppe gebildet wurde, das bei jeder Vorlesung vorhanden war. Von den Profis können Sie auch die Aktivität der Teilnehmer hervorheben. Wie in jeder neuen Gruppe war anfangs jeder verlegen und hörte sich die Vorlesung still an, aber irgendwo in 3-4 Vorlesungen bestand diese Einschränkung und der Unterricht verlief aktiver - Fragen, Diskussionen, nur Live-Kommunikation nach der Vorlesung - und es gab Fälle, wenn eine Person weitere 40-50 Minuten mit dem Dozenten kommuniziert, weil sie sich sehr für das Thema interessiert und sich wirklich in diese Richtung entwickeln möchte. Dies konnte sich nur freuen, da wir verstanden haben, dass wir teilweise zu dieser Tatsache beigetragen haben (+100 zum Karma).


Die hartnäckigsten wurden mit Zertifikaten ausgezeichnet.


Zusammenfassung


Ein Schlüsselindikator für die Effektivität unseres Unternehmens ist das Erreichen von Zielen. Ist es einfacher geworden, für junge Fachkräfte und Praktikanten in unserem Team zu arbeiten, um soziale Kontakte zu knüpfen und berufliche Fähigkeiten zu verbessern? Auf jeden Fall - ja, da die Vorträge auf bestimmten Beispielen basierten, denen unsere Programmierer bei der Arbeit begegnen. Darüber hinaus trug diese Form der Schulung zur Beschleunigung des Anpassungsprozesses im Team für neue Mitarbeiter bei. Könnten wir die C ++ - Sprache außerhalb des Büros bekannt machen? Ehrlich gesagt denken wir, dass es 50/50 gibt. Einerseits gab es sehr interessierte Personen, die unsere Vorlesungen nicht nur besuchten, sondern später auch überarbeiteten, nach zusätzlichen Informationen zu einem bestimmten Thema suchten und für die nächste Vorlesung voll bewaffnet waren. Ja, es gibt Vorbereitung! Es gab einen Fall, in dem es stark regnete und ein Mann nass durchkam, um die Lektion nicht zu verpassen. Das verstehe ich - Eifer! Andererseits gab es anfangs mehr Leute, die unseren Kurs „von außen“ besuchen wollten als am Ende. Ich habe mindestens drei Gründe dafür:

  1. Die Basis von CA waren Studenten, und nachdem sie sich für den Kurs angemeldet hatten, hatten sie vielleicht eine bestimmte Idee zu diesem Thema, aber ihre Erwartungen stimmten nicht mit der Realität überein, denn trotz der Tatsache, dass der Kurs allgemeine Aspekte der Programmierung in C / C ++ abdeckte, viele eng fokussierte und spezialisierte Themen.
  2. Der Kurs fand im Hochsommer statt (ja, wir wissen, dass dieses Jahr kein Argument ist, besonders wenn Sie in Zentralrussland leben). Viele verließen einfach die Stadt und konnten den Kurs nicht besuchen, auch wenn sie daran interessiert waren.
  3. Es gab Arbeitsprogrammierer, die alles ohne unseren Kurs wissen :)

Abschließend möchte ich sagen, dass wir die Idee, einen eigenen kleinen Programmierkurs zu erstellen, für erfolgreich halten, da diese Erfahrung unserem Unternehmen geholfen hat, einige interne Arbeitsprozesse zu optimieren und unsere Standards zukünftigen Bewerbern zu zeigen.

Wenn Sie Fragen haben, vielleicht sogar Vorschläge oder Ideen, können Sie gerne Kommentare hinterlassen - wir werden uns unterhalten :). Und ja, danke, dass Sie diesen Artikel gelesen haben.

Link zur Auswahl der Berichte: "Modern and Effective C ++" Vkontakte und YouTube . Wir sind Ihnen dankbar, wenn Sie sie in sozialen Netzwerken teilen.

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


All Articles