Ist es in Ordnung zu leben, ohne zu wissen, wie das von Ihnen erstellte Programm funktioniert?


16

Ich meine, es gibt wirklich nützliche Bibliotheken, die Probleme lösen können, wenn Sie nicht weiterkommen und nicht wissen, wie Sie dieses oder jenes mit Ihren Kenntnissen der verwendeten Programmiersprache lösen können ... Zum Beispiel Boost für C ++ oder JQuery für JavaScript oder Spring für Java ... Sie lösen Probleme in Sekunden und es ist Ihnen egal, wie sie es gemacht haben (obwohl sie in derselben Sprache geschrieben sind, in der Sie programmieren) ... Ich frage mich also, ob ich allein bin, wenn ich Libs benutze, ohne es zu sein in der Lage, Lösungen für meine Probleme von Grund auf neu zu schreiben, oder ist es üblich?


Sie lösen keine individuellen Probleme, sondern sind nur eine Lösung für häufige Probleme in verwandten Bereichen.
Abimaran Kugathasan

Ist es in Ordnung, nicht zu wissen, wie man allgemeine Probleme im verwandten Bereich löst, und zu sagen, "verwende einfach *** (deine Lieblingsbibliothek hier)", würde es das Problem beheben, wenn man nicht weiß, wie sie es tatsächlich getan haben?
Kabumbus

1
Haben Sie jemals skalierbare Programme programmiert? Ehrlich gesagt, keine Bibliothek ist zu 100% perfekt, und Fehler sind nicht auszuschließen. Wenn sich dieser Fehler in einer der vielen externen Bibliotheken befindet, die Sie verwenden, und zwei Jahre später in der Entwicklung Probleme auftreten, und was wissen Sie dann? Es ist eine dieser Bibliotheken, die Sie verwenden! Um ehrlich zu sein: Nein, es macht keinen Sinn, Bibliotheken als Schnellreparatur zu verwenden (zumindest nicht für Unternehmenssoftware usw.), da sie mit der Zeit zu einer gewissen Einschränkung werden.
Jerluc

5
@jerluc: Standardbibliotheken sind häufig weitaus besser entwickelt und werden besser unterstützt als der Code einer Organisation. Beispiel: Boosts shared_ptr wird von allen in der Industrie, mit denen ich in Kontakt gekommen bin, als ein "Muss" angesehen, und verschiedene andere Codeteile, die von Boost bereitgestellt wurden, haben es dem Projekt, an dem ich arbeite, ermöglicht, sich auf die Details des Problems zu konzentrieren und nicht Zeit damit verbringen, an weniger wichtigen Dingen zu arbeiten, die bereits erledigt wurden. Es kann später zu Problemen kommen. Wählen Sie daher die Bibliotheken aus, die Sie auswählen, aber im Allgemeinen sind sie gut. "Nicht hier entwickelt" -Syndrom ist jedoch schlecht.
TZHX

@TZHX Ich nehme an, ich sollte definitiver sagen, dass das, was ich angegeben habe, hauptsächlich für Bibliotheken gilt, die solche Dinge tun können, wie das Umschließen von "Boiler-Plate" -Code. Es ist sinnvoll, dem "erfundenen Rad" zu vertrauen, indem keine IO-Wrapper geschrieben werden (wenn Bibliotheken für solche Wrapper verfügbar sind), aber es ist nicht sinnvoll, einem "etwas runden Rad" oder mit anderen Worten einer Bibliothek zu vertrauen, die dies tut Eine Art Black-Box-Magie, die genau das tut, wofür Sie sie gerade brauchen.
Jerluc

Antworten:


22

Ist es in Ordnung, nicht zu verstehen, wie man die Probleme selbst löst und stattdessen Bibliotheken verwendet?

Im Allgemeinen ist es nicht.

Eine Bibliothek kann Ihnen die (harte!) Arbeit ersparen, ein Problem zu lösen, die Lösung zu debuggen und sie dann zu warten. Aber wenn Sie es verwenden möchten, sollten Sie besser verstehen, wie es funktioniert - warum die Lösung das Problem tatsächlich löst. Wenn Sie als Mechaniker arbeiten, müssen Sie nicht wissen, wie man Autos, Motoren und Roboter erfindet, die Automotoren bauen. Sie sollten jedoch besser verstehen, wie die Teile funktionieren, was sie alle tun und wie sie funktionieren zusammenpassen!

Dies ist der Grund, warum viele Leute sehr spezialisiert werden - oft nur lernen, wie man mit einer einzigen Sprache, einer einzigen Plattform, einem einzigen Framework und einer ganzen Reihe von Bibliotheken arbeitet.

Davon abgesehen haben Sie nur so viel Zeit zum Lernen. Manchmal muss man Abkürzungen nehmen - nehmen Sie sie, aber wissen Sie, dass es sich um Abkürzungen handelt. Vielleicht haben Sie nur genug über eine Bibliothek gelesen, um zu wissen, dass Sie es herausfinden könnten, wenn Sie die Zeit dazu hätten. Oder vielleicht finden Sie nur die beiden Funktionen heraus, die Sie tatsächlich aufrufen müssen, und nur genug, um die Anrufe richtig zu tätigen. Das ist eine Abkürzung, die einen Preis hat - normalerweise später, wenn jemand (vielleicht ein älterer und erfahrener Mensch) den Code reparieren muss.


13

Einmal fragte computerworld.com.au Bjarne Stroustrup: "Haben Sie einen Rat für aufstrebende Programmierer?"
Und er antwortete"Kennen Sie die Grundlagen der Informatik: Algorithmen, Maschinenarchitekturen, Datenstrukturen usw. Kopieren Sie Techniken nicht einfach blindlings von Anwendung zu Anwendung. Wissen Sie, was Sie tun, dass es funktioniert und warum es funktioniert. Denken Sie nicht Wenn Sie wissen, wie die Branche in fünf Jahren aussehen wird oder was Sie dann tun, sollten Sie ein Portfolio allgemeiner und nützlicher Kenntnisse zusammenstellen. Versuchen Sie, besseren Code mit mehr Prinzipien zu schreiben Geringfügigere "Hacking" -Aktivität (Programmieren ist auch ein Handwerk, aber nicht nur ein Handwerk.) Lernen Sie von den Klassikern auf dem Gebiet und den besser entwickelten Lehrbüchern, und geben Sie sich nicht mit dem leicht verdaulichen "How to" zufrieden. Anleitungen und Online-Dokumentation - es ist flach. "
Hoffe, es wird Ihre Zweifel über das klären, was für eine erforderlich istEchter Programmierer und was für jeden notwendig ist, um einer zu sein.


4
+1 - Ich denke, es ist wichtig zu beachten, dass - obwohl ich mit Stroustrup 100% einverstanden bin - der OP nicht auf die Idee kommen sollte, dass dies bedeutet, dass er das Rad für jede einzelne Sache, die er tut, neu erfinden sollte. Der Hauptgrund für die Implementierung der String-Klasse und von MergeSort sowie anderer Algorithmen im Informatikunterricht liegt darin, dass wir verstehen, was sich unter der Haube abspielt, wenn wir die in der Sprache unserer Wahl verfügbaren Bibliotheken verwenden. Deal mit genug Bibliotheken mit einem guten Verständnis der Grundlagen, und man kann so ziemlich vorhersagen , was unter der Haube der Bibliothek X, Y oder Z
jmort253

Kommen von dem Mann, der mehrere Dutzend Absätze benötigt, um gründlich zu analysieren, zu rechtfertigen und zu erklären, warum die bestimmte Marke und der Geschmack des Tees sein Interesse geweckt haben, ohne auf den Punkt der anfänglichen Frage zu verzichten. ABER, ich immer noch liebe ihn!
Filip Dupanović

1
Ehrlich gesagt weiß ich viel über Algorithmen, Maschinenarchitekturen, Datenstrukturen und viele andere Dinge. Das bedeutet nicht, dass ich verstehe, was jede unserer Bibliotheken von Drittanbietern genau macht oder sogar die gesamte Theorie dahinter. Ich denke, das ist alles ein guter Rat, aber es bedeutet nicht, dass Sie alles über Ihre App wissen müssen.
David Thornley

12

Ja - und wir alle machen es!

Nehmen wir zum Beispiel einen sehr einfachen Fehler, den ich in einem Mac-bezogenen Grafikcode behoben habe. Der Code um den Fehler herum umfasste mehrere Schritte:

  1. Zunächst weist eine Objective C-Methode mit malloc () einen Pixelpuffer zu und fügt diesen seinem Objective C-Objekt hinzu.
  2. Später passiert etwas, und eine C-Routine sendet eine Nachricht an das Objective C-Objekt und ruft den Pixelpuffer ab.
  3. Die C-Routine komprimiert den Inhalt des Pixelpuffers mit jpeglib und sendet ihn über eine TCP / IP-Verbindung.

Da ist eine Menge los! Hier sind ein paar Dinge:

  • Ein dynamischer Speicherzuweiser zur Implementierung von malloc (), der davon ausgeht, dass der Speicher physisch zusammenhängend und linear adressierbar ist.
  • Das zugrunde liegende virtuelle Darwin-Kernel-Speichersystem bildet sowohl den fragmentierten physischen RAM als auch den Festplattenspeicher (der ein anderes physisches Gerät als der RAM ist) auf etwas ab, das dem dynamischen Speicherallokator als physikalisch zusammenhängender und linear adressierbarer RAM erscheint.
  • Objektsystem von Ziel C
  • Das Laufzeitmessagingsystem von Mac OS und die Art und Weise, wie es mit Objective C-Objekten interagiert
  • Die Implementierung des verlustbehafteten JPEG-Komprimierungsstandards für Rasterbilder in der jpeglib-Bibliothek, der einen diskreten Kosinustransformationsalgorithmus verwendet
  • Die Userspace-Netzwerkroutine zum Senden der Daten, die die verschiedenen TCP- und IP-Protokollimplementierungen durchlaufen, die wiederum den Betriebssystemkern aufrufen. Abhängig davon, was Sie für Ihr Netzwerk aktiviert haben, wird möglicherweise ein Treiber für den Ethernet-Anschluss, ein WLAN-Chip oder ungewöhnlicher ein USB- oder Firewire-Treiber aufgerufen.

Verstehen Sie alle Details, wie all diese Dinge tatsächlich implementiert werden? Ich weiß es nicht! Ich bezweifle, dass es sehr viele Menschen auf dem Planeten gibt, die das tun - vielleicht sogar keine. Also mache ich mir einfach keine Sorgen.

Aber es ist gut, neugierig zu sein und zumindest ein wenig über die Bibliotheken und Werkzeuge zu lernen, die Sie verwenden. Als ich anfing zu programmieren, wusste ich, dass Compiler und Betriebssysteme keine Magie sein konnten, aber sie schienen mir auf jeden Fall so zu sein. Durch meine Neugier auf diese Dinge habe ich eine Menge gelernt und hatte bisher eine großartige Karriere.


1
Wenn ich den gesamten Code verstehen wollte, den ich routinemäßig verwende, müsste ich die Datenkomprimierung einschließlich JPEGs, die geometrische Datendarstellung einschließlich aller Details in <i> The Nurbs Book </ i>, die Feinheiten der PDF- und U3D-Formate und verstehen viel mehr. Ich habe Referenzen zu allem, aber ich werde nie all diese Probleme haben.
David Thornley

Ich muss zugeben, dass ich nicht immer alle Bausteine, die ich zum Schreiben von Arbeitscode verwende, im Detail verstehe, aber ich bin unglücklich, wenn dies passiert. Wenn ich verstehe oder zumindest weiß, dass ich die Basiskomponenten verstehen kann, wenn ich muss, wird das Leben viel einfacher. Ich bin froh, dass ich weiß, wie ein Allokator funktioniert, nach welchen Prinzipien ein JPEG-Bild komprimiert wird, wie TCP / IP funktioniert, wie virtueller Speicher implementiert werden kann, wie eine CPU funktioniert usw. All diese Details auf niedriger Ebene werden abstrahiert ist gut, aber keinen Zugang zu den Details zu haben, fühlt sich wirklich schlecht an ...
Pierre Arnaud

5

Ich finde, der Hauptgrund, warum wir Bibliotheken verwenden, ist, das Rad nicht ständig neu zu erfinden und die Probleme zu abstrahieren, die sie zu lösen beabsichtigen. Sie könnten versuchen, die Probleme selbst zu lösen, aber das würde länger dauern.

Ich bin jedoch der Meinung, dass wir auch wissen oder raten müssen, wie das Problem von der Bibliothek gelöst wird. Dies wird in der Regel in der Benutzerdokumentation der Bibliothek dokumentiert. Mit Open Source-Software können Sie den Code jederzeit selbst anzeigen.

Normalerweise lösen wir Probleme auch, indem wir die schwierigen Teile abstrahieren. Warum ist das nicht in Ordnung?


5

Die Bibliotheken bieten Lösungen für häufig auftretende Probleme. Sie müssen entscheiden, ob sie das bestimmte Problem lösen, das Sie lösen. Sie sind KEIN Ersatz dafür, dass Sie nicht wissen, wie Sie ein Problem lösen sollen. Angenommen, Ihre Anwendung erfordert eine Hash-Tabelle. Sie sollten über ausreichende Kenntnisse verfügen, um zu verstehen, welches Problem eine Hash-Tabelle löst. Sie sollten in der Lage sein, die Leistung der von Ihnen verwendeten Bibliothek zu bewerten, um zu entscheiden, ob sie in Ihrer Anwendung funktioniert oder nicht. Ich glaube, dass die Verwendung einer Bibliothek zur Abdeckung unzureichender technischer Kenntnisse nicht der richtige Anwendungsfall ist. Die Entscheidung für die Verwendung einer Bibliothek sollte sich darauf konzentrieren, ob die Verwendung einer Bibliothek die Entwicklung beschleunigt und eine getestete und zuverlässige Lösung bietet. Die Entscheidung, eine Bibliothek zu verwenden, sollte sich nicht auf die Unfähigkeit des Programmierers drehen, ein bestimmtes Problem zu lösen.


Das würde bedeuten, dass ich für mein aktuelles Projekt die Details der PDF- und U3D-Spezifikationen kennen müsste. Für ein bestimmtes Schulprojekt hätte ich viel über bestimmte lineare Programmieralgorithmen wissen müssen (Simplex wäre für meinen Fall hoffnungslos gewesen). Wenn es notwendig wäre, genau zu verstehen, was eine Bibliothek tut, um sie nutzen zu können, würde ich nie etwas tun.
David Thornley

Ich behaupte nicht, dass Sie alle Details der Implementierung verstehen müssen. Sollte aber wissen, was vom Ergebnis zu erwarten ist. Nehmen Sie das Beispiel der Hash-Tabelle noch einmal. Wenn Sie eine schlechte Leistung feststellen, wie können Sie den Grund ermitteln? Das erste, woran ich denken würde, sind die Kollisionsraten zwischen meinen Schlüsseln. Wenn Sie keine Ahnung haben, wie etwas funktioniert, wie können Sie dann überhaupt Hypothesen über Gründe aufstellen, aus denen etwas nicht oder nicht so funktioniert, wie Sie es erwarten?
Pemdas

5

Bis zu dir, wirklich .

Je besser Sie die Tools verstehen, mit denen Sie arbeiten, desto besser können Sie sie nutzen.

Ich verwende zum Beispiel selten jQuery, aber wenn ich muss, weiß ich, was ich daraus machen kann und wie ich es mit anderen Frameworks wie Mootools koexistieren kann.

In Kürze werde ich mit UDK in Spielev einsteigen und ich bin mir sicher, je besser ich es verstehe, desto besser kann ich es meinem bösen Willen anpassen, aber ich könnte auch einfach den einfachen Tutorials folgen. Ich wähle die erste, nur ein wenig mehr Zeit und Gehirnzyklen und ich werde bessere und einfachere Ergebnisse erzielen .


5

Es ist wichtig, Ihr Reich und Ihren Teil des Prozesses zu kennen.

Angenommen, Sie verwenden eine Bildverarbeitungsbibliothek. Müssen Sie wirklich alles über Gaußsche Unschärfen, Transformationen und Farbräume wissen? Nein, aber Sie müssen wissen, warum Sie die Bibliothek überhaupt benutzen. Oder die Sortierfunktion eines Frameworks. Müssen Sie den tatsächlich verwendeten Sortieralgorithmus kennen? In den meisten Fällen nein. Sie müssen jedoch wissen, warum Sie die Daten sortiert benötigen.

Wenn Sie andererseits einen Compiler schreiben, wissen Sie vermutlich besser, wie ein Compiler funktioniert, da dies Ihr Teil des Prozesses ist.

Bestimmte Frameworks wie jQuery werden häufig abstrahiert. Haben Sie müssen wissen , wie genau sie arbeiten? Nein , aber mit einem starken, grundlegenden Verständnis von , was die Bibliothek wird Du tut sehr vorteilhaft sein , wie Sie Code schreiben , weil Sie besser verstehen , warum das Framework die Art und Weise hergestellt wird , ist es, und in der Lage , es zu seinem vollen Potential zu nutzen .


2

Aus meiner Erfahrung: Da Sie die Bibliotheksabhängigkeit nicht beseitigen können, sollten Sie und Ihr Team genug wissen, um das Problem zu lösen.

Als Programmierer haben wir wenig Zeit, deshalb müssen wir den wählen, der die höchste Priorität hat. Das Problem muss so schnell und sanft wie möglich gelöst werden. Nur aus diesem Grund ist es etwas überflüssig, "alles über Dinge zu lernen".

Was ich hier hinzufügen möchte, ist "Abhängigkeit". Als Gemeinschaft sind wir alle auf andere angewiesen. Wir stehen auf den Riesen, um unsere Anwendung zu erstellen: Java, .NET, API ... Und wir vertrauen den Riesen in Bezug auf ihre Arbeit; weil es für so viele Menschen funktioniert. Wenn Sie ein Problem mit dem Framework oder der API haben, besteht eine gute Chance, dass andere Probleme damit haben, und es gibt eine Lösung / Abhilfe.

Das einzige Problem hier: Vielleicht sind die Riesen irgendwo in einem eingeschränkten Kriterium zusammengebrochen. Zum Beispiel wird Flash in einigen Betriebssystemen nicht unterstützt, und es gibt viele Dinge, die wir ohne es nicht tun könnten. Diese Möglichkeit ist mehr als null, aber in diesem Fall haben wir kleine Dinge, die wir tun können. Nur in diesen Fällen erweist sich das Wissen darüber, was sich hinter den Hauben verbirgt, als nützlich, da es darauf hinweist, wo das Problem tatsächlich liegt und möglicherweise eine große Umgehungsmöglichkeit schafft. Aber ich bin mir nicht sicher, ob sich die Zeit, die wir investieren, wirklich lohnt.

Um diese Möglichkeit zu bewältigen, gibt es meiner Meinung nach eine Lösung: Weil die meisten Programmierer die "Oberflächenbearbeitung" einer Bibliothek leicht nachvollziehen können und wir nur manchmal wirklich jemanden brauchen, der sehr gut versteht: Teilen Sie das Team, um das zu tun. Der Versuch, ein Team zusammenzustellen, das jeweils über 1,2 nützliche Bibliotheken / Tools / "Fähigkeiten" informiert ist : Man hat gute Erfahrungen mit jQuery, man hat sich auf Datenbanken spezialisiert, ... Dies trägt wesentlich zur Risikominimierung bei.


2

Ein weiterer Gesichtspunkt ist die Sicherheit. Wenn Sie eine Bibliothek verwenden, von der Sie das genaue Innenleben nicht kennen, dann machen Sie Annahmen darüber, was genau passiert. Jede fehlgeschlagene Annahme kann einen Angriffsvektor für einen böswilligen Angreifer eröffnen.

Wenn Sie einen Quicksort anrufen, sollten Sie sich über das Worst-Case-Verhalten im Klaren sein. Andernfalls kann ein Angreifer möglicherweise Worst-Case-Daten einspeisen und einen DoS ausführen.

Wenn Sie eine Komprimierungsbibliothek aufrufen, sollten Sie beachten, dass es Daten geben muss, die auf mehr Bytes als das Original "komprimiert" werden, wenn einige Daten auf weniger Bytes komprimiert werden. Wenn Sie also davon ausgehen, dass der Ausgabepuffer nur die Größe der Eingabedaten benötigt, weil er [auf weniger Bytes] komprimiert, dann wartet ein Pufferüberlauf auf Sie.

Sie sollten genug Grundlagen über die Dinge wissen, die Sie tun werden, um Ihre Vermutungen als wahr erweisen zu können. Andernfalls sollte die Bibliothek dies ausdrücklich berücksichtigen, z. B. eine Ausnahme auslösen, wenn der bereitgestellte Ausgabepuffer nicht groß genug ist.


1
Das Zuweisen von Puffern mit fester Größe für irgendetwas ist ein Pufferüberlauf, der darauf wartet, passiert zu werden. Es ist viel besser, eine Sprache zu verwenden, die dynamische Arrays unterstützt, und den Angerufenen seine eigenen Puffer verwalten zu lassen.
Mason Wheeler

1

Es ist in Ordnung, nicht alles zu verstehen, was Sie verwenden, solange Sie sicher sind, dass es funktioniert. Sobald Sie von einem Fehler in der Bibliothek gebissen werden, haben Sie Zeit zu sehen, wie es funktioniert, warum es funktioniert und warum es nicht funktioniert. Natürlich sind Sie immer willkommen und ermutigt, unter die Haube zu schauen, auch wenn Sie nicht müssen.

Eine der Schwierigkeiten beim Programmieren besteht darin, die Versuchung zu überwinden, alle Probleme selbst zu lösen.


1

Es ist in Ordnung, aber es ist gefährlich. Als allgemeine Praxis sollte man wissen, was er entwickelt hat.


1

Irgendwie...

Es ist in Ordnung, solange Sie einen Überblick darüber haben, was die Bibliothek oder das Framework zu tun versucht. Was die inneren Teile angeht und was nicht, nein. Gehen Sie pragmatisch vor. Es funktioniert, es hat getan, was ich will, okay.

Es geht darum, sich nicht mit kleinen Details herumzuschlagen und einfach Ihre verdammte Idee schon umzusetzen.

Ich denke, der Punkt ist, dass Sie nicht alles wissen werden. Im Ernst, Sie haben so wenig Zeit, alles zu untersuchen, weil es Sie von Ihrem Hauptziel ablenkt, diese Idee von Ihnen zu kreieren. Vielleicht können Sie sich am Wochenende nach und nach Zeit nehmen, um ein Kapitel über das Thema zu lesen.

Aber versuchen Sie nicht, alles herauszufinden, es sei denn, Sie haben viel Freizeit ... Betrachten Sie es so. Der Grund für die Programmierung von Sprachen ist, dass wir keinen Assembler-Code ausführen. Der Grund für den Assembler-Code ist, dass wir keine Einsen und Nullen ausführen. Ich denke nicht, dass Sie alle Details des Mechanismus dahinter kennen müssen, sondern nur den allgemeinen Kern. Wie ein Müllsammler weiß ich, dass es mit meinen Zeigern und meinem Gedächtnis zu tun hat. Es ist mir egal, welchen magischen Algorithmus es verwendet. Vielleicht ist das Manko aber meh. Es sei denn, Sie sind auf dem Gebiet, auf dem Sie sich damit befassen müssen. Dann würden Sie diese Frage sowieso nicht stellen, weil sie Teil Ihres Jobs ist, haha.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.