Laden...

Suche gleichgesinnte für Coding Katas

Erstellt von NextException vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.095 Views
N
NextException Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren
Suche gleichgesinnte für Coding Katas

Hallo zusammen,

ich bin neu hier im Forum und suche gleichgesinnte die sich gerne mit den Thema Coding-Katas beschäftigen möchten. Im lauf der Jahre habe ich schon einige Katas ausprobiert und irgendwann angefangen diese auf meiner Website zu veröffentlichen. Neben der üblichen kurzen Beschreibung sind auch alle meine Ergebnisse in C# bzw. teilweise auch in Python und TypeScript dort zu finden. Auf http://csharpcode.de findet Ihr die Katas und die Links zu GitHub.

Würde mich über jeden freuen der: *mehr über Katas wissen will *ein paar Katas ausprobieren möchte *sich über die Lösungen/Probleme austauschen möchte *neue Ideen zu Katas oder Refactorings hat *oder einfach seine Meinung/Erfahrung teilen möchte

Danke und Gruß,
NextException

C
1.214 Beiträge seit 2006
vor 7 Jahren

Was sind die Kriterien für eine erfolgreiche Lösung?

Ich will eigentlich keine Diskussion über Performance losbrechen und ich weiß gar nicht, ob das hier im Detail erwünscht ist, aber ich hab mir als erstes das WordWrap Beispiel angeschaut und möchte einfach mal meine Meinung dazu sagen.
Ich bin C++ Entwickler und achte einfach meist auf sowas. Es geht nicht um Microoptimierungen, mir ist einfach aus Erfahrung klar, was welche Kosten verursacht (und das kann ich in C++ besser einschätzen als in .NET), und ich verwende eigentlich schon automatisch die Konstrukte, die weniger Laufzeitkosten verursachen, solang das natürlich keine sonstigen negativen Auswirkungen hat.
Und mit so einer Lösung wäre ich bei uns in der Arbeit nicht glücklich gewesen, zumindest nicht in einer der zentralen Komponenten. Grad so "Stringoperationen" sind oft ein ziemlicher Performancekiller, siehe z.B. StringBuilder. Und wenn ich in unserem Code irgendwo (bzw. an zentralen Stellen, irgendwo in der GUI wärs auch egal) split finde, dann stört mich das meist grundsätzlich. Ein Split bedeutet Scannen über den String + Heapallokation für die Liste + x Heap Allokationen für die einzenen Strings in der Liste + Kopieren aller Substrings + entsprechend viele Deallokationen + Join (ebenfalls mit Heapallokationen, aber hoffentlich nur einer, und Kopieren). Und grad Heapallokationen kosten viel Zeit.
Nur als Beispiel, wir hatten in der Arbeit eine sehr komplexe Datenstruktur, die man auch aus einem textbasierten Format laden konnte. Das ganze war so komplex (15-20 Jahre alter Code, etwa 50 000 Zeilen SLOC allein in dieser Komponente, ursprüngliche Entwickler nicht mehr da), dass sich das niemand wirklich im Detail anschauen wollte. Ich hab das Parsen neulich durch Ändern von ein paar String Operationen von fast einer Sekunde auf 75ms runterbekommen. Das bedeutet, dass viele Batchprozesse, die früher tagelang liefen, jetzt in wenigen Stunden durchlaufen. Eine winzige Änderung in einer riesigen Codebasis mit großen Auswirkungen, weil viele Entwickler auf solche Kleinigkeiten einfach nicht achten, obwohl das ganz einfach wäre und auch keinen schlechteren Code produziert.
In deinem Fall würde es reichen, einmal über den String drüberzulaufen und sich die Position der letzten Wortgrenze zu merken. Viel weniger unnötige Heapallokationen 😉

N
NextException Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

Danke Code007 für deine Frage und Meinung.

zu erfolgreiche Lösung) Als Regel kann man sich in Coding-Katas merken das es nicht das wichtigste ist die schnellste, kürzeste etc. Lösung zu finden/haben.

Natürlich hast du recht wenn du sagst das meine Lösung für WordWrap nicht die beste Performance hat aber auf der anderen Seite muss man sich wirklich ernsthaft fragen: Ist das eine Requirement? Welche Daten sollen überhaupt verarbeitet werden? Werden die anderen NFR dadurch verschlechtert? etc.

In deinem Beispiel macht das natürlich absolut sinn und springt einem bei jeder Performanceanalyse wahrscheinlich direkt ins Auge aber ich denke bei einer einfachen Kata wie dieser hier kommt es in erster Line eher auf die Basics an (Struktur, Test, Erweiterbarkeit, Verständnis etc.).

Vielleicht kannst du ja mal deine (komplette, Sprache egal) Lösung posten?

Gruß,
NextException

C
1.214 Beiträge seit 2006
vor 7 Jahren

Natürlich hast du recht wenn du sagst das meine Lösung für WordWrap nicht die beste Performance hat aber auf der anderen Seite muss man sich wirklich ernsthaft fragen: Ist das eine Requirement? Welche Daten sollen überhaupt verarbeitet werden? Werden die anderen NFR dadurch verschlechtert? etc.

...aber ich denke bei einer einfachen Kata wie dieser hier kommt es in erster Line eher auf die Basics an (Struktur, Test, Erweiterbarkeit, Verständnis etc.).

Wie gesagt, ich wollte das zumindest nicht unkommentiert lassen. Und ich möchte nochmal betonen, dass ich Optimierungen ganz sicher nicht über andere Anforderungen stelle. Wenn durch eine performantere Implementierung die Verständlichkeit, Erweiterbarkeit usw. leidet, sollte man sich ganz genau anschauen, ob es die Optimierung wert ist und ob man sie überhaupt braucht. Ich will aber darauf hinaus, dass es oft viele völlig natürliche Lösungen für ein Problem gibt, und wenn man ein bisschen darauf achtet, wählt man einfach die performantere Variante, ohne dass einer der anderen Aspekte drunter leiden würde.

Wenn du sagst, für dich spielt es bei den Katas eine untergeordnete Rolle, ist das völlig in Ordnung.
Ich persönlich würds aber eher so sehen, dass man sich das nicht angewöhnen sollte. Wobei das natürlich ein schwieriger Punkt ist, vor allem bei so einem Kata... Deine Lösung ist natürlich durchaus "elegant". Ich würde das in unserem Produktivsystem bei Code Reviews (ich mach auch welche) an bestimmten Stellen sicher ankreiden, aber es würde sicher auch genug Stellen geben, wo das eine völlig legitime Lösung wäre.

Ob etwas ein Requirement ist, kannst du nicht wissen. Ich bin wahrscheinlich besonders sensibel für diesen Punkt, weil ich sehr viel mit Optimierungen zu tun habe. Die Ausgangslage bei uns ist, dass wir viele Millionen Zeilen Code haben und eine Codebasis, die über Jahrzehnte von wahrscheinlich über hundert verschiedenen Entwicklern erstellt und gewartet wurde und es kommt ständig viel dazu oder wird ersetzt. Was wo wie verwendet oder später verwendet werden wird, kann man ganz schlecht abschätzen. Es kommt eine Anforderung dazu, man will Code wiederverwenden, nimmt eine vorhandene Implementierung, ohne sich das genau anzuschauen, testet seinen Use Case, hat kein Problem damit. Aber ein anderer, der wiederum diese Komponente verwendet, hat jetzt plötzlich ein Problem, weil er in bestimmten Konstelleationen ganz häufig die eine Funktion aufruft, die diese schlecht geschriebene Funktion aufruft... Fällt drei Jahre später auf. Wir haben auch viel Code, der "irgendwie" geschrieben ist, nach dem Motto, "ist doch egal, das muss doch nicht schnell sein". Ich hab sicher schon hunderte solcher Funktionen umgebaut. Das ist für mich Arbeitsalltag. Ist sicher nicht in jeder Firma so. Wollte nur etwas verdeutlichen, warum ich verstärkt auf sowas achte und warum das aus meiner Sicht keine so untergeordnete Rolle spielt.
Wobei ich schon wieder deutlich mehr geschrieben habe, als ich eigentlich wollte 😉 Wie gesagt, ich wollts zumindest nicht unkommentiert lassen und dich darauf hinweisen, aber wenn du sagst, das spielt für dich hier keine Rolle, ist das für mich auch völlig in Ordnung.

Vielleicht kannst du ja mal deine (komplette, Sprache egal) Lösung posten?

Ich mach sowas ganz selten und dafür finde ich das Problem jetzt auch nicht interesasant genug. Mein grundsätzlicher Vorschlag sollte ja klar sein? Pseudoalgo:

  1. Schleife mit entsprechender Abbruchbedingung
  2. An die Stelle im String schauen, der der maximalen Länge entspricht, wenn String lang genug
  3. Rückwärts iterieren, bis du einen Worttrenner findest.
  4. Diesen String dann kopieren, das ist auch die Anfangsposition, an der du im nächsten Schleifendurchlauf weitermachst.
16.827 Beiträge seit 2008
vor 7 Jahren

Die Optimierungen, von der wir hier sprechen, sind typisch für C++ler; manchmal halt auch deutlich über das Ziel hinaus geschossen.
zB brauch ich keinen StringBuilder, wenn ich dadurch zwar 70% der Ausführungszeit spare es im Totalen aber halt nut 0,002ms ausmacht.

Für die Katas spielen diese Optimierungen in 99,9% keine Rolle. Solche Katas sind i.d.R. für Einsteiger und finden oft auch bei Bewerbungen Einsatz. Da geht es eher um prinzipielle Vorgehen und nicht um Optimierungen, die potentielle Personen überfordern würden.
Und wie immer: pre optimization is the root of all evil

Mein Rat: lasst es so simpel wie möglich.

N
NextException Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

Ich sehe es wie Abt, für Optimierungen gibt es so viele gute Hinweise wie "optimise the whole", "Vorsicht bei Optimierungen (CC)" oder "Root Cause Analysis". Ich würde da immer genau hinschauen und Nachweisen ob die Optimierung überhaupt etwas bringt (Performancemessung, UnitTest etc.), meistens denkt man nur an einen bestimmten UseCase und bei anderen verschlechtert man die Performance eventuell sogar (alles schon erlebt). Aber genug zu dem Thema...

Falls jemand mehr Interesse an Refactorings hat, ich habe auch da ein Repository für dieses Thema https://github.com/SoftwareDojo/Refactorings. Wer sich da gerne mit Lösungen oder neuen Beispielen beteiligen möchte ist herzlich Willkommen!

Gruß,
NextException