Следвай вдъхновението си! (фестивал "Свободата да бъдеш - април 2016")Svetlin Nakov
"Следвай вдъхновението си!" е необикновен поучителен разказ за търсенето на истинското вдъхновение, за пътя на личностното и духовното израстване, за следването на мечтите, за успеха и неговата цена, за провалите и поуките по пътя, за поетите неправилни посоки и болезнените корекции на съдбата, за несломимия дух и доверието във вътрешната мъдрост, за непрестанното развитие и издигане на следващо ниво, за една безразсъдно смела амбиция довела до революция в ИТ образованието, за намирането на истинската мисия в живота, за автентичното лидерство, за ценностите и убежденията и тяхната еволюция, за вселенските закони и принципа "стъпка по стъпка", за намирането наподходящите за теб учения, вярвания, инструменти и методи, които работят конкретно за теб и те издигат на следващо ниво, за интуитивната преценка на хората, за ученето и усъвършенстването през целия живот, за откриването и следването на истинското призвание в живота, което всеки носи в себе си.
Професиите в ИТ индустрията: програмист, QA, админ, дизайнер, ИТ консултант, бизнес анализатор, специалист по дигитален маркетинг и други и как да придобием тези професии?
Светлин Наков @ УНСС
31 март 2016 г.
Dependency Injection and Inversion Of ControlSimone Busoli
This is a short presentation I gave back in 2008 at the UgiAlt.Net conference in Milan about inversion of control and dependency injection principles. Examples use Castle project's Windsor container.
Следвай вдъхновението си! (фестивал "Свободата да бъдеш - април 2016")Svetlin Nakov
"Следвай вдъхновението си!" е необикновен поучителен разказ за търсенето на истинското вдъхновение, за пътя на личностното и духовното израстване, за следването на мечтите, за успеха и неговата цена, за провалите и поуките по пътя, за поетите неправилни посоки и болезнените корекции на съдбата, за несломимия дух и доверието във вътрешната мъдрост, за непрестанното развитие и издигане на следващо ниво, за една безразсъдно смела амбиция довела до революция в ИТ образованието, за намирането на истинската мисия в живота, за автентичното лидерство, за ценностите и убежденията и тяхната еволюция, за вселенските закони и принципа "стъпка по стъпка", за намирането наподходящите за теб учения, вярвания, инструменти и методи, които работят конкретно за теб и те издигат на следващо ниво, за интуитивната преценка на хората, за ученето и усъвършенстването през целия живот, за откриването и следването на истинското призвание в живота, което всеки носи в себе си.
Професиите в ИТ индустрията: програмист, QA, админ, дизайнер, ИТ консултант, бизнес анализатор, специалист по дигитален маркетинг и други и как да придобием тези професии?
Светлин Наков @ УНСС
31 март 2016 г.
Dependency Injection and Inversion Of ControlSimone Busoli
This is a short presentation I gave back in 2008 at the UgiAlt.Net conference in Milan about inversion of control and dependency injection principles. Examples use Castle project's Windsor container.
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клубSvetlin Nakov
Семинар "Работа с Естествен Интелект – Личност – Време" – 3 юли 2013 @ НЛП клуб – http://nlpclub.devbg.org/2013/06/23/seminar-rabota-s-estestven-intelekt-lichnost-vreme-3-july-2013/
В провокативния стил на сократовата беседа и с богат илюстративен материал ще бъдат представени и дискутирани традиционни, но непопулярни концепции за индивидуалността (или липсата на такава) и персоните, 7-те основни схващания за Времето, 3-те житейски подхода за битовото му потребление и заключителна персонална схема за разпределение. В дискусионен стил ще се представят някои концепции за житейските стратегии и траектории, за мисловните структури, нагласи и капани, за похватите във втория етап на съблазняването и за влиянието на IT заниманията върху изброените теми.
Regular Expressions. Validation. Split. Matching, ...
------------------------------------------------------------
Test RegEx at:
http://www.regexr.com
------------------------------------------------------------
[0-9]+
------------------------------------------------------------
[A-Z][a-z]*
------------------------------------------------------------
\s+
------------------------------------------------------------
\S+
------------------------------------------------------------
\w+
------------------------------------------------------------
\W+
------------------------------------------------------------
\+\d{1,3}([ -]*[0-9]){6,}
+1-800-555-2468
+359 2 834-2334
+359888123456
(052) 343-434
------------------------------------------------------------
^\+\d{1,3}([ -]*[0-9]){6,}$
+359 2 123-456 is a match
+359 (888) 123-456 is a NOT match
------------------------------------------------------------
Simplified Email Extraction Pattern:
/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,20}/gi
------------------------------------------------------------
var emailPattern =
/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,20}$/i;
console.log(emailPattern.test("test@abv.bg"));
console.log(emailPattern.test("a.hills@gtx.de"));
console.log(emailPattern.test("invalid@@mail"));
console.log(emailPattern.test("err test@abv.bg"));
------------------------------------------------------------
var towns = "Sofia, Varna,Pleven, Veliko Tarnovo; Paris – London––Viena\n\n Пловдив|Каспичан";
console.log(towns.split(/\W+/)); // incorrect
console.log(towns.split(/\s*[.,|;\n\t–]+\s*/));
------------------------------------------------------------
var text = "I was born at 14-Jun-1980. Today is 14-Mar-2015. Next year starts at 1-Jan-2016 and ends at 31-Dec-2016.";
var dateRegex = /\d{1,2}-\w{3}-\d{4}/gm;
console.log(text.match(dateRegex));
Cos'è la UI Composition e che problemi può risolvere
Perchè MVVM e WPF sono importanti per la UI Composition
Il concetto di 'region' e 'UI Injection'
Analisi del toolkit PRISM di Microsoft e cosa comporta realizzarsene uno in proprio.
Slide Tesi di laurea:
Separazione dei ruoli tra Designer e Developer nello sviluppo di applicazioni Desktop: uso di WPF e del pattern Model-View-ViewModel
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Svetlin Nakov
Few days ago I gave a talk about software architectures. My goal was to explain as easy as possible the main ideas behind the most popular software architectures like the client-server model, the 3-tier and multi-tier layered models, the idea behind SOA architecture and cloud computing, and few widely used architectural patterns like MVC (Model-View-Controller), MVP (Model-View-Presenter), PAC (Presentation Abstraction Control), MVVM (Model-View-ViewModel). In my talk I explain that MVC, MVP and MVVM are not necessary bound to any particular architectural model like client-server, 3-tier of SOA. MVC, MVP and MVVM are architectural principles applicable when we need to separate the presentation (UI), the data model and the presentation logic.
Additionally I made an overview of the popular architectural principals IoC (Inversion of Control) and DI (Dependency Injection) and give examples how to build your own Inversion of Control (IoC) container.
Design pattern architetturali Model View Controller, MVP e MVVMRiccardo Cardin
This presentation talks about model view controller, model view presenter and model view viewmodel patterns. These are architectural design patterns for implementing user interfaces. They divide a given software application into three interconnected parts, so as to separate internal representations of information from the ways that information is presented to or accepted from the user. Also, they promote separation of concerns. As examples, some frameworks are reported, such as:
- Spring MVC
- BackboneJS
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
This presentation talks about dependecy injection, an architectural design pattern that aims to help developer to resolve dependencies between objects. Starting by describing general problem of dependecy resolution, the presentation continues presenting Inversion of Control (IoC) pattern, constructor injection and setting injection. As examples, some frameworks and libraries are reported, such as:
- Google Guice
- Spring framework
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
A presentation on layered software architecture that goes through logical layering and physical layering, the difference between those two and a practical example.
Molte aziende hanno costruito negli anni sistemi informatici complessi che gestiscono i processi interni e i processi di gestione i clienti/fornitori. Con il cambiamento delle abitudini dei consumatori quello che una volta si faceva intermediato da un agente, commesso o addetto che usava il sistema gestionale per rispondere alla richiesta del cliente ora si fa in modalità self service semplicemente con uno smartphone, il cliente si aspetta di essere autonomo nel rapporto con l’azienda. L’esperienza che ci si aspetta come consumatore è quella che si vive usando piattaforma native digitali come ad esempio Netflix e Spotify. Il problema è che la maggior parte delle aziende non è partita nativamente digitale e non è possibile azzerare tutto e ripartire da capo senza correre rischi di business continuity importanti che vedono milioni di clienti coinvolti e impatti significativi a livello economico in caso di down. Se non è possibile ripartire da zero, quindi come fare? Una risposta è un approccio graduale di evoluzione architetturale e tecnologica dove Kubernetes, e il suo ecosistema, giocano un ruolo chiave. In questa presentazione vedremo i tre principi cardine sulla quale si basa questa strategia: API as a Product; architetture evolutive; fast data con pattern CQRS; che si uniscono per creare una strategia di Modernizzazione delle Applicazioni utilizzando i componenti dell’ecosistema del landscape CNCF (https://landscape.cncf.io). Da qui capiremo quali siano i benefici nel breve, medio e lungo termine e quali passi iniziare a fare per avviare questa strategia.
Creazione di una partizione Linux ospitata da IBM i tramite VPMS.info Srl
Vediamo, passo passo, una demo su VPM (Virtual Position Manager). Grazie a Michele Blandamura, Client Technical Specialist –Power IBM i, per il materiale.
Cloud Computing: è un modo nuovo per fornire e fruire in tempo reale risorse informatiche: reti, server, storage, applicazioni e servizi in modo flessibile.
Come modello di erogazione dei servizi IT, il cloud può aiutare le organizzazioni ad allineare gli investimenti, con la crescita del business.
Il Cloud semplifica l’utilizzo di soluzioni e risorse IT rendendole disponibili come servizi in rete su infrastrutture dinamiche e flessibili e ne migliora l’efficienza.
Offrendo tecnologia come servizio, si danno agli utenti solo le risorse necessarie per la specifica attività, evitando di spendere per risorse che non sono effettivamente utilizzate.
Работа с Естествен Интелект – Личност – Време – 3 юли 2013 @ НЛП клубSvetlin Nakov
Семинар "Работа с Естествен Интелект – Личност – Време" – 3 юли 2013 @ НЛП клуб – http://nlpclub.devbg.org/2013/06/23/seminar-rabota-s-estestven-intelekt-lichnost-vreme-3-july-2013/
В провокативния стил на сократовата беседа и с богат илюстративен материал ще бъдат представени и дискутирани традиционни, но непопулярни концепции за индивидуалността (или липсата на такава) и персоните, 7-те основни схващания за Времето, 3-те житейски подхода за битовото му потребление и заключителна персонална схема за разпределение. В дискусионен стил ще се представят някои концепции за житейските стратегии и траектории, за мисловните структури, нагласи и капани, за похватите във втория етап на съблазняването и за влиянието на IT заниманията върху изброените теми.
Regular Expressions. Validation. Split. Matching, ...
------------------------------------------------------------
Test RegEx at:
http://www.regexr.com
------------------------------------------------------------
[0-9]+
------------------------------------------------------------
[A-Z][a-z]*
------------------------------------------------------------
\s+
------------------------------------------------------------
\S+
------------------------------------------------------------
\w+
------------------------------------------------------------
\W+
------------------------------------------------------------
\+\d{1,3}([ -]*[0-9]){6,}
+1-800-555-2468
+359 2 834-2334
+359888123456
(052) 343-434
------------------------------------------------------------
^\+\d{1,3}([ -]*[0-9]){6,}$
+359 2 123-456 is a match
+359 (888) 123-456 is a NOT match
------------------------------------------------------------
Simplified Email Extraction Pattern:
/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,20}/gi
------------------------------------------------------------
var emailPattern =
/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,20}$/i;
console.log(emailPattern.test("test@abv.bg"));
console.log(emailPattern.test("a.hills@gtx.de"));
console.log(emailPattern.test("invalid@@mail"));
console.log(emailPattern.test("err test@abv.bg"));
------------------------------------------------------------
var towns = "Sofia, Varna,Pleven, Veliko Tarnovo; Paris – London––Viena\n\n Пловдив|Каспичан";
console.log(towns.split(/\W+/)); // incorrect
console.log(towns.split(/\s*[.,|;\n\t–]+\s*/));
------------------------------------------------------------
var text = "I was born at 14-Jun-1980. Today is 14-Mar-2015. Next year starts at 1-Jan-2016 and ends at 31-Dec-2016.";
var dateRegex = /\d{1,2}-\w{3}-\d{4}/gm;
console.log(text.match(dateRegex));
Cos'è la UI Composition e che problemi può risolvere
Perchè MVVM e WPF sono importanti per la UI Composition
Il concetto di 'region' e 'UI Injection'
Analisi del toolkit PRISM di Microsoft e cosa comporta realizzarsene uno in proprio.
Slide Tesi di laurea:
Separazione dei ruoli tra Designer e Developer nello sviluppo di applicazioni Desktop: uso di WPF e del pattern Model-View-ViewModel
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Svetlin Nakov
Few days ago I gave a talk about software architectures. My goal was to explain as easy as possible the main ideas behind the most popular software architectures like the client-server model, the 3-tier and multi-tier layered models, the idea behind SOA architecture and cloud computing, and few widely used architectural patterns like MVC (Model-View-Controller), MVP (Model-View-Presenter), PAC (Presentation Abstraction Control), MVVM (Model-View-ViewModel). In my talk I explain that MVC, MVP and MVVM are not necessary bound to any particular architectural model like client-server, 3-tier of SOA. MVC, MVP and MVVM are architectural principles applicable when we need to separate the presentation (UI), the data model and the presentation logic.
Additionally I made an overview of the popular architectural principals IoC (Inversion of Control) and DI (Dependency Injection) and give examples how to build your own Inversion of Control (IoC) container.
Design pattern architetturali Model View Controller, MVP e MVVMRiccardo Cardin
This presentation talks about model view controller, model view presenter and model view viewmodel patterns. These are architectural design patterns for implementing user interfaces. They divide a given software application into three interconnected parts, so as to separate internal representations of information from the ways that information is presented to or accepted from the user. Also, they promote separation of concerns. As examples, some frameworks are reported, such as:
- Spring MVC
- BackboneJS
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
This presentation talks about dependecy injection, an architectural design pattern that aims to help developer to resolve dependencies between objects. Starting by describing general problem of dependecy resolution, the presentation continues presenting Inversion of Control (IoC) pattern, constructor injection and setting injection. As examples, some frameworks and libraries are reported, such as:
- Google Guice
- Spring framework
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
A presentation on layered software architecture that goes through logical layering and physical layering, the difference between those two and a practical example.
Molte aziende hanno costruito negli anni sistemi informatici complessi che gestiscono i processi interni e i processi di gestione i clienti/fornitori. Con il cambiamento delle abitudini dei consumatori quello che una volta si faceva intermediato da un agente, commesso o addetto che usava il sistema gestionale per rispondere alla richiesta del cliente ora si fa in modalità self service semplicemente con uno smartphone, il cliente si aspetta di essere autonomo nel rapporto con l’azienda. L’esperienza che ci si aspetta come consumatore è quella che si vive usando piattaforma native digitali come ad esempio Netflix e Spotify. Il problema è che la maggior parte delle aziende non è partita nativamente digitale e non è possibile azzerare tutto e ripartire da capo senza correre rischi di business continuity importanti che vedono milioni di clienti coinvolti e impatti significativi a livello economico in caso di down. Se non è possibile ripartire da zero, quindi come fare? Una risposta è un approccio graduale di evoluzione architetturale e tecnologica dove Kubernetes, e il suo ecosistema, giocano un ruolo chiave. In questa presentazione vedremo i tre principi cardine sulla quale si basa questa strategia: API as a Product; architetture evolutive; fast data con pattern CQRS; che si uniscono per creare una strategia di Modernizzazione delle Applicazioni utilizzando i componenti dell’ecosistema del landscape CNCF (https://landscape.cncf.io). Da qui capiremo quali siano i benefici nel breve, medio e lungo termine e quali passi iniziare a fare per avviare questa strategia.
Creazione di una partizione Linux ospitata da IBM i tramite VPMS.info Srl
Vediamo, passo passo, una demo su VPM (Virtual Position Manager). Grazie a Michele Blandamura, Client Technical Specialist –Power IBM i, per il materiale.
Cloud Computing: è un modo nuovo per fornire e fruire in tempo reale risorse informatiche: reti, server, storage, applicazioni e servizi in modo flessibile.
Come modello di erogazione dei servizi IT, il cloud può aiutare le organizzazioni ad allineare gli investimenti, con la crescita del business.
Il Cloud semplifica l’utilizzo di soluzioni e risorse IT rendendole disponibili come servizi in rete su infrastrutture dinamiche e flessibili e ne migliora l’efficienza.
Offrendo tecnologia come servizio, si danno agli utenti solo le risorse necessarie per la specifica attività, evitando di spendere per risorse che non sono effettivamente utilizzate.
Strumenti per il deploy e l'esecuzione di Smart Contract sulla Blockchain Ethereum. Interazione fra Blockchain e Intelligenza Artificiale a livello strutturale e applicativo.
Il web service e i sistemi embedded - Tesi - cap2pma77
Nel capitolo secondo capitolo della tesi " SVILUPPO E IMPLEMENTAZIONE SU MICROCONTROLLORE DI UN’APPLICAZIONE WEB SERVER PER IL CONTROLLO DI UN SISTEMA EMBEDDED"sono presentati diversi prodotti commerciali impieganti Web Service , in modo particolare dispositivi di tipo embedded. Viene discusso, inoltre, su come le tecnologie Web entrino nel mondo industriale e della domotica e si pone l’attenzione sui fattori che impediscono il pieno sviluppo in questi ambiti. Infine vengono proposti diversi articoli che affrontano tematiche simili a quelle della tesi.
Welcome to the (state) machine @ ExploreDDD 2019Mauro Servienti
Stateless all the thing, they say. In the last few years we’ve been brainwashed: design stateless systems, otherwise they cannot scale, they cannot be highly available, and they are hard to maintain and evolve. In a nutshell stateful is bad. However complex software systems need to do collaborative processing, that is stateful by definition. Stateless myth busted! Collaborative domains deal with long running business transactions and need to interact with distributed resources. The traditional distributed transactions approach, even if tempting, is a time bomb.
This is when Sagas come into play. Sagas allow to model complex collaborative domains without the need for distributed transactions and/or orchestration across multiple resources. Join Mauro on a journey that aims to disclose what sagas are, how they can be used to model a complex collaborative domain, and what role they play when it comes to designing systems with failure and eventual consistency in mind.
(It’s all right, I know where you’ve been)
Designing a ui for microservices @ .NET Day Switzerland 2019Mauro Servienti
How do we design a UI when the back-end system consists of dozens (or more) microservices? We have separation and autonomy on the back end, but on the front end this all needs to come back together. How do we stop it from turning into a mess of spaghetti code? How do we prevent simple actions from causing an inefficient torrent of web requests? Join Mauro in building a Composite UI for Microservices from scratch, using .NET Core. Walk away with a clear understanding of what Services UI Composition is and how you can architect front end to be Microservices ready.
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsMauro Servienti
Ultimamente ci hanno stressato come non mai che stateful è il male. Tutto deve essere stateless, altrimenti non scala, non può essere altamente disponibile, ed è complesso da manutenere ed evolvere. Nonostante questo i sistemi software complessi, essendo basati su processi collaborativi, sono per natura stateful. I processi collaborativi, noti anche come long running business transactions, necessitano di interagiscono con risorse distribuite. L’approccio tradizionale basato su transazioni distribuite, anche se allettante, è una bomba pronta ad esplodere.
Pane quotidiano per le Saghe. Le Saghe consentono di modellare sistemi complessi senza la necessità di transazioni distribuite e coordinamento esterno. Vedremo cosa sono le Saghe, come possono essere usate per modellare domini complessi, e che ruolo giocano quando progettiamo sistemi basati sui concetti di “design for failures” e “eventual consistency”
(It’s all right, I know where you’ve been)
All our aggregates are wrong @ NDC Copenhagen 2019Mauro Servienti
It always starts well. At first glance the requirements seem straightforward, and implementation proceeds without hiccups. Then the requirements start to get more complex, and you find yourself in a predicament, introducing technical shortcuts that smell for the sake of delivering the new feature on schedule.
In this talk, we’ll analyze what appears to be a straightforward e-commerce shopping cart. We’ll then go ahead and add a few more use-cases that make it more complex and see how it can negatively impact the overall design. Finally, we’ll focus our attention to the business needs of these requirements and see how it can shed light on the correct approach to designing the feature. Walk away with a new understanding on how to take requirements apart to build the right software.
Be like water, my friend @ Agile for Innovation 2019Mauro Servienti
L’acqua è quasi inarrestabile, basta un pertugio e si propaga. Basta un po’ di pressione e con facilità il pertugio diventa una voragine e lascia spazio ad una piena. La conoscenza e l’esperienza in un team possono essere come l’acqua. Il sapere deve poter scorrere senza freni, con solo degli argini che lo guidino al fine di evitare un’inondazione.
È possibile strutturare un’organizzazione al fine di garantire la diffusione del sapere? Quali sono i processi e gli strumenti che possiamo mettere in campo per essere certi che conoscenza ed esperienza siano diffuse, ma anche che non vi sia un’inondazione?
Lasciatevi trasportare da Mauro nei meandri di Particular Software, per scoprire come una realtà “dispersa” su 17 time zone gestisce collaborazione e condivisione del sapere. Analizzeremo sia i processi, che ci siamo creati, che gli strumenti digitali che usiamo quotidianamente.
Microservices architecture is it the right choice to design long-living syste...Mauro Servienti
Microservices all the thing! they say. Nowadays it seems that if architectures are not microservices based they are not worth the name. Is it really true? Do we really need a (micro)services based architecture?
We should design our systems with longevity, manutenability, and evolution simplicity in mind. Not hype. Long living systems are our primary goal. We'll analyze most common errors and we'll see how architecture can be a game changer in systems design.
Join Mauro in a journey that aims to disclose what it means to build a distributed system based on a (micro)services oriented architecture.
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Mauro Servienti
Sei uno studente che deve presentare una tesi? Un manager che deve presentare un report ai colleghi? Un esperto che deve presentare i risultati di uno studio ad una conferenza? O semplicemente avresti voglia di parlare al mondo di ciò che ti appassiona ma non sai da dove cominciare?
Living organizations, particular software @ do IT Better ParmaMauro Servienti
Siamo così abituati ad organizzazioni basate sul tradizionale organigramma che diamo per scontato che sia l'unica opzione.
Un approccio differente è possibile?
Quando sono entrato in Particular, era un'organizzazione tradizionale, sebbene distribuita. Avevamo manager e una gerarchia. Un anno dopo la decisione di rivoluzionare tutto. La miglior decisione di sempre. Intraprenderemo un viaggio che ci permetterà di scoprire che un modello organizzativo diverso è possibile, che un processo decisionale dall'alto verso il basso non è l'unica opzione e che possiamo organizzare la vita lavorativa intorno a quella privata in funzione di un ottimo life-work balance.
Welcome to the (state) machine @ Crafted SoftwareMauro Servienti
Stateless all the thing, they say. In the last few years we’ve been brainwashed: design stateless systems, otherwise they cannot scale, they cannot be highly available, and they are hard to maintain and evolve. In a nutshell stateful is bad. However complex software systems need to do collaborative processing, that is stateful by definition. Stateless myth busted! Collaborative domains deal with long business transactions and need to interact with distributed resources. The traditional distributed transactions approach, even if tempting, is a time bomb. This is when Sagas come into play. Sagas allow to model complex collaborative domains without the need for distributed transactions and/or orchestration across multiple resources. Join Mauro on a journey that aims to disclose what sagas are, how they can be used to model a complex collaborative domain, and what role they play when it comes to designing systems with failure and eventual consistency in mind. (It’s all right, I know we’re you’ve been)
PO is dead, long live the PO - Italian Agile Day 2018Mauro Servienti
Cosa succederebbe se i prodotti non fossero gestiti dai manager? O addirittura, cosa se i manager non ci fossero proprio? Chi si prenderebbe la responsabilità di definire la priorità nel backlog? In Particular Software non c’è una struttura gerarchica. La gestione dei prodotti, intesa come vera e propria product ownership, è responsabilità di tutti. Sembra quasi che gli internati siano anche i gestori del manicomio. Non è proprio distante dalla realtà. Oggigiorno sempre più aziende si stanno orientando verso strutture organizzative fluide. Che cosa si può fare per abilitare chiunque a prendere decisioni a qualsiasi livello? C’è un modo per condividere il processo decisionale? Guarderemo come è strutturata Particular Software al fine di abilitare tutto ciò. Analizzeremo come vengono risolti i problemi e quali processi e strumenti utilizziamo per prendere decisioni. Tutto senza infermieri, ooops, senza manager.
Design a UI for your Microservices @ Do IT BetterMauro Servienti
How do we design a UI when the back-end system consists of dozens (or more) microservices? We have separation and autonomy on the back end, but on the front end this all needs to come back together. How do we stop it from turning into a mess of spaghetti code? How do we prevent simple actions from causing an inefficient torrent of web requests? Join Mauro in building a Composite UI for Microservices from scratch, using .NET Core. Walk away with a clear understanding of what Services UI Composition is and how you can architect front end to be Microservices ready.
Microservices and pineapple on pizza what do they have in common - dos and ...Mauro Servienti
Microservices è una delle buzzword del momento. Sembra quasi che un'architettura a microservices sia fondamentale. È veramente così? Faremo un tortuoso viaggio tra le buzzword del momento cercando di districarci tra cosa è bene e cosa è meno bene, ma soprattutto perché. Obiettivo è quello di comprendere quali sono i limiti di certe scelte architetturali e quali gli errori da non commettere. Il tutto nell'ottica di garantire ai nostri sistemi 'lunga vita e prosperità' (cit.)
All our aggregates are wrong (ExploreDDD 2018)Mauro Servienti
It always starts well. At first glance the requirements seem straightforward, and implementation proceeds without hiccups. Then the requirements start to get more complex, and you find yourself in a predicament, introducing technical shortcuts that smell for the sake of delivering the new feature on schedule. In this talk, we'll analyze what appears to be a straightforward e-commerce shopping cart. We'll then go ahead and add a few more use-cases that make it more complex and see how it can negatively impact the overall design. Finally, we'll focus our attention to the business needs of these requirements and see how it can shed light on the correct approach to designing the feature. Walk away with a new understanding on how to take requirements apart to build the right software.
How do we design a UI when the back-end system consists of dozens (or more) microservices? We have separation and autonomy on the back end, but on the front end this all needs to come back together. How do we stop it from turning into a mess of spaghetti code? How do we prevent simple actions from causing an inefficient torrent of web requests? Join Mauro in building a Composite UI for Microservices from scratch, using .NET Core. Walk away with a clear understanding of what Services UI Composition is and how you can architect front end to be Microservices ready.
Cosa succederebbe se i prodotti non fossero gestiti dai manager? O addirittura, cosa se i manager non ci fossero proprio? Chi si prenderebbe la responsabilità di definire la priorità nel backlog? In Particular Software non c’è una struttura gerarchica. La gestione dei prodotti, intesa come vera e propria product ownership, è responsabilità di tutti. Sembra quasi che gli internati siano anche i gestori del manicomio. Non è proprio distante dalla realtà. Oggigiorno sempre più aziende si stanno orientando verso strutture organizzative fluide. Che cosa si può fare per abilitare chiunque a prendere decisioni a qualsiasi livello? C’è un modo per condividere il processo decisionale? Guarderemo come è strutturata Particular Software al fine di abilitare tutto ciò. Analizzeremo come vengono risolti i problemi e quali processi e strumenti utilizziamo per prendere decisioni. Tutto senza infermieri, ooops, senza manager.
GraphQL - Where are you from? Where are you going?Mauro Servienti
GraphQL, inventato da Facebook per risolvere un problema molto specifico, è diventato uno standard. Le applicazioni client lo utilizzano per leggere e manipolare i dati esposti dai server back-end. È così flessibile che recentemente GitHub l'ha adottata per tutte le sue API. Il paradigma è semplice e tuttavia potente tale da consentire la manipolazione flessibile e la loro composizione da molte fonti diverse. Mauro offre in questo intervento un'introduzione a GraphQL, partendo da una breve storia e poi analizzando come GraphQL risolva i tipici problemi in cui i progettisti API e i loro consumer si possono imbattere.
Dall'idea al deploy un lungo viaggio che passa per git flow e semverMauro Servienti
Parliamo tanto di DevOps e ci concentriamo sui tool senza soffermarci a pensare che DevOps è principalmente una metodologia. Lo scopo è rendere l'intera filiera il più fluida e lineare possibile, rimuovendo impedimenti e cercando di prevenire e anticipare problemi.
Possiamo costruire tutto il processo di sviluppo, partendo dai vagiti iniziali del backlog per finire che il deploy fisico in ottica DevOps? Il processo ha impatto sulle scelte tecniche? Pratiche come SemVer e GitFlow hanno invece un impatto sul backlog?
Analizzeremo l'intero processo di sviluppo di Particular Software, dalla gestione del backlog al deploy automatico in produzione, con lo scopo di evidenziare come pratiche che sembrano disconnesse abbiano invece impatto su tutta la filiera.
Come possiamo progettare una UI quando il back-end è composto da decine (se non di più) di Microservices? Abbiamo la giusta separazione e autonomia lato back-end, ma tutto alla fine deve tornare insieme lato front-end. Come evitiamo che si trasformi nel solito caos di spaghetti code? Come evitiamo che operazioni semplici si trasformino in un tornado di web request? Durante questa sessione costruiremo un esempio di UI per Microservices, usando .NET Core, in modo da capire a fondo cosa sia la Services UI Composition e come progettare e implementare con successo una UI per i nostri Microservices.
The road to a Service Oriented Architecture is paved with messagesMauro Servienti
One of the options on the table when implementing a Service Oriented Architecture (SOA), or the communication style across multiple microservices, is based on messages and a service bus. This talk will drive you through the basic SOA building blocks, introduce message based architectures, and will connect the dots between technology and architectural principles through some samples using NServiceBus.
2. Who I am...
Mauro Servienti
blog: http://blogs.ugidotnet.org/topics
email: mauro@topics.it
web: https://mvp.support.microsoft.com/profile/mauro
community: www.xedotnet.org, www.ugidotnet.org
14/03/2008 www.xedotnet.org 2
3. Upcoming Events
Community Meeting
In collaborazione con:
14/03/2008 www.xedotnet.org 3
4. Perchè abbiamo bisogno di realizzare applicazioni estensibili.
Estensibilità... who cares?
5. Perchè?
» Supporto per l’integrazione e l’interoperabilità;
» Consente di modificare a caldo il
comportamento;
» È un’ottimo “strumento” commerciale;
14/03/2008 www.xedotnet.org 5
6. Scrivere in ottica estensibilità
» Pensare agli entry point;
» Prevedere quali dati potranno essere necessari;
» Incapsulare i dati in classi adatte al loro
trasporto:
• EventArgs;
• CancelEventArgs;
• CustomEventArgs : CancelEventArgs/EventArgs
» Le “pipeline”, un esempio da seguire:
• HttpModule + HttpHanlder;
14/03/2008 www.xedotnet.org 6
8. il problema: le dipendenze statiche
Componente Componente
ComA ComB
14/03/2008 www.xedotnet.org 8
9. Il cammino verso la soluzione...
Componente Interfaccia
ComA IComB
Componente
ComB
14/03/2008 www.xedotnet.org 9
10. Inversion of Control
Interfaccia
Componente
ServiceProvider IComB
ComA (IoC Container)
Componente IoC
ComB Config
14/03/2008 www.xedotnet.org 10
11. Inversion of Control
» Elevato supporto per la manutenzione
» Sostituzione dei componenti a caldo
» Supporto esteso per l’estensibilità:
• Intercepting;
• Dependency Injection
• Chain of Responsability
» Ma... IoC si basa sul contratto;
» Nonostante tutto adoro IoC!
14/03/2008 www.xedotnet.org 11
12. Non avrai altro contratto all’infuori di me.
Un contratto è per sempre
13. Problema: le dipendenze
» Entrambe le parti dipendono in maniera statica
dal contratto;
Host Contract AddIn
Dipendenza Statica
14/03/2008 www.xedotnet.org 13
14. Problema: il versioning del contratto
» Un contratto in quanto tale non dovrebbe
cambiare nel tempo;
» Sappiamo che nella vita reale questo non è
sempre vero:
• Analisi iniziale sbagliata;
• Condizioni che cambiano;
• Introduzione di nuove funzionalità che non potevano
essere previste;
• Nuova versione dell’applicazione che vuole
soddisfare nuovi requisiti;
• Etc...
14/03/2008 www.xedotnet.org 14
15. Adesso che siamo inseparabili possiamo vivere felici?
Finchè morte non ci separi
16. Il versioning non è l’unico dei problemi
» Il processo di Discovery;
» L’attivazione degli AddIn;
• Le dipendenze, da library di terze parti, sia dell’Host
che dell’AddIn: the AssemblyResolve problem;
» L’isolamento del codice altrui: Sandboxing;
• La gestione della security;
• Gestione degli errori nell’AddIn:
• Il fx 2.0 ha cambiato il comportamento in caso eccezione
non gestita;
» La gestione del ciclo di vita: Unloading;
14/03/2008 www.xedotnet.org 16
17. Ma non solo...
» Compatibilità all’indietro:
• Nuovi Host che hanno bisogno di caricare vecchi AddIn;
» Compatibilità in avanti:
• Vecchi Host che hanno bisogno di funzionalità fornite da
nuovi AddIn;
» La necessità di introdurre nuovi livelli di isolamento:
• In Process;
• Different AppDomain;
• Out of Process;
14/03/2008 www.xedotnet.org 17
24. La vista sul contratto
» Host View:
public interface IMyContractView
{
void Execute();
}
» AddIn View:
[AddInBase]
public interface IMyContractView
{
void Execute();
}
» Le View possono essere “SharedViews”;
14/03/2008 www.xedotnet.org 24
25. Gli adattatori: AddIn Side
[AddInAdapter]
public class MyAddInSideAdapter: ContractBase, IMyContract
{
IMyContractView _contract;
public MyAddInSideAdapter( IMyContractView contract )
{
_contract = contract;
}
public void Execute()
{
_contract.Execute();
}
}
14/03/2008 www.xedotnet.org 25
26. Gli adattatori: Host Side
[HostAdapter]
public class MyHostSideAdapter : IMyContractView
{
IMyContract _contract;
ContractHandle _handle;
public MyHostSideAdapter( IMyContract contract )
{
_contract = contract;
_handle = new ContractHandle(contract);
}
public void Execute()
{
_contract.Execute();
}
}
14/03/2008 www.xedotnet.org 26
27. “ContractHandle”
» Dato che l’architettura permette agli AddIn di
comunicare attraverso i confini di un AppDomain (o
addirittura di un processo) non possiamo fare
affidamento sul GC per la gestione della memoria.
» Questa classe ci offre un sistema di “reference
counting” COM Like:
• Quando viene costruito un ContractHandle nel
costruttore viene chiamato AcquireLifetimeToken().
• Quando il ContractHandle viene “disposto” viene
chiamato RevokeLifetimeToken().
14/03/2008 www.xedotnet.org 27
31. P.S. Diario di Bordo
» “Folder Naming”: quello è e quello deve essere,
siamo in V1...;
» L’AddIn può intercettare il suo shutdown:
• Evento custom esposto dall’host;
• Distruttore: C# Finalizer
• AppDomain.UnloadDomain
• Attenzione alla CAS:
PermissionSet permSet = new PermissionSet(
PermissionState.None );
permSet.AddPermission(
new SecurityPermission(
SecurityPermissionFlag.ControlAppDomain |
SecurityPermissionFlag.Execution ) );
14/03/2008 www.xedotnet.org 31
32. P.S. Extreme Sandboxing
» È possibile attivare gli AddIn in un processo
separato:
• Fornisce massimo supporto per il sandboxing
• Isola il processo host dalle eventuali exception non
gestite dall’AddIn:
• Il CLR del fx 2.0 introduce un radicale cambiamento;
• È possibile, ma non consigliabile, cambiare questo
comportamento (via app.config):
• configurationruntimelegacyUnhandledExceptionPolicy
enabled="1“
» Se usate un processo separato eseguite l’attach
anche di quello per poter debuggare;
14/03/2008 www.xedotnet.org 32
34. Recap: a che punto siamo...
» Ogni AddIn vive, su disco, nella sua cartella:
• Con le sue dipendenze;
• Senza generare conflitti di versione con gli altri AddIn;
• Con Il proprio faile di configurazione.
» L’host può intercettare gli errori in un AddIn,
scaricarlo ed eventualmente ricaricarlo senza che
questo impatti sull’host e sugli altri AddIn;
• A patto che non giri in un processo separato;
» Gli AddIn possono essere isolati (Sandboxing)
fornendo un particolare contesto di security;
» Gli AddIn possono essere scaricati liberando risorse;
35. Tutto bello ma... quanto codice
» Abbiamo scritto troppo plumbing code per
ottenere il risultato desiderato:
• Pipeline Builder Tool:
• Genera tutto il plumbing code in maniera automatica;
• Pipeline Hint:
• Ci permette di controllare il Pipeline Builder Tool:
• SharedView;
• Commenti;
• Naming degli Assembly generati;
• Fornisce supporto per esporre eventi tra Host e AddIn e
viceversa;
14/03/2008 www.xedotnet.org 35
36. Gestione degli eventi e comunicazione duplex
Demo: Pipeline Builder & Events Handling
38. Il nostro rapporto non è più lo stesso... “cara ti amo” <cit.>
Demo: Versioning
39. Recap: data astrale....
» Cuore della gestione del versioning sono gli
adattatori;
» Tutto può essere soggetto a versioning:
• Contratto degli AddIn;
• Contratto dell’Host;
• Contratto dei “dati”;
» Il Pipeline Builder Tool genera adattatori per
tutto ciò che implementa, nell’assembly del
contratto l’interfaccia, “IContract”;
40. Alcune note
» Passaggio di un tipo complesso attraverso i
confini:
• Abbiamo a che fare con remoting:
• Il tipo deve essere serializzabile?
• Chi è che affettivamente passa i confini?
• Definire sempre un’interfaccia;
• Se dobbiamo passare una collection, nel contratto,
usiamo IListContract<T>:
• La classe statica CollectionAdapters vi offre facilities per la
conversione da e verso IList<T>;
Demo: Creazione "amanuense" Crea la solution vuota Creazione del progetto dei contratti aggiunta del contratto aggiunta delle reference a System.AddIn fagli notare che sono compilati per la 2.0 inheritance da IContract marcatura con l'attributo [System.AddIn.Pipeline.AddInContract()] Aggiunta di un metodo impostazione dell'output della build (..\\output\\contracts\\) Aggiungiamo un progetto per le "Shared" view impostiamo l'output (..\\output\\AddInViews\\) aggiungiamo una interfaccia IMySampleContractView aggiungiamo le reference a System.AddIn marchiamo l'interfaccia con [System.AddIn.Pipeline.AddInBaseAttribute()] Creiamo l'adapter lato addin impostiamo l'output su (..\\output\\AddInSideAdapters\\) Aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view Aggiungiamo una classe per l'adapter: IMySampleContractView_ViewToContract_AddInAdapter marchiamo la classe con l'attributo [System.AddIn.Pipeline.AddInAdapterAttribute()] deriviamo da: : System.AddIn.Pipeline.ContractBase implementiamo l'interfaccia del nostro contratto originale: AddIn.HandMade.Contract.IMySampleContract Aggiungiamo un costruttore che prenda in pasto la "view" (Shared in questo caso) e la salva in un field l'implementazione dell'interfaccia non farà altro che runculare la chiamata sulla view privata Creiamo il progetto per l'addin aggiungiamo la classe per l'addin aggiungiamo le reference a System.AddIn aggiungiamo la reference alle View (Shared) !!!!impostiamo copy local a false marchiamo l'addin con: [System.AddIn.AddIn( "NomeAddIn" )] impostiamo l'output su: ..\\output\\addins\\NomeAddIn\\ implementiamo l'interfaccia della Shared View Creiamo l'adattatore lato host impostiamo l'output su: (..\\output\\HostSideAdapters\\) aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view creiamo la classe per adattare dal contratto alla view: IMySampleContract_ContractToView_HostAdapter marchiamo con [System.AddIn.Pipeline.HostAdapterAttribute()] aggiungiamo un costruttore che prende una reference al contratto e lo adatta alla view implementiamo l'interfaccia della View creiamo l'handle System.AddIn.Pipeline.ContractHandle passandogli una reference al contratto (che è poi il transparent proxy di remoting creiamo il progetto Console per l'host aggiungiamo le reference a System.AddIn aggiungiamo la reference alla sharedview Aggiungiamo un po' di codice: - list di backend IList<IMySampleContractView> addins = new List<IMySampleContractView>(); - ricerca e attivazione String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase ); IList<AddInToken> tokens = AddInStore.FindAddIns( typeof( IMySampleContractView ), PipelineStoreLocation.ApplicationBase ); foreach( AddInToken token in tokens ) { addins.Add( token.Activate<IMySampleContractView>( AddInSecurityLevel.Internet ) ); } - invocazione foreach( IMySampleContractView addin in addins ) { addin.Execute(); } impostazione dell'output: (..\\output\\) impostazione dello startup project breakpoint sull'host e sull'addint F5
Demo: Creazione "amanuense" Crea la solution vuota Creazione del progetto dei contratti aggiunta del contratto aggiunta delle reference a System.AddIn fagli notare che sono compilati per la 2.0 inheritance da IContract marcatura con l'attributo [System.AddIn.Pipeline.AddInContract()] Aggiunta di un metodo impostazione dell'output della build (..\\output\\contracts\\) Aggiungiamo un progetto per le "Shared" view impostiamo l'output (..\\output\\AddInViews\\) aggiungiamo una interfaccia IMySampleContractView aggiungiamo le reference a System.AddIn marchiamo l'interfaccia con [System.AddIn.Pipeline.AddInBaseAttribute()] Creiamo l'adapter lato addin impostiamo l'output su (..\\output\\AddInSideAdapters\\) Aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view Aggiungiamo una classe per l'adapter: IMySampleContractView_ViewToContract_AddInAdapter marchiamo la classe con l'attributo [System.AddIn.Pipeline.AddInAdapterAttribute()] deriviamo da: : System.AddIn.Pipeline.ContractBase implementiamo l'interfaccia del nostro contratto originale: AddIn.HandMade.Contract.IMySampleContract Aggiungiamo un costruttore che prenda in pasto la "view" (Shared in questo caso) e la salva in un field l'implementazione dell'interfaccia non farà altro che runculare la chiamata sulla view privata Creiamo il progetto per l'addin aggiungiamo la classe per l'addin aggiungiamo le reference a System.AddIn aggiungiamo la reference alle View (Shared) !!!!impostiamo copy local a false marchiamo l'addin con: [System.AddIn.AddIn( "NomeAddIn" )] impostiamo l'output su: ..\\output\\addins\\NomeAddIn\\ implementiamo l'interfaccia della Shared View Creiamo l'adattatore lato host impostiamo l'output su: (..\\output\\HostSideAdapters\\) aggiungiamo le reference a System.AddIn Aggiungiamo le reference al contratto e alla view creiamo la classe per adattare dal contratto alla view: IMySampleContract_ContractToView_HostAdapter marchiamo con [System.AddIn.Pipeline.HostAdapterAttribute()] aggiungiamo un costruttore che prende una reference al contratto e lo adatta alla view implementiamo l'interfaccia della View creiamo l'handle System.AddIn.Pipeline.ContractHandle passandogli una reference al contratto (che è poi il transparent proxy di remoting creiamo il progetto Console per l'host aggiungiamo le reference a System.AddIn aggiungiamo la reference alla sharedview Aggiungiamo un po' di codice: - list di backend IList<IMySampleContractView> addins = new List<IMySampleContractView>(); - ricerca e attivazione String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase ); IList<AddInToken> tokens = AddInStore.FindAddIns( typeof( IMySampleContractView ), PipelineStoreLocation.ApplicationBase ); foreach( AddInToken token in tokens ) { addins.Add( token.Activate<IMySampleContractView>( AddInSecurityLevel.Internet ) ); } - invocazione foreach( IMySampleContractView addin in addins ) { addin.Execute(); } impostazione dell'output: (..\\output\\) impostazione dello startup project breakpoint sull'host e sull'addint F5