Software Product Lines
15-214 Charlie Garrod, Christian Kästner
1
Software Product Lines 15-214 Charlie Garrod, Christian Kstner 1 - - PowerPoint PPT Presentation
Software Product Lines 15-214 Charlie Garrod, Christian Kstner 1 Reuse and Variations 15-214 Kaestner toad 3 15-214 Kaestner toad 4 15-214 Kaestner toad 5 15-214 Kaestner toad 6 Reuse and Variation Configuration in Software
15-214 Charlie Garrod, Christian Kästner
1
toad
3
15-214 Kaestner
Reuse and Variations
toad
4
15-214 Kaestner
toad
5
15-214 Kaestner
toad
6
15-214 Kaestner
Reuse and Variation
– e.g., Windows, Open Office, Oracle, SAP myERP, Photoshop
systems increasingly important
– Mobile divices, sensor networks, automotive systems, consumer electronics, smart cards, ubiquitious computing – 98% of all CPUs in embedded devices [2000] – Resource constraints, heterogeneous hardware
8
embedded environments
9
Database Engine
Printer Firmware
Linux Kernel
~6 000 000 Lines of C code Highly configurable
> 10.000 configuration options!
(x86, 64bit, …)
Most source code is “optional”
15
Boeing Bosch Group Cummins, Inc. Ericsson General Dynamics General Motors Hewlett Packard Lockheed Martin Lucent NASA Nokia Philips Siemens …
19
a unique configuration for every
more configurations than estimated atoms in the universe
Features
for the optimizer (1600 total)
“A software product line is a set of software-intensive systems that share a common, managed set of features satisfying the specific needs of a particular market segment or mission and that are developed from a common set of core assets in a prescribed way.” SEI
The Promise
# Products Costs Development without reuse Development with reuse
28
Domain Analysis
(feature modeling)
D
a i n E n g i n e e r i n g A p p l i c a t i
E n g i n e e r i n g
Domain Implementation
(models, source code)
Requirements Analysis
(feature selection)
Application Derivation
(generator, testing)
Domain knowledge Customer needs Product
Domain Analysis
(feature modeling)
D
a i n E n g i n e e r i n g A p p l i c a t i
E n g i n e e r i n g
Domain Implementation
(models, source code)
Requirements Analysis
(feature selection)
Application Derivation
(generator, testing)
Domain knowledge Customer needs Product
35
Domain Analysis
(feature modeling)
D
a i n E n g i n e e r i n g A p p l i c a t i
E n g i n e e r i n g
Domain Implementation
(models, source code)
Requirements Analysis
(feature selection)
Application Derivation
(generator, testing)
Domain knowledge Customer needs Product
Parameters, variables, constants
38
39
class Config { public static boolean isLogging = false; public static boolean isWindows = false; public static boolean isLinux = true; } class Main { public void foo() { if (isLogging) log(“running foo()“); if (isWindows) callWindowsMethod(); else if (isLinux) callLinuxMethod(); else throw RuntimeException(); }
40
41
durch viele Aufrufe propagiert statt globaler Variable
42
parameters
class Edge { Node a, b; Color color = new Color(); Weight weight; Edge(Node _a, Node _b) { a = _a; b = _b; } void print() { if (Conf. COLORED) Color.setDisplayColor(color); a.print(); b.print(); if (!Conf.WEIGHTED) weight.print(); } } class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(Node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); if (Conf.WEIGHTED) e.weight = new Weight(); return e; } Edge add(Node n, Node m, Weight w) if (!Conf.WEIGHTED) throw RuntimeException(); Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; } void print() { for(int i = 0; i < ev.size(); i++) { ((Edge)ev.get(i)).print(); } } } class Node { int id = 0; Color color = new Color(); void print() { if (Conf.COLORED) Color.setDisplayColor(color); System.out.print(id); } } class Color { static void setDisplayColor(Color c) { ... } } class Weight { void print() { ... } } class Conf { public static boolean COLORED = true; public static boolean WEIGHTED = false; }
for the optimizer (1600 total)
45
– Hard to test in isolation
– Binary size, memory consumption – Performance – Unused functionality as attack vector
46
– Hard to test in isolation
– Binary size, memory consumption – Performance – Unused functionality as attack vector
compile- time if design pattern
conditional compilation #ifdef
#include "db_int.h" static int __rep_queue_filedone(dbenv, rep, rfp) DB_ENV *dbenv; REP *rep; __rep_fileinfo_args *rfp; { #ifndef HAVE_QUEUE COMPQUIET(rep, NULL); COMPQUIET(rfp, NULL); return (__db_no_queue_am(dbenv)); #else db_pgno_t first, last; u_int32_t flags; int empty, ret, t_ret; #ifdef DIAGNOSTIC DB_MSGBUF mb; #endif // over 100 lines of additional code } #endif
49
compilation at statement level
class Example { public static final boolean DEBUG = false; void main() { System.out.println(“immer”); if (DEBUG) { System.out.println(“debug info”); printDetails(); } } void printDetails() { ... } }
50
class Example { void main() { System.out.println(“immer”); /*if[DEBUG]*/ System.out.println(“debug info”); /*end[DEBUG]*/ } } java Munge –DDEBUG –DFEATURE2 file1.java file2.java
http://weblogs.java.net/blog/tball/archive/2006/09/munge_swings_se.html
51
class Edge { Node a, b; /*if[COLOR]*/ Color color = new Color(); /*end[COLOR]*/ /*if[WEIGHT]*/ Weight weight; /*end[WEIGHT]*/ Edge(Node _a, Node _b) { a = _a; b = _b; } void print() { /*if[COLOR]*/ Color.setDisplayColor(color); /*end[COLOR]*/ a.print(); b.print(); /*if[WEIGHT]*/ weight.print(); /*end[WEIGHT]*/ } } class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(Node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); /*if[WEIGHT]*/ e.weight = new Weight(); /*end[WEIGHT]*/ return e; } /*if[WEIGHT]*/ Edge add(Node n, Node m, Weight w) Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; } /*end[WEIGHT]*/ void print() { for(int i = 0; i < ev.size(); i++) { ((Edge)ev.get(i)).print(); } } } class Node { int id = 0; /*if[COLOR]*/ /*if[COLOR]*/ class Color { static void setDisplayColor(Color c) { ... } } /*end[COLOR]*/ /*if[WEIGHT]*/ class Weight { void print() { ... } } /*end[WEIGHT]*/
Features
– Scattered code – Error prone – Hard to understand – Invites neglecting design – Hinder tool support
54
class Stack { void push(Object o #ifdef SYNC , Transaction txn #endif ) { if (o==null #ifdef SYNC || txn==null #endif ) return; #ifdef SYNC Lock l=txn.lock(o); #endif elementData[size++] = o; #ifdef SYNC l.unlock(); #endif fireStackChanged(); } } class Stack { void push(Object o #ifdef SYNC , Transaction txn #endif ) { if (o==null #ifdef SYNC || txn==null #endif ) return; #ifdef SYNC Lock l=txn.lock(o); #endif elementData[size++] = o; #ifdef SYNC l.unlock(); #endif fireStackChanged(); } }
56
static int _rep_queue_filedone(...) DB_ENV *dbenv; REP *rep; __rep_fileinfo_args *rfp; { #ifndef HAVE_QUEUE COMPQUIET(rep, NULL); COMPQUIET(rfp, NULL); return (__db_no_queue_am(dbenv)); #else db_pgno_t first, last; u_int32_t flags; int empty, ret, t_ret; #ifdef DIAGNOSTIC DB_MSGBUF mb; #endif //over 100 lines of additional code } #endif #ifdef TABLES class Table { void insert(Object data, Txn txn) { storage.set(data, txn.getLock()); } } #endif class Storage { #ifdef WRITE boolean set(…) { ... } #endif }
static int _rep_queue_filedone(...) DB_ENV *dbenv; REP *rep; __rep_fileinfo_args *rfp; { #ifndef HAVE_QUEUE COMPQUIET(rep, NULL); COMPQUIET(rfp, NULL); return (__db_no_queue_am(dbenv)); #else db_pgno_t first, last; u_int32_t flags; int empty, ret, t_ret; #ifdef DIAGNOSTIC DB_MSGBUF mb; #endif //over 100 lines of additional code } #endif #ifdef TABLES class Table { void insert(Object data, Txn txn) { storage.set(data, txn.getLock()); } } #endif class Storage { #ifdef WRITE boolean set(…) { ... } #endif }
E x a m p l e : S e s s i o n e x p i r a t i o n i n t h e A p a c h e T o m c a t S e r v e r
61
best practice separation
63
64
65
S t a c k S e c u r e S t a c k S y n c h r o n i z e d S t a c k U n d o S t a c k
modular, but inflexible
S t a c k S e c u r e S t a c k S y n c h r o n i z e d S t a c k U n d o S t a c k
S t a c k S e c u r e S t a c k S y n c h r o n i z e d S t a c k U n d o S t a c k
E x t e n s i
s n
c
b i n a b l e Middle extension not optional
hierarchies
– Combinatorical explosion – Massive code replication
– Diamond problem
S t a c k S e c u r e S t a c k S y n c h r o n i z e d U n d o S e c u r e S t a c U n d o S t a c k U n d o S e c u r e S t a c k S y n c h r o n i z e d U n d o S t a c k S y n c h r o n i z e d S t a c k + p u s h ( ) + p o p ( ) + s iz e ( )+ p u s h ( ) + p o p ( ) + s iz e ( ) « in t e r f a c e » I S t a c k + p u s h ( ) + p o p ( ) + s iz e ( )
S t a c k + p u s h ( ) + p o p ( ) + s iz e ( )
S t a c k D e c o r a t o r + p u s h ( ) + p o p ( ) + s iz e ( ) + lo c k ( ) + u n lo c k ( ) L o c k e d S t a c k + p u s h ( ) + p o p ( ) + u n d o ( )
U n d o S t a c k + p u s h ( ) + p o p ( ) + e n c r y p t( ) + d e c r y p t( )
S e c u r e S t a c k 1 1
design patterns –Strategy –Template method –Observer
69
–Compile and test plug-ins separately
70
71
more configurations than estimated atoms in the universe
2000 Features Inhouse configuration 100 Printers (Product Map) 30 New Printers per Year 10000 Features End user configures 210000 Configurations
true
line 1 #ifdef A line 2 #ifndef A line 3 #endif line 4 #elif defined(X) line 5 #else line 6 #endif
A A ^ not A A not A ^ X not A ^ not X
Dead code
Analysis: SAT(pc(block i))
76
4/13/2011
Cohen et al. Interaction testing of highly-configurable systems in the presence
F1 F2 F3
Cohen et al. Interaction testing of highly-configurable systems in the presence
F1 F2 F3
Specified Variability Implementation Variability
P
WORLD
BYE
WORLD v BYE ¬ (WORLD ˄ BYE) (WORLD v BYE) ˄ ¬ (WORLD ˄ BYE)
Check Consistency
(domain engineering)
(components, version control systems, feature/aspect-oriented development)
S. Apel, D. Batory, C. Kästner, and G. Saake. Feature- Oriented Software Product Lines: Concepts and
2013. K. Czarnecki and U. Eisenecker. Generative Programming: Methods, Tools, and Applications. Addison-Wesley, 2000. P. Clements, L. Northrop. Software Product Lines: Practices and Patterns. Addison-Wesley, 2002
84
– From Design Pattern to Architectures – Dynamic and Static Analysis – Inspection, Advanced Testing – Git, Continuous Integration
– Teams – Process – Requirements – Economics, Risks – Empirical Results
reuse by planning variations
conditional compilation to design patterns and frameworks
87