Meillo hat geschrieben:Worum geht es denn? Darum, dass der Code das Richtige tut und dass er auch noch das Richtige tut nachdem jemand anderes ihn neu angefasst hat. Was dem zutraeglich ist, das wuerde ich tun.
Grundsätzlich stimme ich dir zu. "Dass der Code auch noch das Richtige tut, nachdem jemand anderes ihn angefasst hat", trifft ja auch auf einen selber zu, wenn man nach x Jahren mal wieder in den Code schaut und eine Anpassung machen muß. Aber: Ich würde niemals auf Unwissenheit der Basics anderer Rücksicht nehmen, und ich tendiere dazu, eher wenig als viel zu klammern. (In diesem konkreten Falle würde ich auch klammern, aber aus anderen Gründen.)
Es ist halt immer schwierig die Grenze zu finden, wo beherrschen beginnt.
Für mich ist es weniger eine Grenze als eine Einstellungssache. (BTW: Beherrsche ich die Sprache "Deutsch"? Wenn ich mir so manchen Schriftsteller im Vergleich anschaue, kann ich da nur "nein" antworten.)
Wenn man schwammig wird, kann man entweder herumlavieren oder das zum Anlaß nehmen, sich ein paar Abende hinzusetzen und zu lesen. Wenn man einen Fehler gemacht hat, kann man entweder "Shit happens!" denken und so weiter machen wie bisher, oder aber man kann sich überlegen, wie man den Fehler hätte entweder vermeiden oder zumindest Mechanismen hätte einbauen können, um ihn schneller zu finden. Wenn man einen Fehler nicht versteht, kann man entweder herumbasteln bis es geht (und hat damit beide Teile des Memes erfüllt), oder aber man kann dies zum Anlaß nehmen, etwas zu lernen, indem man sich solange auf den Hosenboden setzt, bis man den Fehler verstanden hat. (Ersteres ist IMHO grob fahrlässig, denn solche Fehler tauchen oft in anderer Form (oder auf anderen Rechnern bzw. Konstellationen) wieder auf, bevorzugt bei einem Kunden in Australien. Leider wird in der Praxis oft so gearbeitet.)
aber bei setjmp(3) und longjmp(3) beispielsweise schwimme ich total
Merkwürdig, eigentlich ist das doch recht einfach (und brutal). (Vielleicht hilft es mir, daß ich einige Jahre in Assembler programmiert habe!?) Wäre ich hier schwammig, würde ich mir wohl die Implementierung von setjmp() und longjmp() anschauen.
Damit beantwortet sich (zumindest aus meiner Sicht) auch deine Frage nach dem Codebeispiel von TRex: Obwohl ich es nicht kenne (Link wäre nett!), kann ich die Frage beantworten: Muß man es verstehen? Ja! Nach meiner Ansicht versteht man es entweder schon, oder aber man schaut es sich solange an und liest ggf. nach, bis man es versteht. "Verstehe ich nicht und brauche ich auch nicht zu verstehen" ist IMHO die falsche Einstellung.
und auch wenn ich Functionpointer verwenden
Zurück zu denen. Muß man die beherrschen? Dann ist man wieder bei deiner obrigen Frage, ab wann "Beherrschen" gilt. Muß man die kennen und verstanden haben, auch wenn man die noch nie gebraucht hat? IMHO ja. Denn ich halte es für falsch, Basics erst dann zu lernen, wenn man merkt, daß man sie braucht. Wer nur grüne Legosteine kennt, wird auch nur mit grünen Legosteinen basteln, bis es offensichtlich wird, daß man ein Problem hat. Wer aber das Buch "Basteln mit Lego" gelesen hat, der wird anders (und effektiver und fehlerfreier) basteln.
Ein konkretes Beispiel: Jemand kennt das Wort "static" bei Memberfunktionen in C++ nicht. Nun hat er aber eine C-API, wo er eine Rücksprungadresse angeben muß. Eine Memberfunktion kann er nicht nehmen, "static" kennt er hier nicht, also nimmt er eine globale Funktion. Die wiederum ruft Memberfunktionen seiner Klasse auf, also muß er alles, was hier benutzt wird, "public" machen. Schlechter Code aus Unwissenheit. Nächstes Beispiel: Forward Declarations sind unbekannt. Es kommt eine Situation, wo man das gut gebrauchen könnte, weil man ungünstige Abhängigkeiten von Header-Dateien hat. Was macht man? Zum Beispiel eine Datei "alles.h" basteln, wo man alles in der "richtigen" Reinfolge lädt, so daß es klappt? (So daß der Code zwar nun compiliert, man aber nicht mehr sehen kann, welche Module die einzelnen Module denn tatsächlich verwenden.) Oder man lagert Sachen in eine neue Header-Datei aus? (Oder...) Auch hier wieder: Schlechter, fehleranfälliger Code aus Unwissenheit. (Daraus abgeleitet die Frage, ob man in C forward declarations kennen sollte? Die Antwort ist natürlich IMHO ja, auch wenn man sie in der Praxis kaum benötigt.)
Aber lassen wir das Extrem beiseite und nehmen die Programmierer die so mitten drin stehen. Die sind doch der Normalfall ueberall da draussen. Das hat nunmal auch Auswirkungen auf meinen Programmierstil, zumindest sollte es das haben, wenn ich ein erfolgreiches Projekt anstrebe, und das tue ich.
Auch ich strebe (natürlich) erfolgreiche Projekte an, aber das schaffe ich durch Disziplin und stetige Verbesserung, und nicht durch Anpassung an den "Normalfall".
Wuenschen wuerde ich es mir auch so wie du es formulierst, aber es scheint mir etwas zu idealistisch und letztlich kontraproduktiv zu sein, das zu erfordern. ...
Wieso kontraproduktiv? Von einem klassischen Musiker erwartet der Kunde auch, daß er über die Jahre reift und besser wird, und dabei aber den Respekt zu den Werken nicht verliert. Wieso darf man das nicht auch von einem Programmierer erwarten? Zumal die Auswirkungen hier schlimmer sind: Ein Kunde in Australien hat ein Problem, was man bei sich in der Firma nicht nachstellen kann. Das kann man nicht verhindern, aber aktiv die Wahrscheinlichkeit, daß es passiert, minimieren.