Wie funktioniert Python Mangel an statischer Typisierung Wartbarkeit und Erweiterbarkeit in größeren Projekten auswirken?

StackOverflow https://stackoverflow.com/questions/3671827

Frage

Nach der Lektüre dieses sehr informativen (wenn auch etwas argumentativen) Frage ich möchte Ihre Erfahrung kennt, mit der Programmierung große Projekte mit Python. Dinge tun, werden un überschaubar, da das Projekt größer wird? Diese Sorge ist eine Sache, die ich an Java hält. Ich möchte daher besonders interessiert sein in informiert Vergleiche von Wartbarkeit und Erweiterbarkeit von Java und Python für große Projekte.

War es hilfreich?

Lösung

Ich arbeite in einem großen Maßstab kommerzielles Produkt in Python getan. Ich gebe eine sehr grobe Schätzung von 5000 Dateien 500 Zeilen x je. Das sind etwa 2,5 Millionen Zeilen Python. Wohlgemerkt, die Komplexität dieses Projektes ist es wahrscheinlich äquivalent zu 10 mil + Zeilen Code in anderen Sprachen. Ich habe nicht von einem einzigen Ingenieur / Architektur / Manager, der über Python klagen gehört Code wartbaren zu sein. Von dem, was ich aus unserem Bug-Tracker gesehen habe, sehe ich kein systemisches Problem, das durch statische Typprüfung vermieden werden könnte. In der Tat ist es nur sehr wenige falsche Verwendung des Objekttyps an alle laichen Fehler.

Ich denke, das ist ein sehr gutes akademisches Thema empirisch zu untersuchen, warum statische Klasse basierte Sprache nicht so kritisch zu sein braucht scheint, als man denken könnte.

Und über Erweiterbarkeit. Wir haben gerade eine Datenbank 2 auf der Oberseite der Datenbank 1 in unserem Produkt, die beide nicht-SQL hinzugefügt. Es gibt keine Frage zu Typprüfung verwendet. Zunächst einmal haben wir eine API flexibel genug, um zu antizipieren unterschiedliche Implementierung ausgelegt. Ich denke, dynamische Sprache ist ein hilft eher als Hindernis in dieser Hinsicht. Als wir auf das Testen und Fehler Phrase Festsetzung arbeiteten wir auf die Art von Bugs Menschen auf jeder Sprache arbeiten zu Gesicht haben. Zum Beispiel, die Speichernutzung Fragen, Konsistenz und referentielle Integritätsprobleme, Fehlerbehandlung Fragen. Ich sehe nicht, statische Typprüfung auf jeder dieser Herausforderungen viel Hilfe haben. Auf der anderen Seite haben wir stark von dynamischer Sprache durch die Möglichkeit, einzuspritzen Code der Flugs oder nach einem einfachen Patchen profitieren. Und wir sind in der Lage unsere Hypothese zu testen und zu demonstrieren unsere Korrekturen schnell.

Es ist sicher die meisten unserer mehr als 100 Ingenieure zu sagen, sind glücklich und produktiv mit Python. Es ist wohl undenkbar für uns das gleiche Produkt mit einem statischen typisierte Sprache in der gleichen Menge an Zeit mit der gleichen Qualität zu bauen.

Andere Tipps

Aus meiner Erfahrung statisch typisierten Sprachen können schwierig sein, aufrecht zu erhalten. Zum Beispiel kann sagen, dass Sie eine Nutzenfunktion haben, die eine benutzerdefinierte Klasse als Parameter akzeptiert. Wenn auf der Straße übernehmen Sie eine neue Namenskonvention als der Name dieser Klasse zu ändern, und dann dann alle Ihre Utility-Funktionen werden auch zu ändern haben. In einer Sprache wie Python spielt es keine Rolle, wie lange sich die Klasse implementiert die gleichen Methoden.

persönlich verachte ich eine Sprache, die mir in den Weg kommt. Beschleunigen Sie Ihre Ideen auszudrücken, ist Wert, und das ist der Vorteil Python über Java hat.

Eine große Code-Basis in Python ohne gute Testabdeckung ein Problem sein könnte. Aber das ist nur ein Teil des Bildes. Es geht um Menschen und geeignete Ansätze, um die Arbeit zu tun.

Ohne

  • Quellcodeverwaltung
  • Bug Tracking
  • Komponententests
  • Committed Team

Sie können mit jeder Art von Sprache versagen.

Ich erinnere mich an die Tage vor und nach der Innovation von IntelliJ IDEA. Es gibt große Unterschiede. Vor nur statische Typisierung für die Kompilierung war, Entwicklung behandelt grundsätzlich Quellcode als Textdateien. Nachdem ist Quellcode strukturierte Informationen sind viele Entwicklungsaufgaben muss einfacher, dank statische Typisierung.

Allerdings ist es nicht wie die alten Tage waren die Hölle leben. Wir nahmen es wie es ist, tun, was notwendig, verwenden Sie die Werkzeuge zur Verfügung, auf dem neuesten Stand, erhalten das System gebaut, Zufriedenheit. Es gab nicht zu viele schlechte Erinnerungen. Das ist wahrscheinlich das, was dynamische Typisierung Programmierer jetzt fühlen. Es ist nicht so schlimm.

Natürlich werde ich nie in den alten Zeiten zurück. Wenn ich verboten habe, eine solche IDE zu verwenden, ich denke, ich uns geben werde alle zusammen zu programmieren.

Versuchen Sie, die Quelle eines scheinbar fehlerhaften Objekts in einem großen, dynamisch typisierte Rahmen mit vielen IoC oder anderem Design-Muster zurückverfolgen, wo das Objekt nicht direkt auf den Stapel zurückgeführt werden.

Jetzt versucht dies zu tun in einer statisch typisierten Sprache.

Es sei denn, die Art des Objekts dokumentiert sich in der Nähe der Einsatz vor Ort (zum Beispiel über Typenannotationen, a-la Python typsichere Bibliothek) oder irgendwo auf dem Stapel herzuleiten, woher es kam praktisch unmöglich sein kann. Ich spreche aus Erfahrung, zu debuggen Teilen des BuildBot Rahmen versucht zu haben. Es ging um eine ungeheure Menge an roher Textsuche durch den Rahmen, auch ausgefallene IDEs wie PyDev, Komodo und Wingware verwendet wird.

Ich zweifle nicht, dass es möglich ist, einige Typ Einschränkungen für dynamische Sprachen zu verhängen, aber das Fehlen einer Standardisierung auf das scheint ein Hindernis zu sein, um jemand zu debuggen Teil eines großen, vorhandenen Rahmen zu versuchen.

EDIT: seit 2014 Guido hinzugefügt PEP484, MyPy und die Eingabe-Modul. Das ist meine Erfahrung viel gemacht, viel besser in Bezug auf große Projekte beibehalten wird.

Nach meiner Erfahrung hängt Wartbarkeit auf geringe Kopplung, eine gute Dokumentation, gute Entwicklungsprozess und eine hervorragende Prüfung. Statische Typisierung hat sehr wenig mit irgendetwas davon zu tun.

Die Fehler, dass Java bei der Kompilierung fangen sind nur eine kleine Teilmenge der Fehler, die auftreten können. Sie sind auch fast immer die banalsten durch Tests zu ermitteln; es gibt keine Möglichkeit, den Aufruf einer Methode auf einem Objekt der falschen Klasse vermissen, wenn Sie testen, dass Ihr Code die richtige Antwort erzeugt! In dieser Hinsicht könnte man argumentieren, dass Python tatsächlich ist besser zur Gewährleistung der Qualität; von zwingen Sie Test mindestens ein wenig Code, um sicherzustellen, frei von einfachen Tippfehlern ist sichergestellt, dass Sie tatsächlich tun Test zumindest ein bisschen.

In der Tat Java ist nicht einmal ein sehr gutes Beispiel für eine Sprache mit starken statischen Prüfungen für viele Bugs zu kontrollieren. Versuchen Sie die Programmierung in Haskell oder Mercury, um zu sehen, was ich meine, oder besser noch versuchen, in Scala Programmierung und Anbindung mit Java-Bibliotheken; der Unterschied in wie viel „Richtigkeit“ der Compiler in der Lage, Garantie für Sie fällt auf, wenn Sie den normalen idiomatische Scala Code Scala Bibliotheken, um den Code zu vergleichen, die mit Java-Bibliotheken zu tun hat (ich habe dies tatsächlich getan, da ich Programm ein Bit in Scala auf Android).

Ihre Fähigkeit, guten wartbaren Code in großen Code-Basen zu schreiben bearbeitet von vielen Entwicklern über längere Zeit, trotz der Mängel von Java statischer Fehlererkennung im Vergleich zu Sprachen wie Scala, hängt von genau den gleichen Techniken verwendet Python-Programmierer die gleiche Sache in ihren großen Code-Basen zu tun, trotz der Mängel statischer Fehlererkennung des Pythons im Vergleich zu Java.

Ich habe für viele Projekte, von ein paar hundert Zeilen bis zu mehreren tausend Zeilen Python verwendet. Dynamische Typisierung ist eine große Zeitersparnis und es macht OO-Konzepte wie Polymorphismus Art und Weise einfacher zu bedienen. Das Typsystem nicht machen Projekte wartbaren. Wenn Sie Probleme beim Vorstellen haben, dass, versuchen, ein paar Dinge in Python zu schreiben und sehen, wie sie gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top