Ist es effektiv, Code in einer Sprache zu überprüfen, die ich nicht kenne?

108

Ich bin ein erfahrener Entwickler, habe aber noch nicht viele Codeüberprüfungen durchgeführt. Ich werde gebeten, in Python geschriebenen Code zu überprüfen, aber ich kenne Python nicht.

Ist es überhaupt sinnvoll, Code in einer Sprache zu überprüfen, die ich nicht kenne?

Heather Smith
quelle
62
Gehen Sie tangential zu CodeReview.SE und sehen Sie sich das Python-Tag an. Wenn Sie nur die Frage betrachten, überlegen Sie, welchen Rat Sie dem Code geben würden, und prüfen Sie dann, ob dies in den Antworten enthalten ist.
14
Klingt nach einer hervorragenden Möglichkeit, mehr über Python zu erfahren. Stellen Sie alles in Frage, was lustig aussieht - einige verstehen Sie nicht in der Sprache, andere sind legitime Elemente für die Codeüberprüfung.
Dan Pichelman
9
@ RobbieDee Absolut! Es lohnt sich oft, den Code jemandem zu erklären, auch wenn es sich nur um einen Teddybär handelt .
Kilian Foth
34
Sie sagen, Sie werden dazu aufgefordert. Die Person, die Sie fragt, ist der Meinung, dass Sie mit dieser Aufgabe einen Mehrwert für Ihr Unternehmen erzielen. Wenn Sie wissen möchten, wie dieser Wert beschaffen ist, fragen Sie diese Person , nicht Fremde im Internet! Wir wissen nicht, was in dem Kopf dieser Person vorgeht. Vielleicht ist der Code von so geringer Qualität, dass selbst Anfänger Probleme finden können. Vielleicht ist der Code von so hoher Qualität, dass Sie daraus gute Gewohnheiten lernen. Wer kann das schon sagen? Jemand hält es für wertvoll; Fragen Sie diese Person nach dem Wert.
Eric Lippert

Antworten:

120

Irgendein Sinn? Ja. Auch wenn Sie nichts über die Semantik einer Programmiersprache wissen , können Sie dennoch Zeichen lesen und inkonsistente Formatierungen, fehlende Kommentare, falsch gewählte Bezeichner, offensichtliche Duplikate usw. feststellen.

Viel Sinn oder genug Sinn, um die Kosten Ihrer Zeit zu erstatten ? Ich bin mir nicht sicher. Dies hängt von Ihrer Position, der Bedeutung von Code-Überprüfungen im Workflow Ihres Teams und mehreren anderen Faktoren ab, die wir nicht gut genug quantifizieren können.

Kilian Foth
quelle
50
Das Durchführen von Code-Reviews ist eine gute Möglichkeit, ein Modul, ein Framework oder sogar eine Sprache kennenzulernen, sodass sich die Zeit möglicherweise trotzdem lohnt (und Sie möglicherweise darauf hingewiesen werden ...). Ich würde eine solche Rezension jedoch nicht abbestellen, ohne jemanden, der sowohl mit der Sprache als auch mit dem Code vertraut ist, dazu zu bringen, sie sich anzusehen.
Ordentliche
8
Auch wenn Sie gute Domain-Kenntnisse haben und der Code hinreichend gut benannt / kommentiert ist, können Sie immer noch falsche / missverstandene / fehlende Funktionen auf hoher Ebene entdecken (Sie können jedoch aufgrund von Syntaxproblemen keine Fehler entdecken)
Dan
4
Als Außenstehender kann man sogar sein mehr wahrscheinlich fencepost Fehler zu erkennen, oder Fehler in die richtige Menge an Gleichheitszeichen Anwendung, und diese Art von Dingen.
KlaymenDK
2
@KlaymenDK Zuweisungen in booleschen Kontexten sind (zumindest in der Regel) Syntaxfehler in Python. Fencepost-Fehler sind weniger wahrscheinlich, da Sie in gut geschriebenem Python so gut wie nie direkt mit Array- / Listenindizes arbeiten. (Selbst wenn Sie dies tun, ist dies normalerweise enumerateder Fall.) Ich denke, Ihr Kommentar ist ein gutes Beispiel dafür, warum der Versuch, eine Sprache zu überprüfen, die Sie nicht kennen, höchstens für sich selbst lehrreich sein sollte.
jpmc26
1
@Mawg - Ich würde sagen, dafür ist automatisiertes Testen gedacht. Selbst mit Expertenwissen in der Sprache ist es schwierig zu sagen, ob Code tatsächlich die Designspezifikation erfüllt, indem man ihn nur ansieht / ohne ihn auszuführen und das Ergebnis zu beobachten (es sei denn, Ihre Designspezifikation ist so detailliert, dass es sich im Wesentlichen um Code an sich handelt). . Die in der Antwort aufgezählten Aspekte decken viele (wenn auch nicht alle) gültige Gründe für die Durchführung von Codeüberprüfungen ab. Eine Codeüberprüfung umfasst im Allgemeinen nicht die Ausführung des zu überprüfenden Codes.
Donnerstag,
59

Als regelmäßiger Mitarbeiter bei Code Review Stack Exchange stoße ich auf viele Fragen, die sprachunabhängig sind, zum Beispiel:

  • Formatierung, Einrückung
  • Umfang
  • Schleifen
  • Typ Operationen

und die Liste geht weiter. Obwohl ich die Sprache nicht kennen muss, kann ich diese Probleme / Punkte dennoch überprüfen.

Einige unserer Top-User haben Top-Antworten in Sprachen, die sie entweder nicht aktiv verwenden oder nicht kennen. Sogar zwei meiner Top Ten sind in Sprachen, die ich weder kenne noch auf meinem Computer kompilieren / ausführen kann.

Ich würde sogar sagen, dass es das Gleiche ist, als würde man den Pseudocode von jemandem überprüfen. Solange Sie Dinge beobachten und kommentieren können, die für Dinge relevant sind, die Sie verstehen, geht es Ihnen gut, und es ist relevant.

Feder
quelle
2
Ich habe sogar eine Antwort auf ein PHP-Programm geschrieben. Es ist nicht die beste Antwort, aber ich behaupte immer noch, dass die ursprüngliche Schleifendeklaration hässlich ist.
Hosch250
4
Ich habe C # gelernt, indem ich es überprüft, geschrieben und das, was ich geschrieben habe, überprüft habe.
RubberDuck
5
Wenn Sie Python nicht kennen, werden Sie die Bedeutung der Einrückung in der Sprache wahrscheinlich nicht zu schätzen wissen ...
Floris
2
In Bezug auf 2/10 Ihrer häufigsten Antworten in Sprachen, die Sie nicht kennen. Wer sagt, dass die Wähler auch etwas über sie wissen?
Martin Smith
Obwohl ich die Sprachen nicht kenne, überprüfe ich meine Aussagen immer noch auf Fakten und wenn ich es vermasselt hätte ... Vertrau mir, ich würde davon hören
Quill
44

Allgemeine Hinweise

Hier ist das Fazit meiner Meinung nach:

  • Wenn Sie die Sprache nicht gut genug kennen, um die Funktionen und gebräuchlichen Redewendungen zu kennen , werden Sie wahrscheinlich nicht viel zum Review beitragen.
  • Wenn Sie die Merkmale und Redewendungen der Sprache lernen möchten , können Sie an der Überprüfung teilnehmen. Ihr Fokus sollte darauf liegen, die Redewendungen zu beachten und Fragen zu Mustern und Organisation zu stellen, die für Sie keinen Sinn ergeben. Dies kann helfen, Problembereiche zu identifizieren, jedoch nur in dem Sinne, dass Sie den Entwickler zwingen könnten, das zu verteidigen, was er getan hat. Stellen Sie Ihre Fragen so, dass Platz für Ihre Wissenslücke bleibt. Beachten Sie, dass dies ein Netz kann am Ende Kosten im Rahmen der Überprüfung selbst, sondern dass die Kosten sind eine Investition in Wissen.
  • Ihre Mitwirkungsmöglichkeiten sind begrenzt, bis Sie sich mit den Funktionen, Redewendungen und Standards der Sprache vertraut gemacht haben. Ich würde nicht erwarten , dass dies zu ändern , bis Sie tatsächlich haben geschrieben eine erhebliche Menge an Code in der Sprache.

Python-spezifische Überlegungen und Beispiele

Für die spezielle Situation, Python nicht zu kennen, wäre ich besonders vorsichtig. In Python gibt es viele Redewendungen und Standardmethoden, die dazu führen, dass gutes Python ganz anders aussieht als in anderen Sprachen. (In der Tat denke ich, dass die Dinge, die Python hervorhebt, dazu geführt haben, dass mein Code in anderen Sprachen besser aussieht , und nicht umgekehrt.) PEP8 bietet darüber hinaus ein gutes Beispiel dafür, wie Sie die Denkweise, die Python ermutigt, möglicherweise völlig verfehlen.

Schauen wir uns ein einfaches Beispiel an. Nimm diesen Code:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

Sehen Sie das Problem mit diesem Code? Wenn Sie nicht mit Python gearbeitet haben, werden Sie es wahrscheinlich nicht tun. Das Problem ist , dass es ein viel bevorzugter Stil in Python , das tut genau das Gleiche:

with open('/home/me/something.txt') as f:
    content = f.read()

Dies ist ein Kontextmanager. Weißt du, wozu sie gut sind? Wissen Sie, wann es angebracht wäre, einen zu verwenden? Wissen Sie, wann es angebracht wäre, eine eigene zu erstellen? Nein? Dann sind Sie wahrscheinlich noch nicht bereit, Python zu überprüfen.

Schauen wir uns ein anderes Beispiel an.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

Sehen Sie das Problem? Das Problem ist, dass diese Methode völlig unnötig ist . Sie sollten wahrscheinlich nur ein Verständnis verwenden, wenn die Bedienung so einfach ist:

x = range(10)
y = [i + 50 for i in x]

Wenn Sie das nicht gesehen haben, sind Sie mit den Funktionen und Redewendungen von Python nicht vertraut.

jpmc26
quelle
1
Wenn ich in Ihrem letzten Beispiel den endgültigen Code gesehen hätte, hätte ich wahrscheinlich eine Vorstellung davon, was er tun könnte (ohne Python zu kennen), und könnte mich fragen, ob ich etwas Ähnliches in meiner Lieblingssprache tun kann, was ich noch nie in Betracht gezogen habe.
gnasher729
1
@ gnasher729 "Ich denke, die Dinge, die Python hervorhebt, haben dazu geführt, dass mein Code in anderen Sprachen besser aussieht, und nicht umgekehrt." =) Das einzige, was ich in anderen Sprachen kenne, das mir auch nur annähernd ähnlich wäre, sind die .NET- Streams LINQ und Java 8 . Ruby könnte etwas haben, und ich bin sicher, dass funktionale Sprachen etwas in der Nähe haben. Mein Punkt mit dem Beispiel ist, dass Sie möglicherweise nicht einmal wissen, was Sie tun sollen, wenn Sie nicht mit Python vertraut sind, sodass Sie nicht einmal wissen, wie Sie die "schlechte" Version herausfordern können.
jpmc26
@x = 1 .. 10; @y = map {$ _ + 50} @x;
Pipe
2
Bei der Codeüberprüfung geht es mehr um Logikfehler als um die Implementierung einiger (für externe Programmierer) unklarer Syntax in einer bestimmten Sprache. Es geht darum, logische Fehler zu finden, wie einen Algorithmus völlig falsch zu implementieren (wie Division zu verwenden, wenn es Addition sein sollte). Der Code entspricht also nicht genau den Spezifikationen. Das ist nicht wichtig, solange die resultierende Ausgabe korrekt ist. Zumindest, wenn Sie sich Sorgen über bestimmte Optimierungen wie diese machen, ist eine Überprüfung des Teamcodes sogar noch besser.
Phyrfox
3
@phyrfox Das stimmt einfach nicht. Logische Fehler können gefunden werden, aber bei der Codeüberprüfung geht es auch (oder in erster Linie) um Best Practices, Sicherheit, Leistung, Zuverlässigkeit, Lesbarkeit / Wartbarkeit usw. Bevor etwas überprüft wird, sollte es wirklich getestet werden. StackExchanges Definition der Codeüberprüfung ist ziemlich genau richtig. In Python sind die Beispiele, die ich erwähnt habe, keine "kleinen Optimierungen". Ein Python-Entwickler, der diese Muster nicht verwendet, ist sehr unerfahren, nicht zeitgemäß oder inkompetent. Dies sind grundlegende Elemente der Sprache.
jpmc26
21

Möglicherweise haben sie Sie gebeten, den Python-Code genau zu überprüfen , weil Sie Python nicht kennen . Es gibt eine Management-Theorie, dass es nützlich ist, einen "Narren" in einem Team zu haben. Ich nenne dich nicht schlecht :) Die Idee ist, dass ein Team unter Gruppendenken leiden und Tunnelblick entwickeln kann. Eine Möglichkeit, dies zu umgehen, besteht darin, jemanden in das Team aufzunehmen, den die anderen Teammitglieder als "Narren" betrachten würden, dh jemanden, der das Thema nicht kennt. Sie werden Fragen stellen, um sich zu informieren, und die Fragen werden aus einer Sicht kommen, die die anderen Teammitglieder wahrscheinlich nie in Betracht gezogen haben.

Sie kennen Python nicht. Was den Python-Codierern also gewöhnlich erscheint, erscheint Ihnen vielleicht seltsam. Sie könnten eine Verbesserung vorschlagen, die das Team nie in Betracht gezogen hat.

user2023861
quelle
1
Das sollte meine Antwort sein. Ich möchte nur hinzufügen, dass an einem bestimmten Tag mit einer bestimmten Python-Routine und einer bestimmten Gruppe von Python-Gurus dieser Code GARBAGE ist.
Dwoz
Und oft löst der bloße Akt, etwas "einem Dummkopf" zu erklären, das "Doh!" Moment von einem "Experten", in dem sie plötzlich bemerken, dass der Code nicht das tut, was er soll, oder einen wichtigen Fall übersieht. Es ist auch eine anständige Methode, um die Verbreitung von Wissen in Gang zu setzen.
TripeHound
21

Bei der Codeüberprüfung geht es nicht darum, nach Variablen mit ungültiger Schreibweise und falscher Formatierung zu suchen. Wenn Sie solche Dinge mithilfe der Codeüberprüfung finden, verschwenden Sie keine Zeit mehr und verwenden Sie ein Tool.

Bei der Codeüberprüfung geht es darum, das Design zu verbessern und häufige Fehler von unerfahrenen Programmierern zu erkennen.

Da ich in C ++ programmiere und Python nicht gut genug kenne, würde ich es nicht wagen, Python-Code zu überprüfen. Allerdings könnte ich bei einer Java-Codeüberprüfung helfen.

Sie haben nicht gesagt, in welcher Sprache Sie programmieren, aber ich sehe nicht, was Sie in einer Codeüberprüfung beitragen könnten, wenn Sie die Sprache, in der es programmiert ist, nicht kennen.

BЈовић
quelle
23
Wirklich, Sie haben ein Tool, mit dem Sie schlecht benannte Variablen von guten unterscheiden können? Ich wäre sehr daran interessiert, einen zu sehen.
Davor Ždralo
1
@ DavorŽdralo Ich weiß, dass Java Checkstyle hat. Formellere statische Analysewerkzeuge sind in vielen Sprachen üblich, und die Durchsetzung eines Codierungsstandards ist in der Regel die geringste Aufgabe.
Shaz
9
Ich habe das Gefühl, dass es hier einen kleinen Unterschied zwischen den Definitionen von Code Review gibt. Erinnert mich irgendwie an diese Frage zu CR Meta: Was ist ein Code Review? . Ich würde etwas Bestimmtes nicht ausschließen und sagen "Code Review ist NICHT über XYZ". Es hört sich auch so an, als würden Sie sagen, dass erfahrene Programmierer ihren Code nicht überprüfen müssen, was ich sehr ablehne.
Simon Forsberg
3
@ SimonForsberg Das sage ich nicht. Selbst erfahrene Programmierer können in einer guten Codeüberprüfung etwas lernen. Aber wenn die einzigen Kommentare "Sie haben hier eine Variable falsch geschrieben" sind, verschwenden sie ihre Zeit.
BЈовић
2
@ BЈовић Nein, es ist nicht das Schlimmste, was Sie finden können, aber es ist ziemlich nah an "dem kleinsten gefundenen Ding, das sich noch lohnt".
Vatine
11

Codeüberprüfungen (zusätzlich zur tatsächlichen Suche nach Fehlern) sind eine gute Einführung von einem Teammitglied zu anderen für den Code, der hinzugefügt oder geändert wird. Wenn Sie ein erfahrener Entwickler sind , sollten Sie in der Lage sein, genug durchzulesen, um größtenteils zu verstehen, was vor sich geht.

Betrachten Sie eine Codeüberprüfung aus Sicht eines Teamleiters: Es gibt jemanden, der versteht, was die Anwendung tun soll (Geschäftslogik), es gibt jemanden, der versteht, was der Code tut (Implementierungslogik), und möglicherweise mehrere andere Personen Es gibt Leute, die eine Vorstellung davon haben müssen, wie das alles zusammenpasst.

Adam Zuckerman
quelle
7

Sie sollten definitiv nicht der einzige Rezensent sein, aber es gibt viele gute Gründe für Sie, einer der Rezensenten zu sein. Keine Sprachkenntnisse sind für viele Fragen, die in einer Codeüberprüfung beantwortet werden müssen, kein großes Hindernis. Zum Beispiel bin ich einer der Top-20-Antwortenden im C # -Tag auf dieser Site, und ich habe nicht einmal Hallo Welt in C # kompiliert.

Einige Fachkenntnisse, die Sie teilen können, ohne die Sprache zu kennen:

  • Fachwissen.
  • Allgemeines objektorientiertes Design.
  • Allgemeine Programmierpraktiken: Benennung, Klarheit usw.

Dies ist auch eine gute Möglichkeit, sich über ein neues Produkt zu informieren. Ich bin gerade einem neuen Team beigetreten, in dem ich die verwendeten Sprachen recht gut kenne, aber die Domäne nicht kenne. Die Teilnahme an Code-Reviews hat mir geholfen, die Domain-Seite besser kennenzulernen, obwohl ich bisher noch nicht viel dazu beitragen konnte.

In Ihrem Fall ist es eine gute Möglichkeit, die Redewendungen einer neuen Sprache zu lernen, wenn Sie die Kommentare sehen, die andere Rezensenten hinterlassen. Dies sind Dinge, die auf andere Weise nur sehr schwer zu lernen sind, da es Ihrem Interpreter egal ist, ob Ihr Code pythonisch ist oder nicht.

Karl Bielefeldt
quelle
5

Dies könnte eine Win-Win-Situation sein. Ich würde sogar sagen, dass Sie ein besonders wertvoller Rezensent sein könnten, weil Sie eine Python-Jungfrau sind, die nicht vom Fluch des Wissens befallen wurde .

Stellen Sie sich das so vor: Wenn Code klar genug ist, dass selbst eine Python-Jungfrau ihn verstehen kann, muss es sich um guten Code handeln. Die Teile, die Sie nicht verstehen können, sind möglicherweise Kandidaten für Überarbeitungen oder bessere Kommentare.

Natürlich wäre es auch für Sie von Vorteil, wenn Sie sich im Laufe der Zeit eine neue Sprache aneignen würden. (Hoffentlich ist der Code, den Sie erhalten, ein gutes Beispiel, um daraus zu lernen.) Diese Anordnung sollte besonders gut für Python funktionieren, eine Sprache, die den Ruf eines "ausführbaren Pseudocodes" hat. Wenn Sie ein erfahrener Entwickler sind, sollten Sie keine großen Schwierigkeiten haben, den Kern eines Python-Programms zu verstehen.

Die Einschränkung wäre, dass man nicht erwarten würde, dass man Fehler entdeckt, die aus sprachspezifischen Fallstricken resultieren . Die Fehlersuche ist jedoch nicht der einzige Zweck der Codeüberprüfung. Wenn nichts anderes, würden Sie am Wissenstransfer teilnehmen, indem Sie einfach wissen, was im Code Ihres Kollegen vor sich geht.

200_erfolg
quelle
2

Ich wurde einmal gebeten, ein Projekt zu prüfen, das von einem Subunternehmer durchgeführt wurde und anscheinend schwerwiegende Leistungsprobleme hatte. Ich stellte ziemlich schnell fest, dass der entscheidende Faktor ein einzelnes Perl-Modul war. Ich war noch nie zuvor auf Perl gestoßen und es gab niemanden in der Organisation, der das wusste. Also machte ich mich daran, es selbst zu verstehen. Ich bin nie soweit gekommen, die Details zu verstehen, aber es war sehr klar, dass der verwendete Algorithmus eine quadratische Datengröße hatte und dies die Ursache aller Probleme war. Ja, das Lesen von Code in einer Sprache, die Sie nicht vollständig verstehen, kann auf jeden Fall produktiv sein. Der Bonus ist, dass Sie neue Tricks lernen, während Sie dabei sind.

Michael Kay
quelle
1

Einige Beobachtungen:

1) Wenn Sie ein erfahrener Entwickler sind, lernen Sie Python (oder mindestens so viel, wie Sie wissen müssen) kennen, indem Sie einfach damit arbeiten. Es wird ein Fall von "Learning by Doing" sein. Anfangs wird es schwierig, aber mit dem Erlernen der Sprache wird es einfacher. Betrachten Sie dies als eine Gelegenheit, eine andere Sprache zu lernen (Menschen lernen oft "Fremdsprachen" durch "Eintauchen").

2) Auf SE-Sites gibt es eine Reihe wertvoller Leute, die "nicht technisch" sind, aber mit Grammatik, Kommunikation und Logik vertraut sind. Solche Leute bringen ein "frisches Auge" zu den Themen und machen eine Reihe von "no brainer" Korrekturen, die andere verpassen, weil sie im Material zu "gefesselt" sind. Sie werden vermutlich wegen Ihrer nicht "technischen" (dh nicht Python) Fähigkeiten wie Logik und Programmierkenntnissen konsultiert.

Und wenn Sie nicht viel Code-Review gemacht haben, hilft Ihnen fast jede Code-Review-Erfahrung als Entwickler. Dies scheint eine gute Übereinstimmung zwischen Ihren Fähigkeiten und Bedürfnissen und denen des Teams zu sein.

Tom Au
quelle
1
Ich frage mich, ob das Überprüfen von Code in einem sinnvollen Maße "learning by doing" bedeutet. Vielleicht unterscheidet sich meine Überprüfungserfahrung von Ihrer, aber es gibt sehr selten bedeutungsvolle oder substanzielle Code-Schreibvorgänge und fast nie Ausführung.
Esoteric Screen Name
@EsotericScreenName - Ich denke, es hängt davon ab, wie viel Feedback Sie von jemandem erhalten, der den Code geschrieben hat oder kennt. Es ist auch wahrscheinlicher, dass Sie sich in einem Domain-Bereich befinden, in dem Sie mit einer anderen Sprache arbeiten, sodass diese relavanter ist als das typische Codebeispiel. Die meisten Codebeispiele zeigen nur, wie kleine Schnipsel eines Heftzwecks erstellt werden, und werden selten als Teil eines großen Projekts gezeigt.
JeffO
0

Das hängt davon ab, was das Ziel der Überprüfung ist. dh was du mit effektiv meinst .

Sie werden wahrscheinlich immer noch in der Lage sein, einige Probleme zu erkennen. Wenn Sie alles sind, womit sie sich auseinandersetzen müssen, und sie hoffen nur, dass Sie einen Blick darauf werfen, was hilft und möglicherweise etwas fängt, dann sicher. Viele Konzepte der Struktur sind zwischen Sprachen ähnlich. Einer ist vor allem in der Lage, die Kommentare zu überprüfen. Es sollte gut genug kommentiert werden, dass ein Programmierer, der diese Sprache nicht beherrscht, immer noch ein gutes Gefühl dafür bekommen sollte, was passiert. Wenn nicht, können Sie ihnen mitteilen, wo ihre Kommentare fehlen. Wenn es so gut kommentiert ist ... dann sollten Sie in der Lage sein, einiges über ihre Struktur zu lesen, nur durch die Anmerkungen dessen, was vor sich geht, anstatt tatsächlich den Code dessen zu lesen, was vor sich geht.

Aber Sie werden wahrscheinlich nicht viele andere Probleme entdecken. Wenn sie also beabsichtigen, dass Ihre Überprüfung eine erschöpfende Entscheidung darüber ist, ob dies ein gut gemachtes / praktikables Programm ist oder nicht, werden sie enttäuscht sein.

Ob sich dieses Ergebnis für Sie lohnt oder nicht, hängt weitgehend vom Projekt ab.

Jimbo Jonny
quelle