Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Going #frameworkless in the backend

813 vues

Publié le

My presentation at Codemotion Milan 2018

Publié dans : Logiciels
  • Identifiez-vous pour voir les commentaires

Going #frameworkless in the backend

  1. 1. THE ART OF #FRAMEWORKLESS IN THE BACKEND Matteo Vaccari @xpmatteo
  2. 2. You have a choice, in your growth as a developer
  3. 3. You may look for a simplified, maybe more pleasant way to deal with reality
  4. 4. And look for a framework that will provide that simplified worldview for you. What is your growth path then?
  5. 5. You can become a developer that knows his framework(s) very well. Your growth is in learning more frameworks and learn them better. You will have plenty to learn! And I don’t say this is necessarily bad. However…
  6. 6. There is another way: you may want to deal with reality as it is. To go closer to the metal.
  7. 7. To do this, you will need knowledge of a more fundamental nature. There is a world of things to learn! This kind of knowledge is more enduring, more versatile, more powerful.
  8. 8. … and you may gain superpowers :-)
  9. 9. Frameworks? Risk Functionality Performance Obsolescence Incompatibilities Developer Experience App startup time Test running timeThe bad The good Learning Standardisation Bad habits DB-Centric Quick project startup Extra work Upgrades Searching on Stackoverflow for answers Addiction Anything is good or bad in a particular context, for a particular set of goals.
  10. 10. I prepared a small demo of an API that plays the game of hangman. I wrote three versions of it; the first uses Spring and JPA. The second replaces JPA with plain JDBC calls. The third one removes Spring and uses the Servlet API.
  11. 11. Creating a new game All three versions respond in the same way. This is a sample of how to play.
  12. 12. First guess: the letter “e”
  13. 13. Second guess: the letter “t”
  14. 14. Etc, etc…
  15. 15. A small demo of how it feels to start a Spring/JPA service versus a plain Java one.
  16. 16. Spring/JPA (Spring MVC) Controller Embedded Tomcat Spring MVC Servlet (Spring) Application Service (JPA) Repository Emtity Manager DB Our router Embedded Jetty Our Servlet Our Application Service Our Repository JDBC DB Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects
  17. 17. Spring/JPA No Spring/No JPA (Spring MVC) Controller Embedded Tomcat Spring MVC Servlet (Spring) Application Service (JPA) Repository Emtity Manager DB Our router Embedded Jetty Our Servlet Our Application Service Our Repository JDBC DB Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects Domain Objects
  18. 18. HttpServletRequest HttpServletResponse A Java web application is (not exactly, but similar to) a function that transforms an HttpServletRequest into an HttpServletResponse.
  19. 19. HttpServletRequest HttpServletResponse WebRequest WebResponse However, those servlet API objects have 50+ methods and are very low level and hard to use. One key thing to make #frameworkless work well is to write simple code. Therefore, it’s good to transform the servlet API objects into something simpler and easier to use. These are custom made for each project, similar but never exactly the same thing.
  20. 20. HttpServletRequest HttpServletResponse WebRequest WebResponse GameResponse x HttpStatus GuessRequest And this is still not enough; for any particular request, we probably want to transform the WebRequest into a specific request object that contains exactly what we need.
  21. 21. Main
  22. 22. The “Main Partition”
  23. 23. The “Main Partition”The main and the servlet together are what Uncle Bob calls the “main partition”, that is, the place where objects are constructed. The main (of course) is executed once per process, while the servlet service method is executed once per request. It is a sort of “main” for the request.
  24. 24. The Router
  25. 25. The Router The router’s job is to decide what is the user trying to do, and dispatch to an appropriate service call. The code of the router is made much simpler by having some logic in the WebRequest and WebResponse.
  26. 26. The Router, part II
  27. 27. The Router, part IIFor a simple service, a chain of IFs is simple and effective. If the service grows, it will probably evolve towards a table lookup. Again, this object should be developed afresh for every project/service. There’s no need to create a reusable “custom framework” here.
  28. 28. The Application Service
  29. 29. The Application Service The application service job is (a) to invoke business logic on domain objects, and (b) to deal with non-functional effects such as persistence.
  30. 30. The Domain Objects
  31. 31. The Game Repository
  32. 32. The Game Repository The GuessRequest contains data that are not used by the business logic, but are relevant for audit/security/debug purposes. This information is saved in a way that does not pollute the business logic (compare the GuessRequest, shown later, with the Guess domain object) The QueryRunner is from Apache Dblib. It’s possible to write your own; it’s no more than 10 lines of code.
  33. 33. The Game Repository, part II
  34. 34. The Game Repository, part II Reconstructing a Game involves replaying all the “guesses” of the player. This not exactly event sourcing, but it’s similar. I find that saving all the “events” involving an aggregate, with as little processing as possible at write time, makes persistence simpler, even when you don’t go full event- sourcing. Perhaps this way can be even better than full event-sourcing :-)
  35. 35. The Web Request
  36. 36. The Web RequestThe API of the WebRequest is at the same time simpler and higher level than the servlet API. The getOptionalParameter() and getMandatoryParameter() methods simplify the router and the service.
  37. 37. The Guess Request
  38. 38. Spring/JPA Spring/— —/— Server startup time ~6s ~3s 0.4s Time to run all tests 10s 5.5s 3.5s Time to run slowest test 7s 4-5s 1s # of tests 25 24 48 SLOC prod 360 424 643 SLOC test 358 357 745 jar size 30MB 17MB 6.3MB Judge for yourself.
  39. 39. Frameworks? Risk Functionality Performance Obsolescence Incompatibilities Developer Experience App startup time Test running timeThe bad The good Learning Standardisation Bad habits DB-Centric Quick project startup Extra work Upgrades Searching on Stackoverflow for answers Addiction
  40. 40. References https://github.com/xpmatteo/frameworkless-hangman https://github.com/frameworkless-movement/manifesto 45
  41. 41. twitter.com/xpmatteo thoughtworks.com THANK YOU WE ARE HIRING! YES, IN ITALY!

×