Die Entwicklung zurück
-
Hi,
ich arbeite an einem Projekt mit 160k Zeilen welches intensiv C++ Features einsetzt. Ohne templates wären es wahrscheinlich 2-3x so viele.
Ich würde mich an dieser Stelle sehr über Geschichten aus eurem Leben freuen, von wachsenden Projekten, von Entwicklungen euers Stils währenddessen, von Fehlern und Rückschritten.
Ich arbeit an einer Maschinenlern Bibliothek. Unser Ziel ist nicht weniger als "One-for-all". Das heißt, wir wollen alles anbieten und müssen damit rechnen, dass die User eine große Palette von verschiedenen Anwendungen haben. Das heißt wir müssen sowohl mit spärlichen als auch mit dichten Daten effizient zurecht kommen (fast jeder Algorithmus kommt mit einem template parameter für den Typ der Daten), manche Algorithmen auch mit beliebigen Datentypen. Zudem müssen alle Algorithmen flexibel implementiert sein, weil wir selbst natürlich Wissenschaft damit betreiben. Das heißt, dass ein Algorithmus nicht nur aus einem Teil besteht, sondern aus mehreren, die dann aus einer Toolbox beliebig kombiniert werden können. Das alles über virtuelle (templatisierte) interfaces hinzukriegen war in der Tat schwer.
Die misten Interfaces haben ine lange Palette von Änderungen hinter sich und ich habe mit SIcherheit jede Klasse 3x neu implementiert. Den Luxus haben wir uns einfach gegönnt

Entwickelt ihr auch die größten Anwendungen strikt nach Andrescu, könntet ihr euer Bildverarbeitungsprogramm zu einem Wordprozessor machen, wenn ihr nur die Traits-Klassen auswechselt?
Quatsch. Das skaliert nicht. Auch wenn ich sehr fortgeschrittene Sprachmittel verwende, habe ich die Erfahrung gemacht, dass normale User mit Traits extreme Probleme haben. Da blicken die nicht durch. Das selbe Interface dargestellt mit vituellen Klassen ist kein Problem, aber sobald Traits ins Spiel kommen, gehen die Rolladen runter. Komplizierte Dinge müssen einfach aussehen, sonst schaltet sich das Gehirn aus.
Ich habe vor kurzem eine Komponente einm Dumb-Down unterzogen, weil der Supportaufwand für mich einfach zu hoch wurde. Jetzt kann sie eben weniger.
Was ist passiert, als eure Projekte mit euch, an euch oder ihr an ihnen wuchst?
Mein Stil wurde ruhiger. Ich mache zwar noch immer komplizierte Dinge, aber das äussere Interface muss einfach sein. Es gibt Dateien, wo ein normaler User nicht rein schauen darf, weil er dann sofort in Ohnmacht fällt. Aber die sind gut versteckt ;). Ich reviewe mich inzwischen auch selber, schaue meinen alten Code an und überlege, ob ich das vielleicht einfacher, mit weniger Template-Overhead lösen kann.
-
Danke Otze, das klingt doch nach einem spannenden Feld und auch danach, als hättest Du da sehr viel Freude

Das beobachte ich an mir selber auch, dass ich inzwischen ein extrem ruhiges Code-Bild bevorzuge, ich kann mich also sozusagen auch selber kirre machen
-
Eisflamme schrieb:
Okay, wieder Mal würde ich hier gerne wissen: Wie viele 100kloc haben Deine Projekte. Sind es <100kloc... bei allem Respekt, aber das, was OP fragt, kannst Du basierend auf den Projekten (sprich: basierend auf praktischer Erfahrung, theoretisch womöglich, aber davon sah ich hier nichts) nicht beantworten.
Privat, wie gesagt, eher klein. Um neue Dinge auszuprobieren.
Beruflich, im Hauptprojekt ca. 500kloc C# und 2600kloc C++, 1998 als einzelner Entwickler begonnen (natürlich ohne C#), mittlerweile haben 14 Leute dazu beigetragen, aktiv arbeiten wir mit 6 angestellten Entwicklern daran, aber nicht ausschliesslich. Angefangen in VS97, von Version zu Version gehoppelt, mittlerweile 2012. (Ja, ich bin seit dieser Zeit hier im Forum, habe mich erst viel später angemeldet.)
Eisflamme schrieb:
bei allem Respekt, aber das, was OP fragt, kannst Du basierend auf den Projekten (sprich: basierend auf praktischer Erfahrung, theoretisch womöglich, aber davon sah ich hier nichts) nicht beantworten.
Bei allem Respekt: Das kannst du nicht beurteilen.
Eisflamme schrieb:
Super! Würde ich auch allzu gerne wissen! DAS hätte Wert!!
Again, bei allem Respekt: Nein, hier geht es um primär um Kritik, man findet in diesem Forum nützliche Dinge, aber zu sehr beteiligen sollte man sich nicht.
-
otze schrieb:
das äussere Interface muss einfach sein.
Genau. Und der Code innen sollte auch einfach sein, irgendwann muss es vielleicht mal ein anderer warten. Viele hier meinen, wie toll sie sind, wenn sie komplizierten Code schreiben können, aber eigentlich ist es viel schwieriger einfachen Code zu schreiben, den jeder versteht.
-
jap schrieb:
otze schrieb:
das äussere Interface muss einfach sein.
Genau. Und der Code innen sollte auch einfach sein, irgendwann muss es vielleicht mal ein anderer warten. Viele hier meinen, wie toll sie sind, wenn sie komplizierten Code schreiben können, aber eigentlich ist es viel schwieriger einfachen Code zu schreiben, den jeder versteht.
Mir ist es lieber 1k Zeilen hässlichen Code zu schreiben, wenn ich dafür aus 10k Zeilen repetetivem fehleranfälligen Code 2000 Zeilen generellen straight-forward code machen kann. Natürlich benötigt man dann für die 1000 Zeilen jemanden, der sich da mal ein paar Tage eindenkt. Dafür werden aber keine Forschungsergebnisse invalidiert, weil der bugfix nur in einem der 3 if-Zweige eingebaut wurde.
-
nn:
Sorry, da habe ich mich im Ton vergriffen, das kam gar nicht so rüber, wie ich's meinte. Auf solche Fragen kommen hier immer so flache Antworten von Leuten, bei denen ich eigentlich denke, dass sie an sehr großen Projekten beteiligt sind und daher eigentlich die Fragen auch beantworten könnten, es aber aus mir unersichtlichen Gründen nicht tun.Aber damit warst Du gar nicht gemeint und dein Beitrag danach war ja auch sehr interessant, also verzeih bitte.

-
otze schrieb:
jap schrieb:
otze schrieb:
das äussere Interface muss einfach sein.
Genau. Und der Code innen sollte auch einfach sein, irgendwann muss es vielleicht mal ein anderer warten. Viele hier meinen, wie toll sie sind, wenn sie komplizierten Code schreiben können, aber eigentlich ist es viel schwieriger einfachen Code zu schreiben, den jeder versteht.
Mir ist es lieber 1k Zeilen hässlichen Code zu schreiben, wenn ich dafür aus 10k Zeilen repetetivem fehleranfälligen Code 2000 Zeilen generellen straight-forward code machen kann. Natürlich benötigt man dann für die 1000 Zeilen jemanden, der sich da mal ein paar Tage eindenkt.
Stellt sich nur die Frage, warum einfacher Code länder sein sollte. Die meisten Template- Operatorüberladungslösungen die hier gezeigt werden sind meistens länger als der einfache Code.
-
Hallo!
Ich fänd's toll wenn dieses "Ein Satz aus dem größeren Zusammenhang eines Posts reißen" und darüber eine hitzige tiefe, aber schmale Ein-Satz-Diskussion vom Zaun zu brechen hier möglichst minimal gehalten wird, da ich einfach darauf hoffe, dass hier vielleicht nochmal eine mitteilungsbedürftige Seele hereinschaut und etwas zum Thema beiträgt! Sowas sieht man bei pseudointellektuellen Boulevard-Talkshows doch schon zu genüge, wir sind doch aber eigentlich besser, oder etwa nicht?

-
Eigentlich glaube ich, dass die meisten C++ Features und Idiome für Anwendungsentwicklung nicht viel bringen, sondern mehr für Libraries. Die meisten komplizierteren Template Sachen lassen sich z.B. gut anwenden, wenn man Libraries wie std::container oder aufwenigere schreibt, aber bei der normalen Anwendungsentwicklung braucht man sowas eher weniger. Operatorüberladung ist für ne Mathelib ganz nett, aber um Buttons zu nem Dialog hinzuzufügen (zu addieren) eher weniger. Eines der wenigen C++ Idiome, das man öfters verwenden kann ist RAII, aber den Rest braucht man doch selten.
-
Habs schon paar mal in anderen Threads geschrieben. Wir arbeiten an einem Projekt mit 6 Mio Zeilen. Ich selber bin jetzt nicht so der fanatische C++ Fanboy, der versucht alles über Templates oder Streams zu lösen. Solche Sachen (und vor allem Alexandrescu) eignen sich eher für Libraries, da geb ich SoundOfHome völlig Recht. Ich seh jetzt auch keinen wahnsinnig großen Unterschied zwischen C++ und Java/C#, was Softwarearchitekturen angeht. Natürlich würde man vieles eher etwas anders lösen, weil die Sprachen und die zur Verfügung stehenden Sprachmittel unterschiedlich sind, aber bei grundlegende Highlevel Konzepte würde ich nicht viel anders machen. Es kommt auch stark drauf an, was man macht. Wenn man mit C++ hauptsächlich irgendwelche wissenschaftlichen Anwendungen wie Physiksimulationen schreibt, wird die Architektur zwangsweise anders ausschauen, als bei einem "Anwendungsprogramm". Was wir schreiben ist eine Art Anwendungsprogramm und da eignen sich durchaus Konzepte wie DDD, MVC usw. Bei so einem großen Projekt gibts aber auch sehr unterschiedlichen Code. Wenns z.B. darum geht, die Anbindung an verschiedene PDM Systeme zu abstrahieren, bieten sich Templates nicht so wirklich an. Aber wir haben auch Code, um CAD Modelle zu generieren, und da haben wir in unseren grundlegenden Libs durchaus viel Templatecode. Das sind aber Implementierungsdetails, die im großen Überblick keine Rolle spielen würden.
Insgesamt muss man meiner Ansicht nach also immer beides im Auge behalten, Architekturkonzepte für das ganze Projekt, und Design Patterns/Idiome für die Implementierungen.