Welche Fähigkeiten sind für professionelles Programmieren unerlässlich, die an Schulen nicht gelehrt werden? [geschlossen]

14

Ich bin ein Hauptfach Informatik im ersten Jahr. Ich ging zu einer Jobmesse, verteilte Lebensläufe, sehr zu meiner Überraschung bekam ich ein Interview und schließlich ein Praktikum als Entwickler.

Ich erklärte dem Interviewer (der mein Chef sein wird), dass ich erst ein erstes Jahr bin und nicht viel Erfahrung im Programmieren habe. Er sagte mir einfach, dass er zuversichtlich ist, dass ich gut abschneiden werde, da ich über einen starken Hintergrund in Mathematik verfüge (ich bin fast mit meinem BA in Mathematik fertig, und ich habe ein paar Abschlusskurse in der Tasche).

Ich bin in allen Programmierkursen gut, aber ich habe immer noch das Gefühl, im Nachteil zu sein. Im Moment möchte ich diesen Job wirklich nur gut machen, wenn er anfängt. Der Job wird meistens C # verwenden, aber abgesehen davon, dass Sie offensichtlich etwas C # gelernt haben, was ist die einzige Fähigkeit, die Sie gerne gelernt hätten, bevor Sie ein echter Programmierer wurden?

Jeder Rat wird sehr geschätzt, aber wenn Sie Bücher im Sinn haben, sagen Sie es bitte. Vielen Dank!

Eric
quelle
8
Diese Frage wurde auf dieser Website schon oft auf verschiedene Arten gestellt. bitte erst suchen und dann fragen. werfen Sie einen Blick auf die FAQ; programmers.stackexchange.com/questions/149970/… ; programmers.stackexchange.com/questions/46716/…
tgkprog
3
Ich habe gesucht und beide Fragen gesehen. Es geht mir aber nicht darum, Design oder Webentwicklung zu lernen. Mir geht es darum zu lernen, was viele Programmierer in der Schule eigentlich hätten lernen sollen. Diese Fragen haben zwar einige gute Ratschläge, aber die sind nicht ganz das, wonach ich suche. Vielen Dank
Eric
+1 Die eine Fähigkeit, die ich gerne beherrschen würde, bevor ich ein Vollzeitprogrammierer werde, sind starke Mathematikfähigkeiten, denn Mathematikfähigkeiten sind wohl die wichtigste Fähigkeit, weil sie den Verstand darin schulen, Probleme zu lösen und neue Konzepte zu lernen, und das als Programmierer ist vor allem das, was ich jeden Tag machen werde.
Anthony
3
Arbeitsablauf. Und zu erkennen, dass dieser Code keine einzige Schneeflocke für Einhörner ist. Wenden Sie beim Entwerfen das Prinzip des geringsten Erstaunens an. Denken Sie nach, bevor Sie es tun. Der Umgang mit Komplexität wird zu einem sehr wichtigen Aspekt.
schlaflos
1
Eigentlich mag ich es nicht, mit Leuten mit starken mathematischen Fähigkeiten zu arbeiten. Sie wandeln alles in eine mathematische Formel um, anstatt die Prinzipien des Software Engineerings anzuwenden. Software ist NICHT Mathe. Es ist wichtig, dass Sie Ihren Code so schreiben, dass er leicht zu verstehen ist.
Rob K

Antworten:

21

In der Schule lernst du, Code zu schreiben. Was Sie nicht lernen, ist der Rest der Softwareentwicklung. Die wichtigsten Dinge, über die ich in der Schule nie etwas gelernt habe, sind:

  • Arbeiten als Teil eines Entwicklungsteams
  • mit Versionskontrolle
  • mit einem Bug-Tracker

Dies sind sehr wichtige Fähigkeiten für jeden Entwickler, und es ist leider unwahrscheinlich, dass Sie sie in einem Klassenzimmer erlernen.

Mason Wheeler
quelle
4
Als Teil eines Entwicklungsteams zu arbeiten, ist mit Sicherheit eine subtile und komplexe Kunst. Ich verstehe jedoch nicht, warum Versionskontrolle und Fehlerverfolgung für neue Entwickler immer eine große Hürde darstellen. Sie sind sicherlich wichtige Werkzeuge, aber Sie verweisen die neue Person auf die Manpages, ein O'Reilly-Buch oder ein Online-Tutorial, und sie können den Brot- und Buttergebrauch in wenigen Stunden erfassen. Warum würden Sie Unterrichtszeit für so etwas verschwenden?
Charles E. Grant
1
@ CharlesE.Grant Die Versionskontrolle ist der Programmierung insofern ähnlich, als Sie die Grundlagen in relativ kurzer Zeit erlernen können, aber es braucht Erfahrung, um sie effektiv zu nutzen. Und DVCS wie Git und Mercurial müssen besser verstanden werden als CVCS wie SVN.
Izkata
8
Ich hatte noch nie Unterricht in der Pflege von etabliertem Code (was einen Großteil der Arbeit in einem Entwicklungsteam ausmacht), und meine Erfahrung im Klassenzimmer mit dem Testen von Code war minimal.
Velociraptors
1
@ CharlesE.Grant: Ich habe mehrere Jahre Kurse für Programmierer und verwandte Themen auf Hochschulniveau unterrichtet. Selbst Doktoranden haben Schwierigkeiten zu verstehen, warum sie ein Revisionskontrollsystem jeglicher Art verwenden sollten. Und wenn sie widerwillig anfangen, es zu benutzen, scheinen sie sehr schnell sehr verwirrt zu sein. +1 an Mason, weil er es als wichtiges, nicht gelerntes Thema erwähnt.
Peter K.
1
+1 +1 +1, eine für jeden Punkt. Es ist so dumm, dass sie dir diese Dinge nicht beibringen ... oder zumindest VERSUCHEN, dich zu unterrichten.
Radu Murzea
20

Ich wünschte, ich hätte zu Beginn meiner Karriere gewusst, dass ich als Entwickler eine sehr wichtige Rolle im Geschäft spiele . Ich bin nicht nur ein Code-Affe.

Als Entwickler haben Sie einen großen Einfluss auf die Teile des Geschäfts, die mit der Software zusammenhängen, an der Sie arbeiten.

Wenn Ihre Firma keine Tests für ihren Code schreibt, schreiben Sie jetzt Tests.

Wenn sie keine Bugs verfolgen, suchen Sie jetzt einen geeigneten Bug-Tracker.

Wenn Ihr Chef möchte, dass Sie sofort mit der Arbeit an einer ausgefallenen Animation für den Begrüßungsbildschirm Ihrer Tabellenkalkulations-App beginnen, aber noch Dutzende von Fehlern zu beheben sind und einige wichtige, noch nicht abgeschlossene Funktionen vor Ablauf der nächsten Kundenfreigabe vorliegen, können Sie sich über die richtige Priorisierung der Arbeit unterhalten .

Selbst wenn Sie nur "ein normaler Angestellter" sind, können Sie sich als Berater von anderen Entwicklern abheben, die nur Code schreiben und sich nicht so verhalten, als hätten sie ein berechtigtes Interesse am Geschäft.

Mark Rushakoff
quelle
9

Meine Schule hat mir nie beigebracht, wie man Probleme löst. Sie haben mir die Mechanismen des Codierens beigebracht, aber ein Problem untersuchen, verstehen und eine Lösung finden zu können, haben sie mir nicht beigebracht. Es erfordert neben dem Verständnis einer Programmiersprache auch Geduld, Genauigkeit und Intuition.

Sie lehrten auch nicht über Teamwork, Versionskontrolle und die Wichtigkeit des Schreibens von Code, der einfach zu pflegen ist. Sie haben auch nicht viel darüber gelernt, wie man Software testet. Sie haben vielleicht Unit-Tests angesprochen, sich aber nicht zu sehr mit den Konzepten Akzeptanztests, Regressionstests usw. befasst.

Disclaimer: Ich bin in den 80ern aufs College gegangen. Ich sehe jedoch Beweise dafür bei Leuten, die ich heute anstelle - frischgebackene Absolventen, die nur sehr wenig über die reale Welt des Programmierens wissen: Versionskontrolle, Testen, sauberes Codieren, Fähigkeiten zum Debuggen usw.

Bryan Oakley
quelle
+1 für den Testteil. An meiner Universität unterrichten sie es auch nicht. Ich hatte 1 Klasse (ja: eine), in der der Lehrer Unit Testing erwähnte ... für ungefähr 3 Minuten. Das ist es.
Radu Murzea
Ich weiß, dass dies eine späte Antwort ist, aber das war einer der Gründe, warum mein Mathematikstudium für meine Arbeitgeber attraktiv war. Diese Ansicht wird definitiv auch von den Arbeitgebern geteilt.
Eric
Stimmen Sie zu, in vielen Schulen werden Algorithmen (auch als "Problemlösung" bezeichnet) nicht richtig oder überhaupt nicht unterrichtet, oder es wird nicht gelehrt, wie man sie mit einer Programmiersprache anwendet, selbst wenn man "agnostisch" sein muss.
umlcat
Hmmmm .... Ihre Antwort könnte nicht entgegengesetzter zu dem sein, was ich erlebt habe. Der Sinn der Schule besteht darin, einen Hintergrund zu vermitteln, damit Sie ein Problem effektiv untersuchen, verstehen und Lösungen finden können. Ein neuer Absolvent mag zwar nicht "gut" darin sein, aber er sollte auf jeden Fall ausgebildet sein und dazu in der Lage sein. An meiner Schule haben sie überhaupt nicht programmiert. Sie sollten lernen, wie man (auf eigene Faust) programmiert, während Sie die Informationen lernen, die der Kurs Ihnen vermitteln wollte. Also, woher Sie sie nur die "Mechanik des Codierens" von lehren, ist mir ein
Rätsel
... An anständigen Schulen wird es nicht gutgeschrieben, einfach das Codieren zu lernen. Wenn Sie es schwierig finden, die Versionskontrolle zu verwenden, haben Sie weitaus schwerwiegendere Probleme, bei denen kein Schulbesuch helfen kann. Wenn Sie den endgültigen Weg finden, Code zu schreiben, der einfach zu pflegen ist, dann schreiben Sie ein Buch und werden Sie reich. Niemand hat dieses Problem bisher gelöst. Sie müssen die Teile in der Schule verpasst haben, in denen Sie Ihre Programme einreichen mussten, um getestet zu werden. Akzeptanz- / Regressionstests sind branchenspezifisch und werden eher im Unternehmen als in der Schule unterrichtet.
Dunk
7

Meiner Meinung nach sind einige der wichtigsten Dinge, die in der Schule nicht gelernt (oder richtig gelernt) wurden:

  • Wie man richtig benutzt und IDE; Die volle Leistungsfähigkeit einer modernen IDE bietet eine enorme Produktivitätssteigerung: automatisches Refactoring, Code-Navigation, VCS-Integration, Code-Analyse, Code-Vervollständigung usw.
  • So verwenden Sie einen Debugger ordnungsgemäß: Remote-Debugging, Multithread-Debugging von Anwendungen, Express-Evaluierung usw.
  • Fehlerbehebung und Wartung; in der universität bringt man einem fast gar nichts bei, in der industrie ist es jedoch üblich, fehler zu beheben.
  • Wie man in einem großen Team und an einem großen Projekt arbeitet; Grundsätzlich sind die Projekte an der Universität im Vergleich zu den großen Industrieprojekten eher klein.
  • Wie man guten Code schreibt und wie man die Lesbarkeit betont; Das kommt mit Erfahrung, aber es gibt einige Bücher, die Ihnen die Grundlagen beibringen (Code Complete, Clean Code usw.).
  • Wie man ein Framework mit voller Leistung nutzt, indem man es anpasst; an der Universität haben Sie vielleicht gelernt, wie man einige Frameworks in sehr einfachen Szenarien einsetzt; In der Industrie erreichen Sie die Eckpunkte.
  • Wie man Code nach der Spezifikation versteht und schreibt; Sie werden wahrscheinlich lernen, wie man Spezifikationen schreibt, aber jetzt, wie man sie liest und interpretiert

VCS, Bug-Tracking-Systeme, Build-Tools usw. sind Tools, die Sie lernen müssen, um mit einem Team zusammenarbeiten zu können. Sie erfordern nicht viel Zeit, um auf einer grundlegenden Ebene gelernt zu werden, und sind danach ziemlich einfach (zumindest zu Beginn). Die obige Liste enthält Feinheiten, die, falls bekannt, Ihre Produktivität steigern.

m3th0dman
quelle
aka "Programming" ist nicht nur eine Programmiersprache zu kennen, es gibt eine "Umgebung", "Ökosystem", "Framework" ...
umlcat
4

Das größte, was mir bei neuen Absolventen fehlt, ist ein gutes Verständnis der Versionskontrolle.

Wenn Sie Erfahrung in der Entwicklung von Open Source-Software mit Quellcode-Repositories (wie GitHub ) haben, sind Sie mostIhren Klassenkameraden einen Schritt voraus .

Das zweite ist ein Verständnis der Komplexität ( big O). Die meisten Studenten haben davon gehört, müssen aber noch echte Software entwickeln, wo sie ins Spiel kommt, und verstehen daher ihre wahre Bedeutung nicht.

Wenn Ihre Datenmengen so groß sind, dass Brute-Force sie niemals einschränken wird, und das Verständnis anderer Techniken nützlich ist und Sie mit Erfahrung und Fehlern abschätzen können, wann Brute-Force für die Situation in Ordnung ist.

Martin York
quelle
1
Ich denke, der Mangel an Versionskontrollausbildung beginnt sich zu ändern. Die Versionskontrolle war in meiner Schule stark beansprucht.
Southpaw Hare
@SouthpawHare: Ich sage nicht, dass es nicht existiert, sie haben es sogar zu meiner Zeit gelehrt. Nur dass die Leute, die mit dieser Erfahrung von der Universität kommen, immer noch in der Minderheit sind. Und als solche sind Menschen, die es haben, wertvoller. Ich stimme nicht zu, dass es sich in den letzten 20 Jahren stark verändert hat.
Martin York
3

Wie man gut debuggt, insbesondere mit einem Debugger, und wie man einen Fehler richtig angeht, dh herausfindet, was der Grund ist, warum er den Fehler verursacht, und warum Ihre Lösung ihn behebt, anstatt einfach Dinge auszuprobieren und zu hoffen.

Die meisten Absolventen der Informatik sind auffällig schlecht im Debuggen und benötigen daher viel mehr Zeit, um das Problem zu beheben, als erforderlich ist, und verursachen dabei mehr Fehler.

Andere Dinge wie Versionskontrolle, Fehlerverfolgung usw. sind erwähnenswert, aber meiner Meinung nach ist der Mangel an vernünftigen Ansätzen zum Debuggen ein viel größeres Problem und erfordert mehr Lernaufwand.

Jack Aidley
quelle
2

Was ist die einzige Fähigkeit, die Sie gerne gelernt hätten, bevor Sie ein echter Programmierer wurden?

Nach meiner Erfahrung hat mir meine Schule nie beigebracht, wie man Probleme löst.

Nach meiner Erfahrung dreht sich beim Programmieren alles um das Lösen von Problemen. In meiner Schule wurde nur geprüft, ob man ein Programm ohne Syntaxfehler schreiben kann. Was tatsächlich benötigt wird, wird nicht als Eingabe angegeben. Die Syntax ist nur etwas, das Sie bei Bedarf in Büchern nachschlagen können. Die Fähigkeit, ein Problem zu lösen, kann jedoch nur erreicht werden, wenn Sie es gut üben und sich darin ausbilden.

Lassen Sie es von jedem Typ sein, versuchen Sie, so viele Fragen wie möglich zu beantworten, damit Sie ein gewisses Vertrauen in sich selbst aufbauen. Versuchen Sie es mit etwas Leidenschaft in Ihrem Kopf, und Sie werden sicher durchkommen.

Abijith Kp
quelle
2

Nehmen Sie sich etwas Zeit, um einige gängige Entwurfsmuster zu lernen: Factory, Singleton, Adapter, Befehl und Beobachter (meine Hochschule hat sie nicht unterrichtet).

Wenn das Unternehmen die Agile-Methodik für die Softwareentwicklung verwendet, ist ein gewisses Verständnis von Vorteil.

user86834
quelle
2

Viele der Fähigkeiten, die Sie als professioneller Programmierer benötigen, sind in einem universitären / akademischen Umfeld für jeden nahezu unmöglich.

Sie können nur aus Erfahrung stammen, die sie direkt vor Ort gesammelt haben.

  • Lernen, wie Sie mit Menschen außerhalb Ihres "Berufs" wie Grafikdesignern, Produktdesignern, Managern usw. zusammenarbeiten und kommunizieren können.

  • Verstehen, dass Ihre Aufgabe nicht darin besteht, Code zu schreiben, sondern ein Produkt zum Leben zu erwecken. Leichter gesagt als getan.

  • Wissen, wie man gute Codierungspraktiken mit praktischen Überlegungen in Einklang bringt. Erwerb der Fähigkeit, zu beurteilen, ob der Code "gut genug", "überarbeitet" oder "überarbeitet werden muss".

  • Lernen Sie, Ihre eigenen Schwächen und Unsicherheiten zu überwinden. Die Fähigkeit erwerben, Kritik standzuhalten. Dein Ego loslassen. Lernen, was es heißt, persönliche Verantwortung zu übernehmen und sie dann zu übernehmen.

Über all das ist leicht zu lesen. Es ist eine ganz andere Sache, dies in die Praxis umzusetzen. Der einzige Weg ist, es zu tun. Sie werden viele Male gebissen, und es wird wahrscheinlich weh tun, aber Sie werden gestärkt und besser herauskommen.

Relevante Lektüre: Lehrlingsmuster

hasen
quelle
1

Es hängt alles von der Schule ab. In meinem College haben wir viele praktische Projekte. Sehr oft in Teams und mit verschiedenen Quellcodeverwaltungen. Daher denke ich, dass sich einige Schulen auf diese konzentrieren.

Aber eines lehrt die Schule nicht: Details. Sehr oft, wenn die Schule Technologie oder Praxis lehrt (wie Webentwicklung, JAVA-UI-Entwicklung, fortgeschrittene Datenbanken), kratzen sie nur die Oberfläche und gehen nie auf Details ein, die notwendig wären, um diese Technologie oder Praxis in der Praxis anzuwenden. Sie erhalten einen allgemeinen Überblick über mögliche Lösungen für Ihre Probleme, müssen sich jedoch mit den erforderlichen Details vertraut machen.

Nur wenn die Schule etwas in Details unterrichtet, steckt ein starker mathematischer oder theoretischer Hintergrund dahinter. Dinge wie formale Sprachen oder SQL-Datenbanken sind ziemlich oft ein zentraler Bestandteil des Lehrplans, da sie auf mathematischen Grundlagen aufbauen und häufig in den Informatik- oder Ingenieurwissenschaften verwendet werden.

Euphorisch
quelle
1
  • Anforderungen - falsch verstehen und ausruhen ist meist eine Verschwendung
  • Prioritäten (welche Funktion in welcher Version)
  • make or use out of box (kaufen / freeware)
  • Zusammenarbeit
  • Projektmanagement - Anforderungen, Qualität (Datenmuster in Produkten, Testfälle, Testverfahren, Berichterstattung vor dem Programmieren, Kosten, aber keine Relevanz. Lesen Sie ein PMI-Buch
  • Kommunikationsmittel (Mail, Meetings: Kalenderplaner)
  • Quellcodeverwaltung
tgkprog
quelle
0

Ich wünschte, ich hätte schon viel früher im Spiel entschieden, ob ich ein Gesamtprogrammierer sein möchte, viele verschiedene Dinge, Sprachen, Datenbanken und Plattformen lernen und schließlich Webentwickler werden möchte oder ob ich mich nur auf ein CMS spezialisieren möchte. Oder spezialisieren Sie sich einfach auf Photoshop. Als Spezialist sind Ihre Fähigkeiten genauso wertvoll und rentabel wie das Wissen, was ein echter Programmierer wissen sollte. Mit anderen Worten, wenn Sie nur gutes Geld verdienen müssen, spezialisieren Sie sich einfach auf EINE SACHE. Wenn Sie den Computer lieben und gerne Probleme lösen, dann sind Sie ein Programmierer.

[Nachdenken über und nach dem Erlernen von 4 oder 5 verschiedenen Javascript-Frameworks, bevor JQuery wirklich gut herauskam. AS400- rpg,> .NET - c # und PHP, bevor ich Photoshop beherrsche und gleich viel Geld verdiene, ohne Fehler beheben oder Software schreiben zu müssen. ]

Ich meine, es ist eine gewisse Befriedigung, ein breites Themenspektrum zu kennen, aber die Befriedigung lässt nach, wenn Sie jemanden sehen, der Photoshop-Bargeld nur mit dem gleichen Gehalt kennt.

Eric
quelle
2
Ja, aber diese Art von Spezialist wird niemals einen eigenen Laden eröffnen. Wenn Sie in Zukunft davon träumen, ein CEO Ihres eigenen Startups zu sein, benötigen Sie eine Vielzahl von Fähigkeiten.
Davor Ždralo