Erfolgreiche Softwareentwicklung

In diesem Beitrag versuche ich eine lose Auflistung von Punkten zu bieten, die eine Softwareentwicklung erfolgreich machen. Klar ist: Alles kann nichts muss. Also ist es weder so, dass man alles einsetzen muss, noch ist der Erfolg bei Einsatz garantiert.

Kommen wir also zu meinen Empfehlungen. Vermutlich ist kollidieren sogar einige meiner Empfehlungen. Daher gilt: Nehmt Euch raus, was Euch gefällt und setzt es für Euch richtig um. Denn wie so oft im Leben gibt es mehr als nur schwarz und weiß. Viel Spaß.

  • Einsatz eines Versionskontrollsystems (z.B. GIT)
  • Einsatz von Entwicklungszweigen im VCS (Versionskontrollsystems). Branches.
  • UnitTests: Für einzelne Klassen (Basisbausteine) bis hin zu Komponenten (Fertigbauteile) sollten UnitTests eingesetzt werden und bei CI/CD ausgeführt werden. UnitTests von Anfang an schreiben.
  • Für Komponentenübergreifende Teile sollten Modultests gemacht werden. Testszenarien. GUI-Tests, Replay-Tests und bei Testreleases und sowieso bei Releases ausgeführt werden.
  • Für die Gesamtanwendung sollte eine QA-Abteilung mit Menschen sich dran setzen. Die ganze Zeit und speziell zu Releases.
  • Einrichtung einer CI/CD-Pipeline . UnitTests sollten dort ausgeführt werden, besser: Statische Analysen + Code-Style. Als Ergebnis wird ein Installer/Paket oder ein Deployter Container o.ä. erwartet. Ein Tester kann also gleich ran an den Speck!
  • Release-Versionierung. Es kann für Regressionen wichtig sein, auf einen laufenden früheren Stand zurückzugehen. Also: „War das früher auch schon kaputt, oder ist das neu?“. Daher: Setups reproduzierbar machen (Installer, VMs, Container deployments etc.)
  • Release-Management. Es braucht einen Plan, wie man von Release zu Release kommt und wie ältere gepflegt werden und welche Merkmale „gemerged“ werden.
  • Ticketsystem einsetzen. Es ist unmöglich in einem Wust von Code und Information den Überblick zu behalten. Aufgaben müssen verwaltet werden. Tickets immer mit Commits im Versionskontrollsystem verknüpfen (wo sinnvoll).
  • Logging einsetzen. Erfindet das Rad nicht neu! Nutzt Logging-Frameworks. So kann auch auf externe Server geloggt werden etc.
  • Audit-Log. Je nach Anwendung frühzeitig einführen, denn später anflanschen ist doof. Es gibt immer wieder sicherheitsrelevante Dinge zu loggen -> Audit-Log
  • Baut die Anwendung in Schichten auf. Es hat sich bewährt.
  • ORM ist Pflicht. Die Datenschicht ist oft eine Relationale Datenbank. Vermeidet SQL-Zeug. Überbrückt die OO-ER-Lücke mit einem Object Relational Mapper (ORM) wie z.B. Entity Framework!
  • Scheut Euch nicht, auch mal andere Konzepte auszuprobieren. Sie könnten für das zu lösende Problem eine einfachere, zuverlässigere Lösung parat haben. Genannt sei das Aktor-Modell oder Reactive oder Prolog-artige Horn-Klauseln.
  • Baut Internationalisierung (i18n) von Anfang an ein. Das schärft gleich den Sinn, wann etwas lokalisiert dargestellt wird, und wann eine Darstellung kulturinvariant sein soll (bei Persistenz). Außerdem: Später hinzufügen ist wieder mal schlecht und teuer.
  • Baut Barrierefreiheit (accessiblity, a11y) von Beginn an ein. Es ist inzwischen in manchen Ländern oder Bereichen (öffentliche Hand) Pflicht. Aber: Großes Thema, nicht einfach. Screenreader sollten aber an den Text kommen können.
  • Setzt immer Unicode ein. Geht davon aus, dass die Anwender alle gültigen Zeichen der Welt einsetzen wollen und werden. Kodiert Dateien mit UTF-8-BOM.
  • Lernt bei Developer Falsehoods und dem gigantischen Git-Repo über Falsehoods, was so die typischen Fehlannahmen sind und vermeidet sie. Schon gewusst: Vor+ Nachname sind eine Besonderheit, die es hier gibt.
  • Bedenkt Sicherheit im Sinne von Security und setzt Verschlüsselung ein. Nutzt aber immer Bibliotheken und erfindet nichts selbst.
  • Paarprogrammierung. Setzt das XP-Merkmal der Paar-Programmierung ein. Ein Junior kann von einem Senior so viel lernen und Umgekehrt. Oder Wissen aus verschiedenen Programmbereichen verteilen. Vorteil: Es gibt nicht mehr einzelne Koryphäen, da sich Wissen dupliziert. Man lernt Programmiertechniken und Prozesse und die Entwickler sind konzentrierter dabei und machen weniger Fehler, was den „doppelten Aufwand“ mehr als Wett macht.
  • Nutze TDD – Test driven develoment. Nicht überall aber bei Kernkomponenten/Klassen empfohlen. Die dabei entstehenden UnitTests können gleich bleiben und in der CI-Pipeline verwendet werden.
  • Coding-Standard. Entwickelt einen Formatierungsstandard und forciert ihn mit Programmen wie StyleCop.
  • Code-Reviews. Macht z.b. alle 14 Tage ein öffentliches Review. Das ist ein unglaublich gutes Werkzeug, um Fehler zu finden und einander Einblick und Tricks zu vermitteln.
  • Check-In mit Pull-Requets und 4-Augen-Prinzip. Nutzt die Mechanismen, die moderne Entwicklungsplattformen bieten. Bei Git gibt es einen zweistufigen Commit mit Code-Review. Nutzt das und lasst einen Check-In immer von einer anderen Person reviewen. Es hilft immens, Fehler von Beginn an zu vermeiden.
  • Refaktorisieren. Mut zur Refaktorisierung. In der Regel kommt was besseres dabei raus. Schiefe Balken müssen gerade gerichtet werden. Nutzt Tools dazu.
  • Kommentiert, aber auch nicht zu viel. Dokumentation veraltet schnell, Kommentare veralten auch. Daher Pflegt zumindest diese. Keine Kommentare ist auch falsch. Mittelweg! Bewährt hat sich, öffentliche Methoden zu kommentieren mit (ohoh) XML-Doc und die Klasse an sich. Dies gefällt mir insbesondere bei fremdem Code, wenn wieder „die nächste Klasse“ auftaucht, und man wieder sich fragt : „warum ist diese Klasse jetzt nötig, was verdammt soll ihre Aufgabe jetzt genau sein?“. Wer mir diese Frage gleich oben beantwortet (und die sollte recht konstant bleiben), der hat bei mir einen Stein im Brett! Sparam im Quellcode zu kommentieren ist auch keine gute Idee. Ich vergesse recht schnell, welche kranken und doch genialen Ideen ich da hatte.
  • Nutzt schlaue Tools. Tools, die Euch das Leben einfacher machen und z.B. Code überprüfen, generieren oder automatisch umstrukturieren. Genannt sei hier z.B. Re-Sharper. Viele haben Angst vor der Automatik, aber sie ist deterministisch und wenn man es einmal gelernt hat, ist sie ein Segen. Denn sie denkt meist sogar an mehr, als man selbst. Dazu gehören auch Analysetools, wie z.B. der Nachfolger von FxCop oder LINTer. Sie analysieren Code auf typische Fehler und weisen Entwickler darauf hin.
  • Automatisiert, wo es geht. Das ist DevOps. Alle dummen, manuellen Schritte sollten wenn möglich automatisch getriggert und ausgeführt werden.

Brotzeit – wissenschaftlich

Heute wollen wir die Brotzeit mal physikalisch wissenschaftlich untersuchen und erklären.

Anders als die Raumzeit handelt es sich bei der Brotzeit nicht um eine Verquickung von Raum (m³) und Zeit (s), sondern von Brot und Zeit, also Brot mal Zeit* was in SI-einheiten etwa J · s ist. Denn Zeit wird in Sekunden gemessen und bei Brot handelt es sich um eine Energieeinheit. So etwas wie Wattsekunden oder Joule.

Daher ist das Produkt aus beiden Js oder Ws² . Was Arbeit mal Zeit bedeutet. Oder Leistung im Zeitquadrat. Damit lässt sich die Arbeitmahlzeitzeit ableiten.

*Es entsteht dadurch die Brotmahlzeit.

Schreibmaschine

Das Kunstrojekt „write against the machine“ ist seit gestern (15.2.2021) aktiv. Jetzt kann die Schreibmaschine also von Künstlern benutzt werden, die sich dort aktuell Schreibdialoge liefern. Es ist aktuell in einem Schaufenster der Szenekneipe Lokomov in Chemnitz zu sehen. Später werden noch mehr Exponate dazukommen und Jedermann kann schreiben. Es wird ein Gast-WLAN geben, über das man meine Oberfläche für die Erika findet.

Der Chaostreff Chemnitz mit Mmaster, et al und mir haben das Teil aufgebaut und mit einer Webseite und einer Kamera versorgt.

Außenansicht durch ein spiegelndes Schaufsenster.
Außenansicht des Ganzen. Monitor davor, der den Life-Stream anzeigt
Die Kamera ist an dem vertikalen Balken.
Schreibmaschine mit Papierführung über einen Stuhl
Seitenansicht. Die Schreibmaschine mit Endlospapier. Papier wird aufgerollt.

Die Kamera streamt ins Internet auf eine vom Freifunk Chemnitz betriebenen Peertube-Server.

Die Schreibmaschine arbeitet mit Endlospapier, welches zu diesem Zweck über zwei „Rollen“ (in Wirklichkeit sind es nur PVC-Kabelkanäle) geleitet. Da das Papier vorne und hinten fast gleich schwer ist, muss es gestrafft werden. Daher ist hinten noch ein U-Förmiges Konstrukt aus einem Abflussrohr mit Gummis, welches mit seiner gespeicherten Spannung das Papier wieder aufrollt.

Die Kamera hängt an einer Brückenkonstruktion. Daran befinden sich auch zwei Strahler, um alles etwas heller zu machen.

Frühere Ansicht bei Nacht. Gut zu sehen ist die Balkenkonstruktion.

Ich auf dem rc3 (CCC)

Ein Vortrag war das Elektrogruselkabinett Indien-Edition

Die Bilder können gerne nochmal angesehen und auch verwendet werden unter einer liberalen CC-BY-Lizenz. Siehe: Album


(Dieses Werk ist lizenziert unter einer Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International Lizenz.) – Robert Köpferl

Der zweite Vortrag ist How to digitale Barrierefreiheit.

Präsentation dazu: Runterlad

Beides auf der #chaoszone im #rc3

Das Programm wurde wieder einfacher…

Das ist es, was uns regelmäßig verkauft wird. Ob App, Webseite, Programm oder andere Oberfläche. Von Version zu Version wird alles immer einfacher und besser bedienbar (… und doch immer fetter auf Platte und Arbeitsspeicher).

Besser bedienbar und einfacher

Tja, da muss man sich (und andere?) wirklich mal fragen, ob die Entwickler und Designer vor Jahren alle so doof waren oder überall Nerds in den UX-Workshops unterrichtet haben. Denn mit dieser Version wird alles viel besser und vor allem einfacher. Oder doch nicht?

Wirklich?

Was die da unter einfacher und besser bedienbar verkaufen ist in Wirklichkeit eine Reduktion der Interaktionselemente und der Information. Wo es früher drei Buttons gab, ist jetzt nur mehr einer. Die anderen zwei Funktionen sind meist nicht einmal migriert (z.B. durch lange klicken, was eine Komplizierung wäre), sondern gestrichen. Wo früher Toolbars waren ist heute gähnende Leere und dafür auf dem Fenstertitel ein kleines Knöpflein – für den Ganzen Rest. Weil wir ja alle immer Vollbild arbeiten wollen und uns dabei jah nichts im Weg sein darf… Pulldown-Menüs werden ausgedünnt oder verschwinden gleich ganz. Die kompakte Befehlsdarstellung ist halt so was von 90er Jahre.

Konsequenz … komplizierter

Das Ergebnis ist doch, dass eine Software nicht mehr so flexibel bedienbar ist. Sie kann zwar jetzt den Standardfall einfacher abarbeiten, da für viele Parameter Standardwerte angenommen werden und die spezielleren Aufgaben nicht mehr erreichbar sind. Aber für die (früher normalen) Spezialfälle ist alles komplizierter geworden. Der Experte wird also seine helle Freude daran haben, weil er jetzt im hintersten Menü erst einmal die Funktion wiederfinden muss – falls noch vorhanden.

Es ist ja so, dass die Software an sich komplex ist, weil sie ein komplexes Problem löst. Das ist die Abstraktion eines Problems in seinen Facetten. Wenn ich jedoch die Komplexität aus der Nutzerschnittstelle herausnehme, kann ich mein Problem gegenüber der Software nicht mehr ausdrücken. Oder es wird umständlich.

Doch lieber nicht ‚einfacher‘

Daher mein Plädoyer: Macht die Software, Apps und Oberflächen bitte nicht immer weiter einfacher sondern macht sie komplexer! Komplexere Bedienung erlaubt mir den Problemraum zu erfassen und mich auszudrücken. Ich sehe, welche Parameter ich verändern kann und kann mir das überlegen. Auf jeden Fall sollten aber gute Standardwerte angenommen werden.

Kandidaten

Die typischen Kandidaten für solcherlei Verhalten sind alle Apple-Inspirierten Macher. Dazu gehört u.a. auch Gnome. Dort gilt das Prinzip, dass man möglichst wenig Bedienelemente zur Verfügung stellt, um blos keinen Menschen zu irritieren. Ergo nervt so eine Software damit, dass sie nicht ohne spezielle Editoren oder Konfig-Datei-Änderungen anpassbar ist. Diese Software ist unterm Strich also KOMPLIZIERTER.

Corona-Kürbis

Der Corona-Warnkürbis spricht..

.. zu uns. Was hat er uns mitzuteilen?

Corona-Warnkürbis

Das Virus SARS-CoV-2 ist auf dem Vormarsch. Sogar im sicher geglaubten Deutschland. Seid also auf der Hut und nutzt Masken wann immer es eng wird. Wichtigste Maßnahme ist das Durchbrechen von Infektionsketten. Das Virus ist eigentlich ein armer Schlucker und immer auf sein Wirtstier angewiesen und auf Zufälle bei der Übertragung von Wirt zu Wirt. Was wir machen können, ist, dem Virus diesen an sich schon schweren Infektionsweg weiter zu erschweren. Das geht am einfachsten durch das Tragen von Masken. Daher: Tut es und bleibt gesund.

Insbesondere gilt das auch mit Leuten, die man kennt! Es fühlt sich vielleicht komisch oder gar falsch an, bei Freunden/Bekannten Maske zu tragen. Bzw. es fühlt sich vertraut an, genau das nicht zu tun…. ‚man kennt sich ja…‘ Doch das ist ein Trugschluss. Das Virus unterscheidet nicht fremd und bekannt. Es breitet sich auch unter Freunden aus… hemmungslos. Daher ist auch hier Vorsicht die Mutter der Porzellankiste. Körperliche Distanz und Masken angezeigt.

Ebenfalls besonders gefährdet sind alle Menschen vom Lande und von den weniger Nicht-Hotspot-Städten (v.a. im Osten der Republik). Warum? Es war doch in der letzten Corona-Saison (Feb-Apr 2020) eigentlich eh eher ruhig und die Gefahr wurde ja quasi überschätzt?
Das ist wahr, aber genau darin verbirgt sich die Gefahr. Gerade der Sommer (eine scheiß Zeit für ein Coronavirus) war ja locker leicht, es gab Erleichterungen und die Infektionsrate war superniedrig. Doch in dieser Saison ist alles anders.!!!
In dieser Grippesaison (Okt 20-Mär 21) wird es schlimm. Schlimm! Verhindert also bitte das Schlimmste!
Das Virus konnte sich den Sommer lang quasi weltweit gut verteilen. Damit meine ich auch in die Kleinstädte, ins Erzgebirge und die Brandenburgische Pampas, wie auch die Alpenregionen … überall. Und dann kommt ganz klassisches Grippewetter dazu. Daraus folgt, dass es überall in der Republik Ausbrüche gibt. Anders als Feb 20, wo wirklich einzelne Herde isoliert vor kamen, ist es jetzt überall.
Dabei ist die Erfahrung von der letzten Saison sooo trügerisch. Weil man ja denkt: ‚… damals war es ja bei uns auch nicht schlimm und passiert ist ohnedies nichts… ‚. Genau deshalb sind die Leute in solchen Regionen besonders gefährdet. Weil sie sich weiterhin lax verhalten wollen und somit die Infektionsketten nicht durchbrechen, sondern in privaten Treffen sogar noch befördern. Plötzlich Maske am Arbeitsplatz… häää? Aber genau das sollte es sein. Die Menschen in den Hotspots sind zwar im Sommer laxer geworden, aber gefühlt ändert sich diese Grippesaison nicht so viel gegenüber der letzten.

Damit will ich es mit meinen Warnungen mal belassen und wünsche Euch allen eine erfolgreiches Versteckspiel gegen das Virus. Bleibt gesund!

8GB Wikipedia – ich in Australien 2006

Heute will ich mal einen kleinen Blick zurückwerfen. Anlass war eine Wikpedia-DVD, die mir irgendwo im Augenwinkel erschien. Da erinnerte ich mich, wie es mir damals ging. Ein kleiner Abriss der Geschichte:

Damals ? war Reisen noch ein wenig komplizierter, aber auch schon recht gut. Es gab auf jeden Fall nicht überall und kostengünstig mobiles Internet – nein nur teures. Aber es gab WLAN, welches dann und wann kostenlos war. Oft genug aber auch bezahlt. Händies waren noch Faustkeile mit smarten Anwandlugnen, aber noch entfernt von modernen, hochauflösenden und schlauen Wischflundern.

In dieser Zeit als stellte sich beim Reisen ernsthaft die Frage: Nimmt man einen Laptop mit, oder nicht. Laptops waren zu dieser Zeit schon recht portabel aber beim Gewicht+Volumen auch nicht ganz unbedeutend. Vor allem waren sie aber noch gefühlt eher teuer. Viele Leute haben diese Frage damals klar verneint. Preis und Praktik. Ich habe etwas gezögert, konnte mich aber dann doch dafür entscheiden, was eine sehr richtige Entscheidung war.

Gründe dafür waren, dass man ihn als Datenlager und Transfereinrichtung für den Fotoapparat nutzen konnte, damit telefonieren, gut Recherche machen, Filme darauf schauen, Texte damit schreiben und nicht zuletzt ihn als Wärmflasche benutzen konnte. Lauter Gründe und überdies wäre er auch unbenutzt älter geworden.

Wärmflasche, Waas? Ja, wenn man mal Bauchweh hat… dann muss man einfach nur eine Variante von Prime95 10min laufen lassen und man hat die beste Wärmflasche mit Zusatzfunktion. Die anderen Gründe klingen wohl sehr nachvollziehbar. Damals hatte man noch separate Fotoapparate mit gigantischen SD-Karten von 128 oder 256MB Kapazität. Die wollten ab und zu geleert werden. Aber auch Laptops werden geklaut, insofern man das Zeug entweder auf CD brennen wollte oder, wie ich, beim nächsten WLAN über die Nacht auf meinen Server ‚hoch-rsyncen‘. Das ging damals noch nicht sonderlich schnell. Telefonieren war auch so eine Sache. SIPGate war schon erfunden und sobald ich WLAN hatte, konnte ich kostengünstig bis gratis zu Hause anrufen. Derweil haben sich alle Anderen diese Telefonkarten gekauft und abtelefoniert. War auch nicht schlecht, aber anders umständlich.

Doch zum Titelthema. Den Laptop habe ich natürlich auch als Lektüre und Nachschlagewerk genutzt. Da damals internetfreie Zeiten durchaus noch die Regel waren, hatte ich mir vorausschauend einen Auszug der Wikipedia mit passendem Viewer auf den Rechner gepackt. 6,4 GB waren das damals. Das hatte ich dann auch gut genutzt, um bei jeder Gelegenheit (Orte, Sprachen, Länder) meinen qualifizierten Senf dazuzugeben.
Irgendwann auf Halbzeit war dieses Paket ‚veraltet‘ und ich wollte den neuesten Auszug der Wikipedia. Allerdings hatte die inzwischen über 8 GB. Doch so gut waren die Internetverbindungen nicht – selbst mit Torrent hat man ewig gewartet. Nicht zu vergessen: Volumenbegrenzung. Die Anbindung des australischen Kontinents war teuer, und so war auch Volumen an jedem australischen Internetanschluss teuer / begrenzt. Aber ich habe irgendwann an der Gold coast zu arbeiten begonnen und in einem der dortigen IT-Unternehmen konnte ich dann einen USB-Stick damit vollladen. Thema erldigt.

Tja.. manchmal ist es auch schön, von einem IT-Standpunkt in seinen Erinnerungen zu schwelgen.

Mit AvaloniaUI Enums in XAML zeigen

Es geht um das GUI-Framework AvaloniaUI. Und es geht darum, wie man in der darin üblichen XAML-Beschreibung Enum-Werte in z.B. eine Combobox hineinbekommt – ohne extra Code.

Es gibt gewisse Kritik an diesem Vorgehen vor allem aus dem Kreise der AvaloniaUI-Kernprogrammierer. Man möchte lieber für alles und immer View-Modelle (MVVM) verwenden. Zweifellos, das ist gut. Aber es gibt auch Gründe, es anders herum zu machen. Zum Beispiel, wenn man einfach nur schnell etwas zusammenstecken möchte. Oder gerade eben kein Viewmodell will.

Zur Lösung: Man möchte z.B. diese GUI darstellen, wobei in der Combobox die Items aus einem eigenen oder bekannten Enum stammen sollen und selektierbar sein sollen. Hier: Dock aus dem DockPanel.

In dieser kleinen Demo wird die Combobox durch den Enum Dock gefüllt und im Weiteren dieser Selektionswert an die Dock-Eigenschaft des kastanienfarbenen Rechtecks gebunden. De XAML oder aXAML-Code dazu sieht so aus:

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:adb="https://flinkebits.de/avadevbox"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="AvaloniaControls.Demo.RangeSliderDemo">
  <StackPanel>
    <TextBlock>Aufzählungswerte von Dock:</TextBlock>
    <ComboBox Name="cbdock" Width="240"
              HorizontalAlignment="Left"
              SelectedIndex="2" Margin="10,5,0,30"
              Items="{Binding Source={adb:EnumBindingSource {x:Type Dock}}}"/>

    <Border BorderThickness="3" BorderBrush="AliceBlue" Margin="10" Height="300">
      <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
        <Rectangle DockPanel.Dock="{Binding #cbdock.SelectedItem}"
                   Width="55"
                   Height="44"
                   Fill="Maroon" />
        <Button IsEnabled="False" >Rest</Button>
      </DockPanel>
    </Border>
  </StackPanel>
</UserControl>

Früher in WPF hat man dazu nette Verrenkungen mit ObjectValueProvider gemacht. Doch den gibt es unter Avalonia nicht mehr. Stattdessen greife ich hier auf eine Markupextension zurück: EnumBindingSource. Allerdings gibt es Markupextensions in AvaloniaUI auch nicht so wirklich. Auf jeden Fall gibt es keine Ableitung von MarkupExtension. Das Problem für AvaloniaUI ist, dass man eigentlich gleichzeitig von AvaloniaObject und MarkupExtension erben wöllte, aber natrülichin C# nur eine Klasse beerbt werden kann!

Die Lösung ist, dass die XAML-Komponente von AvaloniaUI die Klasse MarkupExtension vollständig ignoriert und bei Verwendungen wie Markupextensions einfach nach Klassen sucht, die lediglich von AvaloniaObject abgeleitet sind und eine von mehreren möglichen public ProvideValue()-Signaturen hat. Avalonia lässt hier verschiedene Rückgabewerte zu. Konkrete und object, sowie verschiedene Parameter. Somit lässt sich diese Extension so schreiben:

public class EnumBindingSource : AvaloniaObject /*: MarkupExtension*/
{
    private Type _enumType;
    public Type EnumType
    {
        get { return this._enumType; }
        set
        {
            if (value != this._enumType)
            {
                if (null != value)
                {
                    Type enumType = Nullable.GetUnderlyingType(value) ?? value;

                    if (!enumType.IsEnum)
                        throw new ArgumentException("Type must be for an Enum.");
                }

                this._enumType = value;
            }
        }
    }

    public EnumBindingSource() { }

    public EnumBindingSource(Type enumType)
    {
        this.EnumType = enumType;
    }

    public Array ProvideValue(IServiceProvider serviceProvider)
    {
        if (null == this._enumType)
            throw new InvalidOperationException("The EnumType must be specified.");

        Type actualEnumType = Nullable.GetUnderlyingType(this._enumType) ?? this._enumType;
        Array enumValues = Enum.GetValues(actualEnumType);

        if (actualEnumType == this._enumType)
            return enumValues;

        Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1);
        enumValues.CopyTo(tempArray, 1);
        return tempArray;
    }
}

Das Ganze geht noch besser, denn man könnte auch noch die Attribute DescriptionAttribute auf den Aufzählungswerten auswerten und damit eine Lokalisierung anbieten. Das geht natürlich genau so, dass der SelectedValue vom Enum-Typ ist und die Anzeige in der Combobox der Description-Text ist.

Aber das überlasse ich einer Übung des Lesers. Es gibt genug WPF-Beispiele, die genau das tun.

Die Bodenblicktheorie

Kurz

Es ist die Theorie darüber, dass 30% eines menschlichen Blickfelds immer den Boden erfasst. Daher kann eine Straßenszene komplett anders aussehen, je nach dem, wie der Boden gestaltet ist. Anders gesagt: Ein Ort kann durch Umgestaltung des Bodens unglaublich verbessert werden.

Worum es geht

In dieser Theorie geht es darum, wie sehr ein Stadtbild und der Eindruck, den ein Individuum davon hat, vom Boden abhängt. Also gar nicht mal so sehr von den Häusern und deren Fassaden, sondern mehr vom Boden. Dabei ist der Boden eher so ein Ding, das mit Füßen getreten wird und auf dem so mancher auch sein Geschäft macht. Also ein eher weniger beachteter Teil. Dieser Beitrag möchte dem darauf aufmerksam machen, dass der Boden z.B. auch in der Stadtentwicklung einen ganz wesentlichen Beitrag zum Gesamteindruck beiträgt.

Theorie der zerbrochenen Fensterscheibe

Vermutlich bekannt, sonst nachlesen. Im Grunde zieht kaputt mehr Zerstörung nach sich. Daher sofort Unrat und Defekte beseitigen. So ziehen z.B. schlecht gepflegte, inhomogene und geflickte Straßen auch Hundekot und Müll magisch an.