Brauche ich einen anderen Weg um besser im programmieren zu werden?
In den letzten Monaten komme ich immer wieder in die selbe Spirale.
In der such ich ständig nach Projekten, fange sie an, beende sie nicht und dann suche ich wieder Projekte, um mich zu motivieren.
Mein Ziel ist es, eine Karriere in der Embedded-Programmierung zu machen. Ich habe auch einige Projekte gemacht (auch mit einigen selbstentwickelten PCBs in den letzten zwei Jahren), aber ich habe immer das Gefühl, dass ich länger damit beschäftigt bin, das Hardware-Projekt zu machen, anstatt die Software zu schreiben.
Oder:
Die Hardware ist für mich ziemlich komplex und die Software scheint dann ziemlich einfach zu sein. Ich habe zum Beispiel eine eigene Wetterstation gebaut. Es hat mich viel Zeit gekostet, die Platine mit den verschiedenen Sensoren zu planen und zu entwerfen, und dann war die Hardware in zwei Tagen fertig, weil es nur darum ging, ein paar Daten zu übertragen und sie auf einem Display darzustellen.
Mein Ziel ist es, mich mit schwierigen Softwareaufgaben zu beschäftigen, die nicht so viel mit Hardware zu tun haben. So kann ich mich darauf konzentrieren, größere Projekte zu planen und in die Struktur einzusteigen (was für mich meistens sehr schwer zu verstehen ist, wenn ich mir einige Open-Source-Code-Beispiele ansehe).
Ich komme dann immer an den Punkt, an dem ich darüber nachdenke, von C auf etwas wie Javascript oder Python umzusteigen, damit ich wirklich Software-Projekte machen und mit dem Programmieren ohne Hardware vorankommen kann. Aber dann komme ich mir immer blöd vor, weil ich das Gefühl habe, dass mich das nicht weiterbringt, wenn auf mein Karriereziel erreichen hinarbeite.
Ich habe die meisten meiner Projekte auf STM32-Basis gemacht und ich habe auch ein okayes Verständnis der HAL-Bibliothek, wie man die Dokumentation liest usw. Aber wenn ich darüber nachdenke, eine Art von Algorithmus zu implementieren, fühle ich mich so verloren und weiß nicht, wo ich anfangen soll, und das ist, was ich wirklich üben möchte. Aber die Hardware bremmst mich da immer ab.
Andererseits denke ich, dass ein Wechsel zu Javascript oder Python, um meine Problemlösungsfähigkeiten zu verbessern, am Ende besser sein wird, weil ich dann einfach mehr Code schreiben würde als in der Phase, in der ich jetzt feststecke je schreiben würde.
Keine Projekte und kein Fortschritt in meinen Problemlösungsfähigkeiten...
Ich weiß wirklich nicht, wie ich diese Phase überwinden soll... Hatte sonst noch jemand solche Probleme?
4 Antworten
Hey ich studiere Computer Science und arbeite nebenbei als Software Dev.
Ich war zu Beginn meines Studiums eine Absolute Niete im Coden (Sogar HTML war mir zur Beginn zu Kompliziert) mit der Zeit bin ich fitter geworden und arbeite heute hauptsächlich mit Java (& Frameworks).
Jedenfalls was mir geholfen hat war, ich hatte Open Source Projects entdeckt, das sind Projekte wo Programmierer zusammen kommen und gemeinsam an Projekten arbeiten. Es gibt haufenweise Internetseiten, Dc server etc. deshalb kann ich jetzt nicht eine nennen. Das gute daran war, was mir geholfen hat ist das man dadurch den Kontakt zu anderen Programmierern bekommen hat, die viel weiter sind als man selbst und dadurch das man gemeinsam Arbeitet bzw. Hobbymäßig Projekte macht, wurde alles besser erklärt und so hab ich zb. Java gelernt. Ich hab durch die Projects damals freunde kennengelernt die schon länger in der IT sind und mir dann immer mehr erklärt haben bzw. sich meine Projekte angeschaut haben und mir gezeigt haben, wo der Code unsauber war oder unnötig etc.
Ist das dein Karriereziel, weil Du da Bock drauf hast, oder weil Du dir davon hohe Gehälter und einen sicheren Job versprichst?
Und teste ruhig andere Sprachen aus, Du musst ja nicht ewig dabei bleiben. Und blöd vorkommen musst Du dir dabei auch nicht, am Ende gewinnst Du min. Erfahrung und am Ende ist Erfahrung das wichtigste.
Du kannst dir auch C# anschauen, von da kann man gut C/C++ ansprechen, so kannst Du eine komplexere Oberfläche für die Hardware entwickeln (die Hardware-Ansteuerung ist dann in C/C++), ohne dir regelmäßig ein Bein ausreißen zu müssen ^^
Und such dir allgemein komplexere Projekte. Daten anzeigen alleine ist langweilig, wie wäre es, wenn Du die Daten auch automatisiert auswertest/analysierst? Und überlege dir auch, was nötig wäre, wenn Du das Gerät verkaufen würdest, ein potentieller Kunde möchte ggf. noch mehr machen, z.B. ein/aus schalten, eine Handy-App/Website zur Überwachung, Pusch-Benachrichtigungen, Automatisierungen, etc.
Abgesehen davon bezweifle ich (gefährliches Halbwissen, hab nie im Embedded Bereich gearbeitet), dass Du in dem Bereich sonderlich komplexe Software umsetzen musst, die über die direkte Hardware-Ansteuerung hinaus gehen. Für sowas (z.B. Client-Anwendung) haben die Firmen vermutlich nochmal extra Leute, die sich darauf spezialisiert haben und dann auch mit anderen Sprachen und Technologien arbeiten.
Aber so oder so kannst Du solche Erfahrungen (Problemlösung) nicht erzwingen, das dauert. Wenn Du ein neues Projekt auf der grünen Wiese startest und am Ende der einzige Nutzer bist, dann wirst Du nur wenige tatsächliche Probleme haben, die es zu lösen gibt. Wenn Du aber in einem Team oder an lange lebenden Projekten mit größem Kundenstamm arbeitest, hast Du ständig irgendwas neues, was es zu lösen gibt, das liegt einfach in der Natur der Sache. Um etwas vergleichbares zu erreichen könntest Du ja auch an Open Source Projekten mitarbeiten.
aber was ich wirklich lernen will ist eben große Sachen in kleine Teilprobleme gliedern und diese strukturiert abzuarbeiten
Ich weiß nicht, was Du unter "groß" verstehst, aber wirklich große Projekte habe ich bisher nur bei der Arbeit gehabt. Das sind Projekte, daran arbeiten mehrere Leute mehrere Jahre (und unsere Projekte sind noch vergleichsweise klein), solche Projekte wirst Du aber nicht Mal eben so Zuhause aufziehen können.
In der such ich ständig nach Projekten, fange sie an, beende sie nicht
Warum beendest Du sie nicht? Beende sie und überlege danach, was Du verbessern kannst und so kommst Du vom Hölzchen auf's Stöckchen.
Probier mal leetcode, kurz und knackige Probleme, die die Problemlösefähigkeit steigern.
Sprachen kannst du da frei wählen.
Ansonsten kannst du wirklich in andere Sprachwelten vielleicht mal steigen. Oder du entwickelst Protokolle, bzw schreibst diese.
Nimmst einfach 2 Microcontroller die miteinander reden sollen.
Ein Projekt was ich empfehlen kann, wäre einen Drehgeber via interrupts zu lesen um hohe Geschwindigkeiten zu erkennen
Bei leetcode kannst du die Schwierigkeit auch auswählen. Du musst aber dennoch das Problem in kleine Häppchen zerkleinern um das ordentlich zu lösen.
Hatte heute bspw. Eins, wo man pow(x,n) entwickeln sollte. Da gab's auch Zeitanforderungen, also der naive Ansatz ging nicht, da das zu lange dauert. Da müsste man dann nachdenken wie zerkleinere ich den Code.
Aber vielleicht ist's bei dir eher das Gefühl von großen Projekten, da durchzustehen und dies auch zu entwickeln, oder?
Da bleibt nur üben üben üben. Nimm dir Projekte und mach diese aufjedenfall zuende. Guck danach dir den Code an und überleg dir was daran schlecht ist und schreib es um. Rede dabei von Architekturiellen Änderungen, nicht statt I++ ++I zu Nehmen.
Embedded ist auch ein sehr spezielles Feld. Heutzutage schreibt man Recht selten low Level code. Oftmals schon noch drüber.
Wenn dich das alles aber sehr interessiert, studier mal technische Informatik, da hast den Druck (zumindest an einer Hochschule) auch projekte fertig zu machen.
Wir mussten innerhalb eines Semesters 2 Förderbandanlagen zu 4. Von Grund auf Entwickeln.
Aber zum Projekte Thema kommt ja meine initial Frage: Wie kann ich das von der gleichzeitigen Platinen Entwicklung entkoppeln? ^^
c braucht man ja für Microcontroller.
Aktuell studiere ich Elektrotechnik und schreibe nächstes Semester meine bachelorarbeit. Die Hintergründe der Elektronik verstehe ich dadurch sehr gut. Die Software Strukturen fallen mir da schon schwerer.
Und große Projekte zu finden, die eben nicht eine große Entwicklung der Hardware beinhaltet, das finde ich eben schwer.
Dann hätte ich ein einfaches Projekt:
Kauf dir einen digitalen LED Strip und Steuer diesen an mit verschiedenen Mustern usw. Da musst du sehr viel drüber nachdenken wie du das strukturierst.
Am besten auch ohne vordefinierte HAL, sondern du baust dir deine eigene kleine HAL.
Das liest sich so, als ob Du Dir Übungsaufgaben suchst. Reale Projekte ergeben sich doch aus dem, was die Kunden bestellen. Oder, wenn es Eigenforschung zwischen den Kundenprojekten ist, weiß man doch, wo es bei den Kundenprojekten hapert, was man dringend entwickeln sollte um in Zukunft seine Arbeit zu machen.
Zur Sprache: Ich hab als Ingenieurwissenschaftler, der aus Messungen empirische mathematische Modellierungen erzeugen musste, um damit etwas zu berechnen, bis zur Rente mit Erfolg und großer Freude in C gearbeitet. Man muss nur eben die richtigen Structs entwerfen, Pointer auf ausführbaren Code, im Sinne der Objektorientierten Programmierung, brauchen die nicht. So schlecht und altmodisch ist doch C gar nicht. Mein Nachfolger hat zwar angefangen alles in Python umzuschreiben, aber der Vorteil von Python scheint wohl eher zu sein, dass man so immens viele Algorithmen für alles mögliche öffentlich verfügbar hat.
Du hast recht, dass reale Projekte sich daraus ergeben was der Kunde bestellt. Aber aktuell studiere ich noch und möchte meine Zeit nutzen um eben Erfahrung aufzubauen.
Am ende möchte ich aber nicht Platinen designen, weswegen dieser Part von eigenen Projekten mir meist den Spaß raubt oder eben zu oben genannten Problemen führt.
Und was ich übern möchte ist eben das von dir genannte: "die richtigen Structs entwerfen, Pointer auf ausführbaren Code" etc.
Mein gedanke mit Python oder javascript ist nicht, weil ich c nicht mag. Im gegenteil, ich mag es sehr gerne. Es ist eben eher, weil man leichter größere Software Projekte machen kann die vielleicht nicht nur auf einer Konsole basieren und da auch ein wenig die Motivation hoch halten.
Das fehlt mir aktuell und da weiß ich nicht wie ich weiter machen soll..
Wenn ich in Deiner Situation wär, dann würde ich einmal versuchen, mit MLP (multi-layer perceptron) Lottozahlen vorherzusagen. Wir wissen beide, dass man das nicht kann, aber einen Algorithmus zu entwickeln, der es versucht, wird Dir helfen, KI noch besser zu verstehen.
Oder denk Dir eine Aufgabenstellung an Aktienkursen aus. Ich hatte mal privat monatelang etwas laufen, das zweimal wöchentlich aus vielen Quellen den aktuellen Stand zigtausender historischer Aktienkurse herunterlud, allein das war eine Herausforderung, bei manchen musste ich mit einem xdotool-Skript unter Linux manuelle Benutzug eines Webinterface vortäuschen.
Oder entwickel ein universelles Regbressionsanalyse-Tool. In einer Tabelle sei eine Spalte Funktion bestimmter anderer, als Linearkombination nichtlinearer Funktionen mit positiven und negativen Exponenten. Output ist eine empirische Formel mit den genauen Koeffizienten. Anwendungsbeispiel: Wie hängt in mobile.de für eine bestimmte Kategorie Gebrauchtwagen der Preis ungefähr linear vom Alter und vom km-Stand ab?
Aber ist so etwas nicht dann schon super umständlich das mit c realisieren zu wollen?
Das Problem beim Leetcode ist aber auch wieder: Super kleine Aufgaben die halt teils sehr komplex werden. Soll nicht heißen ich scheue komplizierte Aufgaben.
Wenn ich mir aber ein großes Software Projekt vorstelle komme ich sehr schnell ins schleudern einfach, weil ich noch nie große Programme geplant habe.
Ich bekomme meist die Sachen schon zum laufen, aber was ich wirklich lernen will ist eben große Sachen in kleine Teilprobleme gliedern und diese strukturiert abzuarbeiten.
Leetcode übernimmt diesen Part für mich, da es ein Teilproblem ist. Das große ganze wird dadurch aber nicht leichter.
Wenn du verstehst was ich meine ^^
Kleine Protkolle habe ich schon selber geschrieben (simpel über UART z.B.).
Auch habe ich Erfahrung mit SPI/I2C. ADC's und PWM Erstellung, Timer Configuration, da habe ich auch ein Basic Wissen und kann damit einigermaßen nach Recherche umgehen.
Aber mich überfordert einfach immer große Programme (wenn ich andere anschaue) überhaupt zu verstehen, weil meine Programme teils auch immer nur vielleicht 100-300 Zeilen Code waren.