A zen presentation about the process we call modularity. Showing how we apply the same pattern to software over and over, resulting in the latest incarnation: µservices.
11. int global;
int shared;
int local;
Code
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
7dinsdag 9 november 2010
12. int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
8dinsdag 9 november 2010
13. int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
8dinsdag 9 november 2010
14. int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
9dinsdag 9 november 2010
15. int global;
int shared;
Functions
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local;
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
10dinsdag 9 november 2010
16. A
int global;
int shared;
Modules
B
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
11dinsdag 9 november 2010
17. A
int global;
int shared;
Modules
B
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
11dinsdag 9 november 2010
18. A
int global;
Modules
B
int shared;
int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
12dinsdag 9 november 2010
19. Class A
Objects
Class B
int shared;
int shared;
1
n
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
13dinsdag 9 november 2010
20. Class A
Objects
Class B
int shared;
int shared;
1
n
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
13dinsdag 9 november 2010
21. com.acme.abc
Packages
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class C int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
14dinsdag 9 november 2010
22. com.acme.abc
Packages
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class C int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
14dinsdag 9 november 2010
23. “Chapter 7 describes the structure of a
program which is organized into packages
similar to the modules of Modula.”
Java Language Specification, 3rd edition
15dinsdag 9 november 2010
24. abc-1.2.3-SNAPSHOT.jar
JARs
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
def-4.5.6.jar
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
16dinsdag 9 november 2010
25. abc-1.2.3-SNAPSHOT.jar
JARs
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
def-4.5.6.jar
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
16dinsdag 9 november 2010
26. com.acme.abc-1.2.3
Bundles
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def-9.9.1
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
17dinsdag 9 november 2010
27. com.acme.abc-1.2.3
Bundles
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def-9.9.1
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Private Exported
Private Exported
17dinsdag 9 november 2010
28. The Face of Modularity
18dinsdag 9 november 2010
29. The Face of Modularity
18dinsdag 9 november 2010
31. A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
20dinsdag 9 november 2010
32. A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
Pub
20dinsdag 9 november 2010
33. A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
Pub
20dinsdag 9 november 2010
34. A B
C D
• Modules require other
modules
• Dependencies are
transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
35. A B
C D
• Modules require other
modules
• Dependencies are
transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
36. Evolution
• Modularization is about minimizing the changes
need to support the evolution of itself and its
dependencies.
• Module change should only be required for:
• New functionality
• An embedded assumption is violated
• Ergo: assumptions about other modules should be
minimized
22dinsdag 9 november 2010
71. All Good
• The provider creates the instance
• Life cycle control in the hands of the
implementer
• No Statics
• Full context defined by implementer
• Type Safe
• Discovery by User
46dinsdag 9 november 2010
100. Conclusion
• µServices are a primitive for:
• dependency handling
• dynamics
• discovery
• hiding the implementations
• µServices provide a primitive solution to common
software problems
• µServices require virtually no code to handle
58dinsdag 9 november 2010