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:
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.
Comments
Anonymous
April 16, 2009
PingBack from http://asp-net-hosting.simplynetdev.com/enterprise-library-50-product-backlog-prioritization-results/Anonymous
April 17, 2009
Thank you for submitting this cool story - Trackback from DotNetShoutoutAnonymous
April 17, 2009
Thank you for submitting this cool story - Trackback from progg.ruAnonymous
April 17, 2009
It's great, that you are actually taking our ideas into account! Do you have already planned Time To Release?Anonymous
April 20, 2009
We have officially started our development work on EntLib5.0. Earlier I’ve shared our product backlogAnonymous
April 20, 2009
@sergejus Early 2010.Anonymous
May 13, 2009
As I have mentioned in my previous posts , over the years, Enterprise Library grew large (it now includesAnonymous
June 19, 2009
EntLib5 team is working on improving performance of the logging block (story LAB02 in our product backlog