{"id":11477,"date":"2019-08-14T14:30:23","date_gmt":"2019-08-14T12:30:23","guid":{"rendered":"https:\/\/www.imagicle.com\/cpt_blog\/imagicle-why-choosing-emergent-design-for-agile-software-development\/"},"modified":"2025-04-15T19:19:31","modified_gmt":"2025-04-15T17:19:31","slug":"why-emergent-design-for-agile-software-development","status":"publish","type":"cpt_blog","link":"https:\/\/www.imagicle.com\/en\/blog\/o\/customer-experience\/cx-software-enterprise\/why-emergent-design-for-agile-software-development\/","title":{"rendered":"Why choosing emergent design for Agile software development."},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;3.22&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;63px|0px|0px|0px&#8221;][et_pb_row _builder_version=&#8221;3.25&#8243; background_size=&#8221;initial&#8221; background_position=&#8221;top_left&#8221; background_repeat=&#8221;repeat&#8221; custom_margin=&#8221;0px|||&#8221; custom_padding=&#8221;0px||0px|&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;3.25&#8243; background_color=&#8221;#ffffff&#8221; custom_padding=&#8221;|||&#8221; custom_padding_tablet=&#8221;&#8221; custom_padding_phone=&#8221;&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_divider show_divider=&#8221;off&#8221; _builder_version=&#8221;3.12&#8243; height=&#8221;50px&#8221;][\/et_pb_divider][et_pb_text admin_label=&#8221;Bridges&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>Building a bridge. The problems with the upfront design.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">If you started working in the software industry some time ago, probably you&#8217;ve already experienced what I&#8217;m talking about, and maybe you&#8217;ll agree that <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>the way we used to build software was similar to the way constructors use to build bridges<\/b>, that is:<\/span><\/div>\n<div>\u00a0<\/div>\n<ol class=\"listtype-number listindent1 list-number1\" start=\"1\">\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">define the requirements;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">make arrangements with the client about what, how and when it will be done;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">design the solution;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">implement the solution;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">deliver it to the client.<\/span><\/li>\n<\/ol>\n<p>[\/et_pb_text][et_pb_image src=&#8221;https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/iStock-1133327900.jpg&#8221; align=&#8221;center&#8221; align_tablet=&#8221;center&#8221; align_phone=&#8221;&#8221; align_last_edited=&#8221;on|desktop&#8221; admin_label=&#8221;tabella 1&#8243; _builder_version=&#8221;4.9.10&#8243; max_width=&#8221;60%&#8221;][\/et_pb_image][et_pb_text admin_label=&#8221;Basically, the Waterfall development methodology.&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Basically, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>the Waterfall development methodology<\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">For a bridge, this approach still works very well. And this is because the construction of a bridge typically respects these characteristics:<\/span><\/div>\n<ol class=\"listtype-number listindent1 list-number1\" start=\"1\">\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">it has precise requirements<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(what<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> should be done, for how long it should last, etc.);<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the requirements do not change during construction<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(it<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> is rather difficult to imagine that the client, with work in progress, says something like:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">&#8220;Listen,<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> could you get it 1 km further downstream?&#8221;);<\/span><\/li>\n<li><span class=\"thread-336529786373431615933940 attrcomment attrcommentfirst thread-336529786373431615933940-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">doesn\u2019t need to be developed<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> for future modifications or extensions;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">if there are any doubts, they are known: i.e., I don&#8217;t know how many kg\/m<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><sup>2<\/sup><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> that foundation can hold, so I know I have to to find out;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">building the bridge is much more expensive than designing it.<\/span><\/li>\n<\/ol>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Furthermore, realizing a wrong design choice would imply going back to some phases of the construction that could be impossible to modify<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(what<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> if, after starting the construction of the road, you realized that you needed an extra pillar?).<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Obviously, this is not an absolute truth: even a bridge may be subject to modifications during construction, or future renovations. However, they will be expensive, and their cost will be difficult to predict at the time of construction. Sometimes, rather than renovating an old bridge to make it more modern and capable of driving more cars, it&#8217;s more convenient to rebuild it from scratch.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We can say, in short, that bridges follow a construction method that optimizes the initial realization, to the detriment of future developments. Now, this can be considered an excellent system for making hardware<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(and<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> I would say that a bridge can be regarded as a nice piece of hardware), b<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\">ut we produce software, right? <\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\">Are we sure we can apply the same system <\/span><span class=\"thread-991654311016764008433424 attrcomment attrcommentfirst thread-991654311016764008433424-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\"><span class=\"comment-extra-inner-span\">to it?<\/span><\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><br \/>Well, let&#8217;s see which of the five factors mentioned above are typically respected in a software product.<\/span><\/div>\n<div>\u00a0<\/div>\n<div>\n<h3>1. Precise requirements.<\/h3>\n<\/div>\n<div>\n<p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Nothing like it. Usually, the requirements become clear as the product takes shape. And since we prefer to make our users happy rather than tell them<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">&#8220;You<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> signed for this 6 months ago&#8221;, the continuous feedback from users is much more important to us than the initial negotiation of the requirements.<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><i>Customer<\/i><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><i> collaboration over contract negotiation &#8211; <\/i><\/span><strong><a href=\"https:\/\/agilemanifesto.org\/\" target=\"_blank\" rel=\"noopener\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Agile Manifesto<\/span><\/a><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">)<i>.<\/i><\/span><\/p>\n<\/div>\n<div>\n<h3>2. Stable requirements.<\/h3>\n<\/div>\n<div>\n<p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No: it happens all the time that some requirements change during the development, new ones come out or that which at first seemed indispensable end up being excluded. The market changes quickly, the needs change quickly, so the software must change accordingly<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><i>Responding<\/i><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><i> to change over following a plan <\/i>&#8211; Agile Manifesto<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">).<\/span><\/p>\n<\/div>\n<div>\n<h3>3. Changes in progress.<\/h3>\n<\/div>\n<div>\n<p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Modifications and extensions are a daily occurrence when working on a software<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(think<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> of all the news included in each <\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" href=\"https:\/\/www.imagicle.com\/en\/resources\/roadmap\/#ReleaseTab5\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/www.imagicle.com\/en\/resources\/roadmap\/#ReleaseTab5\" data-target->release <\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">of our products <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img decoding=\"async\" class=\"\" title=\"winking face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f609.png?version=3.1.2\" alt=\"winking face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude09\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">).<\/span><\/p>\n<\/div>\n<div>\n<h3>4. Doubts.<\/h3>\n<\/div>\n<div>\n<p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We are aware from the beginning of not knowing some aspects. But we discover other flaws the moment we encounter them. A bit like saying: if you know you don&#8217;t know, feel lucky\u2026the problem is when you don&#8217;t know you don&#8217;t know <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img decoding=\"async\" class=\"\" title=\"slightly smiling face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f642.png?version=3.1.2\" alt=\"slightly smiling face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude42\" \/><\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(little<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> spoiler, we&#8217;ll see shortly that it&#8217;s better not to try to solve even the doubts we have in advance!).<\/span><\/p>\n<\/div>\n<div>\n<h3>5. High modification cost.<\/h3>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This is the only point that could be common with the bridge, and it&#8217;s the one from which we want to stay further away. If we happen to have a software that should be redone rather than extended, it would mean <\/span><span class=\"thread-417755614910678642466844 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">that <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the software became unmantainable, and we should understand what went wrong to avoid this situation in the future.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">So, apparently, the upfront design, which is well suited for building bridges, doesn&#8217;t work very well with software products.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>Designing the entire product before starting its development, in fact, has a number of easily identifiable disadvantages<\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">. Creating an hyper-extensible and super-abstract product is an expensive exercise that risks creating unnecessarily complex abstractions<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/KISS_principle\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/KISS_principle\" data-target->KISS<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">);<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> the extensibility on which the investment was made could prove to be useless or excessive if we found out that a lower or much simpler level of abstraction was sufficient<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\" data-target->YAGNI<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">);<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> and, in any case, it is complicated to predict what the requirements will be and to understand whether extensions will be needed and at what stage of development. Even if you try to do it, it&#8217;s very easy to go wrong, ending up wasting a great deal of time and money.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">The solution is there: <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>let the design emerge.\u00a0<\/b><\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Let&#8217;s see how.<\/span><\/div>\n<p>[\/et_pb_text][et_pb_divider show_divider=&#8221;off&#8221; _builder_version=&#8221;3.12&#8243; height=&#8221;50px&#8221;][\/et_pb_divider][et_pb_text admin_label=&#8221;Emergent design.&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>Emergent design.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In his last <\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" href=\"https:\/\/www.imagicle.com\/en\/blog\/o\/tdd-why-i-decided-that-debugging-wasnt-worth-my-time\/\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/blog.imagicle.com\/test-diven-development\/\">post<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, Riccardo talked about <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>TDD <\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">as a tool to make development more efficient, guarantee a high level of software quality through the Red-Green-Refactor cycle and obtain a suite of automated tests performed by our Continuous Integration system at each software build.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>Well, TDD, Refactoring, and Continuous Integration are the exact ingredients we need to make the design emerge spontaneously<\/strong>. Now let&#8217;s see how this translates into practice.<\/span><\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div>\n<h2>A real use case: the Imagicle UCX Suite Web Services.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">To date,<strong><a href=\"https:\/\/www.imagicle.com\/en\/suite\/cloud\/\" target=\"_blank\" rel=\"noopener noreferrer\"> Imagicle UCX Suite<\/a> <\/strong>exposes dozens of REST Web Services. Some form public APIs, useful for users to integrate the suite with third-party products<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(such<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> as those for <\/span><span class=\"thread-145262813282702087234563 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">controlling recordings<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> or sending faxes). But to get to dozens of Web Services, we had to start from the first one. And we did it back in 2014, when we wrote the first REST Web Service using WCF. We knew it would be the first in a long series: <strong><a href=\"https:\/\/www.imagicle.com\/en\/blog\/o\/tech-inside-agile-software-development-part-1\/\" target=\"_blank\" rel=\"noopener noreferrer\">the Agicle era<\/a><\/strong> had just begun, we had recently introduced the use of TDD; the most natural thing was writing a Web Service as a simple C# class, written in TDD, instead of a Web Service in ASMX technology.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><br \/>A good software architect could have said:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">&#8220;Well,<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> since from now on we will write a lot of classes like this, let&#8217;s think about how to structure it, and then we think of a framework that makes it easy and fast to write similar classes.&#8221;\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this way, <\/span><span class=\"thread-475163425727733360156405 attrcomment attrcommentfirst thread-475163425727733360156405-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">we would have designed the abstraction up front<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, with the difficulties seen before.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">But as you imagine, it didn&#8217;t happen that way.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We knew we should get a class, but we didn&#8217;t know much else about how that class should have been once it was finished. So, we wrote a test, <\/span><span class=\"thread-250219403767472502173181 attrcomment attrcommentfirst thread-250219403767472502173181-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">we made it pass<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, we wrote another one, and so on with the Red-Green-Refactor cycle, till we ended up having exactly what we needed: <strong>a class that represented a functioning Web Service written in TDD<\/strong> .\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No more and no less.<\/span><\/div>\n<p>[\/et_pb_text][et_pb_image src=&#8221;https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/1.jpg&#8221; align=&#8221;center&#8221; align_tablet=&#8221;center&#8221; align_phone=&#8221;&#8221; align_last_edited=&#8221;on|desktop&#8221; admin_label=&#8221;first web service&#8221; _builder_version=&#8221;4.9.10&#8243;][\/et_pb_image][et_pb_text admin_label=&#8221;After the first Web Service&#8230;&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">After the first Web Service, we were satisfied with the result: we had a class written entirely in TDD, with a suite of tests performed by the Continuous Integration system that ensured its correct functioning and allowed us to continuously refactor the product code, keeping it always clean, clear and easily editable.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Plus, having written the class in TDD, it turns out to be natively compliant with the Single Responsibility Principle: the Web Service makes the Web Service; it doesn&#8217;t have to do also business logic and persistence.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Finally, to be able to write unit tests, we used Dependency Injection, so we could pass mock implementations in the tests. Basically we can say that, even at the level of a single class, <strong>the design complying with the SOLID principles emerged spontaneously from the tests that modeled its behavior, as well as from the continuous refactoring applied to the class during its development<\/strong>.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And then at some point it was time to write <strong>the second Web Service<\/strong>.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, well, and now what?\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We didn&#8217;t have very clear ideas about what parts would be common to all Web Services, if and what would have been the common processing scheme for each Web Service function, and so on. So, we simply started writing the second Web Service with TDD.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Once again, the result was very satisfying. Now we had two Web Service classes whose design had emerged directly from their tests. It was time to do some more refactoring, even outside of the class just written.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We noticed that, between the two implementations, we had some code that could be shared<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" data-target->DRY<\/a><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">),<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> with a level of abstraction minimally higher than that of the two separate codes. Hence, we introduced the abstract WebService class, which exposed some protected methods, for the use and consumption of the two Web Services.<\/span><\/div>\n<p>[\/et_pb_text][et_pb_image src=&#8221;https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/2.jpg&#8221; align_tablet=&#8221;center&#8221; align_phone=&#8221;&#8221; align_last_edited=&#8221;on|desktop&#8221; admin_label=&#8221;FirstWebServiceTest&#8221; _builder_version=&#8221;4.9.10&#8243;][\/et_pb_image][et_pb_text admin_label=&#8221;And what about the tests?&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>And what about the tests?<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No, we haven&#8217;t forgotten them. The tests continued to probe the two classes, without noticing anything. But this is refactoring, isn&#8217;t it? Modify the implementation of a class while keeping its behavior unchanged.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Since the tests verify the behavior of a class and not its implementation, <strong>the tests represented our spy to check that nothing breaks during refactoring<\/strong>.<\/span><\/div>\n<div><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This is a critical point, often underestimated. Several times I was asked:<\/span> <span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">&#8220;How<\/span><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> can we test this private method?&#8221;. Well, the question contains an intrinsic error: if I need to test a private method, it means that I need to test the private implementation of another public method.<\/span><\/div>\n<div><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">But this would mean to tie the implementation of the class together with its tests.\u00a0<\/span><\/div>\n<div>\u00a0<\/div>\n<div>\n<p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, we had come to have our first two Web Services with a very simple abstract class that shared a small piece of code. After a while, it was time to write <strong>the third Web Service<\/strong>, this time having some infrastructure ready.<\/span><\/p>\n<p>But, as you can guess, it&#8217;s not all peaches and cream. Another trap is lurking.<\/p>\n<\/div>\n<p>[\/et_pb_text][et_pb_divider show_divider=&#8221;off&#8221; _builder_version=&#8221;3.12&#8243;][\/et_pb_divider][et_pb_text admin_label=&#8221;Mind the trap&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>Mind the trap.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">One might think:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">&#8220;The<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> code I put into the abstract class is already common to two other Web Services tested. I don&#8217;t need to write the tests that verify the same code also for the third Web Service: it would be a duplication\u201d.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And here you go.\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>This is the best way to fall into the trap<\/strong>, since:<\/span><\/div>\n<div>\u00a0<\/div>\n<ol class=\"listtype-number listindent1 list-number1\" start=\"1\">\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">this assumption is based on the knowledge of the implementation of the three Web Services, which, as we have seen, is not the correct way to interpret the automatic tests. What if tomorrow, following a refactoring, that portion of common code would stop performing the functionality we decided not to test? <strong>That functionality would fail, and we wouldn&#8217;t even notice it<\/strong>;<\/span><\/li>\n<li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the fact that the other two Web Services, today, must have the same behavior as the third one<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(with<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> regard to the part expressed by the common code), does not necessarily have to be valid tomorrow. Tomorrow we may want to change the tests that model that behavior in the first two Web Services, make the code common so that they pass and break the behavior of the third Web Service that was expected to behave as before.<\/span><\/li>\n<\/ol>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>But this would lead to duplicate the test code, right?<\/strong> In fact, i<\/span><span class=\"thread-926213475516675572291765 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">f there is duplication in the code that tests the same behavior on three different Web Services, it means that the test code must be refactored and made common. The tests also need to be easily maintained and extended, so they must be continuously refactored and kept clean.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Obviously, <strong>the more code we have<\/strong><\/span><strong> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">ready <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(within<\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong> the infrastructure), the more tests will pass immediately<\/strong>, without writing a single line of production code<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(if<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> we want, we can see it as a measure of the actual contribution of our infrastructure in terms of development efficiency).<\/span><\/div>\n<p>[\/et_pb_text][et_pb_image src=&#8221;https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/3.jpg&#8221; align_tablet=&#8221;center&#8221; align_phone=&#8221;&#8221; align_last_edited=&#8221;on|desktop&#8221; admin_label=&#8221;tabella 3&#8243; _builder_version=&#8221;3.23&#8243;][\/et_pb_image][et_pb_text admin_label=&#8221;not bad&#8230;&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">So we wrote the third Web Service, with all its tests, and after writing it, another piece of infrastructure emerged, which could benefit all future Web Services.<\/span><\/div>\n<div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">The continuous design process has continued for five years, to date, and has reached the point where the WebService class contains the template that each function of each Web Service specializes, through the Command design pattern, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">that emerged as a product of the refactoring.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Not bad, considering that in many cases it is difficult even to simply add functionality to a class for five years, even without the addition of inheritors.<\/span><\/div>\n<p>[\/et_pb_text][et_pb_divider show_divider=&#8221;off&#8221; _builder_version=&#8221;3.12&#8243;][\/et_pb_divider][et_pb_text admin_label=&#8221;Strange case of software design.&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>Strange case of software design.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">At this point you may have some doubts: what about the UML diagrams? The software architects? Does everything disappear?<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No, no. Absolutely not. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img decoding=\"async\" class=\"\" title=\"open hands\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f450.png?version=3.1.2\" alt=\"open hands\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\udc50\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">What we are trying to do is to <\/span><strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">minimize <\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>the architectural choices we need to make at the initial stage<\/strong>. Once we have defined some architectural choices, we try as far as possible to ensure that the software ignores them. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" class=\"\" title=\"upside-down face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f643.png?version=3.1.2\" alt=\"upside-down face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude43\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Okay, it may seem strange, but perhaps it makes sense if we think that what we usually call architectural choices are actually technological choices.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And the best way to create software that is difficult to maintain and evolve is to create it based on the technologies with which it interfaces.<\/span><\/div>\n<div>\u00a0<\/div>\n<blockquote>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">&#8220;A good architect maximizes the number of decisions not made&#8221; &#8211;\u00a0<strong>Uncle Bob<\/strong><\/span><strong> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(Robert<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> C. Martin).<\/span><\/strong><\/div>\n<\/blockquote>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We use diagrams almost daily, and here lies the difference: there is no design phase in which the architect thinks about all the classes that will be written, prepares the UML, and the team implements them.\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>The diagrams have the sole purpose of facilitating communication<\/strong>: when words are not enough to represent a concept, you go to the blackboard, you make a simple diagram that represents the immediate development to be done, you do it and then you delete the diagram.<\/span><\/div>\n<div>\u00a0<\/div>\n<blockquote>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u201cWorking software over comprehensive documentation\u201d &#8211; <strong>Agile Manifesto.<\/strong><\/span><\/div>\n<\/blockquote>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This approach has two advantages: \u00a0there are no diagrams to keep aligned with the code, and the code becomes the only reference to understand its architecture, so it will necessarily be clear.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this way, the teams develop the design as a continuous process, part of the development itself, carried out by the team that is also in charge of coaching the most inexperienced people, so that they can soon make their contribution. After all, what better architect than those who change, extend, and evolve software every day?<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Remember the principle from which we started? And that a software is not like a bridge?\u00a0<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, here we go. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" class=\"\" title=\"smiling face with open mouth &amp; smiling eyes\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f604.png?version=3.1.2\" alt=\"smiling face with open mouth &amp; smiling eyes\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude04\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div>\n<p>[\/et_pb_text][et_pb_divider show_divider=&#8221;off&#8221; _builder_version=&#8221;3.12&#8243;][\/et_pb_divider][et_pb_text admin_label=&#8221;Conclusions.&#8221; _builder_version=&#8221;4.9.10&#8243;]<\/p>\n<div>\n<h2>Conclusions.<\/h2>\n<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, guys. Let&#8217;s do a little recap.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this article, we have seen <strong>how the architecture of our software emerges through a scale-up approach rather than upfront design<\/strong>.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>TDD and refactoring<\/strong> are fundamental tools to allow the design to emerge. In particular, the tests are fundamental in order to refactor, which in turn is fundamental to be able to bring out the design while keeping the architecture both solid and extensible. And of course, we can&#8217;t forget Continuous Integration (otherwise who would be there to run the tests? <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img decoding=\"async\" class=\"\" title=\"slightly smiling face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f642.png?version=3.1.2\" alt=\"slightly smiling face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude42\" \/>).<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We also focused on<strong> a few traps we typically encounter when we are going to evolve software using TDD<\/strong>, and how to avoid them.<\/span><\/div>\n<div><span class=\"thread-937033609872338483127090 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Finally, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">we have seen <strong>how the emergent design is not the negation of architecture, but is a different way of conceiving it,<\/strong> which forces the software to be soft-ware.<\/span><\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In fact, <\/span><span class=\"thread-033610506035502602044755 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">software easily subject to architectural evolutions will also be software<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> on which it&#8217;s easy to do requirements changes or additions. And having software that easily evolves its architecture makes it natively keen to change and evolve following your needs in a smarter, easier, and safer way.<\/span><\/div>\n<div>\u00a0<\/div>\n<div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u2026And If you want to learn more about emergent design, share your thoughts below. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" class=\"\" title=\"backhand index pointing down\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f447.png?version=3.1.2\" alt=\"backhand index pointing down\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\udc47\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><span style=\"color: #00b7f1;\"><strong>#stayimagicle<\/strong><\/span><\/div>\n<p>[\/et_pb_text][et_pb_sidebar area=&#8221;et_pb_widget_area_2&#8243; _builder_version=&#8221;3.12&#8243; custom_margin=&#8221;0px|||&#8221; custom_padding=&#8221;0px|||&#8221;][\/et_pb_sidebar][et_pb_comments show_count=&#8221;off&#8221; module_id=&#8221;imaPostComments&#8221; _builder_version=&#8221;3.16&#8243; header_level=&#8221;h2&#8243; header_text_color=&#8221;#bd557c&#8221; form_field_text_align=&#8221;left&#8221; form_field_font_size=&#8221;14px&#8221; custom_button=&#8221;on&#8221; button_text_size=&#8221;12px&#8221; button_text_color=&#8221;#ffffff&#8221; button_bg_color=&#8221;#1bbbe9&#8243; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;0px&#8221; button_letter_spacing=&#8221;1px&#8221; button_font=&#8221;VAGRoundedStd-Light|||on|||||&#8221; button_use_icon=&#8221;off&#8221; button_alignment=&#8221;left&#8221; text_orientation=&#8221;left&#8221; max_width=&#8221;90%&#8221; max_width_tablet=&#8221;&#8221; max_width_phone=&#8221;&#8221; max_width_last_edited=&#8221;on|desktop&#8221; module_alignment=&#8221;center&#8221; custom_margin=&#8221;50px||0px|&#8221; custom_margin_tablet=&#8221;&#8221; custom_margin_phone=&#8221;&#8221; custom_margin_last_edited=&#8221;on|desktop&#8221; custom_padding=&#8221;0px||0px|&#8221; header_font_size_tablet=&#8221;51&#8243; header_line_height_tablet=&#8221;2&#8243; custom_css_submit_button=&#8221;padding:6px 30px 4px 30px!important;||&#8221; button_border_color_hover=&#8221;#ffffff&#8221; button_border_radius_hover=&#8221;0px&#8221; button_bg_color_hover=&#8221;#00b996&#8243; saved_tabs=&#8221;all&#8221; button_text_size__hover_enabled=&#8221;off&#8221; button_one_text_size__hover_enabled=&#8221;off&#8221; button_two_text_size__hover_enabled=&#8221;off&#8221; button_text_color__hover_enabled=&#8221;off&#8221; button_one_text_color__hover_enabled=&#8221;off&#8221; button_two_text_color__hover_enabled=&#8221;off&#8221; button_border_width__hover_enabled=&#8221;off&#8221; button_one_border_width__hover_enabled=&#8221;off&#8221; button_two_border_width__hover_enabled=&#8221;off&#8221; button_border_color__hover_enabled=&#8221;on&#8221; button_border_color__hover=&#8221;#ffffff&#8221; button_one_border_color__hover_enabled=&#8221;off&#8221; button_two_border_color__hover_enabled=&#8221;off&#8221; button_border_radius__hover_enabled=&#8221;on&#8221; button_border_radius__hover=&#8221;0px&#8221; button_one_border_radius__hover_enabled=&#8221;off&#8221; button_two_border_radius__hover_enabled=&#8221;off&#8221; button_letter_spacing__hover_enabled=&#8221;off&#8221; button_one_letter_spacing__hover_enabled=&#8221;off&#8221; button_two_letter_spacing__hover_enabled=&#8221;off&#8221; button_bg_color__hover_enabled=&#8221;on&#8221; button_bg_color__hover=&#8221;#00b996&#8243; button_one_bg_color__hover_enabled=&#8221;off&#8221; button_two_bg_color__hover_enabled=&#8221;off&#8221;][\/et_pb_comments][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn why and how the architecture of software should emerge through a scale-up approach rather than upfront design, and how Imagicle self-organizing teams allow the design to emerge.<\/p>\n","protected":false},"author":33,"featured_media":17965,"template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"<p>[et_pb_section fb_built=\"1\" _builder_version=\"3.21.1\" background_color=\"#1bbbe9\" use_background_color_gradient=\"on\" background_image=\"https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/pop.png\" custom_margin=\"0px|||\" custom_padding=\"0px||10px|\"][et_pb_row _builder_version=\"3.12\"][et_pb_column type=\"1_2\" _builder_version=\"3.0.47\"][et_pb_code module_id=\"imaAuthorAvatar\" _builder_version=\"3.0.92\" global_module=\"1189\" saved_tabs=\"all\" locked=\"off\"][avatar][\/et_pb_code][et_pb_post_title title=\"off\" categories=\"off\" comments=\"off\" featured_image=\"off\" text_color=\"light\" admin_label=\"Author and data\" _builder_version=\"3.0.92\" title_font=\"|||on|||||\" meta_font=\"|||on|||||\" custom_margin=\"||0px|\" custom_padding=\"||0px|\"][\/et_pb_post_title][et_pb_post_title meta=\"off\" featured_image=\"off\" text_color=\"light\" _builder_version=\"3.9\" title_text_color=\"#ffffff\" title_font_size=\"42px\" custom_margin=\"||0px|\" custom_padding=\"||0px|\"][\/et_pb_post_title][et_pb_divider color=\"#ffffff\" _builder_version=\"3.2\" max_width=\"40%\" custom_margin=\"||0px|\" custom_padding=\"||0px|\"][\/et_pb_divider][et_pb_post_title title=\"off\" author=\"off\" date=\"off\" comments=\"off\" featured_image=\"off\" text_color=\"light\" admin_label=\"Category\" _builder_version=\"3.0.92\" title_font=\"||||||||\" meta_font=\"|||on|||||\" custom_margin=\"0px|||\" custom_padding=\"0px|||\"][\/et_pb_post_title][\/et_pb_column][et_pb_column type=\"1_2\" _builder_version=\"3.0.47\"][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"3.0.90\" background_color=\"#f2f2f2\" custom_margin=\"0px||0px|\" custom_padding=\"0px||0px|\"][et_pb_row custom_padding=\"0px||0px|\" custom_margin=\"0px||0px|\" padding_top_1=\"0px\" padding_bottom_1=\"0px\" _builder_version=\"3.0.92\"][et_pb_column type=\"2_3\" _builder_version=\"3.0.47\"][et_pb_text _builder_version=\"3.21.1\" header_font=\"||||||||\" header_2_font=\"||||||||\" header_2_font_size_tablet=\"22px\" header_2_font_size_phone=\"25px\" header_2_font_size_last_edited=\"on|phone\" header_2_letter_spacing=\"1px\" custom_margin=\"10px||10px|\" custom_margin_tablet=\"||-10px|\" custom_margin_last_edited=\"on|desktop\"]<\/p><h2><span style=\"color: #999999;\">Want more awesome content? Sign up for our newsletter.<\/span><\/h2><p>[\/et_pb_text][\/et_pb_column][et_pb_column type=\"1_3\" _builder_version=\"3.0.47\"][et_pb_button button_url=\"http:\/\/blog.imagicle.com\/subscribe\" button_text=\"SUBSCRIBE\" _builder_version=\"3.16\" custom_button=\"on\" button_text_size=\"19px\" button_text_color=\"#ffffff\" button_bg_color=\"#00b7f1\" button_border_width=\"1px\" button_border_color=\"#ffffff\" button_use_icon=\"off\" background_layout=\"dark\" custom_margin=\"15px||10px|\" custom_margin_tablet=\"0px||20px|\" custom_margin_last_edited=\"on|desktop\" custom_padding=\"|30px||30px\" button_bg_color_hover=\"#0f8acb\" button_text_size__hover_enabled=\"off\" button_one_text_size__hover_enabled=\"off\" button_two_text_size__hover_enabled=\"off\" button_text_color__hover_enabled=\"off\" button_one_text_color__hover_enabled=\"off\" button_two_text_color__hover_enabled=\"off\" button_border_width__hover_enabled=\"off\" button_one_border_width__hover_enabled=\"off\" button_two_border_width__hover_enabled=\"off\" button_border_color__hover_enabled=\"off\" button_one_border_color__hover_enabled=\"off\" button_two_border_color__hover_enabled=\"off\" button_border_radius__hover_enabled=\"off\" button_one_border_radius__hover_enabled=\"off\" button_two_border_radius__hover_enabled=\"off\" button_letter_spacing__hover_enabled=\"off\" button_one_letter_spacing__hover_enabled=\"off\" button_two_letter_spacing__hover_enabled=\"off\" button_bg_color__hover_enabled=\"on\" button_bg_color__hover=\"#0f8acb\" button_one_bg_color__hover_enabled=\"off\" button_two_bg_color__hover_enabled=\"off\"][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\"1\" _builder_version=\"3.0.90\" background_color=\"#ffffff\" custom_padding=\"63px|0px|0px|0px\"][et_pb_row custom_padding=\"0px||0px|\" custom_margin=\"0px|||\" background_color_1=\"#ffffff\" padding_1_last_edited=\"on|phone\" _builder_version=\"3.9\" background_size=\"initial\" background_position=\"top_left\" background_repeat=\"repeat\"][et_pb_column type=\"4_4\" _builder_version=\"3.0.47\"][et_pb_divider show_divider=\"off\" height=\"50px\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Intro\" _builder_version=\"3.21.1\" header_font=\"||||||||\" header_line_height=\"1.2em\"]<\/p><div><h2 data-usually-unique-id=\"728081706250350457246144\"><span style=\"color: #00568e;\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\"The best architectures, requirements, and designs emerge from self-organized teams\". <\/span>This is one of the <span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" style=\"color: #00568e;\" href=\"https:\/\/agilemanifesto.org\/principles.html\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/agilemanifesto.org\/principles.html\">Principles behind the Agile Manifesto<\/a><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> I've briefly discussed in a <\/span><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" style=\"color: #00568e;\" href=\"https:\/\/blog.imagicle.com\/large-scale-scrum-framework\/\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/blog.imagicle.com\/large-scale-scrum-framework\/\">previous post<\/a><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, talking about Sprint Planning. But it turns out to be a very useful point here today, as we'll look at <strong>what elements we can leverage to create shock-proof software architecture and how Imagicle self-organizing teams allow the design to emerge<\/strong>.<\/span><\/span><\/h2><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" height=\"50px\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Bridges\" _builder_version=\"3.21.1\"]<\/p><div><h1><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">Building a bridge. The problems with the upfront design.<\/span><\/h1><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">If you started working in the software industry some time ago, probably you've already experienced what I'm talking about, and maybe you'll agree that <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>the way we used to build software was similar to the way constructors use to build bridges<\/b>, that is:<\/span><\/div><div>\u00a0<\/div><ol class=\"listtype-number listindent1 list-number1\" start=\"1\"><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">define the requirements;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">make arrangements with the client about what, how and when it will be done;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">design the solution;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">implement the solution;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">deliver it to the client.<\/span><\/li><\/ol><p>[\/et_pb_text][et_pb_image src=\"https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/iStock-1133327900.jpg\" align=\"center\" admin_label=\"tabella 1\" _builder_version=\"3.21.1\" max_width=\"60%\"][\/et_pb_image][et_pb_text admin_label=\"Basically, the Waterfall development methodology.\" _builder_version=\"3.21.1\"]<\/p><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Basically, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>the Waterfall development methodology<\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">For a bridge, this approach still works very well. And this is because the construction of a bridge typically respects these characteristics:<\/span><\/div><ol class=\"listtype-number listindent1 list-number1\" start=\"1\"><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">it has precise requirements<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(what<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> should be done, for how long it should last, etc.);<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the requirements do not change during construction<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(it<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> is rather difficult to imagine that the client, with work in progress, says something like:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">\"Listen,<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> could you get it 1 km further downstream?\");<\/span><\/li><li><span class=\"thread-336529786373431615933940 attrcomment attrcommentfirst thread-336529786373431615933940-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">doesn\u2019t need to be developed<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> for future modifications or extensions;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">if there are any doubts, they are known: i.e., I don't know how many kg\/m<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><sup>2<\/sup><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> that foundation can hold, so I know I have to to find out;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">building the bridge is much more expensive than designing it.<\/span><\/li><\/ol><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Furthermore, realizing a wrong design choice would imply going back to some phases of the construction that could be impossible to modify<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(what<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> if, after starting the construction of the road, you realized that you needed an extra pillar?).<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Obviously, this is not an absolute truth: even a bridge may be subject to modifications during construction, or future renovations. However, they will be expensive, and their cost will be difficult to predict at the time of construction. Sometimes, rather than renovating an old bridge to make it more modern and capable of driving more cars, it's more convenient to rebuild it from scratch.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We can say, in short, that bridges follow a construction method that optimizes the initial realization, to the detriment of future developments. Now, this can be considered an excellent system for making hardware<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(and<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> I would say that a bridge can be regarded as a nice piece of hardware), b<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\">ut we produce software, right? <\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\">Are we sure we can apply the same system <\/span><span class=\"thread-991654311016764008433424 attrcomment attrcommentfirst thread-991654311016764008433424-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"font-size: 18px;\"><span class=\"comment-extra-inner-span\">to it?<\/span><\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><br \/>Well, let's see which of the five factors mentioned above are typically respected in a software product.<\/span><\/div><div>\u00a0<\/div><div><h2 data-usually-unique-id=\"446996603682741431533069\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">1. Precise requirements.<\/span><\/h2><\/div><div><p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Nothing like it. Usually, the requirements become clear as the product takes shape. And since we prefer to make our users happy rather than tell them<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">\"You<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> signed for this 6 months ago\", the continuous feedback from users is much more important to us than the initial negotiation of the requirements.<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><i>Customer<\/i><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><i> collaboration over contract negotiation - <\/i><\/span><strong><a href=\"https:\/\/agilemanifesto.org\/\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Agile Manifesto<\/span><\/a><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">)<i>.<\/i><\/span><\/p><p>\u00a0<\/p><\/div><div><h2 data-usually-unique-id=\"278461461022886535722289\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">2. Stable requirements.<\/span><\/h2><\/div><div><p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No: it happens all the time that some requirements change during the development, new ones come out or that which at first seemed indispensable end up being excluded. The market changes quickly, the needs change quickly, so the software must change accordingly<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><i>Responding<\/i><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><i> to change over following a plan <\/i>- Agile Manifesto<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">).<\/span><\/p><p>\u00a0<\/p><\/div><div><h2 data-usually-unique-id=\"969369688642240640873490\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">3. Changes in progress.<\/span><\/h2><\/div><div><p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Modifications and extensions are a daily occurrence when working on a software<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(think<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> of all the news included in each <\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" href=\"https:\/\/www.imagicle.com\/en\/resources\/roadmap\/#ReleaseTab5\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/www.imagicle.com\/en\/resources\/roadmap\/#ReleaseTab5\">release <\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">of our products <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"winking face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f609.png?version=3.1.2\" alt=\"winking face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude09\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">).<\/span><\/p><p>\u00a0<\/p><\/div><div><h2 data-usually-unique-id=\"167502971369955482266547\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">4. Doubts.<\/span><\/h2><\/div><div><p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We are aware from the beginning of not knowing some aspects. But we discover other flaws the moment we encounter them. A bit like saying: if you know you don't know, feel lucky\u2026the problem is when you don't know you don't know <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"slightly smiling face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f642.png?version=3.1.2\" alt=\"slightly smiling face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude42\" \/><\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(little<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> spoiler, we'll see shortly that it's better not to try to solve even the doubts we have in advance!).<\/span><\/p><p>\u00a0<\/p><\/div><div><h2 data-usually-unique-id=\"790367233404883406111832\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">5. High modification cost.<\/span><\/h2><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This is the only point that could be common with the bridge, and it's the one from which we want to stay further away. If we happen to have a software that should be redone rather than extended, it would mean <\/span><span class=\"thread-417755614910678642466844 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">that <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the software became unmantainable, and we should understand what went wrong to avoid this situation in the future.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">So, apparently, the upfront design, which is well suited for building bridges, doesn't work very well with software products.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>Designing the entire product before starting its development, in fact, has a number of easily identifiable disadvantages<\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">. Creating an hyper-extensible and super-abstract product is an expensive exercise that risks creating unnecessarily complex abstractions<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/KISS_principle\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/KISS_principle\">KISS<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">);<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> the extensibility on which the investment was made could prove to be useless or excessive if we found out that a lower or much simpler level of abstraction was sufficient<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\">YAGNI<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">);<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> and, in any case, it is complicated to predict what the requirements will be and to understand whether extensions will be needed and at what stage of development. Even if you try to do it, it's very easy to go wrong, ending up wasting a great deal of time and money.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">The solution is there: <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>let the design emerge.\u00a0<\/b><\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Let's see how.<\/span><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" height=\"50px\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Emergent design.\" _builder_version=\"3.21.1\"]<\/p><div><h1 data-usually-unique-id=\"065377984740013963531278\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">Emergent design.<\/span><\/h1><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In his last <\/span><strong><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><a class=\"attrlink\" href=\"https:\/\/blog.imagicle.com\/test-diven-development\/\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/blog.imagicle.com\/test-diven-development\/\">post<\/a><\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, Riccardo talked about <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><b>TDD <\/b><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">as a tool to make development more efficient, guarantee a high level of software quality through the Red-Green-Refactor cycle and obtain a suite of automated tests performed by our Continuous Integration system at each software build.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>Well, TDD, Refactoring, and Continuous Integration are the exact ingredients we need to make the design emerge spontaneously<\/strong>. Now let's see how this translates into practice.<\/span><\/div><div>\u00a0<\/div><div><h2 data-usually-unique-id=\"797104352914078145951081\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">A real use case: the Imagicle ApplicationSuite Web Services.<\/span><\/h2><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">To date,<strong><a href=\"https:\/\/www.imagicle.com\/en\/suite\/cloud\/\" target=\"_blank\" rel=\"noopener noreferrer\"> Imagicle ApplicationSuite<\/a> <\/strong>exposes dozens of REST Web Services. Some form public APIs, useful for users to integrate the suite with third-party products<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(such<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> as those for <\/span><span class=\"thread-145262813282702087234563 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">controlling recordings<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> or sending faxes). But to get to dozens of Web Services, we had to start from the first one. And we did it back in 2014, when we wrote the first REST Web Service using WCF. We knew it would be the first in a long series: <strong><a href=\"https:\/\/blog.imagicle.com\/agile-software-development\/\" target=\"_blank\" rel=\"noopener noreferrer\">the Agicle era<\/a><\/strong> had just begun, we had recently introduced the use of TDD; the most natural thing was writing a Web Service as a simple C# class, written in TDD, instead of a Web Service in ASMX technology.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><br \/>A good software architect could have said:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">\"Well,<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> since from now on we will write a lot of classes like this, let's think about how to structure it, and then we think of a framework that makes it easy and fast to write similar classes.\"\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this way, <\/span><span class=\"thread-475163425727733360156405 attrcomment attrcommentfirst thread-475163425727733360156405-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">we would have designed the abstraction up front<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, with the difficulties seen before.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">But as you imagine, it didn't happen that way.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We knew we should get a class, but we didn't know much else about how that class should have been once it was finished. So, we wrote a test, <\/span><span class=\"thread-250219403767472502173181 attrcomment attrcommentfirst thread-250219403767472502173181-first author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><span class=\"comment-extra-inner-span\">we made it pass<\/span><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">, we wrote another one, and so on with the Red-Green-Refactor cycle, till we ended up having exactly what we needed: <strong>a class that represented a functioning Web Service written in TDD<\/strong> .\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No more and no less.<\/span><\/div><p>[\/et_pb_text][et_pb_image src=\"https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/1.jpg\" align=\"center\" admin_label=\"first web service\" _builder_version=\"3.21.1\"][\/et_pb_image][et_pb_text admin_label=\"After the first Web Service...\" _builder_version=\"3.21.1\"]<\/p><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">After the first Web Service, we were satisfied with the result: we had a class written entirely in TDD, with a suite of tests performed by the Continuous Integration system that ensured its correct functioning and allowed us to continuously refactor the product code, keeping it always clean, clear and easily editable.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Plus, having written the class in TDD, it turns out to be natively compliant with the Single Responsibility Principle: the Web Service makes the Web Service; it doesn't have to do also business logic and persistence.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Finally, to be able to write unit tests, we used Dependency Injection, so we could pass mock implementations in the tests. Basically we can say that, even at the level of a single class, <strong>the design complying with the SOLID principles emerged spontaneously from the tests that modeled its behavior, as well as from the continuous refactoring applied to the class during its development<\/strong>.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And then at some point it was time to write <strong>the second Web Service<\/strong>.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, well, and now what?\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We didn't have very clear ideas about what parts would be common to all Web Services, if and what would have been the common processing scheme for each Web Service function, and so on. So, we simply started writing the second Web Service with TDD.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Once again, the result was very satisfying. Now we had two Web Service classes whose design had emerged directly from their tests. It was time to do some more refactoring, even outside of the class just written.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We noticed that, between the two implementations, we had some code that could be shared<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(<\/span><span class=\"attrlink url author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\"><a class=\"attrlink\" href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noreferrer nofollow noopener\" data-target-href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">DRY<\/a><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">),<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> with a level of abstraction minimally higher than that of the two separate codes. Hence, we introduced the abstract WebService class, which exposed some protected methods, for the use and consumption of the two Web Services.<\/span><\/div><p>[\/et_pb_text][et_pb_image src=\"https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/2.jpg\" admin_label=\"FirstWebServiceTest\" _builder_version=\"3.21.1\"][\/et_pb_image][et_pb_text admin_label=\"And what about the tests?\" _builder_version=\"3.21.1\"]<\/p><div><h2 data-usually-unique-id=\"637020398905515976230974\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">And what about the tests?<\/span><\/h2><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No, we haven't forgotten them. The tests continued to probe the two classes, without noticing anything. But this is refactoring, isn't it? Modify the implementation of a class while keeping its behavior unchanged.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Since the tests verify the behavior of a class and not its implementation, <strong>the tests represented our spy to check that nothing breaks during refactoring<\/strong>.<\/span><\/div><div><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This is a critical point, often underestimated. Several times I was asked:<\/span> <span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">\"How<\/span><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> can we test this private method?\". Well, the question contains an intrinsic error: if I need to test a private method, it means that I need to test the private implementation of another public method.<\/span><\/div><div><span class=\"thread-492251341388703420729990 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">But this would mean to tie the implementation of the class together with its tests.\u00a0<\/span><\/div><div>\u00a0<\/div><div><p><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, we had come to have our first two Web Services with a very simple abstract class that shared a small piece of code. After a while, it was time to write <strong>the third Web Service<\/strong>, this time having some infrastructure ready.<\/span><\/p><p>But, as you can guess, it's not all peaches and cream. Another trap is lurking.<\/p><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Mind the trap\" _builder_version=\"3.21.1\"]<\/p><div><h1 data-usually-unique-id=\"335329727660924288968782\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">Mind the trap.<\/span><\/h1><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">One might think:<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-quot\">\"The<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> code I put into the abstract class is already common to two other Web Services tested. I don't need to write the tests that verify the same code also for the third Web Service: it would be a duplication\u201d.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And here you go.\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>This is the best way to fall into the trap<\/strong>, since:<\/span><\/div><div>\u00a0<\/div><ol class=\"listtype-number listindent1 list-number1\" start=\"1\"><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">this assumption is based on the knowledge of the implementation of the three Web Services, which, as we have seen, is not the correct way to interpret the automatic tests. What if tomorrow, following a refactoring, that portion of common code would stop performing the functionality we decided not to test? <strong>That functionality would fail, and we wouldn't even notice it<\/strong>;<\/span><\/li><li><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">the fact that the other two Web Services, today, must have the same behavior as the third one<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(with<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> regard to the part expressed by the common code), does not necessarily have to be valid tomorrow. Tomorrow we may want to change the tests that model that behavior in the first two Web Services, make the code common so that they pass and break the behavior of the third Web Service that was expected to behave as before.<\/span><\/li><\/ol><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>But this would lead to duplicate the test code, right?<\/strong> In fact, i<\/span><span class=\"thread-926213475516675572291765 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">f there is duplication in the code that tests the same behavior on three different Web Services, it means that the test code must be refactored and made common. The tests also need to be easily maintained and extended, so they must be continuously refactored and kept clean.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Obviously, <strong>the more code we have<\/strong><\/span><strong> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">ready <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(within<\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong> the infrastructure), the more tests will pass immediately<\/strong>, without writing a single line of production code<\/span> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(if<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> we want, we can see it as a measure of the actual contribution of our infrastructure in terms of development efficiency).<\/span><\/div><p>[\/et_pb_text][et_pb_image src=\"https:\/\/www.imagicle.com\/wp-content\/uploads\/blog\/2019\/08\/3.jpg\" admin_label=\"tabella 3\" _builder_version=\"3.21.1\"][\/et_pb_image][et_pb_text admin_label=\"not bad...\" _builder_version=\"3.21.1\"]<\/p><div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">So we wrote the third Web Service, with all its tests, and after writing it, another piece of infrastructure emerged, which could benefit all future Web Services.<\/span><\/div><div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">The continuous design process has continued for five years, to date, and has reached the point where the WebService class contains the template that each function of each Web Service specializes, through the Command design pattern, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">that emerged as a product of the refactoring.<\/span><\/div><div>\u00a0<\/div><div><span class=\"thread-260546976018142872149593 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Not bad, considering that in many cases it is difficult even to simply add functionality to a class for five years, even without the addition of inheritors.<\/span><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Strange case of software design.\" _builder_version=\"3.21.1\"]<\/p><div><h1 data-usually-unique-id=\"191474188337398478666174\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">Strange case of software design.<\/span><\/h1><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">At this point you may have some doubts: what about the UML diagrams? The software architects? Does everything disappear?<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">No, no. Absolutely not. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"open hands\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f450.png?version=3.1.2\" alt=\"open hands\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\udc50\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">What we are trying to do is to <\/span><strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">minimize <\/span><\/strong><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>the architectural choices we need to make at the initial stage<\/strong>. Once we have defined some architectural choices, we try as far as possible to ensure that the software ignores them. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"upside-down face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f643.png?version=3.1.2\" alt=\"upside-down face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude43\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Okay, it may seem strange, but perhaps it makes sense if we think that what we usually call architectural choices are actually technological choices.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">And the best way to create software that is difficult to maintain and evolve is to create it based on the technologies with which it interfaces.<\/span><\/div><div>\u00a0<\/div><blockquote><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\"A good architect maximizes the number of decisions not made\" -\u00a0<strong>Uncle Bob<\/strong><\/span><strong> <span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z h-lparen\">(Robert<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> C. Martin).<\/span><\/strong><\/div><\/blockquote><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We use diagrams almost daily, and here lies the difference: there is no design phase in which the architect thinks about all the classes that will be written, prepares the UML, and the team implements them.\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>The diagrams have the sole purpose of facilitating communication<\/strong>: when words are not enough to represent a concept, you go to the blackboard, you make a simple diagram that represents the immediate development to be done, you do it and then you delete the diagram.<\/span><\/div><div>\u00a0<\/div><blockquote><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u201cWorking software over comprehensive documentation\u201d - <strong>Agile Manifesto.<\/strong><\/span><\/div><\/blockquote><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">This approach has two advantages: \u00a0there are no diagrams to keep aligned with the code, and the code becomes the only reference to understand its architecture, so it will necessarily be clear.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this way, the teams develop the design as a continuous process, part of the development itself, carried out by the team that is also in charge of coaching the most inexperienced people, so that they can soon make their contribution. After all, what better architect than those who change, extend, and evolve software every day?<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Remember the principle from which we started? And that a software is not like a bridge?\u00a0<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, here we go. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"smiling face with open mouth & smiling eyes\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f604.png?version=3.1.2\" alt=\"smiling face with open mouth & smiling eyes\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude04\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_text admin_label=\"Conclusions.\" _builder_version=\"3.21.1\"]<\/p><div><h1 data-usually-unique-id=\"015947788066310550839284\"><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\" style=\"color: #00b7f1;\">Conclusions.<\/span><\/h1><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Well, guys. Let's do a little recap.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In this article, we have seen <strong>how the architecture of our software emerges through a scale-up approach rather than upfront design<\/strong>.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><strong>TDD and refactoring<\/strong> are fundamental tools to allow the design to emerge. In particular, the tests are fundamental in order to refactor, which in turn is fundamental to be able to bring out the design while keeping the architecture both solid and extensible. And of course, we can't forget Continuous Integration (otherwise who would be there to run the tests? <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"slightly smiling face\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f642.png?version=3.1.2\" alt=\"slightly smiling face\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\ude42\" \/>).<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">We also focused on<strong> a few traps we typically encounter when we are going to evolve software using TDD<\/strong>, and how to avoid them.<\/span><\/div><div><span class=\"thread-937033609872338483127090 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">Finally, <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">we have seen <strong>how the emergent design is not the negation of architecture, but is a different way of conceiving it,<\/strong> which forces the software to be soft-ware.<\/span><\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">In fact, <\/span><span class=\"thread-033610506035502602044755 author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">software easily subject to architectural evolutions will also be software<\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"> on which it's easy to do requirements changes or additions. And having software that easily evolves its architecture makes it natively keen to change and evolve following your needs in a smarter, easier, and safer way.<\/span><\/div><div>\u00a0<\/div><div><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u2026And If you want to learn more about emergent design, share your thoughts below. <\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\"><img class=\"\" title=\"backhand index pointing down\" src=\"https:\/\/paper.dropboxstatic.com\/static\/img\/ace\/emoji\/1f447.png?version=3.1.2\" alt=\"backhand index pointing down\" width=\"25\" height=\"25\" data-emoji-ch=\"\ud83d\udc47\" \/><\/span><span class=\" author-d-1gg9uz65z1iz85zgdz68zmqkz84zo2qovvlz122zrz69zz71zx7z84zz71zsz84zg0z81zz72zyssnz75zdtz79zz84zz74zz83zmz87zz84zz87z\">\u00a0<\/span><\/div><div>\u00a0<\/div><div>\u00a0<\/div><div><span style=\"color: #00b7f1;\"><strong>#stayimagicle<\/strong><\/span><\/div><p>[\/et_pb_text][et_pb_divider show_divider=\"off\" _builder_version=\"3.12\"][\/et_pb_divider][et_pb_sidebar area=\"et_pb_widget_area_2\" _builder_version=\"3.12\" custom_margin=\"0px|||\" custom_padding=\"0px|||\"][\/et_pb_sidebar][et_pb_comments show_count=\"off\" module_id=\"imaPostComments\" _builder_version=\"3.16\" header_level=\"h2\" header_text_color=\"#bd557c\" header_font_size_tablet=\"51\" header_line_height_tablet=\"2\" form_field_text_align=\"left\" form_field_font_size=\"14px\" custom_button=\"on\" button_text_size=\"12px\" button_text_color=\"#ffffff\" button_bg_color=\"#1bbbe9\" button_border_width=\"0px\" button_border_radius=\"0px\" button_letter_spacing=\"1px\" button_font=\"VAGRoundedStd-Light|||on|||||\" button_use_icon=\"off\" button_alignment=\"left\" text_orientation=\"left\" max_width=\"90%\" max_width_last_edited=\"on|desktop\" module_alignment=\"center\" custom_margin=\"50px||0px|\" custom_margin_last_edited=\"on|desktop\" custom_padding=\"0px||0px|\" custom_css_submit_button=\"padding:6px 30px 4px 30px!important;||\" button_border_color_hover=\"#ffffff\" button_border_radius_hover=\"0px\" button_bg_color_hover=\"#00b996\" global_module=\"1244\" saved_tabs=\"all\" button_text_size__hover_enabled=\"off\" button_one_text_size__hover_enabled=\"off\" button_two_text_size__hover_enabled=\"off\" button_text_color__hover_enabled=\"off\" button_one_text_color__hover_enabled=\"off\" button_two_text_color__hover_enabled=\"off\" button_border_width__hover_enabled=\"off\" button_one_border_width__hover_enabled=\"off\" button_two_border_width__hover_enabled=\"off\" button_border_color__hover_enabled=\"on\" button_border_color__hover=\"#ffffff\" button_one_border_color__hover_enabled=\"off\" button_two_border_color__hover_enabled=\"off\" button_border_radius__hover_enabled=\"on\" button_border_radius__hover=\"0px\" button_one_border_radius__hover_enabled=\"off\" button_two_border_radius__hover_enabled=\"off\" button_letter_spacing__hover_enabled=\"off\" button_one_letter_spacing__hover_enabled=\"off\" button_two_letter_spacing__hover_enabled=\"off\" button_bg_color__hover_enabled=\"on\" button_bg_color__hover=\"#00b996\" button_one_bg_color__hover_enabled=\"off\" button_two_bg_color__hover_enabled=\"off\"]<\/p><p>[\/et_pb_comments][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>","_et_gb_content_width":"","inline_featured_image":false},"categories":[7018],"tags":[],"tax_people":[],"tax_blog":[112],"tax_labels":[533],"class_list":["post-11477","cpt_blog","type-cpt_blog","status-publish","has-post-thumbnail","hentry","category-cx-software-enterprise","tax_blog-agile-software-development","tax_labels-products-fr"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/cpt_blog\/11477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/cpt_blog"}],"about":[{"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/types\/cpt_blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/users\/33"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/media\/17965"}],"wp:attachment":[{"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/media?parent=11477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/categories?post=11477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/tags?post=11477"},{"taxonomy":"tax_people","embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/tax_people?post=11477"},{"taxonomy":"tax_blog","embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/tax_blog?post=11477"},{"taxonomy":"tax_labels","embeddable":true,"href":"https:\/\/www.imagicle.com\/en\/wp-json\/wp\/v2\/tax_labels?post=11477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}