Studien darüber, wie gut ein Programmierer Code in unbekannten Sprachen verstehen kann? [geschlossen]

15

Gibt es ernsthafte Studien darüber, wie gut ein erfahrener Programmierer, der die Sprache X beherrscht, Code verstehen kann, der von einem kompetenten Programmierer mit der Sprache Y für eine Reihe von weit verbreiteten Sprachen wie X und Y geschrieben wurde?

Natürlich ist die reale Welt nicht so einfach, da ein Programmierer nur eine Sprache beherrscht. Was wir wissen möchten, ist: Wenn wir unser Projekt in C # durchführen und eines Tages einige alte Physiker, die nur Fortran und Algol kennen, es betrachten, inwieweit würde es für sie Sinn machen? Mathematische Teile davon könnten für sie gut lesbar sein, wenn sie ignorieren, was für sie zufällige Satzzeichen sind. Oder könnte ein Python-Experte Fehler in meinem cleveren Ruby-Skript finden?

Es kann Probleme geben, von der oberflächlichen Syntax bis hin zur Ebene großer Konzepte wie Objekte, Vorlagen-Metaprogrammierung, Funktionalität und so weiter. Ich erwarte nicht, dass der eine Programmierer jedes Syntaxdetail von Code in einer "Fremdsprache" vollständig versteht oder der Religion eines großen Konzepts folgt, aber ich frage mich, inwieweit er den Hauptkontrollfluss bekommen würde, um den Punkt zu finden Stellen Sie sicher, dass ein Roboter, der für das Fahren eines Autos programmiert ist, den Motor abschaltet, wenn etwas auf dem Bildschirm gezeichnet ist und die Farbe oder Größe bestimmt.

Eine Studie von guter Qualität würde veröffentlichte akademische Forschungen, einen offiziellen Bericht einer Industriegruppe oder eines großen Softwareunternehmens beinhalten, obwohl ich systematisch unvoreingenommene Beobachtungen von erfahrenen Leitern von Workshops und Kursen oder anderen Quellen machen werde. Kein Interesse an kurzen Blogs, Einzelfallbeispielen oder Anekdoten. (Nun, vielleicht ein paar Anekdoten, wenn sie für eine gute Lektüre sorgen.)

DarenW
quelle
1
Ich weiß nicht, ob es irgendwelche Studien gibt, aber aus meiner persönlichen Erfahrung sage ich Ja, ich habe es geschafft, ein Programm zu verstehen, ohne die Sprache zu kennen.
SuperM
2
Dies hängt von zwei Sprachen ab: Wählen Sie "C #" oder "Java" - und Sie erhalten eine nahezu sofortige Vertrautheit. Wählen Sie Algol vs. C - und Sie werden mit einem einseitigen Spickzettel vertraut. Viel Glück beim Auswählen von C gegen Prolog oder Whitespace gegen Ada - es wird frustrierend sein. Übrigens spielt nicht nur die Sprache eine Rolle für das Verständnis eines Programms: Ein C-Experte, der sich auf eingebettete Designs spezialisiert hat und versucht, in C geschriebenen MFC-Code zu verstehen, ist ein trauriger Anblick (dies ist Erfahrung aus erster Hand).
dasblinkenlight
Wie einfach ist es für jemanden, der Algebra versteht, Trigonometrie zu lernen, gegen jemanden, der Kalkül versteht? Es kommt auf die Sprache und das Paradigma an. Das Erkennen und Isolieren der Unterschiede zwischen den Sprachen ist schwierig genug, zumal sich die Sprachen ständig weiterentwickeln. Ich bezweifle ernsthaft, dass jemand das Verständnis mit angemessener Genauigkeit beurteilen kann.
Evan Plaice

Antworten:

9

Es hängt natürlich davon ab, inwieweit die Sprachen miteinander verwandt sind. Wenn Sie beispielsweise einen C- oder C ++ - Hintergrund haben und entweder C # - oder Java-Programmierung ausgeführt haben, sollten Sie die andere der beiden Sprachen (Java oder C #) leicht lesen und verstehen können. Wenn Sie Lisp gut kennen, sollte Scheme kein großes Problem sein. Ich habe einmal ein PHP-Programm ohne PHP-Kenntnisse getestet, nur mit meinen Kenntnissen aus C, C ++ und Perl. Ich bin mir ziemlich sicher, wann dieses Programm in Haskell oder Smalltalk geschrieben worden wäre, das wäre für mich immens schwerer als unmöglich gewesen.

Tatsächlich glaube ich nicht, dass eine akademische Forschung zu diesem Thema Sinn ergibt (zumindest keine ernsthafte). Es gibt keinen "erfahrenen Standardprogrammierer, der die Sprache X beherrscht", sodass in jeder Studie gesicherte Basisdaten fehlen würden. Die Leute haben unterschiedliche Kenntnisse und auch wenn sie die gleichen Schulen durchlaufen haben, sind sie unterschiedlich talentiert und motiviert.

Aber fragen Sie sich, inwieweit sie den Hauptkontrollfluss erhalten würden, und finden Sie die Stelle, an der etwas auf dem Bildschirm gezeichnet wird

Das kann schwierig sein, selbst wenn Sie mit der Sprache sehr vertraut sind, entweder weil die Codequalität so niedrig ist oder das verwendete Framework so komplex ist oder die Codebasis sehr groß ist.

Doc Brown
quelle
6

Sie sind sich nicht sicher, ob es sich um eine akademisch durchgeführte Referenz handelt, aber eine selbsterklärende Benennung von Methoden, Klassen und Funktionen in C # / C ++ / Java / Python oder anderen Sprachen sollte das Verständnis der Codebasis sowie des Ablaufs von Geschäftsprozessen erleichtern.

Die Namenskonvention innerhalb des Projekts und allgemein in der Softwareentwicklung ist ein sehr wichtiger Aspekt. Dieits importanceRelevanz für die Erstellung hochwertiger Software wird jedoch häufig übersehen oder ignoriert.

In .NET Framework verwendete Benennungsrichtlinien und in .NET verwendete allgemeine Benennungskonventionen sind ebenfalls eine gute Referenz.

Yusubov
quelle
Gute API-Design- und Namenskonventionen helfen dabei, aber selbst sprachbasierte Namenskonventionen werden häufig in einer Weise "bewertet", die nur für diese Sprache gilt. Neben C # / Java (die nahezu identisch sind) arbeiten die meisten Sprachen nach unterschiedlichen Prinzipien, die spezifische Workflows und Implementierungen für diese Sprache aufweisen. In Sprachen, die nicht dem mega-monolithischen Kern-Framework-Modell folgen, gibt es zum Beispiel normalerweise ein riesiges Ökosystem von Paketen, die mithilfe eines gemeinsamen Paket-Managers zusammengefügt werden.
Evan Plaice
3

Es hängt immens vom einzelnen Programmierer ab und davon, wie er Sprachen verinnerlicht. Ich habe absolut keine Probleme, in einem Dutzend Sprachen zu arbeiten, während ich einen Freund habe, der nur C ++ kennt. Er programmiert nicht schlechter als ich, er hat es einfach anders gelernt.

Persönlich finde ich eine verwandte Frage interessanter: Wenn es einen Fehler im Code gibt (dh Programmierer X dachte, er habe geschrieben, someFunction(x, y)aber er hat wirklich etwas anderes geschrieben), wie schwer ist es für den zweiten Entwickler, den Fehler zu identifizieren. Ein guter Programmierer X würde außerordentlich deutlich machen, was er vom Computer wollte, und das wäre leicht zu lesen. Wenn er jedoch einen Fehler gemacht hat, kann dies eine große Sache sein. Dinge wie der folgende C ++ - Fehler:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

Kann NOTORIOUS schwer zu erkennen sein, wenn Sie die Sprache nicht kennen.

Cort Ammon - Setzen Sie Monica wieder ein
quelle
1

Es kommt nicht nur auf den Programmierer an, wie andere gesagt haben, sondern auch auf die Ähnlichkeiten zwischen Sprachen, sowohl in der Syntax als auch in der Philosophie und in der Implementierung.

Viele verschiedene Sprachen verwenden eine C-abgeleitete Syntax. Wenn Sie mit dieser Art von Syntax vertraut sind, ist es daher einfacher, dem Kontrollfluss zu folgen. Das Gleiche gilt für stark typisierte und lose typisierte Sprachen, Sprachen mit Unterstützung für Funktionen höherer Ordnung, Abstraktionsgrad und programmatische Philosophien. Es kommt nicht nur darauf an, dass Sie die Syntax lesen können, sondern auch mit den Sprachkonzepten und -philosophien vertraut sind.

Wenn Sie zum Beispiel C gelernt hätten, wäre es vernünftig zu erwarten, dass Sie den Steuerungsfluss von C #, Java oder C ++ usw. ableiten können. Die Entschlüsselung von VB ist aufgrund der unterschiedlichen Syntax etwas schwieriger JavaScript aufgrund von Closures, schwacher Typisierung und Funktionen höherer Ordnung (ich weiß, dass Sie dies in C tun können, aber es ist ein wenig wackelig). Ich würde jedoch nicht erwarten, dass Sie Lisp, F #, R oder Assembly debuggen können, da diese ein völlig anderes Programmierparadigma verwenden.

TL; DR Es ist nicht nur wichtig, die Syntax zu erkennen. Meistens können Sie eine Deklaration oder einen Methodenaufruf entschlüsseln. Den Grund für das Verständnis und das Lesen von Code zu verstehen, ist jedoch entscheidend .

Nimnam1
quelle