<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.7.4">Jekyll</generator><link href="http://coding-and-cooking.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://coding-and-cooking.com/" rel="alternate" type="text/html" /><updated>2019-09-29T11:27:06+00:00</updated><id>http://coding-and-cooking.com/feed.xml</id><title type="html">Coding and Cooking</title><subtitle></subtitle><author><name>Carlo</name></author><entry><title type="html">Korma and Tikka Masala Paste</title><link href="http://coding-and-cooking.com/cooking/curry-paste/" rel="alternate" type="text/html" title="Korma and Tikka Masala Paste" /><published>2019-09-29T09:00:00+00:00</published><updated>2019-09-29T09:00:00+00:00</updated><id>http://coding-and-cooking.com/cooking/curry-paste</id><content type="html" xml:base="http://coding-and-cooking.com/cooking/curry-paste/">&lt;h1 id=&quot;intro&quot;&gt;Intro&lt;/h1&gt;
&lt;p&gt;I was on trying to find a great mango chicken recipe. 
So I read a few recipes and found out that they are mostly identical. The biggest difference seemed to be the used curry paste.
Some used a &lt;em&gt;Korma&lt;/em&gt; style paste whereas others used a &lt;em&gt;Tikka Masala&lt;/em&gt;.
I decided to prepare both pastes and just cook the same mango chicken recipe twice simultaneously and find out what I like better.&lt;/p&gt;

&lt;h1 id=&quot;korma&quot;&gt;Korma&lt;/h1&gt;
&lt;p&gt;Korma is a mild paste with an almond and coconut taste to it. Perfect for those who don’t like their dishes to be spicy.&lt;/p&gt;

&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;1/2 teaspoon coarse sea salt&lt;/li&gt;
  &lt;li&gt;2 gloves of garlic&lt;/li&gt;
  &lt;li&gt;piece of ginger (thumb-sized)&lt;/li&gt;
  &lt;li&gt;1/2 teaspoon cayenne pepper&lt;/li&gt;
  &lt;li&gt;1 teaspoon garam masala&lt;/li&gt;
  &lt;li&gt;2 tablespoons of oil (e.g. groundnut)&lt;/li&gt;
  &lt;li&gt;1 tablespoon tomate puree&lt;/li&gt;
  &lt;li&gt;1 fresh green chili&lt;/li&gt;
  &lt;li&gt;3 tablespoons dried coconut&lt;/li&gt;
  &lt;li&gt;2 tablespoons ground almonds&lt;/li&gt;
  &lt;li&gt;15g fresh coriander&lt;/li&gt;
  &lt;li&gt;1 teaspoon coriander seeds, toasted&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;tikka-masala&quot;&gt;Tikka Masala&lt;/h1&gt;
&lt;p&gt;Tikka Masala is a slightly more spicy paste and has much less coconut to it compared to the korma paste.&lt;/p&gt;

&lt;h2 id=&quot;ingredients-1&quot;&gt;Ingredients&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;1/2 teaspoon coarse sea salt&lt;/li&gt;
  &lt;li&gt;2 gloves of garlic&lt;/li&gt;
  &lt;li&gt;piece of ginger (thumb-sized)&lt;/li&gt;
  &lt;li&gt;1 teaspoon cayenne pepper&lt;/li&gt;
  &lt;li&gt;1 tablespoon smoked paprika&lt;/li&gt;
  &lt;li&gt;2 teaspoon garam masala&lt;/li&gt;
  &lt;li&gt;2 tablespoons of oil (e.g. groundnut)&lt;/li&gt;
  &lt;li&gt;2 tablespoon tomato puree&lt;/li&gt;
  &lt;li&gt;2 fresh red chili&lt;/li&gt;
  &lt;li&gt;15g fresh coriander&lt;/li&gt;
  &lt;li&gt;1 tablespoons dried coconut&lt;/li&gt;
  &lt;li&gt;2 tablespoons ground almonds&lt;/li&gt;
  &lt;li&gt;1 teaspoon coriander seeds, toasted&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;process&quot;&gt;Process&lt;/h1&gt;
&lt;p&gt;The process for the two pastes is similar, first toast the coriander seeds in a dry pan on medium heat for a couple of minutes until they smell deliciously.
Peel ginger and garlic and cut them and the chili(s) in small pieces.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Use a mortar to grind the roasted seeds&lt;/li&gt;
  &lt;li&gt;Add the coarse sea salt and the fresh coriander. The coarse salt helps to grind the fresh coriander&lt;/li&gt;
  &lt;li&gt;Add the garlic and the garam masala&lt;/li&gt;
  &lt;li&gt;Add the ginger and rest of the spices&lt;/li&gt;
  &lt;li&gt;Add the ground almonds&lt;/li&gt;
  &lt;li&gt;Add the tomato paste and the oil&lt;/li&gt;
  &lt;li&gt;Add the chili pieces&lt;/li&gt;
  &lt;li&gt;Add the dried coconut&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;For the lazy ones&lt;/em&gt;: You can also put all the ingredients in a food processor and let it run until you have a smooth paste.
But where is the fun with that?&lt;/p&gt;

&lt;figure class=&quot;&quot;&gt;
  &lt;img src=&quot;/assets/images/currypaste/mortar.gif&quot; alt=&quot;Tikka Masala processing&quot; /&gt;
  
    &lt;figcaption&gt;
      Tikka Masala processing

    &lt;/figcaption&gt;&lt;/figure&gt;</content><author><name>Carlo</name></author><category term="curry" /><category term="vegan" /><summary type="html">How to simply create delicious curry pastes</summary></entry><entry><title type="html">Salt Fat Acid Heat - Mastering the Elements of Good Cooking</title><link href="http://coding-and-cooking.com/coding/salt-fat-acid-heat/" rel="alternate" type="text/html" title="Salt Fat Acid Heat - Mastering the Elements of Good Cooking" /><published>2019-08-13T00:00:00+00:00</published><updated>2019-08-13T00:00:00+00:00</updated><id>http://coding-and-cooking.com/coding/salt-fat-acid-heat</id><content type="html" xml:base="http://coding-and-cooking.com/coding/salt-fat-acid-heat/">&lt;p&gt;&lt;strong&gt;“Commit to mastering salt, fat, acid and heat and you can become a great cook.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Salt Fat Acid Heat is probably the cookbook that changed the way I approach cooking the most.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I own various cookbooks from different authors, but usually they &lt;em&gt;“just”&lt;/em&gt; contain a list of recipes alongside some super beautiful photos of the result.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Samin Nosrat&lt;/em&gt; puts the focus somewhere else.&lt;/p&gt;

&lt;p&gt;She boils good dishes down to 4 main ingredients: Salt, fat, acid and heat.
When, how long, how much and in what form any of these ingredients are added, is what can bring an ordinary dish to the next level.&lt;/p&gt;

&lt;p&gt;Also she explains what any of the ingredients does to a dish, wish helped me to better understand &lt;em&gt;how&lt;/em&gt; to cook.&lt;/p&gt;

&lt;p&gt;While reading the book I thought multiple times: &lt;em&gt;“I would really like to cook now.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of &lt;em&gt;Samin Nosrat’s&lt;/em&gt; mantras is, that you have to &lt;strong&gt;taste again and again&lt;/strong&gt; while your are cooking.
And that this is much more important than strictly following a recipe.
This is also one reason why there are no glossy food photos in this book.&lt;/p&gt;

&lt;p&gt;And even though this sounds a little bit strange it totally works out.
You’ll get some nice illustrations by &lt;a href=&quot;http://wendymacnaughton.com/&quot;&gt;&lt;em&gt;Wendy MacNoughton&lt;/em&gt;&lt;/a&gt; and for the rest &lt;em&gt;Samin Nosrat&lt;/em&gt; encourages you to find your own style.&lt;/p&gt;

&lt;p&gt;There is also a &lt;a href=&quot;https://www.netflix.com/de-en/title/80198288&quot;&gt;Netflix show&lt;/a&gt; inspired by the book and produced by &lt;em&gt;Samin Nosrat&lt;/em&gt;&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/2oKbs4jAf7M&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Below you can find my highlights from the different chapters.&lt;/p&gt;

&lt;h1 id=&quot;salt-brings-food-to-live&quot;&gt;“&lt;em&gt;Salt brings food to live&lt;/em&gt;”&lt;/h1&gt;

&lt;p&gt;One major thing I immediately changed while reading the book was my usage of salt.&lt;/p&gt;

&lt;p&gt;I increased for example the amount of salt I put in water to cook noodles.
It should taste like the memory of sea water. So quite salty. At first I thought this might be too much.
But most of the water and therefore the salt ends up in the drain anyway. 
However I had to learn the hard (or salty) way, that the same does not apply to rice - obviously.&lt;/p&gt;

&lt;p&gt;Another thing literally blew my mind. Mainly because it’s so simple and should be obvious:
When you are not sure if you should add more salt (or basically any spice) to a dish, just take a spoon of your dish and salt on the spoon.
Does it taste better? Add more salt to the pot. So easy, so helpful!&lt;/p&gt;

&lt;p&gt;Also I now take into account the saltiness of other ingredients when thinking about the amount of salt I add.
For example olives, cheese, capers or anchovies are great suppliers of salt for a dish.&lt;/p&gt;

&lt;h1 id=&quot;fat-makes-food-delicious&quot;&gt;“&lt;em&gt;Fat makes food delicious&lt;/em&gt;”&lt;/h1&gt;

&lt;p&gt;The choice of the fat has a significant influence on the taste of a dish.
Olive oil will for example always give a mediterranean flavor whereas the french cuisine is more based on butter as fat supplier.&lt;/p&gt;

&lt;p&gt;But the fat chapter had one more special revelation for me: The reason why my favorite cake is my favorite cake.
I already knew that one of the ingredients in my favorite cake is oil but as I’m not so much into baking I didn’t know - or care - if this makes a difference to butter.
Now I know that oil coats flour proteins and therefore prevents strong gluten networks leading to a more tender texture in the cake.&lt;/p&gt;

&lt;h1 id=&quot;acid-balances-flavors&quot;&gt;“&lt;em&gt;Acid balances flavors&lt;/em&gt;”&lt;/h1&gt;

&lt;p&gt;Acid was the element which was the hardest for me to grasp and understand.
But the book contained some interesting examples that helped understand the importance of acid in a dish.&lt;/p&gt;

&lt;p&gt;The acid of tomatoes for example prevents onions from getting tender and soft.
That’s the reason why recipes usually tell you to first cook only the onions and then add tomatoes do it.&lt;/p&gt;

&lt;p&gt;Another thing I learned from the chapter on acid was the &lt;a href=&quot;https://en.wikipedia.org/wiki/Maceration_(food)&quot;&gt;maceration&lt;/a&gt; of onions.
Before using raw onions e.g. in a salad, you should let them soak for about 15 minutes in some acid (e.g. vinegar or citrus juice).
It will soften the onions and remove some of the acrid taste.&lt;/p&gt;

&lt;h1 id=&quot;heat-the-element-of-transformation&quot;&gt;“&lt;em&gt;Heat: The element of transformation&lt;/em&gt;”&lt;/h1&gt;

&lt;p&gt;Cooking does not start with turning on the stove.
Ingredients cook differently if they just came out of the fridge or if they already have room temperature.
Meat should always have room temperature before being put in a pan.&lt;/p&gt;

&lt;p&gt;Also cooking does not end when turning off the stove. Residual heat trapped within food lead to continued cooking, the so called &lt;em&gt;carryover&lt;/em&gt; effect.
A roast for example can carry over - or rise in temperature - up to five degrees celsius after being removed from heat.&lt;/p&gt;

&lt;p&gt;Another important takeaway from the heat chapter is the strict order of pre-heating the pan, adding the fat only when the pan is hot and only then adding the meat (at room temperature).&lt;/p&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;I can give you only a glimpse of what you fill find in the book.
I strongly recommend &lt;a href=&quot;https://amzn.to/2l75MnS&quot;&gt;the book&lt;/a&gt; &lt;em&gt;(personalized link)&lt;/em&gt; if you want to upgrade your cooking.&lt;/p&gt;

&lt;p&gt;It opened my eyes in various different ways and helped me to better understand what makes a great dish.&lt;/p&gt;

&lt;p&gt;I want to close with a small personal anecdote:&lt;/p&gt;

&lt;p&gt;We have clearly separated the tasks in the kitchen for years.
My wife does everything related to baking and I’m responsible for cooking (&lt;em&gt;we share the eating part ;)&lt;/em&gt; ).
Since I started to read &lt;em&gt;“Salt Fat Acid Heat”&lt;/em&gt; my wife says more than ever before things along the lines: &lt;em&gt;“This tasted so good, you should cook this recipe more often.”&lt;/em&gt;.
And I can clearly attribute that to small changes I’ve done to my cooking because of this book.&lt;/p&gt;</content><author><name>Carlo</name></author><category term="cooking" /><category term="book" /><summary type="html">My take aways from the Book: &quot;Salt Fat Acid Heat&quot;</summary></entry><entry><title type="html">Accelerate - The Science of Lean Software and DevOps</title><link href="http://coding-and-cooking.com/coding/accelerate/" rel="alternate" type="text/html" title="Accelerate - The Science of Lean Software and DevOps" /><published>2019-07-12T12:30:00+00:00</published><updated>2019-07-12T12:30:00+00:00</updated><id>http://coding-and-cooking.com/coding/accelerate</id><content type="html" xml:base="http://coding-and-cooking.com/coding/accelerate/">&lt;p&gt;&lt;img src=&quot;/assets/images/accelerate/cover.jpg&quot; alt=&quot;Accelerate Book Cover&quot; title=&quot;Accelerate Book Cover&quot; class=&quot;align-center&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;introduction&quot;&gt;Introduction&lt;/h1&gt;

&lt;p&gt;My first contact with the book “Accelerate -  The Science of Lean Software and DevOps” was at the W-Jax conference in 2018. I think it was &lt;a href=&quot;https://ewolff.com&quot;&gt;Eberhard Wolff&lt;/a&gt; who mentioned something in the lines of:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There are “good” organizations/teams, they deliver (to production) at least once per day and then there are the “bad” organizations that fail to do that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He used Accelerate as reference for that statement.&lt;/p&gt;

&lt;p&gt;That statement triggered something in me. On the one side I found it pretty hard to call organizations that are not able to deliver to production everyday “bad”. On the other hand I thought it might be necessary to be this hard in the communication just to ensure people are actually listening. 
It’s like if &lt;a href=&quot;https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html&quot;&gt;Robert C. Martin&lt;/a&gt; would state &lt;em&gt;“It would be nice, if you as professional programmer, could be so kind and write some unit tests for your code”&lt;/em&gt; instead of &lt;em&gt;“You should not write a single line of prodction code without prior writing a failing unit test for it”.&lt;/em&gt;&lt;/p&gt;

&lt;h1 id=&quot;software-delivery-performance&quot;&gt;Software Delivery Performance&lt;/h1&gt;

&lt;p&gt;Now I finally had the time to read Accelerate.&lt;/p&gt;

&lt;p&gt;Accelerate is a write-up of the &lt;a href=&quot;https://puppet.com/blog-tags/state-devops&quot;&gt;“Accelerate - State of DevOps”&lt;/a&gt; researches from 2013 - 2017 along with a deep-enough dive into the scientific methods used, to collect and interpret the data, to give confidence in the findings.&lt;/p&gt;

&lt;p&gt;The first question answered in the book is how to actually measure software delivery performance.
The 4 measures selected by the researchers are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lead Time (“The time it takes to go from a customer making a request to the request being satisfied”)&lt;/li&gt;
  &lt;li&gt;Deployment Frequency (“A software deployment to production or to an app store”)&lt;/li&gt;
  &lt;li&gt;Mean Time to Restore&lt;/li&gt;
  &lt;li&gt;Change Fail Percentage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lead Time and the Deployment Frequency are considered measures of the &lt;em&gt;tempo&lt;/em&gt; of software delivery performance.&lt;/p&gt;

&lt;p&gt;Additionally the researches wanted to investigate if tempo gains happen at the expense of the stability.
Acknowledging that failures in rapidly changing complex systems are inevitable the question &lt;em&gt;“How long it generally takes to restore service in case of an incident”&lt;/em&gt; was preferred to the standard measure of reliability (time between failures).&lt;/p&gt;

&lt;p&gt;The final metric is what percentage of changes to production (software releases or infrastructure configuration changes) fail.&lt;/p&gt;

&lt;p&gt;The analysis of the collected data regarding the software delivery performance revelead significantly different categories of performances:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;2016&lt;/th&gt;
      &lt;th&gt;High Performers&lt;/th&gt;
      &lt;th&gt;Medium Performers&lt;/th&gt;
      &lt;th&gt;Low Performers&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Lead Time for Changes&lt;/td&gt;
      &lt;td&gt;Less than one hour&lt;/td&gt;
      &lt;td&gt;Between one week and one moth&lt;/td&gt;
      &lt;td&gt;Between one month and six months&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Deployment Frequency&lt;/td&gt;
      &lt;td&gt;On demand (multiple deploys per day)&lt;/td&gt;
      &lt;td&gt;Between once per week and once per month&lt;/td&gt;
      &lt;td&gt;Between once per month and once every six months&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mean Time to Restore&lt;/td&gt;
      &lt;td&gt;Less than one hour&lt;/td&gt;
      &lt;td&gt;Less than one day&lt;/td&gt;
      &lt;td&gt;Less than one day&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change Failure Percentage&lt;/td&gt;
      &lt;td&gt;0-15%&lt;/td&gt;
      &lt;td&gt;31-45%&lt;/td&gt;
      &lt;td&gt;16-30%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p class=&quot;notice--info&quot;&gt;One of the most interesting points I found in this book was that not only there is no trade-off between improving performance and achieving higher levels of stability and quality, but high performers do better &lt;em&gt;at all&lt;/em&gt; of these measures.&lt;/p&gt;

&lt;h1 id=&quot;key-drivers-for-software-delivery-performance&quot;&gt;Key Drivers for Software Delivery Performance&lt;/h1&gt;

&lt;p&gt;Based on these findings the researchers were looking for key capabilties that drive software delivery performances.&lt;/p&gt;

&lt;p&gt;What they found are 5 categories with a total of 24 key capabilities detailed below.&lt;/p&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#continuous-delivery&quot;&gt;Continuous delivery&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Use version control&lt;/li&gt;
      &lt;li&gt;Automate your deployment process&lt;/li&gt;
      &lt;li&gt;Implement continuous integration (CI)&lt;/li&gt;
      &lt;li&gt;Use trunk-based development methods&lt;/li&gt;
      &lt;li&gt;Implement test automation&lt;/li&gt;
      &lt;li&gt;Support test data management&lt;/li&gt;
      &lt;li&gt;Shift left on security&lt;/li&gt;
      &lt;li&gt;Implement continuous delivery&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#architecture&quot;&gt;Architecture&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Use a loosely coupled architecture&lt;/li&gt;
      &lt;li&gt;Architect for empowered teams&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#product-and-process&quot;&gt;Product and process&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Gather and implement customer feedback&lt;/li&gt;
      &lt;li&gt;Make the flow of work visible through the value stream&lt;/li&gt;
      &lt;li&gt;Work in small batches&lt;/li&gt;
      &lt;li&gt;Foster and enable team experimentation&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#lean-management-and-monitoring&quot;&gt;Lean management and monitoring&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Have lightweight change approval processes&lt;/li&gt;
      &lt;li&gt;Monitor across application and infrastructure to inform business decisions&lt;/li&gt;
      &lt;li&gt;Check system health proactively&lt;/li&gt;
      &lt;li&gt;Improve processes and manager work with work-in-progress (WIP) limits&lt;/li&gt;
      &lt;li&gt;Visualize work to monitor quality and communicate throughout the team&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cultural&quot;&gt;Cultural&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Support a generative culture&lt;/li&gt;
      &lt;li&gt;Encourage and support learning&lt;/li&gt;
      &lt;li&gt;Support and facilitate collaboration among teams&lt;/li&gt;
      &lt;li&gt;Provide resources and tools that make work meaningful&lt;/li&gt;
      &lt;li&gt;Support or embody transformational leadership&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;continuous-delivery&quot;&gt;Continuous delivery&lt;/h2&gt;

&lt;h3 id=&quot;use-version-control-for-all-production-artifacts&quot;&gt;Use version control for all production artifacts&lt;/h3&gt;

&lt;p&gt;Although it might seem obvious to use version control for source code nowadays the researchers specifically mention to also have any configuration (system / application) and build or environment automation scripts under version control.&lt;/p&gt;

&lt;h3 id=&quot;automate-your-deployment-process&quot;&gt;Automate your deployment process&lt;/h3&gt;

&lt;p&gt;Computers should perform repetitive tasks so people can focus on solving problems. Therefore the less manual effort for deployments is needed the better it is. Also together with everything stored in version control it should be possible to easily replicate the production environment (without production data) in testing to be able to investigate errors.&lt;/p&gt;

&lt;h3 id=&quot;implement-continuous-integration-ci&quot;&gt;Implement continuous integration (CI)&lt;/h3&gt;

&lt;p&gt;Integrating each persons work at least daily with a following build including tests reduces the risk of integration problems compared to long lived feature branches and allows teams to develop cohesive software more rapidly. See also &lt;a href=&quot;https://martinfowler.com/articles/continuousIntegration.html&quot;&gt;Martin Fowler on Continuous Integration&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;use-trunk-based-development-methods&quot;&gt;Use trunk-based development methods&lt;/h3&gt;

&lt;p&gt;There should not be more than 3 active branches at a time and the branches should only live for a very short time (e.g. 1 day). This reduces the risk and time needed for merging. It also seem to encourage refactorings.&lt;/p&gt;

&lt;h3 id=&quot;implement-test-automation&quot;&gt;Implement test automation&lt;/h3&gt;

&lt;p&gt;Again repetitive tasks should be done by computers. A &lt;em&gt;reliable&lt;/em&gt; test suite gives teams confidence that their software is releasable. 
It’s worth investing ongoing effort in a reliable test suite (see also &lt;a href=&quot;https://martinfowler.com/articles/nonDeterminism.html&quot;&gt;Eradicating Non-Determinism in Tests&lt;/a&gt;. Another important note here is that acceptance tests should primarily be created and maintained by developers. Tests created by QA or an outsourced party is not correlated with IT performance.
Testers are still essential though by performing exploratory, usability and acceptance testing and helping developers evolve the test suites.
Once automated tests should regularly be run to give developers feedback.&lt;/p&gt;

&lt;h3 id=&quot;support-test-data-management&quot;&gt;Support test data management&lt;/h3&gt;

&lt;p&gt;To be able to run the automated tests it is important to have the correct test data. The management and the collection of necessary test data is therefore vital for smoothly running automated test suites.&lt;/p&gt;

&lt;h3 id=&quot;shift-left-on-security&quot;&gt;Shift left on security&lt;/h3&gt;

&lt;p&gt;Integrating feedback from information security teams early in the process e.g. during design or demos reduces the time needed to spend later on to fix security issues.&lt;/p&gt;

&lt;h3 id=&quot;implement-continuous-delivery-cd&quot;&gt;Implement continuous delivery (CD)&lt;/h3&gt;

&lt;p&gt;continuous delivery has positive impact on various aspects: delivery performance, quality, culture, reduced burnouts and deployment pain.
Although of course this comes not for free. A lot of things have to be automated, team interaction and ways of working have to be rethought.&lt;/p&gt;

&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;/h2&gt;

&lt;p&gt;The study found two architectural characteristics to be important for achieving high performance:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Can most of the testing be done without an integrated environment?&lt;/li&gt;
  &lt;li&gt;Can an application be deployed independently of other applications/services it depends on?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;use-a-loosely-coupled-architecture&quot;&gt;Use a loosely coupled architecture&lt;/h3&gt;

&lt;p&gt;Design systems that can be changed and validated independently. High performance teams require little communication between delivery teams to get their work done.&lt;/p&gt;

&lt;h3 id=&quot;architect-for-empowered-teams&quot;&gt;Architect for empowered teams&lt;/h3&gt;

&lt;p&gt;Having teams to choose tools and frameworks from an approved list prevents teams from choosing technologies that will be most suitable for their practical needs and from experimenting (learning) with new approaches and paradigms.&lt;/p&gt;

&lt;p&gt;What tools or technologies you use is irrelevant if the people who must use them hate using them, or if they don’t achieve the outcomes they care about.&lt;/p&gt;

&lt;p&gt;On the other side when tools provided make the engineers life actually easier, they will adopt them of their own free will.&lt;/p&gt;

&lt;h2 id=&quot;product-and-process&quot;&gt;Product and process&lt;/h2&gt;

&lt;h3 id=&quot;gather-and-implement-customer-feedback&quot;&gt;Gather and implement customer feedback&lt;/h3&gt;

&lt;p&gt;It is important to software delivery performance to actively gather customer feedback and to incorporate this in the design of the product.&lt;/p&gt;

&lt;h3 id=&quot;make-the-flow-of-work-visible-through-the-value-stream&quot;&gt;Make the flow of work visible through the value stream&lt;/h3&gt;

&lt;p&gt;Having a good understanding and visibility of the flow of work from business all the way to the customer has a positive impact on performance.&lt;/p&gt;

&lt;h3 id=&quot;work-in-small-batches&quot;&gt;Work in small batches&lt;/h3&gt;

&lt;p&gt;Work should be decomposed in small features that can be completed in a week or less. This enables short lead times and faster feedback loops.&lt;/p&gt;

&lt;h3 id=&quot;foster-and-enable-team-experimentation&quot;&gt;Foster and enable team experimentation&lt;/h3&gt;

&lt;p&gt;Development teams shouild be empowered to try out new ideas and create or update specifications during the process without requiring approval from outside. When combined wuth working in small batches, custoemr feedback and making the flow of work visible this can have a huge impact on performance.&lt;/p&gt;

&lt;h2 id=&quot;lean-management-and-monitoring&quot;&gt;Lean management and monitoring&lt;/h2&gt;

&lt;h3 id=&quot;have-lightweight-change-approval-processes&quot;&gt;Have lightweight change approval processes&lt;/h3&gt;

&lt;p&gt;A change approval process based on peer review (code reviews / pair programming) results in a better performance than using change approval boards.&lt;/p&gt;

&lt;h3 id=&quot;monitor-across-application-and-infrastructure-to-inform-business-decisions&quot;&gt;Monitor across application and infrastructure to inform business decisions&lt;/h3&gt;

&lt;p&gt;Use monitoring data from infrastructure and applications to drive business decisions.&lt;/p&gt;

&lt;h3 id=&quot;check-system-health-proactively&quot;&gt;Check system health proactively&lt;/h3&gt;

&lt;p&gt;Rate-of-change and threshold warnings in monitoring systems allow teams to preemptively detect problems.&lt;/p&gt;

&lt;h3 id=&quot;improve-processes-and-manager-work-with-work-in-progress-wip-limits&quot;&gt;Improve processes and manager work with work-in-progress (WIP) limits&lt;/h3&gt;

&lt;p&gt;Visual WIP limits help drive process improvements, increase throughput and makes constraints visible.&lt;/p&gt;

&lt;h3 id=&quot;visualize-work-to-monitor-quality-and-communicate-throughout-the-team&quot;&gt;Visualize work to monitor quality and communicate throughout the team&lt;/h3&gt;

&lt;p&gt;Software delivery performance is affected by visually displaying quality and WIP metrics.&lt;/p&gt;

&lt;h2 id=&quot;cultural&quot;&gt;Cultural&lt;/h2&gt;

&lt;h3 id=&quot;support-a-generative-culture-as-outlined-by-westrum&quot;&gt;Support a generative culture (as outlined by Westrum)&lt;/h3&gt;

&lt;p&gt;A culture with good information flow, high cooperation and trust, bridging between teams and conscious inquiry is predictive of IT performance.
Check here for more on the cultural model defined by &lt;a href=&quot;https://continuousdelivery.com/implementing/culture/&quot;&gt;sociologist Ron Westrum&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;encourage-and-support-learning&quot;&gt;Encourage and support learning&lt;/h3&gt;

&lt;p&gt;A job is satisfying if it makes good use of skills and abilities. In an ever changing environment, with a lot of tasks being automated more and more, it is important to build new skills, learn new approaches and paradigms.&lt;/p&gt;

&lt;h3 id=&quot;support-and-facilitate-collaboration-among-teams&quot;&gt;Support and facilitate collaboration among teams&lt;/h3&gt;

&lt;p&gt;Improve the interaction of previously siloed teams like development, operations and information security.&lt;/p&gt;

&lt;h3 id=&quot;provide-resources-and-tools-that-make-work-meaningful&quot;&gt;Provide resources and tools that make work meaningful&lt;/h3&gt;

&lt;p&gt;Another important point in job satisfaction is that the tools and resources needed to do the work are provided.&lt;/p&gt;

&lt;h3 id=&quot;support-or-embody-transformational-leadership&quot;&gt;Support or embody transformational leadership&lt;/h3&gt;

&lt;p&gt;Amplify the technical and process work which is essential in DevOps. Five factors are key to this: Vision, intellectual stimulation, inspirational communication, supportive leadership and personal recognition.&lt;/p&gt;

&lt;p&gt;The illustration of all the impacting factors can be seen below. (taken from &lt;a href=&quot;https://devops-research.com/assets/transformation_practices.pdf&quot;&gt;Overall Research Program&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/accelerate/overall-devops-research.png&quot; alt=&quot;Overall Research Programm&quot; title=&quot;Overall Research Programm&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Teaser Photo from &lt;a href=&quot;https://unsplash.com/@chuttersnap&quot;&gt;Chuttersnap&lt;/a&gt;@&lt;a href=&quot;https://unsplash.com/search/photos/speed&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><author><name>Carlo</name></author><category term="architecture" /><category term="devops" /><category term="book" /><summary type="html">My abstract of the Book: &quot;Accelerate - The Science of Lean Software and DevOps&quot;</summary></entry><entry><title type="html">FriendLib - Intro to my current side project</title><link href="http://coding-and-cooking.com/coding/friendlib-intro/" rel="alternate" type="text/html" title="FriendLib - Intro to my current side project" /><published>2019-01-10T19:50:00+00:00</published><updated>2019-01-10T19:50:00+00:00</updated><id>http://coding-and-cooking.com/coding/friendlib-intro</id><content type="html" xml:base="http://coding-and-cooking.com/coding/friendlib-intro/">&lt;p&gt;Since August 2018 I’m working on a new side project called &lt;em&gt;FriendLib&lt;/em&gt;. 
The basic idea about the app is that you can check which books your friends own and instead of buying the books you ask you friends if you can lend the book. 
The name is a portmanteau of friendship and library.&lt;/p&gt;

&lt;p&gt;I don’t remember exactly how I came to the idea, but I remember that I read something about the book &lt;a href=&quot;https://amzn.to/2Rs4t1m&quot;&gt;&lt;strong&gt;Thinking, Fast &amp;amp; Slow&lt;/strong&gt;&lt;/a&gt;* by Daniel Kahneman and I thought it might be interesting to read (that’s how it found it’s way on my &lt;a href=&quot;/readinglist/&quot;&gt;Reading List&lt;/a&gt; for 2019.
The next day at the office, by chance a colleague started to talk about that new book he just bough and started to read. Guess what he was taking about Thinking, Fast &amp;amp; Slow. So instead of buying the book myself I now knew that he owns it and asked if I can lend if once he has read it. Easy.&lt;/p&gt;

&lt;p&gt;So I thought is &lt;a href=&quot;https://www.youtube.com/watch?v=DtwJCkqU-_E&quot;&gt;there an app for that?&lt;/a&gt; And apparently there isn’t. So I decided to use this use case for a (not so) little side project. There are a few tools, frameworks, architectural styles that I want to try out anyway and I like rather to have a meaningful (aka real world) example than a Todo List App.&lt;/p&gt;

&lt;p&gt;Using the &lt;a href=&quot;https://en.wikipedia.org/wiki/Event_storming&quot;&gt;Event Storming technique&lt;/a&gt;, the awesome &lt;a href=&quot;https://realtimeboard.com/&quot;&gt;RealTimeBoard&lt;/a&gt; and the help of some friends I quickly outlined the basic functionalities of the app.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/friendlib-intro/realtimeboard.png&quot; alt=&quot;FriendLib Event Storming in RealTimeBoard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Registration / Login&lt;/li&gt;
  &lt;li&gt;Management of the own library (how else could your friends know the books that you own)&lt;/li&gt;
  &lt;li&gt;Managing Friendships&lt;/li&gt;
  &lt;li&gt;Browsing the library of friends&lt;/li&gt;
  &lt;li&gt;Searching books (with an indication if any of your friends has an exemplar of it)&lt;/li&gt;
  &lt;li&gt;Managing book lendings (accept lend requests, follow-up the status, reminders …)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turns out its quite a lot of functional stuff to do. Additionally I have some learning goals for that project.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Angular 2+ and Ionic&lt;/li&gt;
  &lt;li&gt;Serverless using AWS (I already did things with &lt;a href=&quot;/coding/simple-web-api-using-claudiajs/&quot;&gt;ClaudiaJS&lt;/a&gt; before)&lt;/li&gt;
  &lt;li&gt;App Store deployments for iOS and Android (automated using tools like &lt;a href=&quot;https://fastlane.tools&quot;&gt;fastlane&lt;/a&gt;)
    &lt;ul&gt;
      &lt;li&gt;the iOS part already looks quite good as you can see &lt;a href=&quot;https://github.com/carlo-mr/friendlib-app/pull/3&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Documenting the whole solution using the &lt;a href=&quot;https://arc42.org&quot;&gt;arc42&lt;/a&gt; template and the &lt;a href=&quot;http://www.writethedocs.org/guide/docs-as-code/&quot;&gt;docs as code philosophy&lt;/a&gt; using the &lt;a href=&quot;https://doctoolchain.github.io/docToolchain/&quot;&gt;docToolchain&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;A first result can already be found &lt;a href=&quot;https://carlo-mr.github.io/friendlib-documentation/&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideally I find the time to write a few posts during the development. So far (since August 2018) I was not so successful with this intend.&lt;/p&gt;

&lt;p&gt;So as you can see a lot of plans for 2019. Stay tuned for updates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Teaser Photo by Alfons Morales on &lt;a href=&quot;https://unsplash.com/photos/YLSwjSy7stw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;* personalized link&lt;/p&gt;</content><author><name>Carlo</name></author><summary type="html">Since August 2018 I’m working on a new side project called FriendLib. The basic idea about the app is that you can check which books your friends own and instead of buying the books you ask you friends if you can lend the book. The name is a portmanteau of friendship and library.</summary></entry><entry><title type="html">A simple Web API using Claudia.js, AWS and DynamoDB</title><link href="http://coding-and-cooking.com/coding/simple-web-api-using-claudiajs/" rel="alternate" type="text/html" title="A simple Web API using Claudia.js, AWS and DynamoDB" /><published>2017-11-27T11:00:00+00:00</published><updated>2017-11-27T11:00:00+00:00</updated><id>http://coding-and-cooking.com/coding/simple-web-api-using-claudiajs</id><content type="html" xml:base="http://coding-and-cooking.com/coding/simple-web-api-using-claudiajs/">&lt;h1 id=&quot;abstract&quot;&gt;Abstract&lt;/h1&gt;
&lt;p&gt;Recently I played around with Claudia.js and AWS Lambda. And I thought that could be a good technical stack for the “Illegal or frowned upon” api.
So I gave the Claudia.js API Builder a chance – and it was so easy that I want to quickly write this up here.&lt;/p&gt;

&lt;h1 id=&quot;claudiajs&quot;&gt;Claudia.js&lt;/h1&gt;
&lt;p&gt;In the first place Claudia.js is a deployment tool for Node.js based projects and eases the use of AWS by abstracting a lot of configuration and deployment steps.&lt;/p&gt;

&lt;p&gt;On top of the deployment tools Claudia.js offers an API Builder and a BotBuilder API (which I will cover in another post).&lt;/p&gt;

&lt;p&gt;The API Builder allows it to easily build serverless Web APIs using the AWS API Gateway.
For the very basic examples please refer to the very good Tutorials and Documentation on the &lt;a href=&quot;https://Claudia.js.com/tutorials/index.html&quot;&gt;official site&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;hands-on&quot;&gt;Hands-On&lt;/h1&gt;
&lt;p&gt;While writing this post I’ll build the Web API for this example live, I hope that by doing this I will not forget any crucial point. You can find the link to the code at the bottom.&lt;/p&gt;

&lt;p&gt;As example I’ll take the statement class from “Illegal or frowned upon”.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Statement&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;illegalVotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;frownedUponVotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;step-1--create-the-dynamodb-table&quot;&gt;Step 1 – create the DynamoDB table&lt;/h2&gt;
&lt;p&gt;Create an DynamoDB Table for the statement as shown in the screenshot.&lt;/p&gt;

&lt;figure class=&quot;&quot;&gt;
  &lt;img src=&quot;/assets/images/simple-web-api/iofu-statement-dynamodb.png&quot; alt=&quot;DynamoDb config&quot; /&gt;
  
    &lt;figcaption&gt;
      DynamoDB config.

    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;h2 id=&quot;step-2--initialize-the-project&quot;&gt;Step 2 – initialize the project&lt;/h2&gt;

&lt;p&gt;Create a empty directory. Init a new npm project. Install claudia-api-builder and aws-sdk and save them dependency.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;mkdir iofu-aws
npm init 
npm install claudia-api-builder &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt;
npm install aws-sdk &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;To be able to access DynamoDB the service needs special permissions. These can be passed to Claudia.js so that it is applied to our lambda function when deployed.&lt;/p&gt;

&lt;p&gt;Create a access-dynamodb.json inside a policy folder.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;w&quot;&gt;  
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Statement&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Action&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;dynamodb:DeleteItem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;dynamodb:GetItem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;dynamodb:PutItem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;dynamodb:Scan&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Effect&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Resource&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;step-3--implement-the-api&quot;&gt;Step 3 – Implement the API&lt;/h2&gt;
&lt;p&gt;Create the entry point for the api (app.js). For the moment it will provide the possibility to POST a new statement and store it in the DynamoDB and a GET for all stored statements.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ApiBuilder&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'claudia-api-builder'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;AWS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'aws-sdk'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'statement'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ApiBuilder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;dynamoDb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AWS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DynamoDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DocumentClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Create new statement&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/statement'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;s1&quot;&gt;'use strict'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;TableName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;illegalVotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;illegalVotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;frownedUponVotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;frownedUponVotes&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// return dynamo result directly&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dynamoDb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;201&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Return HTTP status 201 - Created when successful&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// GET all statements&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/statement'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dynamoDb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;scan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;TableName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;step-4--deploy&quot;&gt;Step 4 – Deploy&lt;/h2&gt;

&lt;p&gt;Now to the deployment capabilities of Claudia.js come into play.
Note: Before this will work you’ll need to perform some general configuration that can be found in the Claudia.js documentation.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;claudia create &lt;span class=&quot;nt&quot;&gt;--region&lt;/span&gt; us-east-1 &lt;span class=&quot;nt&quot;&gt;--api-module&lt;/span&gt; app &lt;span class=&quot;nt&quot;&gt;--policies&lt;/span&gt; policy&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;What happens when executing the above statement?&lt;/p&gt;

&lt;p&gt;Claudia.js will first build the code and create a zip file with all the contents.
It then creates the initial lambda function and also the necessary role.
And finally uploads/deploys the created zip.&lt;/p&gt;

&lt;p&gt;The –region option tells Claudia.js in which region to deploy the function (Thank you, Cpt. Obvious!).&lt;/p&gt;

&lt;p&gt;The –api-module defines the main module of our function. As we exported the built api in the app.js file we give it the name of that file.&lt;/p&gt;

&lt;p&gt;The –policies option is a directory or file pattern for additional IAM (Identity and Access Management) policies to be included in the role that is created to run the lambda function.&lt;/p&gt;

&lt;p&gt;As a result of the create command Claudia.js prints us the configuration (and stores it in a file called claudia.json in the project root directory).&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;lambda&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;iofu-aws-executor&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;iofu-aws&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2hmzoogb6l&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;step-5--test-it&quot;&gt;Step 5 – test it&lt;/h2&gt;

&lt;p&gt;Now we can add a test statement using curl from the terminal. And afterwards retrieve all statements with.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;curl &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; @./test/test.json https://2hmzoogb6l.execute-api.us-east-1.amazonaws.com/latest/statement&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;curl https://2hmzoogb6l.execute-api.us-east-1.amazonaws.com/latest/statement&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;And thats it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I think ClaudiaJS is pretty handy.
The abstraction it provides for the AWS stuff is quite nice, especially when starting with the topic. You don’t need to understand everything whats happening under the hood. Also the Api builder is quite easy to use and the examples provided on the website and the different example projects on GitHub are easy to comprehend.&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;The complete code can be found on my &lt;a href=&quot;https://github.com/carlo-mr/iofu-aws&quot;&gt;GitHub repo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://claudiajs.com/&quot;&gt;Claudia.js Website&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/claudiajs&quot;&gt;Claudia.js on GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/trademark-guidelines/&quot;&gt;AWS Trademark Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Teaser Photo by rawpixel.com from &lt;a href=&quot;https://www.pexels.com/photo/blue-skies-clouds-cut-fingers-335907/&quot;&gt;Pexels&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><author><name>Carlo</name></author><summary type="html">Recently I played around with Claudia.js and AWS Lambda.</summary></entry><entry><title type="html">The Duties of a Software Architect</title><link href="http://coding-and-cooking.com/coding/duties-of-a-software-architect/" rel="alternate" type="text/html" title="The Duties of a Software Architect" /><published>2017-10-03T11:00:00+00:00</published><updated>2017-10-03T11:00:00+00:00</updated><id>http://coding-and-cooking.com/coding/duties-of-a-software-architect</id><content type="html" xml:base="http://coding-and-cooking.com/coding/duties-of-a-software-architect/">&lt;p&gt;Last week I had the opportunity to attended the workshop “Mastering Software Architectures” by &lt;a href=&quot;http://gernotstarke.de/&quot;&gt;Gernot Starke&lt;/a&gt; and &lt;a href=&quot;http://www.peterhruschka.eu/&quot;&gt;Peter Hruschka&lt;/a&gt;.
If you ever have the chance to have a training with the two you should take the opportunity!&lt;/p&gt;

&lt;p&gt;In this post I want to recap the 6 duties that form the software architect role:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Clarify requirements&lt;/li&gt;
  &lt;li&gt;Communicate&lt;/li&gt;
  &lt;li&gt;Design Structures&lt;/li&gt;
  &lt;li&gt;Design transversal concepts&lt;/li&gt;
  &lt;li&gt;Accompany the implementation&lt;/li&gt;
  &lt;li&gt;Evaluate Architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tasks do not follow any specific order are related to each other. During the project or rather product lifecycle they repeatedly occur.&lt;/p&gt;

&lt;h1 id=&quot;clarify-requirements&quot;&gt;Clarify requirements&lt;/h1&gt;
&lt;p&gt;If you work in the software industry you will not be surprised that requirements are not always clear. You might ask why it is the architects task to clarify these. Don’t we have functional experts or similar which can nail the requirements? Generally yes. But thats no always the case. And also in good requirement documents there will be room for for assumptions.
Its the task of the architect to actively clarify and make things explicit.&lt;/p&gt;

&lt;p&gt;Also software architecture should be adequate. To fulfill this the architect needs to clearly understand the requirements and then derive quality goals from these. The quality goals can later help to evaluate the architecture.&lt;/p&gt;

&lt;h1 id=&quot;communicate&quot;&gt;Communicate&lt;/h1&gt;
&lt;p&gt;The architect is the role in a development team with the most interfaces/connections to other stakeholders. Therefore he needs to be able to communicate in a variety of “languages” and ways.
Being able to analyze a bug together with the developers in the code and then communicating the results to management is one example. The way the architect needs to talk to these different stakeholders are very different.&lt;/p&gt;

&lt;p&gt;With the developers everything revolves around code. In which component/class is the bug? How can we fix it?&lt;/p&gt;

&lt;p&gt;Management is (usually) not interested in the component that causes the bug. They need to know how much it costs. How many customers are concerned and how long it will take to fix it.&lt;/p&gt;

&lt;p&gt;Also the architect should keep an eye on a up-to-date list of the stakeholders. So that he is aware of who to talk to for different topics. This list can and will evolve over time. I already mentioned two stakeholders but the list can be very long. Additionally to the management and the developers there usually are testers, operation people, security officers, customers, external partners and so on. Each of those should to be addressed slightly differently.
This aspect should also be reflected in the architecture documentation. A good architect clarifies with the relevant stakeholders what information they expect from the documentation and tailors the different parts to their needs.&lt;/p&gt;

&lt;h1 id=&quot;design-structures--transversal-concepts&quot;&gt;Design structures &amp;amp; transversal concepts&lt;/h1&gt;
&lt;p&gt;Designing the structure and finding/defining transversal or cross cutting concepts in the system is probably the main duty of the architect and has many dependencies to there other activities.&lt;/p&gt;

&lt;p&gt;There are many ways to find out how to structure the system. None of them is the “correct” one, instead you should use multiple approaches and actively switch between those to see things from a different perspective. It can help to first start with a rough first idea about technical aspects and refine this over time iteratively. Also it can help to keep the quality goals in mind that have been deducted from the requirements, often these can give an orientation.&lt;/p&gt;

&lt;p&gt;Some keywords that might help for the structure design process are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Top-Down, Bottom-Up&lt;/li&gt;
  &lt;li&gt;Quality Driven Design&lt;/li&gt;
  &lt;li&gt;Domain Driven Design&lt;/li&gt;
  &lt;li&gt;Patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Concepts are aspects that affect multiple building blocks of an application and guide the implementation. They give a more general solution approach. Sometimes selected tools or frameworks come already with a set of concepts. The areas where concepts are applied are diverse.
It could be the way persistence is handled in the system, or logging, transactions, security and many more.
The documentation for concepts should answer the following questions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Why is a problem solved using a distinct concept?
** Show the purpose&lt;/li&gt;
  &lt;li&gt;What is the concept?
** Be very detailed&lt;/li&gt;
  &lt;li&gt;How is the concept applied?
**Show examples, a prototype, code snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;accompany-the-implementation&quot;&gt;Accompany the implementation&lt;/h1&gt;
&lt;p&gt;A critical duty is to accompany the implementation in order to ensure that the decisions taken are also reflected in the code (at different levels). 
A close follow-up also allows to adjust when it shows that decision should be reconsidered. Generally the architectural tasks are to be handled iteratively. Trying things out, gathering feedback and then (if necessary) adjusting is important.
There are a lot of ways for the architect (or the team) to follow-up during the implementation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Code reviews&lt;/li&gt;
  &lt;li&gt;Code analysis&lt;/li&gt;
  &lt;li&gt;Pair/Mob Programming&lt;/li&gt;
  &lt;li&gt;A Definition of Done&lt;/li&gt;
  &lt;li&gt;Coding guidelines&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;evaluate-architectures&quot;&gt;Evaluate Architectures&lt;/h1&gt;
&lt;p&gt;The evaluation of software architecture can either be done quantitatively or qualitatively.&lt;/p&gt;

&lt;p&gt;Quantitatively means that the software is mapped to numbers. There are different measures that can be chosen. Lines of code, complexity, coupling of different components, resource consumption and many more.
It is advisable to combine multiple measures to find hotspots in the code.&lt;/p&gt;

&lt;p&gt;Qualitative evaluation tries to identify risks regarding the quality goals of an architecture and the interplay of different quality goals.
Therefore the chosen quality goals are refined with concrete scenarios. For each of the quality goals a possible implementation approach is selected.
Then the documentation and the code of the software is taken and evaluated against the scenarios and implementation approaches.
The outcome of this is a subjective evaluation which should help to identify which of the quality goals might be at risk.&lt;/p&gt;

&lt;p&gt;The overall outcome of the assessment can be taken as input for other architectural tasks.&lt;/p&gt;

&lt;h1 id=&quot;two-more-things&quot;&gt;Two more things&lt;/h1&gt;
&lt;p&gt;To conclude I want to highlight not all of the different duties need to be done by the same person in the team. The role of the architect can (and should) be spread across the team. Generally there will still be one person that takes the responsibility for the taken decisions – you could call that person the “Chief Architect”.&lt;/p&gt;

&lt;p&gt;As the architect should take responsibility for the system (that it is build correctly and with the correct quality measures), he should also be involved (or involve himself) in different processes. For example the employee or tool selection processes. Furthermore he should have the competency to take design decisions – how can he take responsibility for decisions otherwise.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Teaser Photo from &lt;a href=&quot;https://www.pexels.com/de-de/foto/arbeit-arbeitsplatz-buro-business-273222/&quot;&gt;Pexels&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><author><name>Carlo</name></author><category term="architecture" /><summary type="html">A write up of the 6 duties of a software architect. Requirement clarification, Communication, Structure Design, Transversal Concepts Design, Implementation Accompaniment and Architecture Evaluation</summary></entry><entry><title type="html">I bought a cow</title><link href="http://coding-and-cooking.com/cooking/buyacow/" rel="alternate" type="text/html" title="I bought a cow" /><published>2017-09-10T11:00:00+00:00</published><updated>2017-09-10T11:00:00+00:00</updated><id>http://coding-and-cooking.com/cooking/buyacow</id><content type="html" xml:base="http://coding-and-cooking.com/cooking/buyacow/">&lt;p&gt;Ok not a complete cow but some parts. The idea is called cow sharing or crowd butching/butchering.&lt;/p&gt;

&lt;p&gt;I was made aware of that concept by a tweet of @andreasdotorg – who I follow since I heard a german podcast featuring him talking about the history and process of brewing beer – which actually made me starting brewing beer, but this is a different topic.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;de&quot;&gt;&lt;p lang=&quot;de&quot; dir=&quot;ltr&quot;&gt;Es ist Rouladentag! (Hab ich euch schon &lt;a href=&quot;https://t.co/dfXdTco2AR&quot;&gt;https://t.co/dfXdTco2AR&lt;/a&gt; empfohlen?) &lt;a href=&quot;https://t.co/lSevbCECBS&quot;&gt;pic.twitter.com/lSevbCECBS&lt;/a&gt;&lt;/p&gt;&amp;mdash; andreasdotorg (@andreasdotorg) &lt;a href=&quot;https://twitter.com/andreasdotorg/status/888676049164357633?ref_src=twsrc%5Etfw&quot;&gt;22. Juli 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;The idea is to have a more sustainable stock breeding. To know where your meat comes from and also to foster animal welfare.
I think I would have problems completely living vegan or even vegetarian, but I like the idea to know that the animals have been raised well and that also the farmers can make a living out of it.&lt;/p&gt;

&lt;p&gt;While researching I came across different sites and finally decided to try &lt;a href=&quot;https://www.kaufnekuh.de/?invite=598c9af86649d&quot;&gt;kaufnekuh.de*&lt;/a&gt; .
It not only appealed to me because of their interesting graphic on their website to show how much of the current cow is already sold.
But also because they offer a small package with about 3,6 kg of meat, which I liked to test the whole thing.&lt;/p&gt;

&lt;p&gt;When I finally decided to try it out, the cow on sale was DE 8418 from Joseph and Thomas Pfaff from Ravensburg.&lt;/p&gt;

&lt;p&gt;I decided to go for the small package without the BBQ option. If you choose the BBQ option some parts that are not ideal for the BBQ (e.g. the goulash) is turned into burgers or sausages.&lt;/p&gt;

&lt;p&gt;This package contains the following parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Roastbeef (300g)&lt;/li&gt;
  &lt;li&gt;Roulade (2x 180g)&lt;/li&gt;
  &lt;li&gt;Steak (2x 160g)&lt;/li&gt;
  &lt;li&gt;Strips (1x 240g)&lt;/li&gt;
  &lt;li&gt;Brisket (1x 350g)&lt;/li&gt;
  &lt;li&gt;Soupmeat (1x 250g)&lt;/li&gt;
  &lt;li&gt;Ground Beef (2x 240g)&lt;/li&gt;
  &lt;li&gt;Goulash (2x 240g)&lt;/li&gt;
  &lt;li&gt;Burgers (4x 120g)&lt;/li&gt;
  &lt;li&gt;Chipolata Sausage (6x 75g)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some people who I told that I bought (parts of) a cow wondered why I couldn’t directly choose the parts that I want. I think this is part of the whole idea as a cow consists of way more than just steaks.
That’s something I personally like about this concept. As it brings me to try out new things. There are parts in my package that I have never cooked before and where I don’t know yet what I can make out of them.&lt;/p&gt;

&lt;p&gt;After buying I was constantly kept up-to-date via mail about the current status. I was for instance informed when the cow was completely sold, when it was butchered, and when it was ripe and prepared for shipment. This was pretty good as it took around 3 weeks for the cow to arrive and every mail fed my anticipation.&lt;/p&gt;

&lt;p&gt;The Cow – or better my parts – where delivered in a thermo bag which I could directly put into the fridge…&lt;/p&gt;

&lt;p&gt;What I also liked was the list included in the package that you can pin to your fridge and mark what meat you took out, so that you can easily keep track of what you still have.&lt;/p&gt;

&lt;figure class=&quot;third &quot;&gt;
  
    
      &lt;a href=&quot;/assets/images/buyacow/cow.png&quot; title=&quot;Selling status indicator&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/cow.png&quot; alt=&quot;Selling status indicator&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/buyacow/kaufnekuh-package-1.jpg&quot; title=&quot;Package shot 1&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/kaufnekuh-package-1.jpg&quot; alt=&quot;Package shot 1&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/buyacow/kaufnekuh-package-2.jpg&quot; title=&quot;Package shot 2&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/kaufnekuh-package-2.jpg&quot; alt=&quot;Package shot 2&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/buyacow/kaufnekuh-package-3.jpg&quot; title=&quot;Package shot 3&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/kaufnekuh-package-3.jpg&quot; alt=&quot;Package shot 3&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/buyacow/kaufnekuh-content.jpg&quot; title=&quot;Package content&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/kaufnekuh-content.jpg&quot; alt=&quot;Package content&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/buyacow/kaufnekuh-list.jpg&quot; title=&quot;Package list&quot;&gt;
        &lt;img src=&quot;/assets/images/buyacow/kaufnekuh-list.jpg&quot; alt=&quot;Package list&quot; /&gt;
      &lt;/a&gt;
    
  
  
    &lt;figcaption&gt;Photos
&lt;/figcaption&gt;
  
&lt;/figure&gt;</content><author><name>Carlo</name></author><category term="beef" /><summary type="html">Sustainable stock breeding. Delivered to your home.</summary></entry><entry><title type="html">Vegan Mousse au Chocolat</title><link href="http://coding-and-cooking.com/cooking/vegan-mousse-au-chocolat/" rel="alternate" type="text/html" title="Vegan Mousse au Chocolat" /><published>2017-08-26T11:00:00+00:00</published><updated>2017-08-26T11:00:00+00:00</updated><id>http://coding-and-cooking.com/cooking/vegan-mousse-au-chocolat</id><content type="html" xml:base="http://coding-and-cooking.com/cooking/vegan-mousse-au-chocolat/">&lt;p&gt;Today I had a small dilemma.
I could not decide if I want to continue programming to process on the coding-related blog series or if I should finally add a cooking related post to my site.&lt;/p&gt;

&lt;p&gt;As so often my wife helped me decide. She wished to try the vegan mousse au chocolat that I learned about last week in a cooking class.&lt;/p&gt;

&lt;p&gt;Neither me nor my wife are vegan (or even vegetarian) but nevertheless we like to look beyond horizons and see different things.
I was lucky to get that vegan cooking class as a birthday gift from my family and was generally be interested what we will be cooking.&lt;/p&gt;

&lt;p&gt;I was quite surprise when I saw mousse au chocolate in the recipe booklet. I was even more surprised by the main ingredient which is called &lt;em&gt;Aquafaba&lt;/em&gt;. Something I had never heard before. So I asked the cooking instructor what Aquafaba is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aquafaba is the name for the water in which chickpeas have been cooked.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This blew my mind.&lt;/p&gt;

&lt;p&gt;Wait what? You can turn the water from the chick peas can into mousse au chocolat? Me – and also the other participants – where really surprised. Afterwards I checked on the net and probably one could have known Aquafaba before, as especially in the vegan cuisine it seems to be pretty common – as it works as a good replacement for egg white. The name is latin “Aqua” – water and “faba” – bean.&lt;/p&gt;

&lt;p&gt;If you want to learn more about Aquafaba check out &lt;a href=&quot;http://aquafaba.com&quot;&gt;Aquafaba.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So how does this work? Pretty much how you would make standard mousse au chocolat actually.&lt;/p&gt;

&lt;p&gt;Ingredients for 4 small servings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;125ml Aquafaba (e.g. from one 400gr can of chick peas)&lt;/li&gt;
  &lt;li&gt;1 tsp Winestone baking soda&lt;/li&gt;
  &lt;li&gt;0,5 tsp Lemonjuice&lt;/li&gt;
  &lt;li&gt;120gr dark chocolate&lt;/li&gt;
  &lt;li&gt;30gr powdered sugar&lt;/li&gt;
  &lt;li&gt;pinch of salt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First the chocolate is chopped in fine pieces and then slowly melted in a water bath.&lt;/p&gt;

&lt;p&gt;In the meanwhile add the lemon juice and baking soda to the Aquafaba and put it in the kitchen machine to stiff. This may take a few minutes. But in the end it will look just like stiffed egg white.&lt;/p&gt;

&lt;p&gt;After a few moments you can add the powdered sugar (sift it before adding) and the little salt.&lt;/p&gt;

&lt;p&gt;When the chocolate is melted turn the heat off and let the chocolate cool down a little bit. It is important that the chocolate cools down so that it is nearly hard again before you can fold the stiffed Aquafaba with the chocolate.&lt;/p&gt;

&lt;p&gt;Once the Aquafaba is stiff and the chocolate cooled down carefully mix everything.&lt;/p&gt;

&lt;p&gt;Then fill the mass in 4 bowls and put them in the fridge. Leave them in the fridge for at least 2 hours ( thats the time we gave it in the cooking class while eating the other dishes). If you can cool them even longer to have better texture.&lt;/p&gt;

&lt;figure class=&quot;third &quot;&gt;
  
    
      &lt;a href=&quot;/assets/images/vegan-mousse/start.jpg&quot; title=&quot;Aquafaba before mixing&quot;&gt;
        &lt;img src=&quot;/assets/images/vegan-mousse/start.jpg&quot; alt=&quot;Aquafaba before mixing&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/vegan-mousse/stiff.jpg&quot; title=&quot;Stiff Aquafaba&quot;&gt;
        &lt;img src=&quot;/assets/images/vegan-mousse/stiff.jpg&quot; alt=&quot;Stiff Aquafaba&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/vegan-mousse/finished-mousse.jpg&quot; title=&quot;Finished Mousse&quot;&gt;
        &lt;img src=&quot;/assets/images/vegan-mousse/finished-mousse.jpg&quot; alt=&quot;Finished Mousse&quot; /&gt;
      &lt;/a&gt;
    
  
    
      &lt;a href=&quot;/assets/images/vegan-mousse/ingredients-mousse.jpg&quot; title=&quot;Ingredients&quot;&gt;
        &lt;img src=&quot;/assets/images/vegan-mousse/ingredients-mousse.jpg&quot; alt=&quot;Ingredients for the mousse&quot; /&gt;
      &lt;/a&gt;
    
  
  
    &lt;figcaption&gt;Photos
&lt;/figcaption&gt;
  
&lt;/figure&gt;</content><author><name>Carlo</name></author><category term="dessert" /><category term="vegan" /><summary type="html">Turning chick peas into mousse au chocolat</summary></entry></feed>