HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTSSander Hoogendoorn | Principal Technology Officer, Global Agile Thought Leader | Capgeminiwww.sanderhoogendoorn.com | [email protected] | @aahoogendoorn
2 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
SANDER HOOGENDOORN
Capgemini
� Principal technology officer
� Global agile thought leader
� Chief architect Accelerated Delivery Platform (ADP)
Other
� Author books on UML, agile
� Author +200 articles, columns
� Speaker +100 international conferences and seminars
� Microsoft Partner Advisory Council .NET
� Editorial boards & Advisory boards
� Capping IT Off Blog
Web
� www.sanderhoogendoorn.com
� www.ditisagile.nl | www.smartusecase.com
� @aahoogendoorn @ditisagile
3 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
4 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
5 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
6 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
7 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
WATERFALL? BIG-UP FRONT?
Architecture!
8 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
WATERFALL? BIG-UP FRONT?
9 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
THE WATERFALL DENTIST
10 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
BOEHM’S LAW
11 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
12 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGILE. NO UP-FRONT?
Architecture?
13 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
BOEHM’S LAW. PER ITERATION
14 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGILE. SOME UP-FRONT
Just enougharchitecting!
Frameworks?
It always takes longer than you expect, even when you take into account Hofstadter’s Law
HOFSTADTER’S LAW
16 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MYFIRSTSURVEY
Frameworks, like pizzas, come in only two sizes: too big and too small.
LIFE IS NEVER EASY …
18 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MYFIRSTSURVEY
19 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
WHAT’S IT GONNA BE PUNK?General purpose frameworks
Enterprise Library, Spring.Net, Castle, NakedObjects, Accelerated Delivery Framework (ADF), SubSonic
Single goaled frameworks – verticals
Dependency injection: ObjectBuilder, Unity, Castle Windsor
Logging: Log4Net, Logging Block, Common.Logging
Exception handling: Exception Handling Block
Apect orientation: PostSharp, SetPoint
Search: Lucene.net, NLucene
Portals: DotNetNukeSpatial, Umbraco
Single goaled frameworks – architectural
User interface: Silverlight, ASP.NET MVC, WPF, ASP.NET Ajax, Spring MVC
Process: UI Process Application Block, WF
Domain: Entity Framework, Hibernate, NEO
Data: Entity Framework, Hibernate, Castle ActiveRecord, CSLA
Service s: WCF, WCF RIA
20 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
FRAMEWORKS - CODEPLEX
21 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
FRAMEWORKS – WWW.CSHARPOPENSOURCE.COM
22 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
FRAMEWORKS – MICROSOFT ENTERPRISE LIBRARY
23 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
FRAMEWORKS – PROJECT CASTLE
24 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DON’T BELIEVE THE HYPE – IT’S A SQL
25 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CONVINCING THE MANAGEMENT TO APPLY THE FRAMEWORK (25.5 %)
26 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
UNDERSTANDING THE FRAMEWORK (56.4 %)
27 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CONVINCING OTHER DEVELOPERS TO USE THE FRAMEWORK (23.6 %)
28 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CONVINCING OTHER DEVELOPERS TO USE THE FRAMEWORK (23.6 %)
29 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
TRAINING THE DEVELOPERS (20 %)
30 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
THE EYE OF THE TIGER
31 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
My software never has bugs. It just develops random features
APPLYING FRAMEWORKS
33 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGILE. SOME UP-FRONT
Just enougharchitecting!
Frameworks? Just enoughre-architecting
34 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
SO GLAD YOU MADE IT!
What if we requireadditional features thataren’t covered by our
framework?
What if we decide thatanother framework mightbe better than the onewe’re using now?
What if the author of ourfavorite framework suddenly
stops developing it?
What if the framework contains bugs?
And what if the new versionof our framework is implemented totally
different?
35 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MORE THAN ANYTHING, DEPENDENCIES WILL KILL YOUR PROJECT
A short story about framework developers and application developers
KENTUCKY FRIED ARCHITECTURE
37 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
PIGS & CHICKENS
The applicationdeveloper
The frameworkdeveloper
38 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
KFC ARCHITECTURE – ENTITY FRAMEWORK
39 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
KFC ARCHITECTURE – ENTITY FRAMEWORK
40 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
KFC ARCHITECTURE – ENTITY FRAMEWORK
I don’t care if it works on your machine! We are not shipping your machine!
LETTING THE LUNATICS RUN THE ASYLUM
Here’sHere’sHere’sHere’s … … … … betabetabetabeta!!!!
42 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
HOT OR NOT?
Hot? From hot to not? Not?
Metro
HTML5
LightSwitch
WCF RIA Services
Silverlight 4.0?
ASP.NET MVC 3
MEF
jQuery
NService Bus
Entity Framework - Code First
Expression Blend
ASP.NET Ajax
REST
Unity
BizTalk
Surface
Duet
SketchFlow
Azure Services
ADO.NET Data Services
ASP.NET Dynamic Data
WPF
Entity Framework 2.0
LINQ2SQL
LINQ2Entities
Entity Data Model
Dublin
DSL’s
Silverlight 2.0
F#
ASP.NET
PopFly
M
Oslo
MGrammar
43 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
BE A F***ING GENIUS
Metro?
WTF? I just figured out ASP.NET MVC
44 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
HERE’S JOHNNY! – ASP.NET MVC
45 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
HERE’S JOHNNY! – ASP.NET MVC
It’s only in theory that practice and theory are the same
NO STRINGS ATTACHED
47 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MYFIRSTSURVEY
48 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CHANGING BASE CLASSES – – NHIBERNATE / LOG4NET
49 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CHANGING BASE CLASSES – NHIBERNATE / LOG4NET
Programming is like sex. One mistake and you have to support it for the rest of your life
YES, YOUR FRAMEWORKS VERSION TOO
51 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
IT AIN’T OVER TILL IT’S OVER
52 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MISSING BASE CLASSES – WORKFLOW FOUNDATION 4.0
53 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MISSING BASE CLASSES – WORKFLOW FOUNDATION 4.0
54 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
Architecture starts when you carefully put two bricks together. There it begins.
SOUND ARCHITECTURE
(SOFTWARE.ARCHITECTURE != LIST<FRAMEWORK>)
57 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
A SOFTWARE ARCHITECTURE
58 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
Presentation
Process
Domain
Data / Services
Outside world
PagesUserControls
Panels
Use casesWorkflow
Domain objects / EntitiesFactories / Repositories
Enums / Value objects / Smart references
Service gatewaysService locators
[Mapping]
DatabasesServices / ESB
Exact SAP BizTalk Java
Android?XAML?ASPX?
Entities(from EF)
DomainServices
Metadata?JSON?
EF?LINQ?
Nhibernate?
MVVM?MVP?
MVWTF?
What to do?
• Identify your architectural requirements
• Set up a (layered) architecture
• Identify layers and layer elements
• List the elements responsibilities
• List the elements collaborations
• And only then map to frameworks
• Create a thin “umbrella” of independence
responsible for managing dependencies
From a developers point of view the user is a peripheral that types when you issue a read request.
LAYER SUPERTYPE
60 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE What’s a layer supertype Ollie?
� Acts as a supertype for all types in its layer
� All types inherit from the layer supertype
Well Stan, it’s characteristics are
� Name expresses common behaviour
� Forces common features on all inherited types
� Ideal starting point for services
� Initially the layer supertype is empty
� Reserve layer supertype for future additions
� Extension methods don’t (always) help, you know
61 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE – ASP.NET MVC
62 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE – ASP.NET MVC
63 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
Presentation
Process
Domain
Data / Services
Outside world
PagesUserControls
Panels
Use casesWorkflow
Domain objects / EntitiesFactories / Repositories
Enums / Value objects / Smart references
Service gatewaysService locators
[Mapping]
DatabasesServices / ESB
Exact SAP BizTalk Java
64 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE – USING A LAYER SUPERTYPE
65 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE – REASON ABOUT LAYER SUPERTYPES
66 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
LAYER SUPERTYPE – EXTENSION METHODS ON LAYER SUPERTYPES
67 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
DESCRIPTOR
69 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
I KNOW NOTHING. I’M FROM BARCELONA
What is the matterMister Fawlty?
The problem Manuel, is that
� I want to use constants in myapplication
� But I want to define them in myframework and extend them in myapplication
� Enumeration won’t do – there’s noinheritance
70 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR – THE PROBLEM (1)
71 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR – THE PROBLEM (2)
72 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
ENUM?
73 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
STRING COLLECTION?
74 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
STRING COLLECTION
75 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
I KNOW NOTHING. I’M FROM BARCELONA
Descriptor
Defines a restricted butapplication specificextendible list of definitions
Useful when
� Enums can not be inherited
� Framework defines enumeration types thatneed to be extended in application code
� Define layer supertype using reflection
� Pre-define frequently used instances
76 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN
77 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN - DEFINITION
78 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN – EXTENDED DEFINITION
79 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN – USE IN FRAMEWORK
80 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN – USE IN APPLICATION
81 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MYFIRSTSURVEY
82 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN – USE IN ASP.NET MVC
83 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DESCRIPTOR PATTERN – USE IN ASP.NET MVC
84 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
AGENDA
An short storyabout frameworks
How frameworks canget you in trouble
Software architectureversus frameworks
The layersupertype
Introducing thedescriptor pattern
The manager-provider
XML is like violence. If it doesn’t solve your problems, you are not using enough of it.
DEPENDENCY INJECTION
86 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
A NEW DISEASE? What do you think it is?
Create true separation between definition
and implementation, so that the two can vary independently and can be replaced easily
Looks like a typical case of dependency injection
� Call functionality without having to knowthe actual implementation
� Implement replaceable services
� Apply implementations in different contexts
� Plug-in services at run-time
So …
� Single topic services
� Single or multiple implemenations need to be handled, which differs dependant oncontext, like with Windows API, logging orerror handling
� Unit testing
87 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DIFFERENT VARIATIONS? Did you know that thereare different types of this dependency injection?
Arggh…Yeah, sure. There’s
� Constructor injection
� Property (setter) injection
� And even manual injection Who cares doc?
88 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DEPENDENCY INJECTION – CONSTRUCTOR INJECTION
89 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DEPENDENCY INJECTION – MANUAL INJECTION
c
90 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
DEPENDENCY INJECTION – WHAT TO PLUG IN
"Teamwork is a lot of people doing what I say“ - Marketing executive, Citrix Corporation
MANAGER – PROVIDER
92 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
Definition
� Create a simple static facade (manager) for a (set of) interfaced implementations (providers)
In practice
� Manager holds one or a collection of providers
� Provider implement a particular interface
� Manager has methods to call methods from interface
� At run-time, using dependency injection, actual providers are injected
MANAGER-PROVIDER PATTERN
93 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MANAGER – VALIDATIONMANAGER
94 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
INTERFACE
95 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MANAGER – INITIALIZATION (USING DEPENDENCY INJECTION)
96 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CONFIGURATION OF IMPLEMENTATION
97 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MANAGER - EXECUTING METHODS
98 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
CLIENT – CALLING METHODS
99 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
MANAGER-PROVIDER PATTERN
Useful when
� Generic services need to be called, which may have different implementations
� Manager prevents having to loop through each of a list of providers
� Flexibility to add or remove providers without changing application code
� Providers differ e.g. in development code, test code or deployed code
Use for
� Task Management
� View Management
� Binding and Persisting
� Resource Management
� State Management
� Logging
� Datasource interaction
� Testing!
Re-factoring or re-architecting?
ARCHITECTURAL CHANGES IN AGILE?
101 HOW FRAMEWORKS CAN KILL YOUR AGILE PROJECTS©2012 Sander Hoogendoorn. All Rights Reserved
Presentation
Process
Domain
Data / Services
Outside world
PagesUserControls
Panels
Use casesWorkflow
Domain objects / EntitiesFactories / Repositories
Enums / Value objects / Smart references
Service gatewaysService locators
[Mapping]
DatabasesServices / ESB
Exact SAP BizTalk Java
What to do?
• Identify your architectural requirements
• Set up a (layered) architecture
• Identify layers and layer elements
• List the elements responsibilities
• List the elements collaborations
• And only then map to frameworks
• Create a thin “umbrella” of independence
responsible for managing dependencies
[email protected] | [email protected] | @aahoogendoorn | @ditisagilewww.sanderhoogendoorn.com | www.ditisagile.nl | www.smartusecase.com | www.accelerateddeliveryplatform.com
REFERENCES AND QUESTIONS
Top Related