post-header-photo

Move Up with .NET Best Practices – NBC Congrescentrum in Nieuwegein op 28 februari 2019

4DotNet organiseerde op 28 februari een meeting over .NET Best Practices. Ik heb een aantal jaren geleden een cursus gevolgd bij 4DotNet (Core Web Applications with Microsoft Visual Studio 2005), mijn collega Anne gaat binnenkort aan de studie. We werden daarom uitgenodigd om bij dit event aanwezig te zijn. 

Het programma is hier te vinden: link.
Voor de volledigheid ook hier nog even de agenda:

16:30 Inloop
17:00 – 17:45 Sander Hoogendoorn
17:45 – 18:45 Eten
18:45 – 19:30 Erwin Staal
19:30 – 19:45 Pauze
19:45 – 20:30 Jan de Vries
20:30 – 21:30 Borrel

Sander Hoogendoorn | It’s a small world after all

How thinking small is changing software development big time

Our world changes at increasing speed. Things that weren’t possible 5 years ago come into reach. Incumbents need to adept to match start-ups. We evolve towards smaller, faster, shorter. Smaller teams or even micro-teams, flat organizations, no management, even shorter cycles, smaller components. During this inspiring talk Sander discusses Cynefin, how development goes wrong, how to go beyond Scrum, why self-organization is hard, why continuous delivery allows you to stop doing projects.

Erwin Staal | Impact van Continuous Delivery op architectuur

Met Continuous Delivery en DevOps streven we ernaar om op elk gewenst moment software op aanvraag te kunnen leveren. Naast de veranderingen die dit met zich meebrengt in de organisatie zullen we ook de architectuur van ons systemen daarop moeten aanpassen. We zullen onze systemen zodanig moeten ontwerpen dat we eenvoudig onderdelen kunnen vervangen zonder dat onze gebruikers daar iets van merken. In deze sessie zullen we ingaan op een aantal architecturale concepten die daarbij helpen. We gaan het onder andere hebben over applicatie design, het nut van Microservices en Traffic Management. Ook laat ik je zien hoe je technieken als Canary releases en Dark Launching kunt toepassen.

Jan de Vries | Design je Azure Functions als een pro

De reden dat Azure Functions & serverless zo aan populariteit genieten is natuurlijk het pay-as-you-go model en het kunnen focussen op het leveren van business value.

In een cloud-native oplossing kun je gebruik maken van veel out-of-the-box functionaliteit om connecties te maken naar verschillende Azure services.

Maar wat als je connecties wilt maken naar alternatieve services? Dat werkt niet out-of-the-box en vergt veel saai & repetitief werk.

Daarom zijn er nu Azure Functions Custom Bindings!
Deze custom bindings schrijf je eenmalig en kunnen daarna worden gebruikt binnen de Azure Functions. Alle best practices voor het opzetten van de connecties kunnen worden gebundeld binnen de binding en hoef je dus niet oneindig te herhalen.

In deze sessie laat ik zien hoe eenvoudig het is om zelf een binding te maken en te gebruiken, zodat je dit gelijk kunt toepassen binnen je eigen productie omgevingen!


Nieuwegein, altijd druk rond de spits, dus om 14.30 uur rijden we vanuit Heerenveen richting Nieuwegein. Er is inderdaad wat filevorming, maar dat is richting de afslag van de Jaarbeurs, omdat wij een eerdere afslag hebben geen enkel probleem met “drukke spits”, dus rond 16.00 uur staat mijn auto op het parkeerterrein van NBC (link). We worden welkom geheten bij de receptie, krijgen hier een naam-badge en kunnen vervolgens naar boven. Hier kan de jas opgehangen worden, staan koekjes klaar en kun je drinken (in ons geval een cappuccino) krijgen. Ik heb me verder niet verdiept in 4dotnet, ze verzorgen niet alleen trainingen, maar hebben ook ontwikkelaars die ze outsourcen. Langzaam maar zeker stroomt de ruimte vol met developers, maken we een praatje met deze en gene en rond 17.00 gaan we naar de zaal. 

Sander Hoogendoorn (twitter en site) heet ons welkom. We zijn met ongeveer 200 man/vrouw (waarbij de mannen in ruime meerheid aanwezig zijn). Sander werkt bij Quby (link). Hier werken 28 nationaliteiten. Sander zijn presentatie is daarom in het Engels, maar hij kan deze avond gewoon Nederlands spreken, deze avond zijn er geen alleen Engels sprekende bezoekers. Hoewel ik in het bovenstaande overzicht niet verwachtte dat deze presentatie de boeiendste zou zijn, is het wel ééntje die interessant is. Sander is een goede spreker en heeft zijn presentatie ook prima op orde. Sander is Agile Coach, Chief Architect en was wel een scrummer, maar ziet daar nu toch meer nadelen van voordelen in. Hij komt met voorbeeld van de wet van Moore. Dat is dat transistors op een oppervlakte elk jaar verdubbelen. In 2006 heeft Amazon EC2 opgezet. Ook de grootste concurrent, Netflix, maakt hier gebruik van. Sander vraagt of er mensen in de zaal zijn die bij een bank werken (dat zijn er toch nog wel een aantal). Sander ziet dit als een uitstervend beroep. Banken zitten met hun legacy, mainframes die met Cobol werken. Sander kent iemand die bezig is om een online bank op te zetten. Één jaar bezig en bijna klaar. Bij die online bank zullen 30 mensen in dienst zijn, 28 developers en de directie. Zo zijn er weer anderen bezig met een online streamingdienst voor sport. Alles via de cloud, dus zelf hoeven ze geen hardware te kopen/onderhouden. Omdat alles zo snel kan, moet je geen tijd verspillen. Dus geen projecten meer doen, een roadmap opstellen, geen userstories, alles wat je kunt automatiseren vooral automatiseren. Zit je met het hele team om tafel om zaken te bespreken, terwijl je dit beter binnen het groepje kunt houden wat ermee aan de slag gaat. De werktijden van 9.00 tot 17.00 uur. We zien een foto van de files. Als je dan op het werk bent: eerst je mail lezen. Je had beter thuis je mail kunnen lezen en dan naar het werk kunnen gaan. En als je in micro-teams zit, dan kun je beter met die collega samen op een plek gaan zitten waar je aan het werk kunt gaan, je hoeft niet naar het werk. We krijgen een kort overzicht: maak producten, geen projecten, maak kortere cycles (waarom een cycle van 2 weken als je één punt in 3 dagen kunt afronden en kunt opleveren), kleinere teams (en ook wisselend qua samenstelling) en kleinere componenten (microservices). Het gaat niet meer om rollen (back-ender, front-ender), maar om de skill-set die iemand of een combinatie van personen heeft. Doordat we elkaar aanvullen krijg je een goed werkend team. Er wordt nog een quote getoond van Edsger Dijkstra (link). Bij het bedrijf waar je werkt moet je de leiding vragen wat hun doelen voor over 3 jaar zijn, wat hun “purpose” is. We zien een schema van getting-things-done, kleine teams en die skill-set, daarmee lever je niet meer code, maar meer waarde voor je klant. Martin Fowler wordt genoemd (link), volgens mijn aantekeningen in combinatie met microservices. Ook zegt Sander dat “hergebruik een illusie is”. Maak je code dus opnieuw en beter. Vervolgens kunnen er nog kaarten gewonnen worden voor Futuretech (link). 

We hebben een korte lunchpauze. Hierna gaan we door met het verhaal van Erwin Staal (twitter en site). 

Jez Hubmle wordt genoemd, de “vader van Continuous Deployment”: link. Er zijn twee regels: de master is altijd te deployen en iedereen checkt dagelijks in op de trunk (master). Je hebt daarbij de unittesten en andere testen, kunt deployen met een pipeline. Je hebt de “ility’s”, dus deployability, testability die belangrijk/essentieel zijn voor CD. Jesse Robins wordt genoemd (link). Jesse werkte ook bij Amazon en als Master of Disaster zorgde hij ervoor dat delen van de applicatie niet werkten, beschikbaar waren om stabiliteit van de rest van de applicatie te testen. API versioning wordt genoemd, zodat je oude API wel beschikbaar blijft voor aanroepende clients, Amazon/AWS schijnt zo nog API’s uit 2007 aan te bieden. Met een circuit-braker, het retry-pattern zorgen dat als een externe webservice niet bereikbaar is, jouw server niet blijft staan wachten (en het geheugengebruik flink oploopt). De monolith komt ter sprake, de “brok van een applicatie” die daardoor niet (goed) onderhoudbaar is. Erwin laat ons Azure Devops zien. Met een pull-request kun je jouw collega’s je code laten beoordelen en met bepaalde controles/rules kun je dat ook automatisch laten doen (zo zien we een MD5 hashing, een techniek die niet meer secure is). In mijn aantekeningen had ik nog “Zona Cloud” voor statistische analyses staan, maar kan die online nergens vinden. Erwin gebruikt Entity Framework Migrations om zijn databasewijzigingen door te voeren. Met een powershell-script, .\migrate.exe kunnen deze overgezet worden. We krijgen het voorbeeld van staging. Zo kun je 10% van je bezoekers naar die omgeving sturen, zodat je kunt testen/controleren of die code die straks op de productie-omgeving geplaatst wordt niet per ongeluk performanceproblemen gaat opleveren. Via een cookie/querystring kun je de bezoeker (en jezelf) op een bepaalde omgeving laten werken. Met feature-flags (kleine if statements in je code) kun je bepaalde bezoekers een feature wel tonen en een andere nog niet. Hiermee maak je een scheiding tussen een release en een deployment. Een vraag uit het publiek hoe je gaat zorgen dat als omgeving A versie 1 draait en op omgeving B versie 1.5 en dat met dezelfde database gaat werken beantwoord Erwin met dat je moet zorgen dat zaken wel “backward-compatible” moeten blijven. Dus het hernoemen van een veld wordt eerst het toevoegen van en veld, het kopiëren van de data naar het andere veld en dan het uiteindelijk weghalen. En ook nog de opmerking dat Feature Flags mooi zijn, maar je deze er wel zo kort mogelijk in moet houden.

We hebben een korte break. Hierna gaat Jan de Vries zijn demo tonen (twitter en site).

De man houdt een rustig tempo aan en ik meende het al te horen: het is een Fries! Hij laat als voorbeeld twee webjobs draaien, we zien dit in de Service Bus Explorer (link). Jeff Hollan wordt genoemd (link), die als Senior Program Manager aan Azure Functions werkt. Adrian Cockcroft wordt genoemd: twitter. Serverless werken is iets wat nu ongeveer 5 jaar bestaat. Paul Johnston wordt genoemd (twitter) die een aantal principes voor Serverless Computing heeft opgezet. De lijst staat hier: link. Een functie zou één ding moeten doen. Komt redelijk overeen met Clean Code van Uncle Bob. Zero libs if possible. Dus geen nuget-packages toevoegen. Soms ontkom je er niet aan, maar als je het zelf kunt bouwen, doe dat dan, want bij een deployment heb je een cold-start, extra externe libraries vertragen die start. Bij Azure Functions heb je Bindings en Triggers. Binnen Azure heb je 18/19 bindings. Maar je wilt ook zelf bindings kunnen maken, daarvan toont Jan ons een voorbeeld. Jan verwijst voor de bindings en triggers naar Github, dat zal deze link wel zijn. In strings die Jan toont zie ik geen $ ervoor staan, in de string staan waardes die automatisch geïnterpreteerd worden. Een procent-teken geeft aan dat het uit een configuratie-waarde komt, {name} van een variabele. Boven de functie heeft Jan een [autoresolve] zodat de code zelf kan bepalen of het uit get, post, cookies of andere bron gehaald moet worden. Je maakt gebruik van een IExtensionConfigProvider. Om de boel te laten werken met .NET core (als ik me niet vergis) moet je een Startup-class toevoegen en een IWebJobsBuilder daarin gebruiken. Het werkte bij Jan toen nog niet, maar je moet dus bovenin nog een [assemly:WebJobsStartup(typeof(MySimpleBindingStartup)) toevoegen. 

Hierna spreken we nog een tijdje met Roosmarijn van 4dotnet en rijden daarna weer richting Friesland. Binnenkort maar eens kijken op de bovengenoemde sites, links en twitter-accounts en bezig om zelf eens wat test-projecten op te zetten. Want door te doen snap je wat je moet maken, kom je problemen tegen die je op moet lossen en ga je beter de materie begrijpen die nu nog redelijk abstract is.

Oh ja, met een zoekactie kwam ik nog op deze site die zeker betrekking heeft op de hier besproken onderwerpen: https://featureflags.io/canary-testing/

Ik heb nog wat foto’s gemaakt, die zijn hier terug te zien: album.

De presentatie van Erwin Staal is hier te bekijken: https://speakerdeck.com/erwinstaal/architecting-for-continuous-delivery

De presentatie van Jan staat hier: https://www.slideshare.net/JandV/move-up-design-je-azure-functions-als-een-pro