Bericht von der Developer Week 2017
Hans-Jörg Stumpf und Robert Walter waren die glücklichen Besucher der Developer Week Konferenz in Nürnberg.
Hier folgt ihr Bericht über die Vorträge, die sie besucht haben:
Mo, 26.06.2017
Bessere Architekturen mit Events (von David Tielke)
- Publisher -> EventAggregator -> Subscriber
Squirrel for Windows – installing .NET apps the way it should be (von Max Lock)
- Projektseite unter: http://github.com/squirrel/squirrel.windows/
- Sqirrel ist ähnlich zu ClickOnce zur Verteilung von Windows Anwendungen, will aber mehr Möglichkeiten bieten.
- Eine Installation geht immer ohne UAC und ohne Neustart, sogar ein Welcomescreen ist möglich.
- Installationspfad: C:\Users\<User>\AppData\Local\<App>
- Jede Anwendungsversion erstellt einen neuen Unterordner (es werden immer die letzten drei Versionen gespeichert).
- Verwendung: NuGet-Package sqirrel.windows installieren
- UpdateManager.CheckForUpdate(...) und UpdateManager.UpdateApp(...) - Methoden einbinden. Es gibt auch Parameter für den Fortschritt (z.B. beim Download)
- Update bereitstellen / zusammenstellen (Paketierung): squirrel --releasify dotnetpro Sqirrel.1.1.0.nupkg
- Eine .NET-Frameworkversion kann automatisch als Voraussetzung mitinstalliert werden.
- Achtung: Das Installationsverzeichnis ist nicht änderbar!
- Die Verteilung bzw. Bereitstellung ist u.a. auch auf einem Netzlaufwerk möglich.
- Sqirrel erstellt selbstständig FullPackages und DeltaPackages
- Staged Rollout möglich - dazu Releases Datei editieren: 1532...nupkg#20% - bedeutet, dass nur an 20% der User ausgeliefert wird
- VS Build Integration ist mit NuGet.CommandLine-Package möglich
- StubExecutable in Version 1.5 hat einen Bug (seit über 6 Monaten) - Empfehlung: Version: 1.4.4 verwenden!
- Eigener Beweggrund des Referenten, Squirrel zu nutzen: Es hat mehr Features als ClickOnce, und kann in den Buildprozess integriert werden.
Event Sourcing – Ewige Daten für flexible BusinessAnwendungen (von Philip Jander)
- Event Sourcing ist eine Architektur, in der es um Ereignisse statt Daten geht. Es unterscheidet sich sehr stark von klassischer Architektur.
- Der Referent hat langjährige Praxiserfahrung mit Event Sourcing, und hat inzwischen auch von Performanceproblemen gesprochen, und Tipps dazu gegeben.
- Beispiel: Ereignisse für eine Konferenz; Anmeldung eingegangen, Beitragsrechnung wurde erstellt
- Daten hängen an Ereignissen als Attribute
- Grundsätze: Ereignisse sind unveränderlich + vollständig + nachvollziehbar
- Klassen vererben von der selbst geschriebenen Klasse Domain Event
- Alle Ereignisse werden in einem Event Store gespeichert; er ist entweder selbst implementiert in einer relationalen DB, DocumentDB, usw.,
oder man kann ein kommerzielles Framework nutzen. Unoptimiert können 1 Mio. Events gespeichert werden, optimierte Frameworks schaffen 20 Mio. Events.
- Achtung: Text parsen ist sehr langsam - man sollte kein JSON speichern!
- Thema Performance: Projektionen sind möglich, d.h. z.B. den Kontostand aus einem Event Store zu liefern
- Der Initiator Greg Young hat anfangs Werbung gemacht, Logik aus der DB zu entfernen; 9 Jahre später hat
er eine eigene DB mit Projektionen entwickelt - eine ähnliche Funktionsweise wie bei Stored Procedures.
- Auswertung: Einen Stream (= Kette von Ereignissen) in Projektionen cachen (= Read Model in CQRS)
Modulare UI mit Prism (von Christian Giesswein)
- Prism ist ein Framework von Microsoft vom Patterns & Practices Team für XAML-basierte Anwendungen.
Es bietet einen Rahmen und ein grundlegendes Framework für modulare UIs.
- Projektseite früher: http://compositewpf.codeplex.com
- Projektseite heute: http://github.com/prismlib
- Schnellstart für ein neues leeres WPF-Projekt:
- NuGet-Package: Prism.Core
und Prism.Wpf für WPF einbinden - ACHTUNG: Das Package
Prism ist veraltet!
- Das bevorzugte Dependency-Injection-Framework einbinden. Z.B.: Prism.Unity
- App.xaml StartupUri entfernen; App.OnStartup überschreiben; eigene Klasse DWXBootstrapping : UnityBootstrapper schreiben; bootstrapper.Run() aufrufen;
- In DWXBootstrapping die CreateShell-Methode überschreiben; return Container.Resolve<MainWindow>(); zurückgeben;
- In DWXBootstrapping die InitializeShell-Methode überschreiben; base.InitializeShell(); ((Window)Shell).Show() aufrufen;
- MainWindow Konstruktor kann erweitert werden um MainWindow(ILoggerFacade logger) mit Dependency-Injection;
Bei MVVM geht z.B. auch das ViewModel als Parameter.
- Im Fenster: mvvm:ViewModelLocator.AutoWireViewModel="True" als Attribut einbinden.
- ViewModel : BindableBase (für INotifyPropertyChanged); Die Basisklasse BindableBase hat schon den SynchronizationContext inkl.!
D.h. Multithreading funktioniert einfach von selbst.
- In DWXBootstrapping die ConfigureModelCatalog() überschreiben; Hier z.B. den DAL initialisieren;
- Es ist z.B. ein Splash Screen mit Fortschrittsanzeige möglich!; Konstruktor: SplashScreenViewModel(IEventAggregator ea);
ea.GetEvent<PubSubEvent<ISplashScreenProgressMessage>>(...);
- In der View im Grundfenster einbinden: <ContentControl mvvm:RegionManager.Name="MainContent" />
Zugriff auf SQL Server mit .NET Core (von Thorsten Kansy)
- ADO.Net Core - Kenntnisse notwendig
- Datatable gibt es nicht
- SQL-Command immer USING- Block verwenden.
- Connection String Builder verwenden
- Entity Framework - Kenntnisse wichtig
- Entity Framework -> No Tracking immer am Schnellsten
- Entity Framework -> No Tracking immer am Schnellsten
An introduction to graph databases (von Szymon Warda)
- Graph Datenbanken: Neo4j, Titan, Flock, OrientDB, AllegroGraph, InfiniteGraph, Microsoft Graph, usw.
- Beispiel Anwendungsfall: Buch-Kaufvorschläge von Amazon - Vorschläge von Buch B führen meistens zum Kauf von Buch C
- Besuchswege der User werden gespeichert und analysiert. Sackgassen werden ermitteln und vermieden.
- Beispiel Anwendungsfall: Darstellung und nachvollziehen von Geldflüssen
- Der isländische Minister musste wegen Geldveruntreuung zurücktreten. Entwickler haben dazu Daten analysiert, und veröffentlicht.
- Ein Beispiel für eine Suche in einer Graph DB: "Sushi Restaurants in New York that my friends like"
- Neo4j Abfragesprache CYPHER: 'Find recipes with fish and sweet drinks'
MATCH(r:Recipe) -[:CONTAINS]->(n:Ingredient), (n)-[:FROM|SPECIFICATION*0..9]-(soda:Ingredient (Name:'sweet drink')
-[:FROM|SPECIFICATION*0..9]-(meal:Ingredient (Name:'fish')
- Graph DBs sind gut geeignet für: Hierarchische Daten, wenn Beziehungen im Vordergrund stehen, bessere Visualisierung
Domain Driven Design (von Marco Heimeshoff)
- Das Original DDD Buch von Eric Evans ist aus dem Jahr 2003. Seine eigene Aussage dazu ist:
"Ich habe das Buch in der falschen Reihenfolge geschrieben. Eigentlich sollte es mit Kapitel 7 starten, und mit Kapitel 1 - 6 aufhören."
- Hier die Kernaussagen: Man braucht eine ubiquitäre Sprache / ubiquitos Language, d.h. eine 'allgegenwertige Sprache'.
- Weasel Words vermeiden: Unnötige Wörter wie 'Infrastructure', 'Layer', 'Simple', 'Singleton', 'Presenter', 'Evaluator' sollen weggelassen werden.
- Beispiel CustomerRepository: Schlecht - class CustomerRepository { GetCustomersByYearOfBirth(DateTime yearOfBirth) { ... } }
- Beispiel CustomerRepository: Besser - interface IFindCustomers { BornIn(Year year); }
- Ein Entwickler würde einen TV z.B. mit Weasel Words als EntertainmentProviderSingleton beschreiben.
- Bounded Context: Man sollte nur eine Sprache pro Kontext verwenden - Beispiel: Ein Kunde im Webshop mit einem Warenkorb ist eigentlich ein Interessent;
Ein Kunde bei der Bezahlung ist ein Kreditor und ein Debitor
- Der Referent nutzt DDD selbst für eine Personalsoftware, wo er für die Urlaubsberechnung zuständig ist.
Durch die Komplexität sind sie immer wieder in Sackgassen geraten. Als er auf einer Konferenz einem Bekannten erzählt hat, dass er seit 3 Monaten
am Urlaubsmodul programmiert, konnte er es nicht glauben. Daraufhin hat der Bekannte in seine Firma gewechselt, um die Aufgabe zu übernehmen. Nun programmiert
der neue Kollege schon seit einem Jahr daran!
- Codebeispiel: Berechnungsmodus.Nach_TageWoche; Anspruchsgrundlage(konstant(20)), offenerZeitraum(von(2015, 01, 01), bis(2015, 12, 31))
- Zu DDD sind nicht unbedingt die Building Blocks wichtig (Value Objects, u.a.)
- Einstieg: Das Modell des Kunden extrahieren - dann in semantischen Code gießen - und schließlich es vor Korrumption schützen.
- ACHTUNG: Nicht sofort nur die Hauptwörter einer neuen Domäne in Klassen gießen! Zuerst muss erfragt werden, was wichtig ist, man muss Begründungen einholen
und die Domäne herausfordern. Man muss immer wieder mit 'warum' hinterfragen - was ist wenn etwas anders wäre? Und zuallererst muss man natürlich herausfinden,
wo das Problem liegt.
- Empfehlung: Das Verfahren Event Storming nutzen (angelehnt an Brain Storming).
Ein paar Leute sind in einem Raum und jeder schreibt Business Ereignisse auf Zettel und pinnt sie an. Die Zettel werden sortiert, und nach Kontext gruppiert.
- Buchempfehlung: Wrox - Patterns, Principles and Practices of Domain-Driven Design - das Originalbuch ist nämlich sehr schwer zu lesen!
Schlanke und performante Android-Apps (von Thomas Künneth)
- Der Referent ist ebenfalls Buchautor und arbeitet bei der Nürnberger Firma Mathema.
- Material unter: http://github.com/tkuenneth/
- Internationalisierung mit strings.xml und "@string/app.name". Android Emulator hat Custom Locale App, um Systemsprache zu ändern.
Ordner werden lokalisiert mit values/ - values_de/ oder drawable/ - drawable_de/
- Grafiken optimieren: U.a. drawable_vector ab Android 5.0 verwenden
- RelativeLayout ist performanter als LinearLayout (braucht weniger Speicher und Objekte)
Di, 27.06.2017
Wie gut ist Ihre Software? (von David Tielke)
- Zyklomatische Komplexität (je Methode) - Visual Studio kann dies ermitteln
- Switche sollten ausgeklammert werden
- Optimalerweise 5-7
- ISO 9126
Was wir WPF´ler von Angular.JS lernen können (von Christian Giesswein)
- XAMLStyler Extension ist ein MUSS!
- MVVM als Begriff ist irreführend - Model-View-VM-VM-VM-... wäre besser!
- MVVM-Beispiele sind viel zu minimalistisch, um auf das Wesentliche zu kommen. Beispiel:
Eine Combobox mit Adressen und integriertem Delete-Button für eine Person kann mit DTOs nicht mehr abgebildet werden!
- "Wir leben in einer technologisch unsicheren Zeit" - "ViewModels müssen aufgrund wandelbarer Technologien
wegwerfbar sein!! Nur das pure C# Modell wir überleben!"
- Tipp: Optimiertes Binding bei TextBox Binding UpdateSourceTrigger="PropertyChanged", kann man auch als Ableitung festschreiben
und als Markup-Schreibweise einbinden!
- Ein ähnliches Beispiel wäre ein spezielles OneTimeBinding - Eine Performanceoptimierung ist möglich mit Mode="OneTime"
für Listen/ComboBoxen, die sich nicht ändern.
- local:OneTimeBinding erstellen: In Projekt auslagern (WPFInfrastructure) mit AssemblyInfo.cs: [XmlnsDefinition("...winfx/2006/presentation", ...)]
Somit entfällt local: für Controls, Bindings, u.a.!
- <Window.DataContext>... d: geht für alle Elemente für den Designer! Hier gibt es z.B. auch d:IsDesignTimeCreatable="True"
Was ist dieses KISS eigentlich? (von Jan Fellien)
- Negativ
- Schizophrene Objekte
- Traditionalisten
- KISS = Einfachheit & Fokus
The (Awesome) future of Web Apps (von Jad Joubran)
- Neue Möglichkeiten: Offlinefähigkeit, Push Notifications, u.a.
- Offlinefähigkeit durch ServiceLocator Pattern; z.B. durch Google Chrome sw-precache
- <meta name="theme-color" ... für mobile web apps
- Wichtiges CSS soll inline geschrieben werden, damit es schneller und sofort geladen wird! z.B. background-color für die ganze Seite.
- <link rel="preload" ... onload="this.rel = 'style.css'"> für Chrome
- Man sollte Geräte-Schriftarten verwenden: font-family: -apple-system, "Segoe UI", Roboto, ...
- Web Fonts (*.woff) sollten vorgeladen werden <link rel="preload" as="font" ... crossorigin>
- Wie man Home screen Benutzer erkennt: Z.B. im manifest.json - index.html#homescreen angeben
- Chrome Developer Tools haben Service Worker Manipulationsparameter
- Chrome Developer Tools Coverage zeigt an, wieviel Javascript NICHT benutzt wird!
- Mit dem Framework Polymer2 kann man Polyfills nachladen, aber nur wenn man sie benötigt.
- Unwichtige Arbeit sollte verzögert werden (z.B. das Laden von Google Analytics), nur wenn Browser idle ist.
Grids & Glory (von Sven Wolfermann)
- Hier geht es um Techniken für Web Layout-Rahmen (Grids)
- Bootstrap hat 146 kb in unkomprimierter Größe, und das nur dafür, dass die meisten ein Grid System nutzen!
- Singularity Grid ist ein empfohlenes Responsive Grid mit Sass; Ein Smartphone hat 3 Spalten, Tablets 6, und Computer 12
- Es bietet ein assymetrisches Grid mit einem goldenen Schnitt (CSS-Klasse: golden-ratio)
- Flexbox vs. CSS Grid Layout (W3C recommendation): Flexbox geht nur auf 1 Achse - CSS Grid Layout hingegen auch auf 2 Achsen.
- Seitenempfehlungen: http://www.gridbyexample.com
und http://www.canisue.com (= can I use?)
- Neue Attribute mit CSS Grid Layout: grid-gap: 12px; 3 Spalten: 1fr 1fr 1fr; grid-column: 1/span 2; grid-row: auto/span 3;
CSS Flexbox: Oberflächenlayout der Zukunft (von Timo Korinth)
- "Die Menschheit kann auf den Mond fliegen und landen, aber wir schaffen es nicht vernünftig,
mit CSS ein Element in HTML vertikal auf einer Seite zu zentrieren!"
- CSS FlexBox ist endlich eine vernünftige Lösung für CSS Layouting
- flex-direction: row | row-reverse (für horizontale Ausrichtung)
- flex-direction: column | column-reverse (für vertikale Ausrichtung)
- flex-grow: 0 (Element darf nicht wachsen); 1 (Element wächst mit) wie bei Uniform Grid
- Beispiele für Element-Container:
- Main Container: flex: 1 1 auto;
- Nav Container: flex: 0 0 auto;
- Header Container: flex: 0 0 auto;
- Alle modernen Browser haben inzwischen Flexbox implementiert! (Android z.B. schon ab Version 4.4)
- Autoprefixer machen aus display: flex; -> -webkit-box, -ms-flexbox, usw.
- es gibt ein Autoprefixer GitHub-Projekt - Angular hat es schon inklusive.
- ScrollBars in einer Seite in einem Container sind -EINFACH- möglich!
- Elemente verschieben: nav { order: -1; } stellt nav links neben den maincontent
- Nachteil: Flexbox ist nur 1-dimensional; CSS Grid wird immer besser unterstützt!
WPF und MVVM: Von 0 auf 100 (von Thomas Claudius Huber)
- Model -> ViewModel
- NavigationDataProvider
- Test-Fake-Klasse MOQ
- Autofac ItemsControl
- MessageBox nie im ViewModel
- ViewModel ist nur richtig wenn man es über eine Testklasse testen kann
Powershell für NET Entwickler – Willkommen in der Welt von DevOps (von Manuel Meyer)
- Die Powershell ist der beste Freund für Windows-Admins zum produktiven Scripting
- Möglichkeiten zur Fernsteuerung: IIS, TFS, Sharepoint
- Beispiel Befehle, um Dateien eines Verzeichnisses in einer HTML-Seite auszugeben:
Get-ChildItem C:\Pfad\ -File | Sort-Object Length -Descending | Select-Object FullName, Length -First 8 | -ConvertTo-Html
- Get-Service | Out-GridView (zeigt alle Windows Dienste in einem WPF DataGrid-Fenster an)
- Com-Interop mit Windows Speech oder Excel-Interop möglich:
$voice = New-Object -ComObject SAPI.SPVoice
$voice.Speak("Das wird ausgesprochen.")
- Per WMI kann man viele Provider (wie z.B. den SQL Server oder die Windows Registry) ansprechen, wie ein Dateisystem
- Der Befehl: Get-Provider zeigt alle verfügbaren WMI-Provider an
- Zugriff auf SQL Server DB:
cd sqlserver:\sql
dir
- Installation des Webservers unter Windows Server:
Install-WindowsFeature WebServer -ConfigurationFilePath x.xml
- Das Spiel Space Invaders gibt es mit dem Modul psinvaders auch für die Powershell
Mi, 28.06.2017
Angular 2 – Feel the difference (von Gregor Biswanger)
- Schnell, mächtig, sauber, simpel
- Module (exe, dll), Components (Usercontrol), Directives (Erweiterungen), Services (Geschäftslogik)
- Angular CLI anschauen
- Verschiedene Klammern:
- () View -- Binding -> ViewModel
- [] View -> Binding – ViewModel
- [()] View -> Binding -> ViewModel
- ngFor (For-Schleife)
- Befehle:
Volltextsuche in der Praxis (von Kay Müller)
- Der Sprecher war 2006 bei IBM in Dublin im Watson Core Algorithm Team und ist inzwischen Big Data Analyst
- Eine Text Indizierung trennt zuerst die Wörter und speichert sie quasi in einer Key-Value Tabelle mit Positionen ab
- Text Normalisierung gleicht den Text an, durch Kleinschreibung und Wandlung in Lemmatisierung (= Grundform, Wortstamm),
und Stoppwort-Filterung (a, is, the, etc.)
- Tokenisierung und Mehrdeutigkeiten: Was ist ein Token? Beispiele:
USA, U.S.A, U.S, us? Schiff|fahrts|kapitän? [United Kingdom]? methyl()-9*(xent)?
- Inverse Document Frequency drückt aus, wie oft ein Wort im Text vorkommt (= Wichtigkeitsindex)
- Je mehr neue Dokumente in die DB hinzugefügt werden, umso weniger neue Wörter werden aufgenommen
- Möglichkeiten: Generieren von Tag Clouds, TimeLines, Pivots, u.a.
- Empfehlung: Framework Lucene (existiert in Java seit 1999), Solr ist Aufsatz auf Lucene
- Query Syntax zu lernen unter: http://www.solrtutorial.com
- Auch eine GeoSpatial Suche mit Heatmaps ist möglich
- http://www.dbpedia.de ist eine Beispielseite dafür,
und kann auch semantische Suche
Code-Sharing to the max: Mit der richtigen Architektur! (von Kai Brummund)
- Ansätze: Native, Portable Body, Native, WebApp
- Domain, Infrastructure, Clients
Und nun die Fortschrittsvorhersage – Simulieren statt schätzen (von Ralf Westphal)
- Eine Frage in die Runde mit einem vollen Saal voller Entwickler: Wer schätzt gern? Wer kann korrekt schätzen?
-> Ein bis zwei Personen melden sich. Und das im Jahr 2017, wobei Schätzungen doch für jedermann dazugehören?!
- Empfehlung von Ralf Westphal: "Lasst schätzen sein!"
- Schätzungen können schon deswegen nicht verlässlich eingehalten werdne, weil man meistens keine Kontrolle bzw. Hoheit
über seine eigene Zeit hat (z.B. kann man sich morgen vier Stunden am Stück für etwas Zeit nehmen?!),
und weil man als Entwickler fast keine handwerklichen Tätigkeiten hat
(man muss viel Analyse betreiben, viel kommunizieren, hat wenig wiederkehrende Tätigkeiten)
- Absolute Schätzungen sind nicht möglich, weil man einer Kontrollillusion bzw. einer Erfahrungsillusion unterliegt.
- Beispiel: Wie lange dauert eine Tic-Tac-Toe-Spiel als Webanwendung?
(z.B. ein Bot als Gegenspieler würde den Aufwand explodieren lassen)
- Nicht geschaffte Schätzungen erzeugen Leiden, Analyse, "Fingerpointing"
- Zitat von Ralf Westphal: "Ein gebrochenes Versprechen erzeugt Konflikte, erzeugt Verschwendung"
- Empfehlung von Ralph: Jeder der eine absoute Schätzung haben will, soll doch selber schätzen!
- Ratschlag: Die Monte-Carlo-Simulation von Joel Spolsky verwenden
- Schätzungen in die Zukunft funktionieren nicht, man muss die Aufwände der Vergangenheit dokumentieren!
- Man erfasst alle Anforderungen, und die Dauer. Daraus erstellt man eine Häufigkeitstabelle.
Beispielsweise braucht man meistens zu 90% 26 Stunden / Tage für eine Anforderung. Zu 40% 18 Stunden.
Deswegen ist es am wahrscheinlichsten, dass man beim nächsten Mal zu 90 % 26 Stunden brauchen wird.
- Ein Manager kann wie beim Poker nach Wahrscheinlichkeitsgraphen sich nach Risiko die passende Dauer aussuchen.
Open Source Lizenzen in der Praxis (von Thomas Graf)
- CopyLeft - Software soll „frei“ sein
- GPL 2.0 - wenn verwendet wird, dann alles GPL
- LGPL - eingeschränktes CopyLeft
- MPL, CPL, CPPL - CopyLeft ähnlich
- MIT, Apache 2.0, BSD - ohne CopyLeft
- MIT - Copyright, Lizenzbedingungen anzeigen, Produktname nicht verwenden
- http://www.fossology.org (Lizenzscanner)
Business Apps mit der Universal Windows Platform entwickeln (von Thomas Claudius Huber)
- x:Bind statt Binding
- Kompiliertes Databinding
- Menü, Datagrid, Treeview, TapControl nicht vorhanden
SQL Server Neues und Altbewährtes: Best Practices und How-To’s für Entwickler (von Thorsten Kansy)
- Tipp: Datenbankprojekte in Visual Studio nutzen! Vorteile: Refactoring, DACPAC-Deployment Schema/Data Compare,
T4-Skripte möglich; 'Find all references' geht auch auf Spalten.
- Achtung: Zu viele Indizes schaden der Performance!
- Der häufigste Zugriff (PK/ID) muss ein Clustered Index sein
- Die häufigsten Suchspalten sollen in einem Non-Clustered Index sein
- Daten mit großer Zeilenanzahl und statischen Daten sind optimal mit einem Clustered ColumnStore Index