[python-users] Zen of Python

Mark Asbach mark.asbach at web.de
Di Jul 3 19:16:32 CEST 2018


Hallo zusammen,

> gibt es überhaupt komplexe oder komplizierte Probleme?

Die Mail lag hier eine Weile in der Inbox rum und ich wollte unbedingt noch was dazu schreiben :-)

Ich würde sagen: ja, eine Unterscheidung macht Sinn und es gibt sogar Probleme, die beides sind. Aber für hie Diskussion sollte man die Begriffe präzise definieren, und leider ist der Begriff „kompliziert“ aus meiner Sicht schlecht gewählt. Ich sehe folgende zwei unabhängige Dimensionen:


a) Komplex = Zusammengesetzt aus vielen Teilen, die sich gegenseitig beeinflussen

Die Schwierigkeit bei komplexen Problemen besteht darin, dass eine Änderung bei einem Teilaspekt Auswirkungen auf einen ganz anderen Teilaspekt des Problems hat. Verständnisfehler bei der Analyse führen dann nicht nur zu lokalen Problemen, sondern können alles durcheinander würfeln. Bei großen Software-Projekten findet man das oft, dass eine Fachabteilung / Arbeitsgruppe einen Designfehler macht und dann viele andere Arbeitsgruppen darunter leiden, weil die Bestandteile nicht gut genug gegeneinander isoliert wurden oder vielleicht gar nicht gegeneinander isoliert werden können. Die Thematik wird sehr gut in „The Mythical Man Month“ diskutiert.

Ich verstehe unter einem komplexen Problem eines, das vor allem die Expertise eines Softwarearchitekten erfordert.


b) Kompliziert = Fachlich anspruchsvoll, verlangt Domänenwissen

Das Wort „kompliziert“ finde ich ungünstig gewählt, denn komplexe Probleme (siehe oben) sind ja kompliziert zu lösen. Ich glaube, stattdessen sollte man als zweiten Begriff von „verlangt Domänenwissen“ sprechen. Damit ist gemeint, dass es eine Menge Probleme gibt, deren Schwierigkeit nicht in der Softwaretechnologie, sondern im Verständnis des „Kundenproblems“ liegt. Das können z.B. wissenschaftliche Probleme sein, bei denen Mathematik, Numerik, Physik oder ähnliches gefordert ist. Diese Art Software kann man nicht einfach von einer „Softwarebude“ erweitern oder gar debuggen lassen, denn nur mit Domänenwissen über das ursprüngliche Problem kann die Arbeitsweise der Software überhaupt nachvollzogen werden.

Ich verstehe also unter einem „komplizierten“ Problem eines, dass die Expertise von Fachexperten einer Nicht-Software-Domäne verlangt.


Beides kann zusammen auftreten. Im Moment habe ich ein Projekt, bei dem eine physikalische Simulation / Messwertauswertung von einem MATLAB-Prototypen nach Python portiert werden soll. Das verlangt zunächst Expertenwissen aus der Kundendomäne, hier Signaltheorie und technische Akustik. Allerdings läuft die Software derzeit auf einem 10-CPU-Cluster und soll gegenüber dem aktuellen Stand um den Faktor 100 bis 200 beschleunigt werden, damit dann Daten im Terabyte-Volumen in endlicher Zeit verarbeitet werden können. Zur Numerik kommt also Cluster/Cloud-Know-How, was ich eher in den Bereich Softwarearchitektur einordnen würde und was die Komplexität der Sache erheblich erhöht, denn viele verschiedene Performance-Flaschenhälse unterschiedlicher Algorithmusbestandteile beinflussen sich dann plötzlich gegenseitig. Beispiel: hat man durch Vektorisierung die CPU-Performance eines Algorithmus erhöht, der zunächst der Flaschenhals zu sein schien, schreibt dieser Algorithmus plötzlich viel mehr Daten pro Zeiteinheit und kann die Speichersysteme / Netzwerkknoten vollständig auslasten. Das wieder bremst dann andere Bestandteile aus, die vorher performant erschienen.


Mit dem Satz aus dem Zen of Python stimme ich daher auch gar nicht überein. Ich finde, er erzeugt eher Verwirrung, als das er irgendetwas lehrreiches mitgibt. Und ich würde unbedingt den Begriff „kompliziert“ vermeiden, sondern stattdessen von „fachlich anspruchsvoll“ oder „domänenspezifisch“ reden. Und: wenn sich herausstellt, dass ein Problem weder komplex noch kompliziert ist, dann macht es entweder super viel Spaß, oder man sollte es off-shoren / near-shoren …


Grüße,
Mark


Mehr Informationen über die Mailingliste python-users