Feature driven development

2,534 views

Published on

This talk shows Best Practices that can be used to develop application in an agile and feature driven workflow. Companies like flickr use this development process internally and even Martin Fowler defined a part of the process as “FeatureToggle”.
In the talk I will start with the definition of feature tasks and what steps and methods are needed to define them. Next to this an application is shown that was developed by the use of FeatureToggles. Here different architecture approaches in Java will be shown. Next to the architecture of an application the development workflows must be changed to create applications in a feature driven way, too. In some examples best practices to handle the new workflows will be shown.
Methods and tools like the GitFlow, GitLab, the Java Togglz API and Jira will be shown in this talk.

Published in: Technology

Feature driven development

  1. 1. @hendrikEbberswww.guigarage.com Feature Driven Development
  2. 2. @hendrikEbberswww.guigarage.com default branchAbout me Hendrik Ebbers @hendrikEbbers www.guigarage.com JUG DortmundMastering JavaFX 8 Controls DataFX, AquaFX, Vagrant-Binding
  3. 3. @hendrikEbberswww.guigarage.com default branchContent features workflows feature toggles
  4. 4. @hendrikEbberswww.guigarage.com default branchWhat is a feature? „play“ button feature
  5. 5. @hendrikEbberswww.guigarage.com default branchWhat is a feature? „play“ button feature
  6. 6. @hendrikEbberswww.guigarage.com private single developer project Ribbon interface removed „play“ button added multi touch support Hibernate version changed
  7. 7. @hendrikEbberswww.guigarage.com structure of a complex application Backend Frontend / UI Persistence
  8. 8. @hendrikEbberswww.guigarage.com Let’s start with the UI trunk button on UI
  9. 9. @hendrikEbberswww.guigarage.com Diff of the first commit <form > <input type="button" value=„play“ onclick=„rpc.play()“> </form> class PlayService { ! public void play() { throw new RuntimeException(„Not implemented!“); } ! }
  10. 10. @hendrikEbberswww.guigarage.com Commit history button on UI JPA classes new media service bugfix #235 trunk
  11. 11. @hendrikEbberswww.guigarage.com Houston, we have a problem button on UI JPA classes new media service bugfix #235 Application can’t be released! trunk
  12. 12. @hendrikEbberswww.guigarage.com Concurrent development = Concurrent problems Jim Bob Martin John bugfix 7 new middleware rest services security issues
  13. 13. @hendrikEbberswww.guigarage.com Concurrent development = Concurrent problems button on UI JPA classes new media service bugfix #235 trunk Ribbon interface removed (50%) Ribbon interface removed (100%) testcommit refactored most entities
  14. 14. @hendrikEbberswww.guigarage.com Concurrent development = Concurrent problems button on UI JPA classes new media service bugfix #235 trunk Ribbon interface removed (50%) Ribbon interface removed (100%) testcommit refactored most entities Application can NEVER be released!
  15. 15. @hendrikEbberswww.guigarage.com Using a feature branch button on UI JPA classes new media service mergebranch develop feature branch
  16. 16. @hendrikEbberswww.guigarage.com Release cycle? Application can be released!
  17. 17. @hendrikEbberswww.guigarage.com Concurrent development? Application can be released! feature 1 feature 2
  18. 18. @hendrikEbberswww.guigarage.com Problem: merge hell Application can be released! merge hell f# 1 f# 4 f# 2 f# 3 f# 5 t = 2 month
  19. 19. @hendrikEbberswww.guigarage.com Application can be released! hidden button and middleware backend visible button easy merge easy merge easy merge Solution: Dark launching & small branches
  20. 20. @hendrikEbberswww.guigarage.com Solution: update the feature branch Application can be released! merge merge merge adding button localization of button title final button icon ! easy merge / pull request
  21. 21. @hendrikEbberswww.guigarage.com Problem: changes creates bugs Application can be released! bugs? Point of no return
  22. 22. @hendrikEbberswww.guigarage.com Solution: Feature Toggles ! if(MY_FEATURE.isActive( )) { showPlayButton( ); } activate feature the feature check
  23. 23. @hendrikEbberswww.guigarage.com Fallback to old implementations ! if(NEW_PERSISTENCE.isActive( )) { return jpaCall( ); } else { return jdbcCall( ); } old new
  24. 24. @hendrikEbberswww.guigarage.com Java APIs JSF Support Spring Support Java EE Support Admin Console Activation Strategies State Repositories User Authentification Java SE Support
  25. 25. @hendrikEbberswww.guigarage.com Java APIs JavaFX Support Observer pattern Binding Supports predefined annotations
  26. 26. @hendrikEbberswww.guigarage.com Define Features as enum ! @Issue(„JFX-638“) @EnabledByDefault NEW_PERSISTENCE, ! @Issue(„JFX-492“) @EnabledByDefault TWITTER_SUPPORT, . . . add metadata to describe the feature
  27. 27. @hendrikEbberswww.guigarage.com Features state and activation ! MY_FEATURE.isActive( ) always always on dev system next 3 hours for random users stored in db defined in property file
  28. 28. @hendrikEbberswww.guigarage.com Administration view < > ! http://www.my-app/administration/togglz
  29. 29. @hendrikEbberswww.guigarage.com Fronted support ! <h:panelGroup rendered="#{features['PLAY_FEATURE']}"> <h:commandButton value=„play" /> </h:panelGroup> @FXML @HideByFeature("PLAY_FEATURE") private Button playButton; JavaFX JSF
  30. 30. @hendrikEbberswww.guigarage.com Take care of your features FEATURE_1, FEATURE_2, FEATURE_3, FEATURE_4, FEATURE_5, . . . FEATURE_1462, FEATURE_11463, Where is my feature??? Don’t forget to clean up! (once a feature is live for a defined period of time)
  31. 31. @hendrikEbberswww.guigarage.com Conclusion button & feature toggle backend remove feature toggle use feature toggles clean upuse short living branches describe your features with metadata & provide feature administration &
  32. 32. @YourTwitterHandle#DVXFR14{session hashtag} @hendrikEbberswww.guigarage.com Q & A

×