Ist das Programmieren?

Hallo Leute, ich hab da mal eine Frage:
Unzwar code ich hobbymäßig in Java mal das ein oder andere kleine Programm,
in der Uni hab ich zwar auch noch etwas mit C zu tun, aber das ist nur absolutes basic Zeug...

Ist ja auch egal, die Sache ist dass ich mich schon als Schüler für das Programmieren interessiert habe und schon damals mit dem Programmieren angefangen habe,
hatte das ein oder andere Buch durchgelesen und Kleinzeug wie Taschenrechner, Snake usw programmiert.
Da ich im Real Life nie einen Gleichgesinnten hatte und auch in der Uni (studiere Elektrotechnik) keinen wirklichen Kontakt zu richtigen Programmieren habe,
kann ich schwer einschätzen was das Programmieren eigentlich ist, ob ich behaupten kann dass ich es kann und wie weit ich eigentlich bin.

In den Pfingstferien von der Uni, habee ich jetzt mal wieder ne Woche Zeit ein bisschen was zu programmieren: hab einen Keylogger programmiert, ein Programm welches den Text aus Bildern mittels OCP erkennt und in einer Datei abspeichert und ein Programm welches eine lineare Approximation berechnet und das Ergebnis formatiert in Excell ausgibt.
Ist jetzt auch nichts besonderes, aber beim programmieren ist mir aufgefallen dass ich für alles eine externe Library benutzt habe; JNativeHook, Apache Maths, OPC usw.,
die Funktionsweise der Libraries habe ich mir gar nicht wirklich angeschaut sondern sie einfach in mein Programm eingebunden und mithilfe des Examplecodes das benötigte zusammengeschustert.

Deswegen meine Frage: Ist das normal? Macht ihr das auch so oder ist das eher Script-Kiddy-Programmierung?
Was Programmierbücher lesen angeht bin ich auch eher faul geworden, ich google einfach was ich brauch und schau mir eigentlich nur die Klasse/Methode an, die ich gerade brauche und binde es halt ein.
Es funktioniert so zwar auch und ich bringe auch eher meine kleine Projekte zustande als früher, aber so richtig das Gefühl das ich das jetzt programmiert habe habe ich dabei nicht.
Ich denke das ich einen Stand habe auf dem ich behaupten kann dass ich die Grundlagen der Programmierung so einigermaßen beherrsche,
aber wie geht es nun weiter?

Für einen Werkstudentenjob in der Programmierung oder einer Beteiligung an einem Open Source Projekt langt es eher noch nicht,
also wie beschreitet man privat die Stufe vom Anfänger zum fortgeschrittenen Programmierer?
Und ist das was ich mache überhaupt richtiges Programmieren?
 
digga was bist du denn f+r einer :D
guckst du hier: Programmierung – Wikipedia

keylogger?
ist ja süß, geh spiel noch auf der noobwiese, du bist noch nicht bereit für das board!
 
Zuletzt bearbeitet:
Bitte verzeihe das kindliche Gehabe von CypherL0rd hier. Dass es solche Typen auf der Welt noch gibt, hätte ich auch nicht erwartet. Und vor allem lass dir von so einem Frischling bitte nicht erzählen, wer bereit für dieses Board sei und wer nicht. Er ist es sichtlich nicht, wie man an seinem Umgangston, der dem einen pubertierenden Jungen entspricht, sieht. Aber es muss wohl auch Menschen mit Geltungssucht und Drang nach Profilieren geben. Fame bekommt er aber auf diese Weise sicherlich weniger als du, der sich wenigstens Gedanken darum macht, wie man sich verbessern kann. :)

Zum Thema: Die Anforderungen der Wirtschaft an Programmierer in der heutigen Zeit gehen natürlich über das reine Kennen und Verstehen einer Programmiersprache hinaus. Man sollte auch wissen wie Software automatisiert getestet wird (Stichwort: Unit Testing), wie man mit gängigen IDEs umgeht, wie Projekt-Management grundlegend funktioniert, wie man mit einer Versionsverwaltung (Git, Subversion, Mercurial etc.) umgeht, wie man eine Big-O-Analyse von Code macht uvm.. Vor allem für letzteres sollte man natürlich auch verstehen, was der eigene Source in CPU und Speicher eines ausführenden Rechners anrichtet.

Dennoch bieten gerade kleinere OpenSource-Projekte einen guten Einstieg in die weiterführenden Kenntnisse. Denn Tatsache ist nunmal, dass der Rest mit der Erfahrung kommt. Und die bekommt man nunmal nur durch coden, coden und nochmals coden. Oft hilft es auch, wenn man mit ein paar Freunden ein eigenes Projekt auf die Beine stellt und so am praktischen Beispiel sieht, welche Schwierigkeiten bei der Zusammenarbeit auftreten können.

Dass man auf bereits vorhandenen Klassen und Programmbibliotheken zurückgreift ist übrigens völlig normal. Das geschieht in der Wirtschaft genauso und zwar aus mehreren Gründen:
1. Es spart natürlich sehr viel Zeit und somit dem Unternehmen Geld.
2. Frameworks, Bibliotheken etc. unterliegen zumeist einer kontinuierlichen Weiterentwicklung, ohne dass das Unternehmen, das diese einsetzt, dafür Zeit investieren muss. Spart also auch wieder Geld.
3. No work should be done twice. Warum soll man viel Zeit investieren um ein Problem zu lösen, das andere bereits gelöst haben? Das wäre doch sinnlose Verschwendung der eigenen Zeit.

Natürlich sollte man aber trotzdem in der Lage sein Klassen und Bibliotheken selbst zu erstellen, wenn es mal keine passende Lösung gibt. Um das zu Erlernen kann es auch sinnvoll sein ein Problem nochmal zu lösen, obwohl es bereits gelöst wurde. Dann kann man sein eigenes Ergebnis mit den Ergebnissen anderer Programmierer vergleichen und schauen was sie eventuell besser oder auch schlechter gelöst haben. Es gilt also auch hierfür: Übung macht den Meister.
 
Vielen Dank für deine ausführliche und hilfreiche Antwort.
Den User Cyberlord ignoriere ich einfach, wobei ich froh bin, dass ich nicht die gleichen emotionalen Probleme wie er habe.
Jemand der andere grundlos so anpampt muss mMn große Selbstzweifel haben.

So wie sich das anhört, scheint die Beteiligung an Open Source Projekten tatsächlich eine gute Möglichkeit zu sein, einiges im Bereich Software Entwicklung zu lernen.
Mir gefällt der learning-by-doing Anstatz den du empfiehlst ganz gut.
Da ich wie gesagt keine Gleichgesinnten kenne, werde ich wohl etwas "größere" kleine Projekte starten,
wobei ich mir überlegen muss, wie ich dafür dauerhaft motiviert bleiben kann, auch wenn mal eine Sache nicht auf Anhieb funktioniert.
Bei privaten Projekten die man alleine macht, ist zumindest bei mir die Gefahr groß,
dass sie unvervollständigt irgendwo in den hintersten Winkeln der Festplatte verschwinden und nicht bis zum Ende bearbeitet werden...
Von daher bleibe ich lieber erstmal bei Projekten, die nicht länger als maximal ein paar Tage brauchen, aber trotzdem Spaß machen: Hackingtools halt, auch wenn sie natürlich nicht (im Feld - würden wir Elektrotechniker sagen) benutzt werden.
Anschließend werde ich versuchen den Einstieg bei richtigen Open Source Projekten zu schaffen,
am liebsten wäre es mir sogar erstmal als reiner Tester einzusteigen, um mir schon mal alles in Ruhe anschauen zu können.
Aber da muss ich mich nochmal genauer informieren, was es da überhaupt für Möglichkeiten gibt.

Unit Testing und Versionsverwaltungsprogramme werde ich definitiv in Angriff nehmen, ich melde mich noch heute auf Github an :)
Big-O-Analyse und Projektmanagement sind Sachen die man vermutlich nicht so gut privat lernen kann,
hoffentlich lerne ich das in meinem Master den ich definitv informatiklastig wählen werde: Technische Informatik wirds wahrscheinlich werden.
Digitaltechnik hatte ich im Studium und wie gesagt auch Grundlagen der C-Programmierung, geht das so in die Richtung dass man verstehen kann was der eigene Source im Speicher anstellt?
Vermutlich nicht, da fehlen mir wohl noch Rechnerarchitekturkenntnisse.
Zumindest habe ich nicht das Gefühl zu wissen was der Source wirklich im Speicher anstellt :)
In Digitaltechnik gings eher um Boolesche Algebra, um Schaltkreise auf Gatterebene und ein paar Assemblerbefehle.

Man muss ja auch nicht alles im Studium lernen, vor allem bei etwas das so viel Spaß macht und in dem es Leute auf Spitzenniveau gibt, die gar nicht studiert haben.
Die Informatikprofs an meiner Uni belächeln aber immer Programmierer, die sich das Programmieren selbst beigebracht haben und keine Ausbildung und kein Studium in dem Bereich genoßen haben,
so gab es in den entsprechenden Vorlesungen öfters mal Kommentare wie: "Dann hat man keinen Überblick mehr über den Source da den irgendjemand geschrieben hat, der sich das Programmieren selbst beigebracht hat" usw..
Für mich ist es da schwer zu differenzieren ob das jetzt Informatiker-Standesdünkel ist, oder ob da tatsächlich was dran ist.
Irgendwie beneide ich die Informatikstudenten langsam: Elektrotechnik ist zwar auch nicht uninteressant, aber längst nicht so interessant wie Informatik.
Vielleicht ist das Gras auf der anderen Seite aber auch nur grüner :)
 
Zuletzt bearbeitet:
In der heutigen Zeit hat man glücklicherweise die Möglichkeiten Video-Aufzeichungen von Vorlesungen und Online-Kurse zu nutzen um sich weiterzubilden. So kann man z.B. die Grundlagen von Scrum, Kanban etc. verstehen, herausbekommen wobei es bei einer Big-O-Analyse ankommt usw.. Autodidaktisches Lernen muss man halt auch irgendwie können und wissen wo man sich ggf. bei seinen Lerninhalten orientieren kann.

Daher haben die Professoren sowohl Recht als auch Unrecht. Tatsächliche vergessen nämlich viele, die Programmieren autodidaktisch lernen, sich mit Themen wie UI-Design, Software-Design, Coding-Standards etc. zu beschäftigen. Und das kann dann oft zu unübersichtlichen Programmen und erst recht zu unübersichtlichem Code führen, der irgendwann nicht mehr wartbar ist. Allerdings... wenn man auch mal von sich aus anfängt komplexere Programme zu schreiben, wird man selbst irgendwann feststellen, wenn es nicht mehr wartbar ist. Und dann kann man sich Gedanken darüber machen, wie man das im nächsten Projekt oder bei einem Rewrite besser organisiert. Solche Erfahrungswerte sind meiner Meinung nach auch sehr viel wert. Ich möchte z.B. meine anfänglichen Erfahrungen bei der Systemadministration nicht missen, denn sie ermöglichen es mir heutzutage in Startups schnell zu erkennen, wenn in diesem Bereich etwas falsch läuft und man auf unsaubere Netzwerk-Strukturen zusteuert. Schlicht und einfach deswegen, weil ich die gleichen oder ähnliche Fehler früher auch gemacht habe. Und gleichermaßen kenne ich durch sie Wege, wie man aus einem Chaos wieder ein sauberes Netzwerk bastelt ohne dafür lange Downtimes u.ä. zu riskieren. Hätte ich mein Leben lang nur streng nach Vorgabe irgendwelcher Ausbildungen gearbeitet, würde mir dieses Wissen fehlen. Ich kenne genug Admins, die zwar bereits so lange wie ich in diesem Bereich arbeiten, bei einem undokumentierten und unstrukturierten Netzwerk aber völlig überfordert sind und es lieber komplett neu machen anstatt die bestehenden Strukturen gerade zu ziehen. Daraus resultieren dann für die Kunden/Arbeitgeber Downtimes, die in der heutigen Zeit enorm schädlich für Unternehmen sind.

Ähnlich sehe ich das auch beim Programmieren. Meine ersten Projekte waren auch eher unstrukturiert. Irgendwann lernte ich dann aber diese Projekte zu modularisieren und später dann, als die Technologien dafür reif wurden, sie in Microservices aufzuteilen. Dadurch fällt es mir heutzutage recht leicht in einer monolithischen Software jene Teile zu identifizieren, die man leicht in Microservices auslagern kann und so die Teile Stück für Stück zu zerlegen und neu zu strukturieren. Das verschafft mir im DevOps-Bereich natürlich einige Vorteile, die Informatik-Studenten auch nach ihrem Abschluss meiner Erfahrung nach eher selten mitbringen. Die strukturieren dann eher den Source neu anstatt die Software. Nicht jede Theorie, die man im Studium lernt, lässt sich auch immer problemlos in der Praxis anwenden. Schliesslich spielen in der Praxis noch andere Faktoren wie Wirtschaftlichkeit, Team-Strukturen uvm. eine Rolle, die im Studium nie behandelt werden.

Was das Verständnis für die Vorgänge im Rechner angeht, sind grundlegende Architektur-Kenntnisse sicherlich von Vorteil. In Zeiten der modernen Software-Entwicklung, in der man zumeist auf Frameworks zurückgreift, reicht es aber auch schon aus, wenn man versteht, wie oft eine Schleife über bestimmte Variablen läuft, wie viel Speicher diese Variablen beanspruchen, wie Threading funktioniert etc.. Damit kann man zumindest schonmal grundlegend eine Big-O-Analyse durchführen und Faktoren wie Rechen-Komplexität und Speicher-Komplexität von Programmen ermitteln und ggf. optimieren.

Im Studium kannst du gar nicht alles lernen. Du wirst in deiner beruflichen Laufbahn sicherlich feststellen, dass du dich irgendwann auf bestimmte Bereiche spezialisieren wirst. Während ich anfangs als Sysadmin auch versuchte möglichst alles über Server zu lernen, kristallisierte sich im Laufe meiner beruflichen Laufbahn eine Spezialisierung im Bereich von Netzwerken für Webapplikationen heraus (Webserver, Caching-Server, Message-Queues, Datenbanken etc.). Mit anderen Bereichen, wie z.B. Windows-Servern oder Samba, beschäftigte ich mich irgendwann gar nicht mehr, weil ich sie schlicht nicht mehr brauchte. Das Studium kann dir daher nur das grundlegende Handwerkzeug mitgeben.

Die Spezialisierungen und tieferen Einblicke kommen dann mit der Praxis/im Job. Die Frage ist dann nur, was man daraus macht. Das sehe ich sehr gut in meinem Freundeskreis. Ich kenne Leute, die alles autodidaktisch gelernt haben und mittlerweile erfolgreiche CTOs sind und ich kenne Diplom-Informatiker, die noch immer nur nach den Vorgaben ihrer Chefs arbeiten. Meine Erfahrung sagt mir daher: Mit je mehr Herzblut man bei der Sache ist, umso besser wird man. Wer Programmieren nur als Job betrachtet, der wird auch mit Studium nur ein "Code-Monkey" bleiben. Wer aber ständig bemüht ist besser zu werden, der kann es selbst ohne Studium recht weit bringen. Für den Einstieg ist aber ein abgeschlossenes Studium in der Tasche immer hilfreich. Als Quereinsteiger in die Informatik zu gehen ist nicht immer einfach. Hat man dann erstmal entsprechende Referenzen aufgebaut, wird man nach seinem Abschluss kaum noch gefragt.
 
Für einen Werkstudentenjob in der Programmierung oder einer Beteiligung an einem Open Source Projekt langt es eher noch nicht,
also wie beschreitet man privat die Stufe vom Anfänger zum fortgeschrittenen Programmierer?
Hat jetzt eigentlich nichts mit Programmieren zu tun sondern eher mit den Open Source Projekten. Viele Open Source Projekte benötigen Personen, die nicht direkt programmieren. Z.b. im Bereich Übersetzungen, Bugs suchen, melden und diese dann nach dem Fix wieder testen, usw. Du könntest z.b. auch bei einem Bugreport auch gleich einen Lösungsvorschlag anhand eines Patches einreichen.
 
Wenn ich so bitmunchers Tipps und Erfahrungsberichte durchlese, merke ich dass ich wohl doch noch ziemlich am Anfang bin und dass wohl auch im Hobbybereich.
Vielleicht bin ich ja wirklich noch nicht bereit für das Board ^^
Auf der anderen Seite habe ich aber auch genau das feststellen wollen und wollte wissen was das Programmieren, oder wohl eher was die Software-Entwicklung, eigentlich ist und das wurde mir hier verständlich und kompetent erklärt.
Ehrlich gesagt klingt das alles sogar noch besser als ich es mir vorgestellt habe, es wäre ja auch langweilig wenn das was man in Ausbildung und Studium lernt schon alles wäre.
Dann könnte ich auch gleich irgendeinen Job ergreifen, der mich zwar nicht interessiert, aber bei dem das Geld stimmt und ziehe dann halt jeden Tag meine 7 Stunden durch, mit leerem Kopf und starrem Blick.
Das ist definitiv nichts für mich, lieber gehe ich in die IT und suche mir was in der Schnittstelle zwischen IT und Elektrotechnik, in dem ich auf meinen im Studium erworbenen Grundlagenwissen weiter aufbauen kann.

Aber bevor ich meine berufliche Zukunft weiterplane, konzentriere ich mich lieber auf die hobbymäßige Programmiererei und versuche dort ein paar mehr Level aufzusteigen,
dabei werde ich mich an die Tipps halten die hier gefallen sind:
Unit Testing (in meinem Fall JUnit :) ), Big-O-Analyse, UI Design sind alles Dinge die ich autodidaktisch lernen werde und die Programmier- und Projekterfahrung kommt halt Stück für Stück und hört hoffentlich nie auf zu wachsen.
Ich nehme mal an reine Programmierbücher sollte ich jetzt keine mehr kaufen und vor allem nicht mehr komplett durchzulesen sondern mich eher an Referenzen zu halten.
Vielleicht poste ich ja mal den einen oder anderen Source hier auf dem Board und lasse mal die Profis drüberschauen :)

Danke auch an xbeduine, kannst du mir vielleicht noch verraten wie ich diese Open Source Projekte finde?
Suche ich mir da einfach was auf Github und schreibe diejenigen an, die was entwickeln was mich interessiert und frage ob die einen unerfahrenen, aber lernwilligen Softwaretester und Bugfixer gebrauchen können?
 
Zuletzt bearbeitet:
Danke auch an xbeduine, kannst du mir vielleicht noch verraten wie ich diese Open Source Projekte finde?
Suche ich mir da einfach was auf Github und schreibe diejenigen an, die was entwickeln was mich interessiert und frage ob die einen unerfahrenen, aber lernwilligen Softwaretester und Bugfixer gebrauchen können?
Z.b. bei größeren Linux-Distributionen
- Join - FedoraProject
- Portal:How to participate - openSUSE
- Ubuntu Community

Hier ist der Vorteil, dass du z.b. bei QA die Pakete/Bereiche auswählen kannst, die du testen willst. Habe selber vor Jahren bei fedora als Bugzapper angefangen und bin jetzt als Ambassador unterwegs. Hab somit nicht mehr viel mit Paketen/Code zu tun ;)
 
Zuletzt bearbeitet:
Linux?
Klingt danach dass ich mit meinen Java Kenntnissen dort nicht viel anfangen kann :)
Aber gut, ein bisschen C kann ich ja.
Mal sehen was draus wird.
 
Linux?
Klingt danach dass ich mit meinen Java Kenntnissen dort nicht viel anfangen kann :)

Programme für Linux sind in den verschiedensten Sprachen geschrieben. Es gibt durchaus auch welche in Java. Bestes Beispiel ist die allseits beliebte Eclipse-IDE. Sagt ja keiner, dass du gleich an den Kernel ran musst. Denn dafür sind tatsächlich wesentlich tiefere Kenntnisse als nur ein bisschen C notwendig.

Edit: Sich an Projekten auf GitHub zu beteiligen ist übrigens eine gute Idee für den Anfang.
 
Linux und Java

Hallo

@bitmuncher
Es gibt durchaus auch welche in Java. Bestes Beispiel ist die allseits beliebte Eclipse-IDE.

Wenn ich mir so z.B. Debian-unstable ansehe, dann sind da tatsächlich relativ wenig Javaprogramme vorhanden. Die meisten Javaprogramme, die ich selbst nutze, sind Javaprogramme außerhalb des Debian-Repositories, entweder als jar oder per installer.



mfg
schwedenmann
 
Ja, das Linux-Ökosystem ist nicht auf die Repo-Server der Distributoren beschränkt. Und erst recht ist es größer als die Repo-Server von Debian. Denn gerade bei Debian stellen immer mehr Software-Projekte lieber ihre eigenen Repo-Server bereit, damit sie nicht auf die grauenvolle Update-Politik von Debian angewiesen sind. Darunter sind sehr viele Server-Tools, die in Java geschrieben sind, wie die vielen Tools der Apache-Foundation (z.B. der komplette Hadoop-Stack, Cloudwatch, Lucene, Kafka uvm.). Einfach mal in The Apache Software Foundation * GitHub schauen was da allein an Java auftaucht. Weil man aber bei solchen Server-Tools auch gern mal die neuen Features mitliefert und auf schnelle Updates angewiesen ist, haben sich diese Projekte mittlerweile von den Repositories der Distros abgetrennt. Es ist nunmal für die Projekte einfacher und schneller, wenn sie ihre Builds direkt aus ihren Build-Umgebungen in ein einzelnes Repo pushen können anstatt es erst auf ein Dutzend Distro-Server verteilen und sich mit einem Dutzend Communities auseinandersetzen zu müssen. Die Distro-Vielfalt wird nämlich für Linux langsam aber sicher mehr und mehr zum Nachteil.
 
Zurück
Oben