Slide 1

Slide 1 text

S o f t w a r e A r c h i t e c t u r e A l l i a n c e 2 0 2 2 , 1 1 . 1 0 . 2 0 2 2 Knifflige Probleme in Software- systemen lösen Markus Harrer Senior Consultant

Slide 2

Slide 2 text

" Markus Harrer Senior Consultant / Nürnberg, Deutschland Tools only ind, people have to ind out!" • Softwarearchitektur-Entwicklung und -Bewertung • Software-Modernisierung und -Rightsizing • Datenanalysen in der Softwareentwicklung 2 Foundation & IMPROVE https://softwareanalytics.de https://feststelltaste.de/ Instructor inkl. Lehrplan

Slide 3

Slide 3 text

3 Ziele und Scope des Vortrags „Knifflige Probleme in Softwaresystemen lösen“

Slide 4

Slide 4 text

Lösung Ursache L a n g s a m e s Denken Schnelles Denken Symptom „Abhilfe“ ~95% Lösung Problem L a n g s a m e s Denken Nach „Schnelles Denken, langsames Denken“ von Daniel Kahneman Ziel 1: Lösungsreflexe unterbinden 4

Slide 5

Slide 5 text

Ziel 2: Probleme nachvollziehbar lösen 5 Euch helfen, Fäden zwischen Problemen und Lösungen zu ziehen Problem Lösung

Slide 6

Slide 6 text

6 Das Problem zu erkennen ist wichtiger als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung.“ Albert Einstein Bild: https://commons.wikimedia.org/wiki/File:Albert_Einstein_Head_cleaned.jpg “

Slide 7

Slide 7 text

Nicht-Inhalte des Talks 7 … aber zumindest bietet dieser Talk Input dafür Roadmap-Erstellung Portfoliomanagment Silver Bullets

Slide 8

Slide 8 text

8 Knifflige Probleme in Softwaresystemen

Slide 9

Slide 9 text

9 Vielfältig Intransparent Viele Abhängigkeiten Wechselwirkungen Richtiges Schlammassel

Slide 10

Slide 10 text

Beispiele ür knif lige Probleme 10 Nur für den Fall, dass diese bei euch unbekannt sein sollten… „Angebot berechnen fabriziert 12000 Service-Calls!“ „Nur Herbert kennt sich mit der Abrechnung aus!“ „Die Suche nach Verträgen dauert 5 Minuten!“

Slide 11

Slide 11 text

Probleme sammeln 11 Beispiel: The Wall of Technical Debt Blog-Post: https://verraes.net/2020/01/wall-of-technical-debt/ Bild: https://twitter.com/Pelshoff/status/1220291781188866049, CC BY 4.0 Lizenz

Slide 12

Slide 12 text

Probleme sammeln 12 Beispiel: Risk-Storming Blog-Post: https://riskstorming.com/ Bild: https://c4model.com, CC BY 4.0 Lizenz

Slide 13

Slide 13 text

Probleme sammeln 13 Beispiel: Code-Happiness-O-Meter Paul Paul Julia Julia https://twitter.com/feststelltaste/status/961639365045817344

Slide 14

Slide 14 text

Ergebnisse einer Problemsammlung 14 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 15

Slide 15 text

Was machen wir nun damit? 15 Problem lösen (frei nach Prof. Walter Schönwandts „Key Seven“ ) 1. Was sind die Probleme? 2. Problem(rück|vor)verschiebung 3. Problemverständnis 4. ProblemursachEN 5. Passende Maßnahmen finden 6. Denkfehler beachten 7. Richtiges Problem? Ungefähres Verhältnis der Zeitdauer der Themen

Slide 16

Slide 16 text

1. Punkt Was sind die Probleme? 16

Slide 17

Slide 17 text

Ergebnisse einer Problemsammlung 17 Kein Kubernetes Kein Kubernetes Ø 400 DB- Calls bei 1 Klick in Anwendung Ø 400 DB- Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 18

Slide 18 text

Was sind die Probleme? 18 Kein Kubernetes Kein Kubernetes Ø 400 DB- Calls bei 1 Klick in Anwendung Ø 400 DB- Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht

Slide 19

Slide 19 text

Was sind die 19 Kein Kubernetes Kein Kubernetes Ø 400 DB- Calls bei 1 Klick in Anwendung Ø 400 DB- Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Als Lösung getarntes Problem Kniffliges Problem Einfaches Problem (Routineaufgabe) Probleme? kniffligen Was sind die

Slide 20

Slide 20 text

Ergebnisse einer Problemsammlung 20 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 21

Slide 21 text

Ergebnisse einer Problemsammlung 21 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem Maß- nahme Maß- nahme Routine Routine

Slide 22

Slide 22 text

Ergebnisse einer Problemsammlung 22 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem Gelöstes Problem Gelöstes Problem

Slide 23

Slide 23 text

Ergebnisse einer Problemsammlung 23 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 24

Slide 24 text

2. Punkt Problem(rück|vor)verschiebung 24

Slide 25

Slide 25 text

Problemrückverschiebung 25 = Root-Cause-Analysis Frage: Woher kommt das Problem? → Der Sache auf den Grund gehen Ursache Problem Zu viele Daten werden mit einer Abfrage geladen Die Daten- strukturen sind kreuz und quer

Slide 26

Slide 26 text

Problemvorverschiebung 26 = „Reverse-Problem-Analysis“ Frage: Wozu führt das Problem? → Weitere Einstiegsstellen inden (aber nur, wenn Lösung nicht anders möglich!) Symptom Ursache Problem Datenbank- abfragen sind zu langsam! Zu viele Daten werden mit einer Abfrage geladen Die Daten- strukturen sind kreuz und quer

Slide 27

Slide 27 text

Erste Lösungsideen finden 27 Spielräume für die Problemlösung schaffen Räume für Ideen Symptom Ursache Problem Datenbank- abfragen sind zu langsam! Zu viele Daten werden mit einer Abfrage geladen Die Daten- strukturen sind kreuz und quer Werbung beim Warten einblenden Optimierte Lesemodelle einführen Nutzungs- szenarien der Daten analysieren Viele potenzielle Dinge, über die nachgedacht werden kann

Slide 28

Slide 28 text

Ergebnisse einer Problemsammlung 28 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 29

Slide 29 text

Ergebnisse einer Problemsammlung 29 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von

Slide 30

Slide 30 text

Ergebnisse einer Problemsammlung 30 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Gelöstes Problem Gelöstes Problem

Slide 31

Slide 31 text

Ergebnisse einer Problemsammlung 31 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von

Slide 32

Slide 32 text

Ergebnisse einer Problemsammlung 32 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Erste Idee Erste Idee

Slide 33

Slide 33 text

33 3. Punkt Problemverständnis

Slide 34

Slide 34 text

Ergebnisse einer Problemsammlung 34 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Schlechte Performance Schlechte Performance Problem Problem hängt ab von Erste Idee Erste Idee

Slide 35

Slide 35 text

Ein typisches Problem 35 Schlechte Performance Schlechte Performance Was können wir dagegen machen?

Slide 36

Slide 36 text

Typische Lösungen 36 Schlechte Performance Schlechte Performance Caching Caching Mehr RAM / CPU Mehr RAM / CPU Server- less Server- less

Slide 37

Slide 37 text

Schlechte Performance Schlechte Performance Eine typische Situation 37 Caching Caching Mehr RAM / CPU Mehr RAM / CPU Server- less Server- less

Slide 38

Slide 38 text

Resultat: Verschlimmbesserung 38 Mehr RAM / CPU Mehr RAM / CPU = Umsetzung von Features dauert zu lange = Umsetzung von Features dauert zu lange Daten- inkonsistenzen Daten- inkonsistenzen Hohe Betriebs- kosten Hohe Betriebs- kosten Instabile Betriebs- umgebung Instabile Betriebs- umgebung ↓ ↓ ↓ Folgen = Quelle neuer Probleme Caching Caching Server- less Server- less

Slide 39

Slide 39 text

Resultat: Verschlimmbesserung 39 Kommt nicht so gut bei allen an…

Slide 40

Slide 40 text

Bei Begriffen genauer werden 40 Schlechte Performance Schlechte Performance Umsetzung von Features dauert zu lange? Umsetzung von Features dauert zu lange? Durchsatz von Vertrags- genehmigungen zu langsam? Durchsatz von Vertrags- genehmigungen zu langsam? Entwickler tanzen zu schlecht? Entwickler tanzen zu schlecht? Antwortzeiten der Anwendung dauern zu lange? Antwortzeiten der Anwendung dauern zu lange?

Slide 41

Slide 41 text

41 „Was meinst du damit?“ Einfache Frage, große Wirkung!

Slide 42

Slide 42 text

Begriffe im Kontext sehen 42 Wörter bekommen erst in einem Kontext eine Bedeutung → z. B. durch Kategorisierung bzw. Clustering von Problemen Schlechte Performance Schlechte Performance Feature- entwicklung Feature- entwicklung Leistungs- effizienz Leistungs- effizienz Schlechte Entwicklungs- performance Schlechte Entwicklungs- performance ??? ??? Schlechte System- performance Schlechte System- performance →

Slide 43

Slide 43 text

Bei Begriffen konkreter werden 43 Ø 400 DB- Calls bei 1 Klick in Anwendung Ø 400 DB- Calls bei 1 Klick in Anwendung Ø 1000 DB- Calls bei Report- Generierung Ø 1000 DB- Calls bei Report- Generierung 10000 DB- Calls bei Jahresend- berichts- generierung 10000 DB- Calls bei Jahresend- berichts- generierung > >

Slide 44

Slide 44 text

Ergebnisse einer Problemsammlung 44 Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 45

Slide 45 text

Ergebnisse einer Problemsammlung 45 Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem

Slide 46

Slide 46 text

Ergebnisse einer Problemsammlung 46 Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem Cluster Cluster

Slide 47

Slide 47 text

Ergebnisse einer Problemsammlung 47 Lokaler Build geht nicht Lokaler Build geht nicht Skalier- barkeit Skalier- barkeit Prozesse Prozesse Codequalität Codequalität Problem Problem Cluster Cluster

Slide 48

Slide 48 text

Ergebnisse einer Problemsammlung 48 Lokaler Build geht nicht Lokaler Build geht nicht Skalier- barkeit Skalier- barkeit Prozesse Prozesse Codequalität Codequalität Problem Problem Cluster Cluster

Slide 49

Slide 49 text

4. Punkt ProblemursachEN 49

Slide 50

Slide 50 text

50 UrsachEN betrachten Code wird lokal nicht getestet Build-Server ist teils fehlkonfiguriert Externe Systeme ändern Abläufe ohne Kommunikation Builds schlagen zu oft fehl im Nightly Build hat Ursache Legende Ursachen Problem Problem → UrsachEN Wichtige Frage: Was noch?

Slide 51

Slide 51 text

Ergebnisse einer Problemsammlung 51 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Erste Idee Erste Idee

Slide 52

Slide 52 text

5. Punkt Passende Maßnahmen finden 52

Slide 53

Slide 53 text

53 Gefahr: Maßnahmen oder Ursachen unvollständig Code wird lokal nicht getestet Build-Server ist teils fehlkon iguriert Externe Systeme ändern Abläufe ohne Kommunikation Builds schlagen zu oft fehl im Nightly Build Entwickler müssen Tests erfolgreich ausführen ist Maßnahme für hat Ursache Legende ist eigentlich Maßnahme für Ein ührung von Consumer-driven Contract Testing Externe Systeme durch Mocks ersetzen ? ? Fehlende Maßnahme Fehlende Ursache Ursachen Problem Maßnahmen Maßnahmen zu Ursachen finden

Slide 54

Slide 54 text

54 We fail more often because we solve the wrong problem than because we get the wrong solution to the right problem.” Russell L. Ackoff “ Bild: https://de.wikipedia.org/wiki/Datei:Russel_Lincoln_Ackoff.jpg

Slide 55

Slide 55 text

Landkarte der Probleme 55 Ursachen mit Maßnahmen zusammenbringen Code wird lokal nicht getestet Externe Systeme ändern Abläufe ohne Kommunikation Builds schlagen zu oft fehl im Nightly Build Entwickler müssen Tests erfolgreich ausführen Einführung von Consumer-driven Contract Testing Ursachen Maßnahmen

Slide 56

Slide 56 text

Landkarte der möglichen Lösungen 56 Folgen der Maßnahmen identifizieren (nichts ist umsonst!) Code wird lokal nicht getestet Externe Systeme ändern Abläufe ohne Kommunikation Builds schlagen zu oft fehl im Nightly Build Entwickler müssen Tests erfolgreich ausführen Einführung von Consumer-driven Contract testing Ursachen Maßnahmen Folgen Schulungen für effektives Testen notwendig Lokale Test müssen schnell durchlaufen Folgen

Slide 57

Slide 57 text

Landkarte der Lösungen 57 Folgen der Maßnahmen bewerten ür die eigene Situation Code wird lokal nicht getestet Externe Systeme ändern Abläufe ohne Kommunikation Builds schlagen zu oft fehl im Nightly Build Entwickler müssen Tests erfolgreich ausführen Einführung von Consumer-driven Contract testing Ursachen Maßnahmen Folgen Schulungen für effektives Testen notwendig Lokale Test müssen schnell durchlaufen Folgen Bewertung Sinnvoll, da wir Qualitätsoffensive anstreben

Slide 58

Slide 58 text

Landkarte der Lösungen 58 Übersicht über konkrete Maßnahmenbündel schaffen Ursachen Maßnahmen Folgen Folgen Bewertung

Slide 59

Slide 59 text

Ergebnisse einer Problemsammlung 59 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Erste Idee Erste Idee

Slide 60

Slide 60 text

Ergebnisse einer Problemsammlung 60 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Erste Idee Erste Idee

Slide 61

Slide 61 text

Ergebnisse einer Problemsammlung 61 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Maß- nahme Maß- nahme Keine Maß- nahme Keine Maß- nahme

Slide 62

Slide 62 text

Ergebnisse einer Problemsammlung 62 Kein Kubernetes Kein Kubernetes 100k DB-Calls bei 1 Klick in Anwendung 100k DB-Calls bei 1 Klick in Anwendung Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem hängt ab von Maß- nahme Maß- nahme Gelöstes Problem Gelöstes Problem Folge Folge

Slide 63

Slide 63 text

Ergebnisse einer Problemsammlung 63 Lokaler Build geht nicht Lokaler Build geht nicht Problem Problem Folge Folge

Slide 64

Slide 64 text

6. Punkt Denkfehler beachten 64

Slide 65

Slide 65 text

Sehen wir die wirklichen Probleme? 65 Problemidentifikation hinterfragen! Ursachen Maßnahmen Folgen Folgen Bewertung Sehen wir wirklich die richtigen Probleme?

Slide 66

Slide 66 text

66 Wer nur im Code sucht, wird auch nur dort Probleme finden! 1 101 1 0

Slide 67

Slide 67 text

Antimethode: Den Schlüssel unter der Straßenlaterne suchen 67 Nicht nur dort suchen, wo das Licht hin ällt!

Slide 68

Slide 68 text

Bewusst in die Breite gehen! 68

Slide 69

Slide 69 text

69 I suppose it is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail.” Abraham Maslow Bild: https://en.wikipedia.org/wiki/Abraham_Maslow#/media/File:Abraham_Maslow.jpg “

Slide 70

Slide 70 text

Die große Welt der Denkfehler 70

Slide 71

Slide 71 text

Ein paar Denkfehler als Beispiel 71 Grand Vision Bias Grand Vision Bias Entnommen von Janelle Arty Starr: Idea Flow - How to Measure the PAIN in Software Development

Slide 72

Slide 72 text

7. Punkt Zielführende Problemlösung 72

Slide 73

Slide 73 text

Ist unser Weg der richtige? 73 Problemlösungsvorgehen reflektieren! Ursachen Maßnahmen Folgen Folgen Bewertung

Slide 74

Slide 74 text

Kausale Ketten in Frage stellen 74 Wir haben kein Content Management System Wir haben kein Content Management System Vorgeschriebenes Single Sign-On wurde bisher falsch bzw. nicht implementiert Vorgeschriebenes Single Sign-On wurde bisher falsch bzw. nicht implementiert Wir haben keine anpassbare Login- Seite für unsere internen Anwendungen Wir haben keine anpassbare Login- Seite für unsere internen Anwendungen Unsere IT- Mitarbeiter müssen ständig Anmeldeseiten für neue Anwendungen erstellen Unsere IT- Mitarbeiter müssen ständig Anmeldeseiten für neue Anwendungen erstellen Warum? Warum? Zuständigkeiten und Budget- zuweisung für Themen der Rechteverwaltung sind unklar Zuständigkeiten und Budget- zuweisung für Themen der Rechteverwaltung sind unklar Was noch? ... ... Lösungsraum Problemraum Für welche Lösung ist das das Problem? Warum (ist das ein Problem)?

Slide 75

Slide 75 text

„Problem… 75 Bei Rekordaus- schüttungen informieren wir unsere Kunden, dass sie bitte früher unser System nutzen sollen. Online- Lottoanbieter Entwicklung WT$? Bessere Werbe- möglichkeiten! Vor großen Anstürmen können wir alle unsere Kunden anschreiben und damit noch einmal Werbung für unser Angebot machen! …oder Chance?“

Slide 76

Slide 76 text

„Problem… 76 Die Umsetzung einer Kundenanforderung im System dauert bei uns immer sehr lange. Schlechte Wartbarkeit! ! Softwarehaus …oder Chance?“ Wir haben Time & Material- Wartungsverträge mit Kunden geschlossen, die uns die Zeit für die Umsetzung bezahlen! Bezahlter Wartungsvertrag Entwicklung WT$?

Slide 77

Slide 77 text

„Problem… 77 Unsere Kunden sind sehr stark in unser angebotenes Services- Ökosystem integriert. Software-as- Service-Anbieter …oder Chance?“ Durch einen Vendor- Lock-In binden wir Kunden langfristig an unsere Plattform! Entwicklung WT$?

Slide 78

Slide 78 text

78 Wenn Sie ein Ziel haben, und Sie sind auf dem Weg Ihr Ziel zu erreichen, dann haben Sie kein Problem! Wenn Sie ein Ziel haben, und Sie sind nicht auf dem Weg Ihr Ziel zu erreichen, dann haben Sie ein Problem! [..] Ohne Ziel ist es nämlich verdam- mt schwer zu erkennen, ob man auf dem richtigen Weg ist.“ Georg Jocham Zitat aus https://georgjocham.com/apl006-wir-haben-ein-problem-haben-wir-wirklich-ein-problem/ Bild aus https://www.youtube.com/watch?v=q7JKlHJqDY4 “ ? ? ?

Slide 79

Slide 79 text

79 Vielen Dank

Slide 80

Slide 80 text

Zusammenfassung Knifflige Probleme in Softwaresystemen lösen 80

Slide 81

Slide 81 text

Wiederholung: Sieben Themen 81 Problem lösen frei nach Prof. Walter Schönwandts „Key Seven“ 1. Was sind die Probleme? 2. Problem(rück|vor)verschiebung 3. Problemverständnis 4. ProblemursachEN 5. Passende Maßnahmen finden 6. Denkfehler beachten 7. Richtiges Problem? Unge ähres Verhältnis der Zeitdauer der Themen

Slide 82

Slide 82 text

Kudos 82 Dieser Talk baute vor allem auf die Ideen von Prof. Walter Schönwandt et.al. auf* Podcast-Folge von Georg Jocham Abenteuer Probleme lösen, Folge 021: So löst man komplexe Probleme, im Gespräch mit Prof. Walter Schönwandt https://georgjocham.com/apl-020-so-loest-man- komplexe-probleme-im-gespraech-mit-prof-dr- walter-schoenwandt/ game changer Frei verfügbar unter https://scg.unibe.ch/ download/oorp/ usual suspects * es gibt aber genügend Berichte über meine Praxiserfahrungen damit!

Slide 83

Slide 83 text

83 Fragen + Antworten

Slide 84

Slide 84 text

84 Vielen Dank

Slide 85

Slide 85 text

Bis gleich beim INNOQ-Stand? 85

Slide 86

Slide 86 text

KLIENTEN Finance ● Telko ● Logistik ● E-Commerce ● Fortune 500 ● KMUs ● Startups FAKTEN ~160 Mitarbeitende 1998 gegründet 9 Standorte in D & CH UNSER ANGEBOT Produktkonzeption & Design Software-Entwicklung & -Architektur Technologie-Beratung Infrastruktur & Betrieb Wissenstransfer, Coaching & Trainings FOKUS Webapplikationen SaaS IoT Produktentwicklung ML/AI Blockchain TECHNOLOGIEN (Auswahl) Java/Spring Ruby/Rails Scala AWS Kubernetes Azure JavaScript Python C# ML/AI Blockchain 86 86