{"componentChunkName":"component---src-templates-generic-template-js","path":"/lectures/lecture9-bdd","webpackCompilationHash":"041090671d318979d692","result":{"data":{"markdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"h2","properties":{"id":"motivating-behavioral-driven-design-bdd"},"children":[{"type":"element","tagName":"a","properties":{"href":"#motivating-behavioral-driven-design-bdd","ariaLabel":"motivating behavioral driven design bdd permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"Motivating Behavioral Driven Design (BDD)"}]},{"type":"text","value":"\n"},{"type":"comment","value":" Adapted from David Patterson and Armando Fox under CC-BY-SA-NC "},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Why do SW projects fail? Failing projects:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Don't do what customers want"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Or are late"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Or over budget "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Or are hard to maintain and evolve"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Or all of the above"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How do Agile processes help us avoid those problems? Recall that in an Agile process you:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Work closely and continuously with stakeholders to develop requirements, tests"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Maintain working prototype while deploying new features every iteration.\nIterations are typically 1 or 2 weeks instead of Waterfall's 5 major phases,\neach months long. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Check with stakeholders on what’s next, to validate building right thing"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Behavioral Driven Design (BDD) asks questions about behavior of an application\nbefore and during development to reduce miscommunication. BDD is really about\nhaving conversations (recall the emphasis on individuals and interactions in\nthe Agile Manifesto)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Individuals and interactions over processes and tools"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We translate those conversations into "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"user stories"}]},{"type":"text","value":", lightweight descriptions\nof how the application will be used. Those user stores can be translated into\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scenarios"}]},{"type":"text","value":" that in turn become automated "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"acceptance tests"}]},{"type":"text","value":". Recall that an\nacceptance test verifies that the SW satisfies the specifications/requirements."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"These stories, scenarios and tests describe the behavior of an application\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" its implementation. In contrast, TDD and unit tests describe the\nimplementation. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"user-stories"},"children":[{"type":"element","tagName":"a","properties":{"href":"#user-stories","ariaLabel":"user stories permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"User Stories"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"user story"}]},{"type":"text","value":" describes something that the user wants, written:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"as 1-3 sentences, "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"in plain language,"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"in collaboration with the user,"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"often on a 3x5 index card."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"User stories are often written in the Connextra format:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\"As a [kind of stakeholder]"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nI want to [do some task]"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nso that [some result or benefit].\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Why 3x5 cards? Non-threatening to all stakeholders, easy to (re)organize, easy to rewrite as we learn more during development."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"An example for our Film Explorer:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"As a user\nI want to click on a film\nso that I get more information."}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"User stories will play an important role in our Agile approaches. We will maintain a prioritized list (the \"product backlog\") of user stories to implement (with possibly 10s-100s of user stories). "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"smart-user-stories"},"children":[{"type":"element","tagName":"a","properties":{"href":"#smart-user-stories","ariaLabel":"smart user stories permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"S.M.A.R.T. user stories"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Specific "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Measurable"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Achievable"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Relevant"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Time-bound"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The combination of specific and measurable could be translated to \"testable\".\nWe aim to achieve (implement) each user story in one development iteration\n(i.e. sprint), typically two weeks. If a story will take (is taking) longer\nthan one iteration we should split it into sub-stories. That is we should\n\"time-bound\" each story. If development exceeds the time budget we should give\nup on the story, or split it into smaller stories."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Is our example user story SMART?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Definitely achievable and readily time-bound. Measurable in the sense that we\ncould imagine how to test. But both specific and not, and not clearly relevant."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How could we rewrite our story to be more specific and relevant?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"As a user\nI want to click on a film to get a plot summary and other details\nso that I can see if I will like the film"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Compared before, our user story is more specific and relevant to the\nstakeholder."}]},{"type":"text","value":"\n"},{"type":"comment","value":" 1. Hand out 3x5 cards\n1. Have students write two user stories for the Film Explorer application (write large)\n1. Query for examples (and tape to board to demonstrate use on a Kanban-style board) "},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"testable-user-stories"},"children":[{"type":"element","tagName":"a","properties":{"href":"#testable-user-stories","ariaLabel":"testable user stories permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"Testable User Stories"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Although we made our user story more specific, still more detail is needed to\nactually construct acceptance tests. To do so we can translate the story into a\nseries of testable "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scenarios"}]},{"type":"text","value":". A common format is (implemented in the Cucumber\n"},{"type":"element","tagName":"a","properties":{"href":"https://docs.cucumber.io/gherkin/"},"children":[{"type":"text","value":"Gherkin language"}]},{"type":"text","value":"):"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\"Given [a context],"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nWhen [an event happens],"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nThen [an outcome should occur].\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Refining our previous story as testable scenarios in this format:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Given a film summary is shown, \nwhen I click on the title,\nthen the detail view is shown with the plot overview and poster image,"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"and"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Given that the film detail is shown,\nwhen I click on the title,\nthen the summary view is shown."}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"These scenarios can be turned, nearly directly, into automated acceptance tests\nwith "},{"type":"element","tagName":"a","properties":{"href":"https://cucumber.io"},"children":[{"type":"text","value":"Cucumber"}]},{"type":"text","value":". The idea behind Cucumber is to create a\nmeeting point between developers and customers. The scenarios are not code so\nthat they can be understood by customer, but are sufficiently formalized to be\nexecuted automatically. A Cucumber test is composed of:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"Given"}]},{"type":"text","value":" steps represent state of world before event, the preconditions"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"When"}]},{"type":"text","value":" steps represent event, e.g. simulate user pushing a button "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"Then"}]},{"type":"text","value":" steps represent expected postconditions, the test expectations\nwith "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"And"}]},{"type":"text","value":" and "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"But"}]},{"type":"text","value":" extending any previous step."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"For example:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Given I open the url 'http://the/test/url'\nWhen I click on the element 'Jurassic World'\nThen I expect the element 'img[src=\"http://the/poster\"]' is visible"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The steps are mapped to functions that implement clicking, etc. with\narguments extracted with regular expressions. In this example, based on\n"},{"type":"element","tagName":"a","properties":{"href":"https://github.com/webdriverio/cucumber-boilerplate"},"children":[{"type":"text","value":"cucumber boilerplate"}]},{"type":"text","value":",\nthe quoted expressions with the URL, title, CSS selector, etc. are the\narguments. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Note that you don't have to use Cucumber to implement \"Given-When-Then\"-style\ntests. For simplicity, we will use code (and the Enzyme library) instead of\ntrying to incorporate Cucumber (although you could if you wanted to do so in\nyour project). Why? Cucumber brings non-trivial overhead (implementing\nfunctions for the different steps) in an already packed semester."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"bdd-perspectives"},"children":[{"type":"element","tagName":"a","properties":{"href":"#bdd-perspectives","ariaLabel":"bdd perspectives permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"BDD Perspectives"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A quote that resonated with me..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{"className":["blockquote"]},"children":[{"type":"text","value":"\nHaving conversations is more important than capturing conversations is more important than automating conversations\n"},{"type":"element","tagName":"footer","properties":{"className":["blockquote-footer"]},"children":[{"type":"element","tagName":"a","properties":{"href":"https://www.slideshare.net/lunivore/behavior-driven-development-11754474"},"children":[{"type":"text","value":"Liz Keough"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Recall that BDD is all about encouraging conversations with stakeholders!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"conversations-with-stakeholders-lo-fi-mockups"},"children":[{"type":"element","tagName":"a","properties":{"href":"#conversations-with-stakeholders-lo-fi-mockups","ariaLabel":"conversations with stakeholders lo fi mockups permalink","className":["anchor"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]},{"type":"text","value":"Conversations with stakeholders: Lo-fi mockups"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"SaaS apps often faces users, which inevitably leads to the challenge of how to\nget the customer to participate in UI design so that they are happy with the\nresult. Specifically, we are aiming to avoid WISBNWIW (What I said But Not What\nI Wanted). And we want to do so without actually building a prototype."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo-Fi mockups and storyboards, i.e. a pencil and paper drawing of the UI that\nshow how the UI changes based on user actions, can be very helpful. Think of it\nlike a movie storyboard, but non-linear."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"I think you will find Lo-Fi mockups have some real advantages compared to\njumping directly to HTML:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Lo-Fi mockups are less intimidating to nontechnical stakeholders"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Lo-Fi mockups are less likely to confuse nontechnical stakeholder (it looks like a webpage, but doesn't work like a webpage)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"The customer is more likely to suggest changes to UI if there isn't code behind it (i.e. they perceive minimal cost to making a change)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"The customer is more likely to focus on interaction rather than colors, fonts, etc."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In your projects, you will likely be the customer, but even so, I think you\nwill find that above advantages still hold, especially the last two..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Remember that what you think is cool, is not what your customers/users may think\nis valuable. Frequent feedback is essential. Investing lots of time in hi-fi\nmockups will make it harder to get frequent feedback, and potentially make that\nfeedback expensive (what if you invested all that time only to get it\nwrong...). Make getting it wrong cheap so that you can quickly iterate to find\nthe right solution."}]}],"data":{"quirksMode":false}},"frontmatter":{"path":"/lectures/lecture9-bdd","title":"Lecture 9 - BDD","name":"Lecture 9 - BDD"},"parent":{"__typename":"File","id":"7adc2703-edff-5cf6-a29a-d9ea23e93876","name":"lecture9-bdd","modifiedTime":"Oct 8 2019 03:54"}}},"pageContext":{"isCreatedByStatefulCreatePages":false}}}