Enterprise Library 5.0: Product Backlog prioritization results

Some two weeks ago, we exposed the preliminary product backlog for Enterprise Library 5.0 and invited the community to vote on the features that matter to them most. And what a response we got! Over 2,600 people viewed the backlog and 981 cast their votes, with 230 troopers persevering to the very end. 18 members of the EntLib Expert Advisory Board also voted. In this post I would like thank you all for taking the time to complete the survey, and I want to share the results with you.

In retrospective, every previous EntLib release had a theme:

  • 1.0 = Integration of application blocks
  • 2.0 = .NET 2.0 update
  • 3.0 = Validation, PIAB, Block Factory
  • 4.0 = Dependency Injection with Unity, WMI 2.0

Over the years, EntLib grew larger, and arguably more complex than it really needs to be. The community has spoken loud and clear that they want EntLib to be easier to learn and to use. We have taken this feedback seriously, and have decided to focus this release on enhanced user experience, simplicity, and learnability. The working slogan is “Simplicity for the Win! ”.

So, getting back to the product backlog. Let me explain the methodology we used to analyze the data. Stories voted as Priority 1 got 20 points, Priority 2 got 19 points, Priority 3 got 18 points, and so on, with Priority 20 getting only 1 point. Votes from our team of expert advisors’ carried double weight. Then, for each story, we calculated an arithmetic sum (the total number of points), and - using these numbers - ranked all of the stories (obviously the story with the most points was ranked as #1).

Based on past experience, we didn’t want to plan our development execution in the strict natural order of story rank, because this would require juggling various blocks within each iteration, and potentially create silos of experts around each block. Instead, we wanted an iteration to have a theme that the entire team can focus on. Therefore, we decided to carry out affinity mapping of stories for each block, and calculate their group weightings (ignoring all stories with ranks 50 and higher, since those automatically made our P3 bucket and so are not likely to be done). We then stack ranked the P1 groups (colored green in the following table) and we plan to address them in the stack ranked order, with the individual stories inside the group still ranked according to the original scores. Note that learnability and user experience stories will be addressed in parallel with all the development stories throughout the entire project, and -therefore - those groups are listed near the top of the backlog.

Total points

Rank

Description (T-shirt size)

Architecture

2910

1

ARC01 : Architectural update: use DI container instead of one-off Object Builder factories; DI container independence (XL)

2164

2

ARC02 : Simplification of the codebase (identify redundancies, obsoletes etc.) (XL)

1898

6

ARC03 : Reduction of the number of assemblies (XL)

Learnability

2082

4

LEARN03: Notebook-style 150 page book for Enterprise Developers (XXL)

1400

12

LEARN02: Notebook-style 150 page book for Architects (XXL)

1338

14

LEARN08: Updated Quickstarts (XL)

976

22

LEARN09: Updated Hands-on Labs (XXL)

590

37

LEARN10: EntLib Overview Video (L)

524

42

LEARN07: Migration guide v.4.1 ->5.0 (L)

User Experience

1876

8

UX05: Config tool facelift - towards a more intuitive and easier to use UI (XL)

1718

10

UX03: Config IntelliSense for Unity and EntLib in XmlEditor (M)

1610

15

UX01: Better error reporting/messaging throughout (M)

1010

28

UX02: Debugging Visualizer for Unity (L)

744

36

UX04: Config IntelliSense for Unity in XmlEditor (M)

Data Access

2652

3

DAAB01: DAAB & LINQ basic integration (i.e. execute a query on a database, get back an object that you can do LINQ on) (M)

2012

9

DAAB02: Async ADO.NET support (M)

1390

16

DAAB04: No swallowing of SQL exceptions (S)

Logging

2006

7

LAB02: Async logging (text formatting done asynchronously) to cut down on load on primary thread (M)

1100

17

LAB03: Automatically purging old files by the rolling trace listener (S)

Tool support

1516

13

TOOL02: Support of Unity configuration (M)

Unity

1072

19

UIN01: Generalized interceptor (XXL)

1108

20

U06: Clearer error reporting (M)

1042

23

U05: Unity-MEF Integration (e.g. unityContainer.Resolve<MefPart>()) (M)

896

24

U03: Support for passing arguments to the Resolve method (M)

Config

1962

11

CFG01 : Config decentralization (support for config stored in multiple sources) (S)

1276

18

CFG05: Making Unity configuration less verbose (M)

1072

21

CFG07: Unity config auto-registration: expanded conventions and helper classes to reduce need for explicit configuration (M)

804

34

CFG02: Improved Config API (XL)

850

38

CFG03: Support for different sections of config in different media (not just files) (XL)

Validation

2438

5

VAB01: Integration with WPF (XL)

1020

25

VAB04: Decorating LINQ objects with Validation attributes (M)

944

26

VAB02: Integration with/assistance in implementing IDataErrorInfo (S)

840

33

VAB07: Validation Block refactoring to allow using Unity to resolve Validators (M)

570

40

VAB12: Inheritance-aware object validator (M or ?)

Installability/Uninstallability

858

29

INS01: Installer allows you to pick which specific blocks to install instead of the whole package (M)

864

31

INS03: EntLib installers to be included as part of installers of other custom products (merge modules) (M)

Extensibility

1028

30

EXT01: Simplifying writing extensions and plugging their custom configs into the config tool (XXL)

PIAB

784

32

PIAB01: Implement PIAB interface that takes an interceptor type (to leverage new Unity interceptors) (S)

718

35

PIAB03: New handlers (incl. RequiresTransaction and Call Forwarding) (S)

Resource management

996

27

RAB03: Resource Application Block (a provider to get assorted resources from various media/sources) (XXL)

Localizability

834

39

LOC01: Localizability of EntLib assemblies (L)

752

41

LOC02: Localizability of exception messages and templates (S)

 

Stories in P2 (yellow in the following table) and P3 (red) categories are listed according to their ranks, and not group ranks. Should time permit, we will address the P2 stories in the order shown.

P2

614

43

LEARN01: Discoverability and context/dependencies EntLib poster (L)

556

44

LEARN11: EntLib5.0 New Features Video (L)

682

45

EHAB02: Parameterized templates for exceptions (M)

572

46

TOOL01: Type picker improvements (sped up search, better generics UI) (M)

516

47

U04: Container introspection (S)

590

48

LEARN12: Unity Overview Video (L)

500

49

VAB06: Simple validating field only if the value is not null (S)

590

50

VAB13: Support for recursive data structures (M)

496

51

U02: Allow a mapping from a named registration to the "default" one (S)

506

54

VAB08: Enabling Validation Block to be used with 3rd party object relational mappers (M)

482

55

VAB09: Honouring validation attributes defined in System.ComponentModel.DataAnnotations (S)

468

59

LEARN04: Notebook-style 100 page book for Operations/IT management (XXL)

394

65

VAB03: ArgumentValidationException.ToString() show the validation results (S)

P3

500

52

UIN02: Caching of matching policies (M)

608

53

DAAB03: Fix: validation of sprocs parameters – do not validate (S)

496

56

LAB04: Authenticated Email Trace Listener (S)

430

57

CFG06: Support other config schemas for Unity config (e.g. XAML-based config)

402

58

U01: ResolveAll to return unnamed registration too (S)

390

60

LAB01: ETW sink (?, potentially XXL)

422

61

LEARN14: Unity Extensibility Guide (XL)

424

62

VAB16: Additional validator: Validator that checks that an enum contains a value that maps onto its defined values (S)

404

63

INS02: Installer ships both debug and release versions of the DLLs (S)

546

64

CFG04: Support for multiple pieces of config for a single block in multiple places (XXL)

412

66

EHAB01: Default post-handling action to ThrowNewException instead of NotifyRethrow (S)

378

67

TOOL04: Web-based config tool (L)

372

68

CACHE01: Adding a reason to the class that informs a user why their object was removed from the cache (S)

409

69

LEARN15: Guidance on environmental overrides in Unity (S)

409

70

LEARN15: Unity& MEF decision tree/matrix (M)

344

71

VAB14: Provide NullValidator to properly "ignore nulls" instead of the "Or composite" (S-M)

390

72

CACHE02: Cache backing store targeting ESENT (L)

352

73

VAB15: Additional validator: Number of decimal places validator (S)

292

74

PIAB02: Add non-generic overloads (S)

344

75

VAB05: Simplifying checking for positive / negative values (S)

282

76

LEARN05: Migration guide v.2.0 ->5.0 (XL)

266

77

VAB11: Better localization support (i.e. the first time the validator is used, the locale for the messages is defined) (M)

270

78

VAB18: RelativeDateTimeValidator update to compare against UtcNow instead of Now (S)

238

79

VAB10: Honouring MetadataType attribute (M)

238

80

TOOL03: Block invocation from the configuration designer (e.g. Configure a block, Right-click, Copy “Code to Invoke”, and then paste it elsewhere) (S)

234

81

TOOL05: Easier manipulation of validation trees (potentially, drag&drop) (M)

238

82

VAB17: Validator that compares against a single specific value (S)

196

83

LEARN06: Migration guide v.3.1 ->5.0 (XL)

162

84

LEARN13: Unity Extensibility Video (L)

 

The initial request for a Business Rules Application Block (which would help developers to take advantage of the WF business rule engine without creating a workflow) has been evaluated, and we solicited additional feedback from the advisors and the community. We didn’t see much convergence on the scenarios, and concluded that - at this point - we would not be playing in this area.

With regard to the platform we will target, originally our plan was to target binaries to version 4.0 of the .NET Framework. However, our advisors and the community pushed back on this. The result from 1,229 votes is shown in the following graph:

Targeted Framework for EntLIb poll results

This data is significant enough for us to adjust our plans to meet the community needs, and so we will target the binaries to version 3.5 SP1 of the .NET Framework. We will also carry out our test path on version 4.0 of the .NET Framework to ensure compatibility.

A similar question was asked about the framework version to which we should target Unity. The graph below shows the result of the votes, and so the decision is similar to that for EntLib 5.0. We will be targeting version 3.5 SP1, but also testing on version 4.0.

image