Welches Level sollten Programmierprojekte haben bevor man sie auf Github hochladen sollte und sie potenzielle Arbeitgeber sehen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ich würde dir dazu raten, erst einmal Projekte nahezu ungefiltert zu sammeln. Die können auch jetzt schon auf deinen GitHub-Account. Wieder hinauswerfen kannst du sie später immer noch.

Das können soweit auch Experimente mit neuen Technologien (Frameworks/Bibliotheken) oder die Implementation bestimmter Algorithmen (wie Dijkstra, A*, o.ä.) sein. Innerhalb deines Studiums wirst du bestimmt auf mehrere interessante Ideen/Sachverhalte stoßen. Sei es die Visualisierung der Einfügeoperationen eines AVL-Baums, die Implementation einer Conways Game Of Life-Variante oder die Programmierung einer mobilen App. Nicht zu vergessen wäre, dass bei einem Studium noch eine Abschlussarbeit ansteht, in der man sich ja ebenso einem Thema mit praktischer Realisierung widmen kann.

Nur Anfängeraufgaben, die du selbst sicherlich auch nicht interessant finden würdest (wie Hello World, eine Einmaleins-Ausgabe, Taschenrechner, ...) wären auf jeden Fall Speicherplatzverschwendung.

Wenn du dich dann einmal dem Zeitpunkt einer Bewerbung näherst, kannst du die Projekte noch einmal überblicken. Zum einen können sie Anreiz für darauf aufbauende Projekte liefern, zum anderen sind vielleicht schon präsentierbare Exemplare dabei. Maximal drei Projekte würde ich für eine Präsentation wählen. Du könntest sie beispielsweise auf einer GitHub Page vorstellen.

Bei der Wahl würde ich folgende Kriterien einfließen lassen bzw. bestimmte Grundfragen stellen:

  • Was möchtest du dem potenziell künftigen Arbeitgeber mit dem Projekt zeigen / In welchem Bezug steht das Projekt zur angebotenen Kompetenz oder dem Leistungsfeld des Zielunternehmens?

Wenn du dich beispielsweise als Spieleentwickler bewirbst, kannst du durchaus eine Ruby-Webanwendung zeigen, sofern du in deinem Bewerbungsschreiben auch ein überzeugendes Argument findest, welches mit dieser Arbeit zeigt, dass du für die beworbene Rolle geeignet bist.

Das heißt, Projekte dienen als Beleg für die Thesen, die du in deinem Bewerbungstext aufstellst.

Beispiel:

In meiner Studienzeit habe ich mich intensiv mit der Spieleentwicklung auseinandergesetzt und dafür basierend auf SFML eine eigene Game Engine (GitHub-Link) entwickelt.

Oder man erwähnt GitHub in einem separaten Satz, wenn man im gesamten Text verschiedene Projekte erwähnt.

Die angesprochenen Projekte stelle ich auf dieser Seite: GitHub-Page detaillierter vor.

Eine kommentarlose Angabe eines GitHub-Links würde ich hingegen negativ bewerten.

  • Wie kannst du das Projekt präsentieren?

Wenn sich jemand deine Projekte anschaut, besteht eher wenig Interesse daran, sie auszuprobieren. Leicht aufrufbare Demos (also in der Regel bereits gehostete Webanwendungen) wären da noch die wahrscheinlichste Ausnahme. Fehlende Zeit und Sicherheitsbedenken dürften die Hauptgründe dafür sein.

Des Weiteren solltest du bedenken, dass eine Bewerbung nicht zwingend von einer Person bewertet werden muss, die tiefe Fachexpertise hat (und intern erfragt). Schlagworte wie der Name der Programmiersprache sind sicherlich geläufig, doch dann hört es vielleicht schon auf. Projekte mit Praxisbezug wären daher vorteilhaft.

Wenn du dich also mit speziellen Algorithmen auseinandersetzt, dann finde auch einen Weg, sie in einem Kontext einzusetzen, der visuell repräsentierbar ist (Beispiel: ein Arduino-gesteuerter Roboter, der mittels Wegfindungsalgorithmus patrouilliert) oder sich leicht erklären lässt.

Für eine greifbare Präsentation sind Screenshots oder animierte GIFs eines der besten Mittel. Wenn du ein Projekt textuell beschreibst, dann erst in 2-3 zusammenfassenden Sätzen. In einem nächsten Absatz kann eine detailliertere Beschreibung erfolgen.

All das (Bilder, Beschreibung) gilt natürlich nur für ein externes Portfolio (GitHub Pages o.ä.). Im Bewerbungsschreiben reduzieren sich Projektbeschreibungen eher auf einen Halbsatz (wie im SFML-Beispiel oben).

  • Zeigt das Projekt eigene Ideen und die Art, wie du strukturierst?

Ein Projekt, welches zum Großteil aus Boilerplate-Code besteht, besitzt kaum Aussage über deine eigene Fähigkeit, kreativ zu denken. An einem Projekt, welches nur aus einer Datei besteht oder je Datei nur 20-30 Zeilen Code, sieht man wenig strukturelle Planung.

Wenn denn nun eine Person mit technischer Expertise deine Bewerbung prüft (vielleicht der technische Leiter oder ein Senior Entwickler), dann wären die oben angesprochenen Punkte die, die von besonderer Interesse wären. Sie verraten etwas über deine Arbeitsweise und dein Niveau.

Damit ich allerdings nicht missverstanden werde: Das bedeutet nicht, dass du in eigenen Projekten das Rad neu erfinden sollst. Der Einsatz von Bibliotheken/Frameworks kann ja ebenso ein Beleg dafür sein, dass du auch bereit bist, dich in fremde Themen einzuarbeiten.

An der Stelle zuletzt noch zum Stichwort Kreativität: Wenn du so etwas wie dein Space Invaders vorzeigen wolltest, würde ich doch noch nach Features suchen, die das Projekt technisch interessanter, individueller und anspruchsvoller gestalten. Auch wenn SFML schon eine erste fremde Komponente ist, in du dich hineinarbeiten musstest, haut ein klassisches Space Invaders sicherlich niemanden vom Hocker. Oder um es fieser zu formulieren: Internettutorials zum Abschreiben solchen Codes findet man sicherlich schnell. Woher soll man wissen, dass dein Code eine Eigenleistung war?

Klassische Aufrüstmittel wären irgendeine Art Netzwerkkommunikation (z.B. eine Highscore-Tabelle, die Spieler unterschiedlicher Rechner berücksichtigt) oder der Einbau weiterer grafischer Effekte und neuer Spielfunktionen (suche auf YouTube z.B. nach Videos zu Space Invaders Extreme).

Valentin1720653 
Fragesteller
 22.09.2022, 09:38

Erstmal vielen Dank für dass du dir die Mühe gemacht hast mir so eine ausführliche Antwort zu schreiben, ich hab irgendwie nicht damit gerechnet dass ich noch eine so gut und ausführliche Antwort bekomme :)

Dass die Person die meine Bewerbung liest im Zweifelsfall sich so oder so nicht mit der Materie auskennt war auch mein Gedanke, ich denke daher dass du mit vielem Recht hast.

Das Problem ist leider so ein wenig, dass mein Studium halt "Uni" und "Wirtschaftsinformatik" ist, d.h wirkliche Programmierprojekte haben wir überhuapt nicht...

Wir hatten jetzt 2 Module Programierparadigmen und dann kommt noch ein Modul Softwaretechnik und ein Modul Verteilte Anwendungen, das war's! Und ich bin damit halt irgendwie ziemlich unzufrieden.

Und da ich vor der Uni noch nie wirklich programmiert habe, komme ich bei größeren Dingen doch irgendwie relativ schnell an meine Grenzen.

Ich denke daher ich werde es so machen wie du es geschrieben hast; GitHub nur als zusätzliches Mittel zu verwenden wenn es sich anbietet.

Ich habe das was ich die letzten Tage gemacht habe Mal hochgeladen https://github.com/ValentinMro/Small-C-SFML-Space-invaders-clone wenn du Zeit und Lust hast kannst du dir es ja Mal anschauen und was dazu sagen ☺️

Vielen Dank für deine Antwort.

0
regex9  22.09.2022, 20:43
@Valentin1720653

Ja, dem Studium an einer Uni wird meist eine größere Theorieballast nachgesagt. Auf einer FH wäre der Praxisanteil in der Regel größer.

Ich würde dir raten, einmal mit deinen Dozenten zu reden, um in Erfahrung zu bringen, wie sich deine Bedürfnisse / Erwartungen mit dem Studium besser vereinbaren lassen. Entweder du bekommst eine Antwort, die dir mehr Eigenverantwortung zuschiebt (und dazu vielleicht konkrete Vorschläge - Themenschwerpunkte, Projektideen, Literaturverweise) oder vielleicht kann man dir auch Mut machen, dass es mit den kommenden Fächern praktischer wird. Allenfalls würde es dir helfen, für die Zukunft zu planen. Vielleicht kann ein anderer Studiengang (oder eine andere Hochschule) deine Wünsche stärker ansprechen.

Ansonsten kann ich nur vorschlagen, Themen aus den anderen Fächern zu sammeln (Datenverarbeitung und -analyse würden mir direkt einfallen) und zu denen Anforderungen für Programme abzuleiten oder nach Tools zu suchen, die mit Themen in Bezug stehen und über eigene Module erweiterbar sind. Es gibt z.B. Frameworks für Risikomanagementanalysen, ERP und CRM, MATLAB lässt sich mit eigenen Modulen erweitern, usw.. Da ich in dem Feld kein Experte bin, würde ich erneut empfehlen, dass du dir Rat bei deinen Dozenten einholst. Vielleicht gibt es konkrete Tools, die du als Student frei nutzen kannst (z.B. irgendein Framework XY) und die relevanten Praxisbezug haben.

Mit Techniken zum Aufbau komplexer Software sollte sich das Fach Softwaretechnik näher auseinandersetzen.

(...) wenn du Zeit und Lust hast kannst du dir es ja Mal anschauen und was dazu sagen (...)

Die Aufteilung in Klassen wirkt ok. Es ist gut, dass du in Header- und Implementationsdateien separierst und deine Variablen/Funktionen klar benennst.

Folgende Punkte sind mir ins Auge gefallen und würde ich ändern:

1) Klassennamen beginnen nach Konvention stets mit einem Großbuchstaben. Felder / Variablen hingegen mit einem Kleinbuchstaben. Bei dir ist es derzeit andersherum.

Ich würde zudem für jedes Feld eine eigene Zeile nutzen (siehe window.hpp).

private:
  sf::Texture backgroundTexture;
  sf::Texture alienTexture;
  sf::Texture playerTexture;
  /* etc. */

Zeilen, die in die Breite gehen (und zudem Aufzählungen enthalten), sind nicht so schnell überblickbar.

2) Auch wenn man es auslassen kann, würde ich bei der main-Methode stets die explizite return-Anweisung mit aufschreiben. Immerhin gibt der Funktionskopf selbst ja auch an, dass eine Rückgabe erfolgen wird.

return 0;

In älteren C++-Versionen würde die fehlende return-Anweisung ein undefiniertes Verhalten auslösen.

3) Schau noch einmal, ob du einige Konstanten gegen Makros austauschen kannst. Auch bestehende nutzt du noch nicht einheitlich.

Also statt:

window.create(sf::VideoMode(1920, 1080), "Space Invaders");

besser:

window.create(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "Space Invaders");

4) Ich weiß, dass viele Quellen immer wieder C-Arrays in C++ benutzen. Aber eigentlich gibt es in C++ einen eigenen Typ dafür (std::array). Ziel wäre es, C und C++ möglichst wenig zu mischen.

5) Bei

if (i == 33) {
  // ...
}

if (i != 33) {
  // ...
}

müssen in jedem Fall zwei Ausdrücke geprüft werden, selbst wenn i dem Wert 33 entspricht. Das kannst du dir mit einem if-else ersparen.

if (i == 33) {
  // ...
}
else {
  // ...
}

Wenn du hingegen mehrere Vergleiche hast, bei denen stets nur einer zutrifft, wäre ein if-else if-else- oder ein switch-Konstrukt passend.

6) Für Spielfiguren wie die Aliens würde ich eine extra Klasse anlegen, die sich Textur und Position merkt. Die Instanzen werden in einem std::vector gehalten (das wäre im Prinzip ein dynamisches Array). Wenn ein Alien abgeschossen wurde, wird es aus dem Vektor entfernt.

1
Valentin1720653 
Fragesteller
 22.09.2022, 21:20
@regex9

Danke nochmals :)

Zu 1:

Also an sich habe ich tatsächlich vieles von dem was du genannt hast schon gemacht, einiges ist aber leider nicht so wirklich zu ändern.

Das Institut für Wirtschaftsinformatik ist an der Uni Leipzig leider relativ klein und besteht nur aus 3 Professuren, wobei nur ein einziger Professor für Softwareentwicklung zuständig ist, und quasi alle Module diesbezüglich macht.

An sich bin ich mit der Vermittlung von Konzepten ja nicht unzufrieden, im Gegenteil. Ich finde dass ich sehr viel von dem was uns anhand von c++ beigebracht wurde auch in anderen Sprache wiederfinde, die Vorlesungen bestehen aber leider in erster Linie daraus dass wir uns Code anschauen und der Professor und zeigt wie er etwas gemacht hat.

Ich weiß nicht, aber ich kenne es zB von anderen Uni dass es dort diese Theorievorlesungen gibt, jedoch auch ein praktisches Projekt dazu kommt, das ist bei uns aber leider nicht so.

An sich verstehe ich mich mit dem Professor super (ich arbeite bei ihm nächstes Semester als Tutor), er meinte aber aber zu mir dass sich für unseren "Jahrgang" daran leider nichts ändern wird, da das Modul komplett neu war.

An sich hat er mir sogar Recht gegeben dass ich mit meinen wünschen an einer FH mit reiner Informatik wahrscheinlich besser aufgehoben wäre.

An sich habe ich mich aber dagegen entschieden zu wechseln, aus dem einfachen Grund weil ich mit den Wirtschaftsmodulen aus den ersten 2 Semestern nichts machen könnte, und ich mit generell kaum etwas anrechnen lassen könnte.

An sich wird es also auf Eigenverantwortung hinauslaufen, und der Professor hat mir auch schon die ein oder andere Idee gegeben (u.a zB in alogrithmen und Datenstrukturen nächstes Semester diese mit c++ und SFML zu visualisieren, was an sich eigentlich echt cool klingt)

Was mich eigentlich mehr störrt ist dass ich glaube elementare und wichtige Dinge die an anderen Unis gelernt werden nicht mitbekomme.

Ich habe jetzt z.b gehört dass funktionale Programmierung immer mehr an Bedeutung gewinnt, und es gibt leider keinerlei Modul was ich belegen könnte wo ich das beigebracht bekomme, das ist eigentlich das was mich am meisten ärgert, da viele das von einem "guten SE" erwarten.

Zu 2:

Ich werde die änderungen übrrnehmen, dazu würde ich die membervariablen noch in m_var umbenennen, wurde uns auch so beigebracht dass das Konvention ist.

An sich merkt man wahrscheinlich dass ich "Versuche" das aus der Uni irgendwie anzuwenden, aber vieles dann doch so programmiere dass es halt "funktioniert". Auch der Algorithmus zum Bewegen der Aliens gefällt mir zB überhaupt nicht.

Auch das mit den C-arrays ist so eine Sache. Jetzt wo du es sagst hast du natürlich Recht; es gibt eigentlich keinen Grund nicht die STL-Container zu verwenden. Und selbst da gibt es ja den Std::Array<> der im Prinzip das gleiche wäre.

Es zieht sich leider ziemlich durch wie ich finde, dass ich viele der Konzepte aus der Vorlesung zwar verstanden habe, aber sie nicht wirklich anwenden kann.

Praktisch alles was wir zu Objektorientierung gemacht haben fällt mir hier schwer, (ich dachte vielleicht an eine entity Klasse und dann player-entity, fireball-entity usw) aber da ist mir dann irgendwie nix sinnvolles eingefallen.

Und dazu zB auch sehr vieles mit Templates. Unser Professor hat in diesem Bereich extrem viel Forschung betrieben, und hat uns fast ein halbes Semester damit "abgequält" 😂. Ich hatte das am Ende als einer der wenigen des Kurses zwar kapiert, aber das ich kann es um Gottes Willen nicht anwenden.

Templates als Ersatz für Funktionsüberladen zu verwenden geht zwar noch, aber zB bei Template Template Parameter oder Variadic Templates muss ich passen. War zwar am Ende irgendwie "cool" zu sehen was man damit machen kann, ich hatte aber noch nie die Situation wo ich mir dachte: "hier kann man ja perfekt ein Template verwenden" :-/

0
regex9  23.09.2022, 20:18
@Valentin1720653
(...) die Vorlesungen bestehen aber leider in erster Linie daraus dass wir uns Code anschauen und der Professor und zeigt wie er etwas gemacht hat (...)

Das wäre wohl in jeder Einrichtung so, die Vorlesung bespricht Themen theoretisch. Viele Einrichtungen bieten zusätzlich zur Vorlesung Tutorien (meist von Studenten/Tutoren geleitet), in denen erworbene Kenntnisse praktisch geübt werden können. Die Vertiefung in gelernten Stoff (und dazu gehört auch die praktische Übung) liegen zwar so und so in der Verantwortung des Studenten selbst, doch ist das dann noch ein extra Angebot, Hilfe zu erhalten.

Falls noch nicht getan, dann höre dich einmal in deiner Uni bezüglich Lerngruppen/Abendtutorien o.ä. um. Nicht nur deine Dozenten können unterstützen, sondern auch deine anderen Kommilitonen. Seien es die aus deinem Jahrgang oder die älterer Semester.

Vorlesungen anderer informatiklastiger Studiengänge kannst du in der Regel (soweit es zeitlich passt) ebenfalls besuchen. An der Uni Leipzig gibt es einen Studiengang für reine Informatik.

Ich habe jetzt z.b gehört dass funktionale Programmierung immer mehr an Bedeutung gewinnt (...)

Die funktionale Programmierung hat sich wohl deshalb zu einem Trendthema entwickelt, da ihre Anwendungsgebiete (wie AI/ML und Datenanalyse), für die sie sich gut eignet, stärker in den Fokus rücken.

Diese Methodik, Programme zu schreiben, ist aber nichts unbedingt neues. Typische Vertreter (Lisp, Haskell, F#) gibt es schon lange. Lisp ist beispielsweise die zweitälteste Programmiersprache überhaupt.

Bei verschiedenen Programmiersprachen (wie C++ oder Java) wurden in den letzten zehn Jahren nun auch einzelne nützliche Features (z.B. Lambda-Ausdrücke oder Typinterferenz) herausgeklaubt und integriert. Man versucht eher OOP und funktionale Programmierung miteinander zu kombinieren. Eine große Revolution sollte man nicht erwarten. C++ & Co. werden in ihren Anwendungsbereichen bleiben, auf die sie sich jahrelang ausgerichtet haben.

(...) aber vieles dann doch so programmiere dass es halt "funktioniert". (...)

Mach dir erst einen Plan, bevor (!) du Code schreibst. Eine gewisse Abstraktion kommt dabei schon automatisch mit hinein und du siehst schneller Fälle, bei denen du bestimmte Muster (z.B. Templates) einsetzen könntest (nicht aus Zwang, sondern weil es einen tatsächlichen Vorteil bringt). Ich denke zudem, dass dir Übung vorerst reichen wird, denn du reflektierst ja selbst und würdest bei Folgefällen versuchen, es wieder besser zu machen.

Zu speziellen Themen, die du bisher nur theoretisch behandelt hast, lassen sich sicherlich Übungsaufgaben finden (schau z.B. auf Edabit oder Exercism) oder sie lassen sich beiläufig integrieren (so wie const correctness). Für Templates würde mir beispielsweise eine generisch-zirkuläre Liste einfallen, die du selbst implementierst (ohne Hilfe von Arrays/Vectors). Zu der wird zusätzlich ein Iterator entwickelt, der zum Beispiel nur jeden dritten Eintrag ausgibt und die Elemente der Liste natürlich nur einmal durchläuft.

Hinsichtlich OOP hilft dir vielleicht dieser ältere Beitrag von mir etwas weiter. Für dich wären allerdings nur die Absätze unter den Codesnippets relevant.

(...) ich dachte vielleicht an eine entity Klasse und dann player-entity, fireball-entity usw (...)

Ja, das kannst du so machen. Die Entity-Klasse würde eine draw-Methode vorgeben, die von ihren Subtypen implementiert werden muss.

class Entity {
  public:
    virtual void draw() = 0;
};
(...) ich hatte aber noch nie die Situation wo ich mir dachte: "hier kann man ja perfekt ein Template verwenden" (...)

Mir würde spontan eine Factory einfallen, die verschiedene Typen erstellen kann, denen dann noch individuelle Argumente übergeben werden sollen.

template<typename T, typename ...TArgs>
T* create(TArgs ...args) {
  T* product = new T(args ...);
  return product;
}

class Person {
  public:
    Person(std::string name, int age);
};

class Car {
  public:
    Car(double velocity);
};

// usage
Person* person = create<Person>("John Doe", 58);
Car* car = create<Car>(100.0);

Das Beispiel ist zwar simpel und grob (so einiger Code fehlt noch), dürfte zur Demonstration aber genügen. Mit einer Factory kann man den Erstellprozess einer Klasse kontrollieren/regulieren.

Gänzlich ohne Templates auszukommen, ist aber auch nicht schlecht. Es gibt Entwicklerteams, die von vornherein explizit auf Template-Programmierung verzichten, da es eine zusätzliche Komplexität in das Projekt bringt.

1