In früheren Beiträgen haben wir darüber gesprochen, was unsere Studenten in Praktika machen: wissenschaftlich (zum Beispiel in JetBrains Research ) und industriell . In diesem Beitrag möchten wir Ihnen mitteilen, wie wir industrielles Programmieren unterrichten.

Kurz gesagt: In vier Kursen probiert ein ehemaliger Student ein Dutzend oder zwei Technologien und Sprachen aus, schreibt und entfernt ständig viel Code, besteht eine Codeüberprüfung durch erfahrenere Kameraden (nicht immer der erste Versuch), vertieft sich in ein Thema und verteidigt letztendlich ein aussagekräftiges Diplom. All dies findet direkt an der Universität statt und gibt ein Staatsdiplom. Und im Sommer können Sie entweder bei JetBrains, Yandex und JetBrains Research entspannen oder ein Praktikum in Russland absolvieren (wenn Sie mehr Wissenschaft wollen) oder ins Ausland gehen (Google, Facebook und andere). Jetzt genauer.
Über mich
Mein Name ist Yegor Suworow, ich studiere an der Higher School of Economics, interniert bei Google (zweimal), Asana, GSA Capital, nahm erfolgreich an internationalen Programmierolympiaden ( Schüler und Schule ) teil. Letztes Jahr habe ich das Grundstudium an der Akademischen Universität abgeschlossen und fast alles durchgearbeitet, was in der Stelle beschrieben wurde. Ich beteilige mich auch an der Entwicklung eines Software-Engineering-Schulungsprogramms und führe praktische Übungen in verschiedenen Fächern (Paradigmen und Programmiersprachen, C ++) durch.
Hauptkomponenten
In diesem Beitrag werden wir nur die Unterrichtung "Industrielle Programmierung" betrachten. Obwohl wir immer noch "Maschinelles Lernen", "Programmiersprachen" und einige andere haben, überschneiden sich die Programme in den Richtungen, insbesondere in den ersten beiden Kursen.
Das Training besteht aus drei Hauptteilen. Zuerst werde ich einen allgemeinen Überblick geben und dann werde ich detaillierter auf jeden Teil eingehen.
- Grundlegende Gegenstände . Kinder lernen vom ersten Semester an, mit ihren Händen zu arbeiten. Alle sechs Monate müssen alle "Industrieprogrammierer" 2-4 Grundfächer bestehen (und einige Fächer sind für andere Unterrichtungen erforderlich). Zweck: Einen Schüler in mehr oder weniger allen Bereichen der Programmierung zu pumpen, damit Sie durch die Ebenen der Abstraktionen auf und ab gehen können. Angefangen beim Schreiben Ihres Spielzeug-Betriebssystems mit User-Space in C mit einer Prise Assembler (für die beständigsten) und der Befehlszeile bis hin zur Bewegungssemantik in C ++ und bis hin zu Monadentransformatoren. Dies ist notwendig, um den Horizont und die Erfahrung verschiedener Programmierungen zu bilden. Wir unterrichten nicht nur Sprachen: Parallelprogrammierung, Netzwerke, Datenbanken. Und natürlich geht es in wenigen Fächern nicht um Code, aber in diesem Fall ist es egal: Zum Beispiel Software Engineering (Übersichtskurs: Warum brauchen wir Teams / Manager / Projekt- und Risikomanagement) und Schnittstellendesign (ansonsten denken sie, dass „Formen genietet sind - das ist einfach"). Es gibt auch Mathematik und Algorithmen, aber dies ist ein Thema für einen separaten Beitrag.
- Semesterpraxis . Sie müssen unbedingt ab dem zweiten Semester abgeschlossen sein. Zweck: dem Schüler die Möglichkeit zu geben, verschiedene Dinge zu tun, die größer sind als Hausaufgaben, und zu verstehen, wie es eher ist. Zu Beginn des Semesters findet eine Projektmesse statt, auf der potenzielle Forschungsleiter darüber sprechen, was Sie mit ihnen machen können. Ein Abschluss für eine Führungskraft ist übrigens optional - viel wichtiger ist, was eine bestimmte Person und Praxis dem Studenten geben kann. In einem Semester können Sie eine Desktop + Mobile-Anwendung auf Qt erstellen und verstehen, wie Sie im Allgemeinen für das gesamte Semester ohne klare technische Anforderungen (mit Schwierigkeiten) an einem Projekt arbeiten. Das nächste ist, Android auszuprobieren und das Gefühl zu haben, „einen zuverlässigen Client für das soziale Netzwerk zu schaffen“ - dies ist, wie sich herausstellt, nicht einfach, selbst wenn die Funktionalität stark eingeschränkt ist. Versuchen Sie in einem anderen Fall, eine Art maschinelles Lernwerkzeug in Python zu erstellen, und stellen Sie fest, dass Sie sich überhaupt nicht mit diesem Thema befassen möchten. Im vierten - beenden Sie den Haskell-Compiler, seien Sie entsetzt und kehren Sie zum Schatz C ++ zum Diplom zurück. Oder umgekehrt. Kommt auf den Schüler an - das ist die Bedeutung der Praxis. Infolgedessen bildet der Schüler entweder eine bevorzugte Richtung (in der Sie arbeiten und ein Diplom machen können) oder erlebt eine Reihe verschiedener Richtungen. Win-Win trotzdem. Übrigens, wenn Ihnen eines der Projekte nicht gefällt, können Sie sich ein eigenes einfallen lassen. In diesem Fall müssen Sie jedoch zuerst einen wissenschaftlichen Berater interessieren oder jemanden von außen finden und uns dann davon überzeugen, dass aus dem Projekt etwas Sinnvolles und Geschütztes entstehen kann.
- Optionale Artikel . Erscheint im dritten Jahr. Grund: Nicht jeder möchte sich mit dem Linux-Kernel befassen, genauso wie nicht jeder sich mit dem Design von Scala-Sammlungen mit tonnenweise impliziten befassen möchte. So können Sie auswählen, in welche Themen Sie sich vertiefen möchten. Wenn einem Schüler beispielsweise die Anzahl der Möglichkeiten, ein Knie im Plus zu schießen, nicht gefallen hat, kann er einen Kurs über Containervirtualisierung unter Linux belegen, in reinem C schreiben und glücklich sein. Und umgekehrt: Wenn das Handbuch 3 für Entwickler von Intel 64- und IA-32-Architekturen immer noch Albträume hat, können Sie mit Abstraktionen von Einhörnern in die wunderschöne Welt von Scala eintauchen. In jedem Modul (ein halbes Semester) werden ca. 4 Kurse angeboten, von denen zwei ausgewählt werden sollten.
Darüber hinaus möchten wir, dass die Schüler Spaß am Lernen haben. Sie können jederzeit mit Programmmanagern chatten und Verbesserungen in jedem Bereich vorschlagen. Wir sammeln viermal im Jahr Feedback und - beachten - berücksichtigen es und verbessern das Programm ständig. Wir rekrutieren nicht speziell viele Studenten, damit wir die Möglichkeit haben, persönlich mit allen zu sprechen. Es gibt 30 Studenten im zweiten und dritten Jahr und im vierten Jahr - 15.
Auf Wunsch der Schüler erstellen oder suchen wir ständig neue Kurse. Wir suchen gute Lehrer, die das Fach verstehen und unterrichten können. In diesem Modul wurde in nur wenigen Wochen ein experimenteller Reverse Engineering-Kurs von SPbCTF erfolgreich durchgeführt. Und wenn Sie keinen geeigneten Kurs finden, können Sie nach Vereinbarung etwas Sinnvolles mit dem Computer Science Center , ShAD oder Coursera durchgehen .
Grundlegende Gegenstände
Grundlegende Programmierfächer: C ++, Unix-ähnliche Systeme, Paradigmen und Programmiersprachen, Computerarchitektur, Java, Betriebssysteme, funktionale Programmierung, Datenbanken, Software-Design, Software-Engineering, parallele Programmierung, Computernetzwerktechnologien, Schnittstellendesign, mobile Entwicklung.
Zusammen decken diese Themen fast alle Aufgaben ab, die bei der Arbeit auftreten können. Sie schützen auch vor verschiedenen "klassischen" Fehlern, wie dem Vergleich von Gleitkommazahlen mit ==, den Erwartungen an die Angemessenheit von undefiniertem Verhalten, den Rennbedingungen und dem Vorhandensein von Entwurfsmustern und Nicht-Programmierer-Aufgaben in der Produktentwicklung.
Natürlich bekommen die Schüler während des Lernprozesses ständig „das Labor und die Hausaufgaben in die Hand“. Nehmen wir etwas Klassisches, zum Beispiel die Implementierung des Archivierers auf dem Huffman-Algorithmus. Es ist nicht so schwierig, es „irgendwie arbeiten zu lassen“. Um jedoch eine gute Architektur des Projekts zu erstellen (zumindest um die Eingabe / Ausgabe, die Bitkomprimierung und den Algorithmus selbst zu trennen), sollten Sie die Funktionen von C ++ (die Regel von drei oder fünf je nach Halbjahr) korrekt verwenden und den Code im Allgemeinen so gestalten, dass er angenehm zu lesen und nicht völlig peinlich ist Open Source - eine separate Kunst, die Lehrer in einem C ++ - Kurs unterrichten, ständig mit den Schülern kommunizieren und alle Codezeilen im Detail analysieren. Bei den übrigen Themen ist es ähnlich. Kein Kurs ist auf theoretische Tests beschränkt. Zu allen Themen mit Code wird eine Codeüberprüfung durch einen erfahrenen Programmierer durchgeführt.
C ++ . Das erste Studienjahr. Beginnend mit C, endend mit C ++ 14. Wir zeigen RAII, Valgrind und Autotests, wir lernen, sowohl Bibliotheken (my_vector mit Ausnahme von Garantien) als auch Anwendungen (der gleiche Archivierer) zu schreiben. Warum: Da C ++ in der Branche immer noch aktiv verwendet wird und mit der Systemprogrammierung in Resonanz steht (mangelnde Speicherbereinigung, können Sie das Layout der Daten im Speicher anzeigen ...).
Unix-ähnliche Systeme . Erstes Semester. Der Kurs des jungen Kämpfers zur Arbeit mit der Befehlszeile und dem Dateisystem ohne C:\
und D:\
. Beispiel für eine Testarbeit: Auf dem Paar ist das Image eines leicht defekten installierten Ubuntu zu hören, es muss repariert werden. Ein Beispiel für eine Hausaufgabe: Gehen Sie die Dateien in einem Ordner auf Bash durch und rufen Sie jemanden an, der mit regulären Ausdrücken nützlich ist.
Paradigmen und Programmiersprachen . Erstes Semester. Ein Dutzend Themen (mindestens OOP, funktionale Programmierung, SQL, Multithreading) und jedes Thema, das die Schüler ausprobieren können, können ein oder zwei Hausaufgaben anprobieren. Natürlich ganz oberflächlich, aber es gibt immer noch ein Verständnis dafür, wie vielseitig die Programmierung ist und welche coolen Dinge mit verschiedenen Methoden zusammengestellt werden können. Sowohl OOP, FP als auch SQL werden dann detailliert beschrieben, aber bereits im ersten Jahr weiß der Schüler über ihre Existenz Bescheid und kann beispielsweise Aussagen im Code arrangieren oder ein paar einfache Komponententests schreiben, wenn er möchte.
Computerarchitektur . Erstes Jahr. Register, eine Zusammenstellung von etwas Computerähnlichem aus logischen Gattern, Caches, einer Prozessorpipeline, der Darstellung von Zahlen und anderer Theorie. Warum: Binden Sie Informationen über alle Arten von Dingen auf niedriger Ebene zu einem einzigen Bild zusammen.
Java Zweites Studienjahr. Es endet mit Streams und einem Kursprojekt für Android (z. B. Spielen eines rekursiven Tic-Tac-Toe mit einem Bot- und Netzwerkmodus). Wir zeigen Maven, IDEA, JUnit, asynchrone Arbeit mit dem Netzwerk. Warum: In der JVM drehen sich jetzt viele Dinge, es gibt Unmengen von Bibliotheken, das ist gut zu wissen.
Betriebssysteme . Zweites Jahr. Hardcore Keine langweilige Aufregung mit Bootloadern - die Schüler erhalten im Fertighaus Multiboot und wechseln in den geschützten Modus. Anschließend können Sie einen Speicherzuweiser, Threads, Prozesse, ein Dateisystem, eine Partitionierung des Schutzrings und sogar das Laden von ELF in C schreiben. Vielleicht nicht so umfangreich wie Tannenbaums "Moderne Betriebssysteme", aber Sie können deutlich sehen, ob es interessant ist, sich überhaupt damit zu beschäftigen oder in einem isolierten Benutzerbereich zu bleiben. Bei Interesse können Sie einen speziellen Linux-Kernel-Programmierkurs besuchen. Übrigens ist auf Stepik eine sehr leichte Version verfügbar - dort wird kein Betriebssystem geschrieben, aber es gibt die erforderlichen theoretischen und verifizierenden Aufgaben. Um wegen schlechter Leistung nicht herauszufliegen, gehen Sie es einfach durch.
Funktionsprogrammierung . Zwei Klassen auf Lambda-Kalkül und ging dann nach Haskell. Wir enden mit Transformatoren von Monaden. Natürlich ist alles detailliert: Eine Monade ist keine Box, sondern nur eine nützliche Abstraktion einer solchen Vorlage zum Schreiben von Code. Zwischenprojekte sind jedoch eher theoretisch als praktisch - schreiben Sie eine automatische Typinferenz in die Lambda-Rechnung. Jetzt wird jedoch die Fortsetzung des Kurses vorbereitet (als zusätzliches Fach des Masterstudiengangs), wo Multithreading und ein Webserver geplant sind. Lesen Sie auch im Computer Science Center .
Datenbanken Wir lernen relationales DBMS (am Beispiel von PostgreSQL), SQL, kennen. Wir entwerfen eine Datenbank für einen bestimmten Themenbereich und arrangieren dann eine Codeüberprüfung für einander, basierend auf den Anweisungen des Lehrers. Anschließend führt der Lehrer eine Überprüfung des Codes durch. Wettbewerbe des Formulars "Schreiben Sie eine solche Anfrage für diese Datenbank". EXPLAIN-Jobs (Simple Profiling Queries). Wiederum wiederholt sich der Kurs im Computer Science Center .
Softwareentwicklung . Er spricht darüber, wie die Arbeit eines Programmierers arrangiert werden kann, was alle anderen im Unternehmen tun, warum gute Manager immer noch nützlich sind und warum das Verwalten von Projekten ebenfalls schwierig ist. Was ist der Sinn der Planung, warum es nicht immer funktioniert, warum nicht alle Fehler behoben werden müssen ... Das Ziel ist es, zu verstehen, was für andere Projekte als Menschen benötigt wird. Natürlich ist es unrealistisch, alles in einem Semester detailliert offenzulegen, aber zum Beispiel ist es nützlich zu wissen, dass es nach der Entwicklung des Projekts immer noch keine weniger wichtige Unterstützung gibt.
Software-Design . Alle Arten der Modellierung der Realität und (UML-Diagramme), Zerlegungsmethoden, Entwurfsmuster. Als Beispiele verstehen wir am Ende des Kurses GFS, BigTable, CMake ... In der Praxis lernen wir nicht nur, Code zu schreiben, sondern auch die Architektur zu beschreiben und Vorlagen dort anzuwenden, wo sie angemessen sind.
Gleichzeitige Programmierung Wir beginnen mit einfachen Threads und Mutexen, am Ende analysieren und schreiben wir sperrfreie / wartefreie Algorithmen, dringen in MESI ein, studieren übergeordnete Technologien wie Fork-Join-Framework, OpenMP, OpenCL, Intel TBB.
Computernetzwerktechnologie . Vorlesungen: Ein detaillierter Überblick über die wichtigsten Protokolle des TCP / IP-Stacks: Nachrichten in ICMP, ein historischer Ausflug in RIP, alle Arten von Datensätzen in DNS, die Funktionsweise von FTP / HTTP / SMTP / DHCP, was NAT ist und sogar ein wenig über IPv6. Praktiken: Wir schreiben auf die Pluspunkte unseres plattformübergreifenden TCP-Clients und -Servers, zuerst für den Toy Messenger und dann für den UDP-Client für DNS.
Schnittstellendesign Der Schüler schreibt keine einzige Codezeile, sondern durchläuft alle Phasen des Entwurfs einer guten Benutzererfahrung: Er erstellt ein Projekt, führt Recherchen durch (einschließlich einer Umfrage unter realen Personen), entwickelt und überprüft Verwendungsszenarien und am Ende können Sie eine Oberfläche in Sketch oder Figma zeichnen . Das Ziel ist es zu verstehen, dass Sie für ein gutes Produkt nicht nur Code, sondern auch eine Reihe anderer vorbereitender Arbeiten benötigen. Die Codeüberprüfung ist nicht hier, aber alle Zwischenartefakte werden aktiv mit dem Lehrer besprochen. Es erscheint mir unrealistisch, die Hausaufgaben beim ersten Versuch zu bestehen (dies ist jedoch nicht erforderlich).
Mobile Entwicklung . Fortgeschrittener Android-Entwicklungskurs. Wir schreiben bereits mehr über Kotlin als über Java, wir verwenden alle möglichen Kotlin-spezifischen Dinge für Android. Im Vergleich zum Java-Projekt ab dem zweiten Jahr ist die Anwendung hier komplizierter, wir arbeiten mehr mit externen Abhängigkeiten und Bibliotheken, wir denken mehr über die Benutzeroberfläche und die Benutzer nach (hier hat der Kurs etwas mit dem Schnittstellendesign gemeinsam).
Softwaretests . Grundsätzlich gibt es eine Menge Theorie, die alle Standardpraktiken benennt, die die Schüler wahrscheinlich in anderen Fächern erfunden haben: Testen des Kontrollflusses oder Datenflusses, Paartests (All-Pair-Tests) ... Es gibt auch einige spezifische Praktiken - einen Testplan für solche und solche zu erstellen die Technik, extreme Fälle in einer solchen und einer solchen Anwendung zu finden und mehrere Szenarien in einer Webanwendung mit Selenium auszuführen, so dass es nicht langweilig wäre, Fälle einfach zu komponieren.
Big Data Software Engineering, auch bekannt als Big Data Software Engineering. Lesen Sie zusammen mit dem Computer Science Center . Wir verbinden Datenbanken, parallele Programmierung, verteilte Systeme und andere Schlagworte - diese sind in Vorlesungen. In der Praxis haben die Schüler letztes Jahr ihr verteiltes Telefonbuch von Grund auf neu geschrieben. Bei den nächsten Starts scheint es richtig, den Schwerpunkt von einem niedrigen Niveau auf Werkzeuge zu verlagern, die tatsächlich in der Branche verwendet werden, wie Zookeeper, Cassandra und andere beängstigende Tiere. Bisher besteht die Hauptschwierigkeit darin, die „Big Data“ -Bedingungen für Schüler zu emulieren und ihre Lösungen zu bewerten: Es ist nicht erforderlich, Zookeeper zu erhöhen, wenn es keinen klaren Beweis dafür gibt, dass ohne sie alles sehr schlecht ist.
Übe
Der zweite wichtige Teil des Trainings ist die Praxis. Ab dem ersten Jahr erledigt der Student unter Anleitung eines erfahrenen Kollegen einige praktisch nützliche Aufgaben. Zum Beispiel eine andere Anwendung zum Verwalten eines Kalenders oder von Notizen. Oder neue Funktionen in einer vorhandenen Anwendung. Oder es untersucht die Berechenbarkeitskomplexität einer Formelfamilie, wenn sie in Richtung Informatik gebracht wird.
In den ersten Kursen benötigen wir keine Neuheit oder Praktikabilität (schließlich ist es das Ziel, etwas Spiel zu geben), aber die Anforderungen an die Diplome für die Qualität von Projekten und den Schutz steigen. In den letzten Kursen zusätzlich zu der Frage "Was wurde getan?" Für die Schüler ist es wichtig zu sagen, warum und warum. Gleichzeitig ist „Ich möchte wirklich dieses spezielle Unternehmen, in dem mein Forschungsleiter arbeitet“ an sich nicht die Antwort. "Dort sterben Festplatten jede Sekunde, daher funktioniert Open Source nicht. Dieser Artikel ist rein theoretisch, aber Google hat eine Lösung, aber sie ist geschlossen." Es wird nicht als Diplom funktionieren, um eine unnötige Übung ab dem zweiten Jahr zu schützen - neugierige Entwickler mit Laptops und Google sind bereit, sich zu verteidigen (und einige Vorverteidigungen). "Das hat noch niemand gemacht" - praktisch das Gefährlichste, was man sagen kann. Übrigens verteidigen wir nicht nur Diplome, sondern auch Praktiken regelmäßig ab dem ersten Jahr.
Hier sind einige Fotos mit typischem Schutz. Fotograf: Dima Drozdov.


Mithilfe von Übungen können Sie lernen, wie Sie mit großen Projekten, die manchmal teilweise von anderen Entwicklern geschrieben wurden, „auf lange Sicht“ arbeiten. Es ist nicht immer möglich, mit dem Thema des Projekts zu raten: Wenn ein Student beispielsweise eine Entwicklung auf niedriger Ebene versucht hat, kann er sich entscheiden, sich in Zukunft darauf einzulassen. Dies ist die Bedeutung der Praxis: zu verstehen, was Sie mögen und was nicht, nicht bei der Arbeit, sondern unter Bedingungen mit niedrigeren Raten. Obwohl sich die letztere Praxis zu einem substanziellen Bachelor-Abschluss entwickeln sollte. "Substantiv" ist, wenn man laut Diplom zumindest einen Artikel über Habr schreiben kann und nicht ins Minus geht. Oder, wenn die Arbeit sehr gut ist, veröffentlichen Sie sie in einer wissenschaftlichen Zeitschrift, sprechen Sie auf einer Konferenz oder sammeln Sie zumindest die Pluspunkte.
Wahlpflichtige
Der dritte, aber auch wichtige Teil sind zusätzliche Punkte. Die Themen sind spezifisch und werden wahrscheinlich nicht von jedem benötigt, aber interessierte Schüler können sie probieren. In Seniorenkursen gibt es die meisten dieser Fächer: Es gibt eine Basis, es bleibt, unseren Horizont in eine für den Studenten interessante Richtung zu erweitern. Leider bleibt nicht genügend Zeit, um alle Gegenstände aufzunehmen. Manchmal ändert sich die Anzahl der Kurse, hier sind die, die mir angeboten wurden:
Alternative Sprachen für die JVM . Ein Kurs aus zwei Modulen: In einem sprechen sie über Kotlin, im anderen über Scala. Für Kotlin analysieren wir sowohl Java Interop als auch das Schreiben von DSL und Coroutinen. Die letzte optionale Hausaufgabe besteht darin, dem Spielzeugsprachdolmetscher (in den vorherigen Hausaufgaben geschrieben) einen Debugger mit Corutin hinzuzufügen. Was Scala betrifft ... Die Sprache ist groß, aber wir haben Zeit, alle Arten von Implikationen zu verstehen :)
Programmierung im Linux-Kernel . Schritt für Schritt wird ein Kernelmodul entwickelt, das ein virtuelles Speichergerät emuliert: mmap, Puffer, gleichzeitiger Zugriff, nicht blockierende E / A. Unterwegs können Sie Unterbrechungen und das Verdrängen von Multitasking aus dem Verlauf von Betriebssystemen abrufen und die internen Strukturen von Linux untersuchen (z. B. Warteschlange).
Compiler Wir schreiben unseren mikrosprachlichen Compiler in OCaml. Eine Zwischenstapelmaschine, Kompilierung in x86 ohne LLVM, Integration mit libc. Überraschte Ausrufe von Studenten "Warum fällt es nur auf den Ausdruck einer Länge von hundert?" (wahrscheinlich, weil der Fehler in der Registerzuordnung liegt). Ein ähnlicher Kurs ist übrigens auch im Computer Science Center verfügbar.
Computergrafik . Relativ niedriger Kurs: Wir studieren OpenGL, schreiben unsere Shader für Schatten und verzögertes Rendern, vergleichen die Farbmischung mit und ohne Gammakorrektur.
Erstellen eines DBMS . Interne Gerätedatenbank. Alle Arten von Verbindungsalgorithmen, formalen Modellen, Spalten-DBMS. In der Praxis können Sie mehrere blockweise Verarbeitungsalgorithmen in einem Spielzeug-DBMS mit Pluspunkten implementieren (z. B. doppelt Pipeline-Hash-Join).
Containervirtualisierung . Eine detaillierte Studie über Container unter Linux. Zum Beispiel Namespaces und cgroups - und die API und wie sie funktioniert. Alle Arten von Hilfstools für das Netzwerk. Dabei schreiben wir unseren Container wie Docker, aber es ist nicht so einfach - Sie müssen eine Menge von allem korrekt einschränken, das Netzwerk konfigurieren, die erforderlichen Dateien an den Container weiterleiten ... Die Orchestrierung auf hoher Ebene am Beispiel von Kubernetes wird jedoch ebenfalls berücksichtigt.
Was wir verbessern wollen
Sowohl wir als auch unsere Schüler sind mit dem resultierenden Programm eher zufrieden (nach den Umfragen zu urteilen). Sie können es jedoch noch besser machen, indem Sie nicht nur vorhandene Elemente verbessern, sondern auch neue hinzufügen.
Beispielsweise ist noch unklar, wie bestimmte Aspekte der „Berufserfahrung“ an die Universität übertragen werden sollen. Die gleiche Arbeit mit Legacy-Code - nützlich? Und dann. Es gibt sogar Bücher und spezielle Techniken. Um daraus einen guten Kurs zu machen, müssen jedoch mehrere Faktoren kombiniert werden:
- Lenken Sie die Lehrer nicht lange von ihrer Hauptarbeit ab, damit sie den Schülern ständig helfen, ein großes Projekt zu verstehen. Und wenn es eine gute Dokumentation gibt - dann ist dies nicht mehr so, dass Legacy.
- Studenten sollten interessiert sein. "Fügen Sie einem nicht benötigten Projekt tausend Codezeilen hinzu" ist nicht enthalten.
- Das Ergebnis sollte vorhersehbar sein. "Es scheint, dass dies eine unlösbare Aufgabe ist, sorry, sie haben nicht gedacht" - schlechte Nachrichten nach den Ergebnissen der Überprüfung der Hausaufgaben.
Leider haben wir noch nicht herausgefunden, wie das geht. Am nächsten geht es in Richtung maschinelles Lernen, wo jede Woche Seminare abgehalten werden, in denen die Schüler einige der neuesten Artikel präsentieren. Vielleicht kann diese Erfahrung auf die industrielle Programmierung übertragen werden.
Möglicherweise sind die einzigen Bereiche, die derzeit nicht behandelt werden, die Webentwicklung (einschließlich des Frontends), komplexe Automatisierungssysteme (wie 1C oder SAP) und die Computersicherheit (ein Anfang Februar 2019 begonnener experimenteller Kurs). Wir haben vielleicht etwas anderes vergessen, oder Sie wissen, wie Sie das Programmieren noch besser lehren können - wir werden es gerne in den Kommentaren besprechen.
Wir glauben jedoch, dass Absolventen, die bereit sind zu arbeiten und die gegebenenfalls speziell unterrichtet werden müssen, dann vielleicht die internen Systeme des Unternehmens, bereits das Abitur verlassen. Übrigens ist ein separates Thema, über das wir jetzt nachdenken und das wir umsetzen wollen, das, was wir nach einer so dichten Reihe von Kursen in einer Magistratur studieren müssen, aber dies ist ein Thema für einen separaten Beitrag.