Mich als Physiker lehren, ein besserer Programmierer zu werden

17

Ich mochte Physik schon immer und Codierung schon immer. Als ich das Angebot für eine Doktorandenstelle in numerischer Physik (Details sind nicht relevant, es handelt sich meistens um parallele Programmierung für einen Cluster) an einer Universität erhielt, war es ein Nein -Schlau für mich.

Wie die meisten Physiker bin ich jedoch Autodidakt. Ich habe kein breites Hintergrundwissen darüber, wie man objektorientiert codiert, oder den Namen dieses spezifischen Algorithmus, der die Suche in einem kD-Baum optimiert.

Da sich meine ganze Arbeit bisher mehr um die Physik und die wissenschaftlichen Ergebnisse gekümmert hat, habe ich zweifellos einige schlechte Gewohnheiten - vor allem, weil ich selbst programmiere und nicht wirklich im Team arbeite. Ich habe meistens C verwendet, da es sehr einfach ist und "was Sie schreiben, ist was Sie bekommen" - keine Notwendigkeit für ausgefallene Abstraktionen. Ich bin jedoch kürzlich zu C ++ gewechselt, da ich mehr über die Leistungsfähigkeit der Abstraktion erfahren möchte, und sie ist ziemlich C-artig (zumindest in Bezug auf die Syntax).

Wie bringe ich mir selbst bei, wie ein Absolvent der Informatik auf eine gute, abstrakte Art und Weise zu kodieren?

Ich weiß, dass mein Code effizient ist, aber ich möchte, dass er auch elegant und lesbar ist. Denken Sie daran, dass ich keine Zeit habe, mehrere 1000-Seiten-Bände über abstrakte Programmierung zu lesen. Ich muss Zeit für aktuelle physikalische Forschung aufwenden (mein Vorgesetzter würde mich auslachen, wenn er wüsste, dass ich Zeit damit verbringe, über elegantes Programmieren nachzudenken). Wie bewerte ich, ob meine Arbeit auch aus Sicht eines Programmierers gut ist?

user787267
quelle
12
Eine Frage: Woher wissen Sie, dass Ihr Code effizient ist?
Matsemann
Ich habe viele Leute gesehen, die C ++ als erste OO-Sprache ablehnten. Ich lerne Java und ich habe Mark Dexters Video-Tutorials hier gefunden. Eclipsetutorial.sourceforge.net/totalbeginner.html , sie sind ziemlich gut und werden Sie auf TDD-Weise unterrichten. Schauen Sie sich auch Head First Java an, es ist ziemlich gut, um Java auf OO-Weise zu vertuschen.
Garv
4
@DeveloperDon, die Berechnung war ein zentraler Bestandteil der Physik, noch bevor es elektronische Computer gab. Die Berechnungen wurden von Hand oder auf mechanischen Rechnern durchgeführt. Seit dem Zweiten Weltkrieg beschäftigen sich Physiker intensiv mit Software. Wenn Sie die Rückkehr eines Kometen berechnen, die Produktion von Neutronen in einer nuklearen Kettenreaktion simulieren oder Gigabyte an Daten analysieren, um nach Anzeichen für das Higgs-Boson zu suchen, müssen Sie eine Menge Zahlen knacken. Bereits 1974 war die erste Hälfte meines ersten Physiklabors dem Unterrichten von FORTRAN gewidmet.
Charles E. Grant
1
@DeveloperDon Wenn die Physiker am CERN beispielsweise Daten abrufen, erhalten sie Daten aus Millionen von Teilchenkollisionen. Sie benötigen einen Computer, um diese Informationsmenge verarbeiten zu können. Betrachten Sie auch einen Bereich wie die Festkörperphysik, in dem Sie versuchen, die makroskopischen Eigenschaften eines Materials anhand der mikroskopischen Wechselwirkungen von Atomen zu verstehen. In einem solchen System fühlt ein einzelnes Elektron die Abstoßung / Anziehung von Milliarden von Kernen und Elektronen - und um ein solches System genau zu beschreiben, benötigt man einen schnellen Computer und effiziente Algorithmen (und einige gute Annäherungen an die Grundgleichungen).
User787267
1
Vielleicht solltest du deine Sprache von C / C ++ auf Python ändern, damit du mehr Zeit hast? Python wird oft von Wissenschaftlern verwendet , es gibt Module wie NumPy - Paket für wissenschaftliches Rechnen mit Python oder SciPy . Wenn Sie die Geschwindigkeit von C / C ++ in Python benötigen, verwenden Sie Cython . Sie können C / C ++ - Typen und -Strukturen verwenden, um eine ähnliche Geschwindigkeit wie in C / C ++ zu erzielen. Mit Cython können Sie auch vorhandene C / C ++ - Bibliotheken problemlos integrieren.
Czarek Tomczak

Antworten:

20

Denken Sie daran, dass ich keine Zeit habe, mehrere 1000-Seiten-Bände über abstrakte Programmierung zu lesen.

Bitten Sie also jemanden, Ihnen eine Checkliste mit fünf Schritten zu geben, die Sie zu einem erfahrenen Programmierer macht? Das wird nicht passieren !

Wie in jeder anderen Disziplin müssen Sie Zeit und Mühe aufwenden, um gute Programmierkenntnisse zu erlangen. Sie lernen, klaren, eleganten Code zu schreiben, indem Sie viel Code schreiben und den Code anderer sorgfältig lesen. Einige dieser 1000-Seiten-Bücher werden Ihnen Zeit sparen, indem sie die schwierigen Lektionen zusammenfassen, die andere Leute gelernt haben. Es ist eine Wahnvorstellung zu glauben, dass man als schmerzloser Nebeneffekt eines Physik-Doktortitels ein erfahrener Programmierer werden kann. Mit verrückten Programmierkenntnissen kostet es Sie nur Zeit und Mühe.

Code Complete ist eine gute Einführung in die Mechanik der Softwareentwicklung, einschließlich Ratschlägen zum Schreiben und Strukturieren von klarem, wartbarem Code. Ja, es ist ein riesiger Band, aber sicherlich nicht so dicht wie Diracs "Principles of Quantum Mechanics" oder MTWs "Gravitation". Code Complete ist so nah wie möglich an einer Checkliste mit fünf Schritten, um bessere Software zu schreiben.

Matlab, VIM, C, MPI und Valgrind sind hervorragende Werkzeuge. Sie erwähnen nicht die Verwendung eines Versionskontrollsystems. Wenn Sie durch einen Zufall noch kein Versionskontrollsystem verwenden, müssen Sie sofort damit beginnen. Die Versionskontrolle ist auch ein Geschenk für das Verfassen Ihrer Abschlussarbeit. Weitere grundlegende Tools, die Sie kennen sollten, sind ein Debugger, ein Ausführungsprofiler, ein Protokollierungsframework und ein Unit-Testing-Framework. Sie müssen nicht für jedes Buch ein Buch mit 1000 Seiten lesen. Durcharbeiten Sie die Online-Tutorials, um die Grundlagen zu erlernen, und beginnen Sie dann, mit ihnen zu arbeiten. Tauchen Sie tiefer in die Dokumentation ein, wenn Ihre Anforderungen komplexer werden.

Es ist schwieriger, Sie über das Erlernen der Grundlagen der Informatik zu beraten (im Gegensatz zu den Grundlagen des Software-Aufbaus). Sie geben nicht an, an welchem ​​Problem Sie arbeiten, ob Sie neue Algorithmen entwickeln oder vorhandene Algorithmen anwenden. Abhängig von Ihrem Forschungsproblem kann ein Überblick über die grundlegenden Datenstrukturen und Standardalgorithmen hilfreich sein. Andere Probleme würden eher von einem soliden Hintergrund in der numerischen Analyse profitieren. Wenn Sie die Grundlagen der Algorithmusanalyse erlernen möchten, gibt es mehrere gute Texte. Das Algorithm Design Manual und die Einführung in Algorithmen fallen mir ein. Es gibt auch ein paar gute Einführungskurse, die jetzt online verfügbar sind: Entwurf und Analyse von Algorithmen und Algorithmen .

Charles E. Grant
quelle
Danke für die Links, ich werde mich darum kümmern. Ich weiß, dass ich an einem Wochenende kein Coding-Guru werden werde, aber ich gehe davon aus, dass ich mich mit der Zeit allmählich verbessern werde - insbesondere, wenn ich Inspiration außerhalb der Physik suche (wie viele der Physiker, von denen ich weiß, dass sie sich nicht weniger für gute Coding-Praktiken interessieren könnten).
User787267
1
Ich würde Python in Tools als lesbare Anzahl hinzufügen
Xavier Combelle
2
+1 für das Vorschlagen von Code Complete. Es ist wirklich das Beste, was der Op lesen kann, um das betreffende Problem zu lösen.
JW01
9

Mein Hintergrund ist Ihrem ein wenig ähnlich - ich war ein Physik-Absolvent, der sich das Programmieren selbst beigebracht hat. Nachdem ich meinen Abschluss gemacht hatte, nahm ich einige IT-Jobs an und wurde schließlich Software-Ingenieur. Einschließlich ein wenig Zeit für OpenGDA (Software, die zum Ausführen von Experimenten an verschiedenen Synchrotron-Standorten verwendet wird).

Das Wichtigste, was ich über Ihre Fragen gelernt habe, als ich hier war, ist, dass es viel einfacher ist, diese Fähigkeiten von anderen Leuten zu bekommen, als sie selbst zu erlernen. Ein erfahrener Mentor kann Ihnen leicht dabei helfen, herauszufinden, wo Ihr Code schwach ist oder wo Ihnen gängige Muster und Praktiken helfen können. Während ich selbst gelernt habe, C und Objective-C zu schreiben, wusste ich nicht genau, was ich nicht wusste (wenn Sie verstehen, was ich meine), bis ich mit anderen Leuten am selben Code arbeitete. Die Tatsache, dass du hier um Rat fragst, bedeutet, dass es dir besser geht als mir :-).

Wo finden Sie einen zahmen professionellen Softwareentwickler? Ich bin kürzlich zu MentorNet gekommen , einem System, das erfahrene Programmierer mit Schützlingen zusammenbringt.

Aber Sie müssen sich nicht für ein solches formales System entscheiden. Die Suche nach einer lokalen Programmierer-Meet-up-Gruppe (oder einer Stelle, an der die Software-Engineering-Abteilung Ihrer Universität am Freitag nach der Arbeit ist) ist ein guter Anfang.


quelle
MentorNet sieht sehr interessant aus - ich werde es untersuchen. War es ein schwieriger Übergang vom Physiker zum Software-Ingenieur?
User787267
@ user787267 Da ich mich für das Programmieren interessierte (und bereits ein Hobby-Programmierer war), war ich motiviert, den Übergang so zu gestalten, wie es sich anhört, als ob Sie es wären. Daher fand ich die technische Seite nicht schwierig. Ich brauchte länger, um mich mit der Wetware auseinanderzusetzen: Ich verstehe meinen Platz in einem größeren Projektteam und wer war Experte für eine große Veränderung gegenüber der "einsamen Wolf" -Codierung, die ich zuvor durchgeführt habe.
5

Kein Königsweg zur Software

In der Antike wurde Euklid von seinem Schüler, König Ptolemaios, eine Frage wie Ihre gestellt. Seine Antwort: "Es gibt keinen Königsweg zur Geometrie."

Sie erwähnen, dass Ihr Vorgesetzter lachen würde, wenn er wüsste, wie viel Zeit Sie damit verbringen, Code wie einen professionellen Entwickler zu schreiben. Andere beantworteten Ihre Fragen mit einer Liste von Lerninhalten, die von der Quellcodeverwaltung bis zum Entwurf und zur Analyse von Algorithmen reichen.

Sie verfehlen Ihr Ziel:

"Ich muss Zeit für die Physik aufwenden"

Konzertpianist oder One Man Band?

Die Welt bewegt sich zu schnell, als dass sich Menschen damit beschäftigen könnten. Wenn Sie Konzertpianist werden möchten, teilen Sie Ihre Zeit nicht mit dem Erlernen von Instrumenten, um eine Ein-Mann-Band zu werden.

Mein Konzept für die Rolle eines Doktors in Physik bei mittleren bis großen Projekten ist, als Ideenführer für die Systemdefinition, theoretischer Experte, Fachexperte bei der Erstellung von Anwendungsfällen und Endbenutzer / Beurteiler für die durch Software-Artefakte erzeugten Ergebnisse zu fungieren. Arbeiten Sie eng mit den besten Software-Ingenieuren zusammen, die Sie können.

Wie bewerte ich, ob meine Arbeit auch aus Sicht eines Programmierers gut ist?

Wenn Sie die Messlatte hoch legen möchten, beginnen Sie hier:

Software-Architektur in der Praxis, Len Bass, Paul Clements, Rick Kazman

Suchen Sie nach dem Kapitel "Qualitätsmerkmale verstehen". Über den Code hinaus werden Benutzerfreundlichkeit, Änderbarkeit, Leistung, Sicherheit, Verfügbarkeit, Zuverlässigkeit, Testbarkeit, Wartbarkeit und Portabilität berücksichtigt (nicht Sie können es mit sich führen, aber Sie können das Design von einer Plattform auf eine andere portieren). Alle brauchen spezifische messbare Ziele. Ähnliche Referenzen beinhalten:

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

Deine Ziele gegen C und C ++

Dies sind wie bei FORTRAN harte und alte Sprachen. Positive Indikatoren für C / C ++ sind:

  • Anwendung mit Hardware, eingebetteten Systemen.
  • Bestehendes Projekt möchten Sie als Ausgangspunkt.

Es gibt viele Leute, die Webentwicklung, Datenvisualisierung und Big Data betreiben. Viele sind motiviert, andere Sprachen zu finden oder zu machen. Zum Beispiel machte der Physiker Sir Tim Berners-Lee seinen Erfolg mit HTML (aber für Physik ist wenig bekannt). Bewerten Sie Ihr Ziel im Vergleich zu Ihrer Programmiersprache.

Erwägen Sie die Verwendung von Matlab

Matlab hat eine großartige installierte Basis und ist auf Mathematik und Naturwissenschaften spezialisiert. Es verfügt über Tools zur Datenvisualisierung. Es ermöglicht Wissenschaftlern und Mathematikern, Probleme eher in der Problemdomäne als in der Lösungsdomäne auszudrücken. Matlab stellt eine Parallel Computing Toolbox und Distributed Computing Server-Produkte her.

Ich gehe davon aus, dass der Erfolg von Matlab darauf zurückzuführen ist, dass multidisziplinäre Teams mit Experten aus den Bereichen Physik, Mathematik, Elektronik und Instrumentierung, Betriebssysteme, Programmiersprachen, Softwareentwicklung, Softwaretests, Softwarearchitektur und -design zusammenarbeiten. Die Analogie mag eine Strecke sein, aber warum würden Sie sich allein da draußen aufhalten und mit Hammer, Meißel und Raspel anfangen, um etwas zu machen, wenn Sie einen 3D-Drucker zur Verfügung haben? Wie Newton fragen könnte, warum nicht auf den Schultern von jemandem stehen?

DeveloperDon
quelle
4

Sie werden einen langen Weg in der Physik zurücklegen können, ohne etwas über den "professionellen" Stil zu wissen (aus Erfahrung). Aber ich habe viele Leute gesehen, die endlose Zeit verschwenden, weil sie den Überblick verloren haben, was sie tun oder nachdem sie ihren Code für ein paar Jahre erweitert haben, sind sie nur in seiner Komplexität verloren gegangen (selbst in der Wissenschaft gibt es keinen "Wegwerf" -Code, sondern Dinge bleiben Sie viel länger als Sie anfänglich denken).

Ich würde vorschlagen, dass Sie einen Vorsprung in Algorithmen und Datenstrukturen haben, z . B. mit diesem Kurs . Danach sollten Sie in der Lage sein, produktiver über Leistung nachzudenken und beispielsweise Artikel auf Wikipedia nachzuschlagen.

Danach gewöhnen Sie sich an das, was im Kern Ihrer Sprache verfügbar ist, z. B. für C ++ cppreference.com . Ich würde Ihnen auch dringend empfehlen, die Effective C ++ - Reihe von Scott Meyers und Accelerated C ++ von Koenig & Moe zu lesen . Zumindest für C ++ bietet dies eine solide Grundlage für die Sprache.

Parallel sollten Sie versuchen, sich mit Ihren Werkzeugen vertraut zu machen. Es ist nicht unwahrscheinlich, dass Sie Ihren Code unter Linux entwickeln werden. Versuchen Sie also, zu erfahren, wie Sie mehr Diagnosen (Warnungen) von Ihren Compilern erhalten (zumindest von gcc und clang). Informieren Sie sich auch über statische Analysetools wie cppcheck oder clangs Scan-Build . Erfahren Sie, wie Sie diese Tools zu einem integralen Bestandteil Ihres Entwicklungsprozesses machen, z. B. indem Sie sie in Ihr Build-Setup integrieren (ja, Sie sollten mindestens GNU make verwenden, oder noch besser etwas wie GNU autotools / cmake / ...). Sie sollten Ihrem Toolset auch Profilerstellungs-Tools hinzufügen. Für C ++ würde ich Ihnen dringend empfehlen, alles über valgrind zu lernen, das sich auf einem sehr niedrigen Niveau profilieren kann (es kann Ihnen auch dabei helfen, Ressourcenlecks zu finden).

All dies hilft Ihnen, sich auf das zu konzentrieren, was Ihnen am wichtigsten ist (Ihre Forschung), anstatt Zeit damit zu verschwenden, Fehler zu finden oder nutzlose Optimierungen vorzunehmen. Natürlich ist es fast unmöglich, dies an einen Berater zu verkaufen, aber sie (und Sie) werden beeindruckt sein, aber die Geschwindigkeit, mit der Sie zuverlässige Ergebnisse erzielen können.

Sie haben C und C ++ erwähnt, aber für numerische Berechnungen kann ich Python nicht mit genug numpy und scipy empfehlen . Es ermöglicht Ihnen, in einer sauberen, ziemlich sauberen Sprache auf einem sehr hohen Niveau zu schreiben (Sie können sogar interaktiv arbeiten), während Sie dennoch die in C, C ++ und FORTRAN implementierten, extrem optimierten Routinen nutzen. Außerdem ist die Anbindung Ihres eigenen C- oder C ++ - Codes an Python fast trivial.

Benjamin Bannier
quelle
Danke für die Links! Ich werde es auf jeden Fall untersuchen (aber ich glaube nicht, dass ich Zeit habe, mehrere Bücher zu lesen - obwohl ich in der High School irgendwann beschleunigtes C ++ gelesen habe). Ich arbeite in einer Unix-Umgebung (ich benutze Vim als meinen Editor und mag es) und ich benutze make und Valgrind ausgiebig. Ich habe auch die Option -pedantic in gcc und -Wall ausgelöst, da dies ziemlich hilfreich ist. Vielleicht hätte ich erwähnen sollen, dass ich Hochleistungsrechnen (mit der MPI-Bibliothek für paralleles Programmieren) auf dem Supercomputer der Universität mache.
User787267
Ich sollte auch erwähnen, dass Python nicht wirklich eine Option ist, da mein Code sehr schnell sein muss - obwohl ich es zum Beispiel zum Plotten mag. Ich habe Matlab auch oft benutzt.
User787267
Ich benutze Python ziemlich oft als Front-End, um mit Routinen zu sprechen, die in meinem eigenen C ++ implementiert sind. Mit Boost ist dies ganz einfach und Sie erhalten die volle Flexibilität von Python (z. B. für die Verarbeitung von Daten zum Plotten). Außerdem ist Python für das Prototyping ziemlich gut geeignet. Sobald ich weiß, dass etwas von entscheidender Bedeutung ist, kann ich es immer nach C ++ verschieben. Da Sie MPI erwähnen, würde ich Ihnen empfehlen, einen Abend mit IPython zu verbringen, das eine schöne Schnittstelle für verteiltes Computing darstellt.
Benjamin Bannier
@ user787267 Es ist nicht mehr unbedingt wahr, dass Python langsam arbeitet - schauen Sie sich zum Beispiel youtube.com/watch?v=Iw9-GckD-gQ an. Der Schlüssel ist, dass Sie mit Python schneller einen Arbeitscode schreiben können, den Sie dann beschleunigen können, indem Sie 1) numpy / scipy verwenden, 2) Cython oder shedskin verwenden und 3) nur den Kernalgorithmus in ein C / C ++ - oder FORTRAN-Modul einfügen, wenn Sie brauchen wirklich die letzten 5% Verbesserung. Denken Sie auch daran, dass die Zeit, die Sie mit dem Codieren verbringen, die Zeit ist, in der der Code noch nicht ausgeführt wurde. Es kann daher manchmal effizienter sein, einen 80% -Leistungscode in der Hälfte der Zeit schreiben zu lassen
Tobias Kienzler,
Normalerweise mache ich Prototypen in Matlab, um die einfachen Dinge zu testen, aber ich wollte für eine Weile zu Python wechseln. Ich werde es mir ansehen. Aufgrund großer Teile meines Codes, der bereits in C ++ geschrieben wurde, möchte ich die Sprache jedoch nicht zur Hälfte ändern. Es ist zwar richtig, dass Sie auch die tatsächliche Programmierzeit berücksichtigen müssen (und glauben Sie mir, das tue ich), aber ich denke nicht, dass dies eine Ausrede sein sollte, um Ihre Programmierfähigkeiten (nach und nach) nicht zu verbessern.
User787267
4

Wie bewerte ich, ob meine Arbeit auch aus Sicht eines Programmierers gut ist?

  • Ist es richtig? Produziert es in allen Fällen korrekte Ergebnisse?

  • Können andere Ihren Code lesen und leicht verstehen?

  • Wenn Ihr Vorgesetzter sagt "Großartig, jetzt machen Sie es auch mit X ...", müssen Sie viel Code umschreiben?

  • Wenn Sie ein Programm geschrieben haben, wird es zu einem Werkzeug, das Sie immer wieder verwenden können, oder wird es einmal verwendet und weggeworfen?

Wenn Sie mit "Ja", "Ja", "Nein" und "Ja" antworten können, versuche ich, Werkzeuge und keine einmaligen Berechnungen anzufertigen, dann geht es Ihnen schon ziemlich gut. Vieles, was wir als Programmierer tun, soll bei den oben aufgeführten Dingen helfen.

Caleb
quelle
3

Ihre Programme unterscheiden sich grundlegend von kommerziellem Quellcode, weshalb viele bewährte Methoden und Ansätze für die tägliche Entwicklung von Quellcode nicht gelten. Aber es gibt eine gute Möglichkeit, ein paar Tipps und Tricks zu lernen.

Lassen Sie einen guten Softwareentwickler Ihren Code überprüfen und gemeinsam optimieren. Es wird Ihnen viel mehr Erfahrung geben und Ihnen gute Praktiken beibringen. Überprüfen Sie auch den Quellcode, der von anderen Personen geschrieben wurde. Suchen Sie auf sourceforge oder github nach Open Source-Projekten und lesen Sie deren Quellcode.

Überlegen Sie sich aber vor allem, ob Sie tatsächlich etwas Neues lernen müssen, um Ihre Ziele zu erreichen. Wenn Sie unnötige Dinge tun, um den Code ansprechender zu gestalten, erhalten Ihre Anwendungen keinen Mehrwert.

Andrzej Bobak
quelle
Das Lesen und die Teilnahme an Open Source-Projekten ist eigentlich eine sehr gute Idee - aber etwas, das ich in meiner Freizeit tun müsste (aber da ich gerne programmiere, sollte das kein allzu großes Problem sein). Ein Grund, warum ich ein besserer Programmierer werden möchte, ist, dass ich nicht sicher bin, ob ich im akademischen Bereich bleiben werde. Wenn mein Doktor Ist das erledigt, bekomme ich vielleicht gerade einen Job in der Branche - und hier sollte ein erfahrener Programmierer gefragt sein. Ein weiterer Grund ist die intellektuelle Befriedigung, etwas Elegantes / Schönes zu schaffen - wie das Lösen einer wirklich schwierigen Differentialgleichung.
User787267
Leider erfordert die Industrie Fähigkeiten, die Sie in der akademischen Entwicklung normalerweise nicht erwerben. Das Zeug, das Sie während Ihrer akademischen Forschungen schreiben, ist normalerweise weniger als 5% des Quellcodes der kommerziellen Anwendung.
Andrzej Bobak
3

Wenn es darum geht, ein besserer Programmierer zu werden, gibt es keine magische Kugel. Wenn Sie Autodidakt sind, ist der Schlüssel die Selbsterkenntnis, wie es sich anhört. Das Erlernen des Codierens hängt jedoch hauptsächlich vom Lesen und Üben ab.

Sich kritisch gegenüber seinem eigenen Code zu verhalten, ist eine der besten Möglichkeiten, besser zu werden. Fragen Sie sich immer:

  • Wird das leicht zu ändern sein?
  • Ist das leicht zu testen?
  • Kann ich das vereinfachen? Kann ich das leicht verstehen, wenn ich es in 3 Monaten wieder sehe?

Mein anderer Vorschlag wäre, sich nicht an C / C ++ zu binden. Das sind zwar gute Sprachen, die aus einem bestimmten Grund verwendet werden, aber Sie müssen eine Menge Dinge tun, die nicht mit dem Thema zusammenhängen. Schauen Sie sich Matlab an, ich wäre überrascht, wenn die Universität das nicht für Sie bereit hält. Betrachten Sie eine Skriptsprache wie Python. Überlegen Sie nachdrücklich, eine funktionale Sprache wie Haskell aufzugreifen - das Paradigma ist sehr mathematisch und würde wahrscheinlich wie angegossen zu Ihren Problemen passen. Kurz gesagt, erforschen Sie einige andere Sprachen / Paradigmen. Auch wenn sie nicht zu einem dauerhaften Werkzeug in Ihrem Gürtel werden, machen sie Sie zu einem besseren Programmierer.

Möglicherweise möchten Sie auch einen Blick auf das Algorithmus-Design werfen. Ich vermute, dass Sie den Job bekommen haben, Sie sind schon relativ weit fortgeschritten, aber Algorithmen sind unglaublich wichtig, wenn Sie numerische Analysen durchführen. Ich vermute sogar, dass es Ressourcen gibt, die speziell auf numerische Analysealgorithmen ausgerichtet sind.

Verlieren Sie niemals Ihren Hauptzweck beim Schreiben des Codes aus den Augen. Sie müssen die Dinge erledigen. Ein besserer Programmierer zu werden, ist eine Methode, um das zu tun. Die Auswahl der richtigen Werkzeuge für den Job ist eine andere.

Mike Cellini
quelle
2

Erstens ist "elegant" ein relativer Begriff. Abstraktion mag Ihnen elegant erscheinen, aber für einen anderen C-Aficionado mag sie unnötig erscheinen. Um Ihre Frage zu beantworten, sollten Sie auf jeden Fall versuchen, Ihren Code zur Überprüfung auf http://codereview.stackexchange.com zu veröffentlichen .
Vom Hauptpunkt abschweifen, einige unaufgeforderte Ratschläge, die auf meinen eigenen Erfahrungen beruhen. Wenn Sie Ihre gesamte Arbeit mit nur C erledigen können, warum möchten Sie sie dann abstrakt codieren? Möchten Sie damit anderen Benutzern ermöglichen, Ihren Code wiederzuverwenden? Wenn Sie wirklich gute Gründe haben, auf C ++ umzusteigen, entscheiden Sie sich für die Abstraktion und das Erlernen von C ++ - und OO-Konzepten. Ansonsten lass die Idee fallen. Sollten Sie meiner bescheidenen Meinung nach nicht darauf abzielen, dass Ihr Code besser lesbar und Ihre wissenschaftlichen Ergebnisse reproduzierbar sind, als dass Sie ihm OO-Abstraktionen geben? Ich selbst hatte diese Art von Obsession, OOPS zu lernen und "elegant" zu codieren. C ++ wird jedoch einige Zeit in Anspruch nehmen. Sie müssen das Speichermanagement erlernen, da die Garbage Collection in C ++ nicht automatisch erfolgt. Nehmen Sie meinen Rat an, da ich selbst für ein Forschungslabor gearbeitet habe und viel Zeit damit verloren habe, C ++ und OO zu lernen.

haCknRoCk
quelle
1
C ist jedoch noch unmanagter als C ++. In C ++ gibt es mindestens RAII.
Benjamin Bannier
Ich mag es zu programmieren, also möchte ich ein besserer Programmierer werden. Ich bin zuerst Physiker und dann Programmierer, aber das heißt nicht, dass ich meine Programmierkenntnisse nicht verbessern sollte - schließlich wäre es besser, wenn ich meinen Code zusammen mit den wissenschaftlichen Ergebnissen veröffentliche. lesbarer Code.
User787267
2

In Anbetracht Ihrer Erwähnung von Zeitmangel zum Studium der Theorie.

Wenn Sie sich nach ein paar Monaten noch einmal Ihren alten Code angesehen haben und sich gefragt haben, "was für ein Idiot hat dieser Code geschrieben", dann sind Sie auf dem besten Weg.

Wie sind Sie vorangekommen? Indem wir besseren Code sehen, den andere geschrieben haben. Eine Person kennt den Wert von "Eleganz" oder "gutem" Code nur dann, wenn sie sieht, dass er ihrer Arbeit einen Mehrwert verleiht. Anstatt Theorie zu lesen, möchte ich Sie ermutigen, die Augen offen zu halten für Code, der von anderen in Ihrem Arbeitsbereich geschrieben wurde. Halten Sie Ihre Augen offen für Konzepte, die im Stackoverflow (C ++ - Tag) diskutiert werden. Wenn Sie nur fünfzehn Minuten pro Tag mit einer solchen Suche verbringen, können Sie zufällig Konzepten ausgesetzt werden, die Ihnen helfen können. Es kann Ihnen Code anzeigen, der besser geschrieben ist als Ihr Code. Dann folgen Sie Wikipedia und erfahren mehr darüber. Solches Lernen, das aus Neugier entsteht, wird für Sie viel länger dauern und nützlicher sein als die Theorie, die Sie vergessen werden, wenn Sie am nächsten Tag aufwachen.

Probieren Sie auch Sprachen wie MATLAB oder Python aus.

Nav
quelle
Ich verbringe ziemlich viel Zeit mit Stack Exchange - es ist eine unschätzbare Ressource für mich in meiner täglichen Arbeit. Ich habe Matlab oft verwendet, aber es ist sehr einfach, schlechte Angewohnheiten zu entwickeln, z. B. keine Arrays vorab zuzuweisen, da dies sehr verzeihend ist.
User787267
+1 für Python @ User787267 Ich verstehe nicht wirklich, warum nicht vorab Array ist eine schlechte Angewohnheit
Xavier Combelle
2

Als selbst zum Programmierer gewordener Physiker fand ich meinen physikalischen Hintergrund am hilfreichsten, um die richtigen Metaphern für das Verständnis von Softwarekonzepten zu finden. Diese Perspektive machte mir auch das Programmierenlernen mehr Spaß und half mir, das Gefühl für "Eleganz" in Software zu entwickeln, nach dem Sie zu streben scheinen.

Ich habe die wichtige und unterschätzte Rolle von Metaphern und Analogien in Software in meiner CUJ-Kolumne "Denkmuster - Namen, Metaphern, bessere Programmierung und die Politik der Sprache" beschrieben . Beispielsweise werden die OO-Konzepte der Klassenvererbung häufig mit der Weitergabe von Merkmalen von Eltern an Nachkommen in einer Familie verglichen. Dies ist eine falsche Analogie. Die korrekte Analogie für die Klassenvererbung ist die biologische Klassifizierung von Organismen (z. B. ist eine Klasse RedRose eine Art Blume und eine Blume eine Art Pflanze).

Oder nehmen Sie zum Beispiel das Softwarekonzept einer hierarchischen Zustandsmaschine. Eine gute Metapher ist hier das Konzept eines gebundenen Quantensystems wie des Wasserstoffatoms. Wie Sie sich erinnern, werden die Zustände eines Atoms durch drei Quantenzahlen | n, l, m> nummeriert, genau weil sie "verschachtelt" (hierarchisch) sind. Diese Metapher zeigt Ihnen, wie Sie verstehen, dass Zustände in Zuständen verschachteln (genau wie Drehimpulszustände (l) in den Energiezuständen (n) verschachteln) und dass Zustandsverschachtelung immer eine gewisse Symmetrie des Systems widerspiegelt .

Eine weitere interessante Analogie aus der Physik ist das "Akteurmodell der Berechnung", das aufgrund von Mehrkern-CPUs und des verteilten Rechnens in der "Cloud" in letzter Zeit wiederentdeckt wurde. Ich fand es hilfreich und unterhaltsam, Ereignisse, die von staatlichen Schauspielern (auch als aktive Objekte bezeichnet) ausgetauscht wurden, als virtuelle Bosonen wie Photonen in QED oder Gluonen in QCD zu betrachten. Diese Metapher erklärt die grundlegende asynchrone Natur der Kommunikation, die vollständige Ereignisverarbeitung (Quantensprung) und die strikte Einkapselung von aktiven Objekten, die nur über die expliziten Zwischenartefakte miteinander interagieren können.

Wie auch immer, die Entwicklung einer Systemmetapher wird in XP (eXtreme Programming) empfohlen, und als Physiker haben Sie einen Vorteil darin, gute Metapher zu finden. Sie werden auch ein Gespür für "Eleganz" entwickeln, da Ihre Software die konzeptionelle Integrität von guten Metaphern erbt, die Sie anwenden.

Miro Samek
quelle
Obwohl die Physik potenziell eine reiche Quelle von Metaphern ist, besteht die Absicht von XP darin, eine Metapher zu finden, die die Kommunikation mit dem Kunden vor Ort und anderen Teammitgliedern erleichtert. Daher werden im Allgemeinen Metaphern gewählt, die allgemeiner verstanden werden.
Pete Kirkham
2

Ich kann Ihnen sagen, dass die größten Fortschritte, die ich beim Lösen von Problemen erzielt habe, alle durch das Erlernen funktionaler Sprachen und Parser erzielt wurden. Beide Entdeckungen wurden zufällig gemacht. Wenn Sie es also wirklich ernst meinen, ein besserer Programmierer zu werden, müssen Sie die verschiedenen Techniken kennenlernen, die beim Schreiben eines Compilers zum Einsatz kommen, z. B. Parser und Parsergeneratoren. Außerdem müssen Sie lernen, wie Sie Berechnungen mit höherer Ordnung erstellen funktionen.

Eine ausgezeichnete Ressource für Parser und Compiler ist PL101: Create Your Own Programming Language . Ich habe immer noch keine gute Einführung in die funktionale Programmierung gefunden, aber ich höre wirklich gute Dinge über SICP .

davidk01
quelle
-5

Ein Absolvent der Informatik weiß nicht, wie man gut codiert, wenn er seinen Abschluss macht. Sie sind nicht so gefragt, wenn sie die Universität verlassen. Nur wenn sie die Erfahrung machen.

Die Antwort auf Ihre Frage ist, dass Sie Design Patterns lernen müssen. Ich habe in Java, .NET programmiert und arbeite jetzt als PHP-, Javascript- und MySQL-Programmierer. .NET hat übrigens einen sehr hohen Abstraktionsgrad, zB ASP.NET. Dies bedeutet, dass Sie das Lernen der Abstraktion überspringen können. Sprachen wie Perl, PHP usw. weisen einen geringen Abstraktionsgrad auf.

Lesen Sie Head First Design Patterns, es ist ein gutes Buch. Es ist ein ziemlich umfassendes Buch. Das ist alles was Sie brauchen.

Dmitry Makovetskiyd
quelle
Ich habe eine Idee, warum diese Antwort abgelehnt wurde, aber vielleicht ist es nützlich, wenn die Downvoter sagten, warum?
Pierre Arlaud