Gien's Blog2023-09-01T12:44:08+00:00https://www.gienverschatse.com/Gien VerschatseCopenhagen Dev Festival - Slides Manage the Understandability of Your Systems2023-09-01T00:00:00+00:00https://www.gienverschatse.com//talks/2023/09/01/talk-cdf<p>At Copenhagen Developers Festival, I was invited to give a talk about bounded contexts as understandability boundaries. I did this presentation together with my colleague <a href="https://twitter.com/mathiasverraes">Mathias Verraes</a>.</p>
<!--more-->
<iframe class="speakerdeck-iframe" style="border: 0px; background: rgba(0, 0, 0, 0.1) padding-box; margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;" frameborder="0" src="https://speakerdeck.com/player/7aa5fc311c164a2881cf330ec942b4a0" title="Bounded Contexts: Manage the Understandability of Your Systems" allowfullscreen="true" data-ratio="1.7777777777777777"></iframe>
DDDEU23 - Slides Collaborative software design2023-06-16T00:00:00+00:00https://www.gienverschatse.com//talks/2023/06/16/talk-dddeu<p>At DDDEU23, after being invited to give a hands-on lab on modelling constraints, I was unexpectedly invited to give a talk about the book “Collaborative software design” I am writing too. This time I did it on my own, without the help of my co-authors <a href="https://twitter.com/kenny_baas">Kenny Baas-Schwegler</a> and <a href="https://twitter.com/EvelynvanKelle">Evelyn van Kelle</a>. It is similar to the talk I did with Evenlyn at TEQNation earlier that month, with my own personal touches on the content.</p>
<!--more-->
<iframe class="speakerdeck-iframe" style="border: 0px none; background: rgba(0, 0, 0, 0.1) padding-box; margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 314;" src="https://speakerdeck.com/player/3e710623080344e6bb3c451c1e87e53f" title="Collaborative Software Design: How to facilitate design decisions " allowfullscreen="true" data-ratio="1.78343949044586" frameborder="0"></iframe>
Product and tech - 4 weddings and a funeral2023-05-27T00:00:00+00:00https://www.gienverschatse.com//talks/2023/05/27/talk-ncrafts<p>At NCrafts 2023 in Paris, I spoke about some challenges around product thinking I noticed at my customers and try to offer a way of talking about this with other developers.</p>
<!--more-->
<iframe class="speakerdeck-iframe" style="border: 0px none; background: rgba(0, 0, 0, 0.1) padding-box; margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 314;" src="https://speakerdeck.com/player/03404dceb9f74998b459259206fdb3b9" title="Prod and Tech: 4 weddings and a funeral" allowfullscreen="true" data-ratio="1.78343949044586" frameborder="0"></iframe>
Collaborative software design - How to facilitate domain modeling decisions2023-05-18T00:00:00+00:00https://www.gienverschatse.com//talks/2023/05/18/talk-teqnation<p>It’s a challenge to arrive at achievable, sustainable software design decisions. Fortunately, there’s a collection of tools and techniques you can use to facilitate productive decision-making sessions, even when you involve a diverse group of business and technical stakeholders. Placing such a diverse group of people in the same room, brings social challenges with it. At TEQNation 2023 in Utrecht, <a href="https://twitter.com/EvelynvanKelle">Evelyn van Kelle</a> and I spoke about these social challenges and how to deal with them in your company.</p>
<!--more-->
<iframe class="speakerdeck-iframe" style="border: 0px none; background: rgba(0, 0, 0, 0.1) padding-box; margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 314;" src="https://speakerdeck.com/player/18c0b1e3a905407dba28908ebb1e7525" title="Collaborative software design - How to facilitate domain modeling decisions" allowfullscreen="true" data-ratio="1.78343949044586" frameborder="0"></iframe>
The Scout Mindset - Why Some People See Things Clearly and Others Don't by Julia Galef2022-03-25T00:00:00+00:00https://www.gienverschatse.com//books/2022/03/25/scouts-mindset<h3 id="introduction">Introduction</h3>
<blockquote>
<p>scout mindset: the motivation to see things as they are, not as you wish they were. (Location 103)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>As the late physicist Richard Feynman once said, “The first principle is that you must not fool yourself — and you are the easiest person to fool.” (Location 107)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>our judgment isn’t limited by knowledge nearly as much as it’s limited by attitude. (Location 124)</p>
</blockquote>
<h3 id="part-i-the-case-for-scout-mindset">Part I The Case for Scout Mindset</h3>
<blockquote>
<p>The investigation of Dreyfus is an example of an aspect of human psychology called directionally motivated reasoning — or, more often, just motivated reasoning — in which our unconscious motives affect the conclusions we draw. (Location 215)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>“Must I believe this?,” searching for an excuse to reject (Location 220)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Being in scout mindset means wanting your “map” — your perception of yourself and the world — to be as accurate as possible. (Location 319)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>if you get defensive or combative when you hear the truth, you’re not likely to hear it very often. (Location 350)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Psychologists make a distinction between self - enhancement, which means boosting your ego with positive beliefs, and self - protection, which means avoiding blows to your ego. (Location 460)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>It also means demonstrating your loyalty to the group by rejecting any evidence that threatens its figurative honor. (Location 553)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>present bias, a feature of our intuitive decision - making in which we care too much about short - term consequences and too little about long - term consequences. (Location 657)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The benefit also lies in the fact that you’re reinforcing valuable skills and habits. (Location 679)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>when you tell a lie, it’s hard to predict exactly what you’ve committed your future self to. (Location 698)</p>
</blockquote>
<h3 id="part-ii-developing-self-awareness">Part II Developing Self-Awareness</h3>
<blockquote>
<p>And being able to explain a position “rationally,” as he put it — by which people usually mean that they can make a compelling argument in favor of their position — doesn’t mean the position is fair. (Location 807)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>When you start from the premise that you’re an objective thinker, you lend your conclusions an air of unimpeachability they usually don’t deserve. (Location 821)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>It’s a lot easier to say you welcome criticism than it is to actually welcome it. (Location 919)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>What Dan did was a version of the “double standard test”: “Am I judging other people’s behavior by a standard I wouldn’t apply to myself?” (Location 1080)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>this test can also reveal the opposite double standard — that you’re judging yourself more harshly than you would judge someone else in exactly the same situation. (Location 1090)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>an outsider test: Imagine someone else stepped into your shoes — what do you expect they would do in your situation? (ocation 1108)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>conformity test: Imagine this person told me that they no longer held this view. Would I still hold it? Would I feel comfortable defending it to them? (Location 1133)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>the selective skeptic test: Imagine this evidence supported the other side. How credible would you find it then? (Location 1153)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Selective skeptic test: Imagine the article had been full of cherry - picked quotes from a group you dislike, such as conservatives. * How would you react? (Location 1161)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>the “status quo bias,” a motivation to defend whatever situation happens to be the status quo. (Location 1170)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>A bet is any decision in which you stand to gain or lose something of value, based on the outcome. (Location 1483)</p>
</blockquote>
<h3 id="part-iii-thriving-without-illusions">Part III Thriving Without Illusions</h3>
<blockquote>
<p>A silver lining to any mistake is the lesson you’re going to extract from the experience, which you can use to help save you from similar mistakes in the future. (Location 1684)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Calling people’s beliefs “biased” or “illusions” without any objective standard of reality to compare them to is a problem that’s rampant throughout the research on self - deception. (Location 1742)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Over time, your situation will change, or you’ll learn new information, and you’ll need to revise your estimate of the odds. (Location 1857)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>One is epistemic confidence, or certainty — how sure you are about what’s true. (Location 2056)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Separately, there’s social confidence, or self - assurance: Are you at ease in social situations? (Location 2059)</p>
</blockquote>
<h3 id="part-iv-changing-your-mind">Part IV Changing Your Mind</h3>
<blockquote>
<p>The word admit makes it sound like you screwed up but that you deserve to be forgiven because you’re only human. (Location 2369)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>But in many cases, there’s an unknown unknown, a hidden “option C,” that enriches our picture of the world in a way we wouldn’t have been able to anticipate. (Location 2598)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>He calls it a “de minimus error,” an attempt to minimize the inconsistency between observations and theory. (Location 2658)</p>
</blockquote>
<h3 id="part-v-rethinking-identity">Part V Rethinking Identity</h3>
<blockquote>
<p>If you use epithets like these in talking about a particular issue, that’s a sign you’re viewing it as a fight between people, not ideas. (Location 3122)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>it does mean that your identity is probably coloring your judgment. (Location 3124)</p>
</blockquote>
<h3 id="conclusion">Conclusion</h3>
<blockquote>
<p>You can focus on humanity’s capacity for self - serving distortions of reality and feel bitter. Or you can focus on the flip side of the coin, the Picquarts of the world who are willing to spend years of their life making sure the truth wins out, and feel inspired to live up to their example. (Location 3678)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p>Galef, Julia. <a href="https://www.goodreads.com/book/show/54181287-the-scout-mindset">The Scout Mindset: Why Some People See Things Clearly and Others Don’t</a>. Little, Brown Book Group. Kindle Edition.</p>
ERRORS - bugs, boo-boos, blunders by Gerald Weinberg2022-02-08T00:00:00+00:00https://www.gienverschatse.com//books/2022/02/08/errors-blunders-booboos<p>I love reading books by Gerald Weinberg, I try to read at least one book a year from him (he has many). I came across a very short (129 pages) book on <a href="https://www.selketjah.com/books/2020/03/02/are-your-lights-on/">problem solving</a>, which was a lesser known book of him,
so for my next book I decided to do the same. This time I picked up <code class="language-plaintext highlighter-rouge">ERRORS: bugs, boo-boos, blunders</code>, a book about everything error related in programming. It was a good choice! The book is well written, funny at times, full of examples and made me think about errors differently. In the last chapter, he describes the experience of Alice, a person who has to use software to do their job. At the end of the chapter, you have eight laws of error defense from a user perspective, which I thought was very interesting.</p>
<!--more-->
<h3 id="the-eight-laws-of-error-defense">The eight Laws of Error Defense</h3>
<ol>
<li>IF YOU DESTROY THE SYSTEM FROM THE KEYBOARD IT’S NEVER YOUR FAULT.</li>
<li>THE THIRD TIME YOU DESTROY THE SYSTEM FROM THE KEYBOARD IN THE SAME WAY, IT IS YOUR FAULT.</li>
<li>IT WON’T GO AWAY BY ITSELF, SO GET AROUND IT ANY WHICH WAY YOU CAN.</li>
<li>IF THE PROGRAMMERS DO IT WRONG ONCE, THEY ARE LIKELY TO DO IT WRONG AGAIN.</li>
<li>IT NEVER HURTS TO KNOW HOW THINGS LOOK BEHIND THE IRON CURTAIN.</li>
<li>WHEN THE FILES GROW SUFFICIENTLY BIG THE APPLICATION WILL FAIL.</li>
<li>ONE THING WORSE THAN AN ERROR IS AN ERROR FARM.</li>
<li>IF THEY WILL NOT LET YOU TEST IT AT HOME, LEAVE IT IN THE STORE.</li>
</ol>
<h3 id="part-1-how-do-we-think-about-errors">Part 1. How Do We Think About Errors?</h3>
<blockquote>
<p>You cannot say that someone is morally inferior because they don’t do something they cannot do. (Location 273)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I doubt it, because to have value, software must be more than perfect. It must be useful to someone. (Location 295)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The workers in a software organization are one sample. The managers are a different sample. The managers are not “ just like ” the rest of the people — else why were they selected to be managers, and why are they being paid more money? (Location 526)</p>
</blockquote>
<h3 id="part-2-what-do-errors-cost">Part 2. What Do Errors Cost?</h3>
<blockquote>
<p>the first step in managing failures is to manage customer expectations — but that’s always the first step in managing quality. (Location 769)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Nobody notices that statement 3 is a statement about the difficulty of making the change, not the consequences of making it, or of making it wrong. (Location 845)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Higher managers are left untouched. After all, what could they have done? (Location 855)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Nobody wants to believe the Second Law of Thermodynamics applies to them. (Location 927)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>If no relationship can be traced, then the secondary requirement is not a real requirement at all. (Location 951)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Discontent over standards arises when people who must conform to the standards cannot make the cause - effect connection between the standard and the value of the standard. (Location 978)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Your errors will be worthless if you believe they are worthless, so you don’t investigate why they happened. (Location 1037)</p>
</blockquote>
<h3 id="part-3-where-do-errors-come-from">Part 3. Where Do Errors Come From?</h3>
<blockquote>
<p>If they were truly identical, they would find the identical errors, so the second wouldn’t add any value to the first. (Location 1614)</p>
</blockquote>
<h3 id="part-4-how-do-we-get-rid-of-errors">Part 4. How Do We Get Rid of Errors?</h3>
<blockquote>
<p>Developers quickly throw code “ over the wall ” to testers, so that errors are seen as somehow arising during test, rather than from coding. (Location 1750)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Variation provides the new ideas ; selection weeds out the ones lacking promise ; and retention propagates the ones that survive the selection. (Location 2085)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Less effective organizations believe that such error sequences are inevitable. (Location 2128)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>if we can’t provide what our users want, then convince those users that what we do provide is what they really wanted in the first place. (Location 2188)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Much of the dissatisfaction with computers arises from unkept promises. Sometimes the programmers simply can’t do what the specification has promised. (Location 2199)</p>
</blockquote>
<h3 id="part-5-how-do-we-prevent-errorsh3-classnoteheadinghighlight-yellow---53-go-slow-go-fast-">Part 5. How Do We Prevent Errors?<h3 class='noteHeading'>Highlight (<span class="highlight_yellow">yellow</span>) - 5.3 Go Slow, Go Fast ></h3>
<blockquote>
<p>the more different people use code or data, the more constraints there will be when it comes time to change. (Location 2364)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>They can look forward to more maintenance, more difficult maintenance, done under greater constraints, with greater shortages of professional staff — and, of course, more errors. (Location 2367)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Because they’re in a dopey daze, however, many managers won’t be looking forward at all. (Location 2368)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>If you wish to remove errors, then, start by testing your thinking. (Location 2417)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Contrary to simple - minded intuition, it turns out that “ tiny ” changes are more likely than larger ones to be flawed. (Location 2586)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>In development, you simply fix errors and go on your merry way. (Location 2594)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>If you’re afraid to do what you know is right, then you’re not a real programmer, tester, or manager. (Location 2673)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p>Weinberg, Gerald M. <a href="https://www.goodreads.com/book/show/40665361-errors">ERRORS: bugs, boo-boos, blunders</a>. leanpub.com. Kindle Edition.</p>
The great mental models volume 1 by Shane Parrish and Rhiannon Beaubien2021-09-12T00:00:00+00:00https://www.gienverschatse.com//books/2021/09/12/great-mental-models-v1<p>I enjoyed reading this book. It is well written and goes down easy. Each chapter starts with a list of people who are linked to the topic introduced in the chapter, which I thought was a very nice addition to the book. None of the topics covered in this book were new to me, I have read about these concepts before, but it was nice to read about them again. For anyone interested in mental models (and indirectly systems thinking), this is a nice introduction.</p>
<!--more-->
<p>Topics covered in this book are:</p>
<ul>
<li>The map is not the territory</li>
<li>Circle of competence</li>
<li>First principles thinking</li>
<li>Thought experiment</li>
<li>Second-order thinking</li>
<li>Probalistic thinking</li>
<li>Inversion</li>
<li>Occam’s razor</li>
<li>Hanlon’s razor</li>
</ul>
<h3 id="preface">Preface</h3>
<blockquote>
<p>Education doesn’t prepare you for the real world. At least, it didn’t prepare me. (Location 53)</p>
</blockquote>
<h3 id="acquiring-wisdom">Acquiring Wisdom</h3>
<blockquote>
<p>When understanding is separated from reality, we lose our powers. Understanding must constantly be tested against reality and updated accordingly. (Location 155)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>If you don’t test your ideas against the real world — keep contact with the earth — how can you be sure you understand? (Location 159)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Our failures to update from interacting with reality spring primarily from three things: not having the right perspective or vantage point, ego - induced denial, and distance from the consequences of our decisions. (Location 166)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The first flaw is perspective. We have a hard time seeing any system that we are in. (Location 169)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The second flaw is ego. Many of us tend to have too much invested in our opinions of ourselves to see the world’s feedback — the feedback we need to update our beliefs about reality. (Location 179)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The third flaw is distance. The further we are from the results of our decisions, the easier it is to keep our current views rather than update them. (Location 184)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>We also tend to undervalue the elementary ideas and overvalue the complicated ones. (Location 199)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>We have a tendency to think that how the world is, is how it always was. And so we get caught up validating our assumptions from what we find in the here and now. (Location 293)</p>
</blockquote>
<h3 id="the-map-is-not-the-territory">The Map is not the Territory</h3>
<blockquote>
<p>If a map were to represent the territory with perfect fidelity , it would no longer be a reduction and thus would no longer be useful to us. (Location 394)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>A map can also be a snapshot of a point in time, representing something that no longer exists. (Location 395)</p>
</blockquote>
<h3 id="supporting-idea-falsifiability">Supporting Idea: Falsifiability</h3>
<blockquote>
<p>Too frequently, these postulated laws become immune to falsifying evidence — any new evidence is interpreted through the lens of the theory. (Location 741)</p>
</blockquote>
<h3 id="first-principles-thinking">First Principles Thinking</h3>
<blockquote>
<p>First principles are the boundaries that we have to work within in any given situation — so when it comes to thermodynamics an appliance maker might have different first principles than a physicist. (Location 784)</p>
</blockquote>
<h3 id="supporting-idea-necessity-and-sufficiency">Supporting Idea: Necessity and Sufficiency</h3>
<blockquote>
<p>We often make the mistake of assuming that having some necessary conditions in place means that we have all of the sufficient conditions in place for our desired event or effect to occur. (Location 1034)</p>
</blockquote>
<h3 id="second-order-thinking">Second-Order Thinking</h3>
<blockquote>
<p>«Stupidity is the same as evil if you judge by the results.» (Location 1077)</p>
</blockquote>
<h3 id="probabilistic-thinking">Probabilistic Thinking</h3>
<blockquote>
<p>Probabilistic thinking is essentially trying to estimate, using some tools of math and logic, the likelihood of any specific outcome coming to pass. (Location 1197)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Conditional probability is similar to Bayesian thinking in practice, but comes at it from a different angle. When you use historical events to predict the future, you have to be mindful of the conditions that surrounded that event. (Location 1242)</p>
</blockquote>
<h3 id="inversion">Inversion</h3>
<blockquote>
<p>Instead of thinking through the achievement of a positive outcome, we could ask ourselves how we might achieve a terrible outcome, and let that guide our decision-making. (Location 1501)</p>
</blockquote>
<h3 id="hanlons-razor">Hanlon’s Razor</h3>
<blockquote>
<p>Hanlon’s Razor states that we should not attribute to malice that which is more easily explained by stupidity. (Location 1712)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Always assuming malice puts you at the center of everyone else’s world. This is an incredibly self-centered approach to life. (Location 1744)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.goodreads.com/book/show/58103132-the-great-mental-models">Parrish, Shane; Beaubien, Rhiannon. The Great Mental Models Volume 1: General Thinking Concepts. Latticework Publishing Inc.. Kindle Edition.</a></p>
Lost connections by Johann Hari2021-09-01T00:00:00+00:00https://www.gienverschatse.com//books/2021/09/01/lost-connections<p>What really causes depression and anxiety – and how can we really solve them? Award-winning journalist Johann Hari suffered from depression since he was a child and started taking anti-depressants when he was a teenager. He was told that his problems were caused by a chemical imbalance in his brain. As an adult, trained in the social sciences, he began to investigate whether this was true – and he learned that almost everything we have been told about depression and anxiety is wrong.</p>
<!--more-->
<blockquote>
<p>That’s why he did something no scientist in this field had done with really obese people before . He stopped telling them what to do — and started listening to them instead .
<br /></p>
</blockquote>
<blockquote>
<p>“What we had perceived as the problem — major obesity — was in fact, very frequently, the solution to problems that the rest of us knew nothing about.”
<br /></p>
</blockquote>
<blockquote>
<p>turned out people treating obesity had noticed before that a disproportionate number of obese people described being abused . They just assumed that they were making excuses.
<br /></p>
</blockquote>
<blockquote>
<p>depression is a normal response to abnormal life experiences.
<br /></p>
</blockquote>
<blockquote>
<p>The belief that it all comes down to biology protects you, in a way, for a while.
<br /></p>
</blockquote>
<blockquote>
<p>Psychological damage doesn’t have to be as extreme as childhood violence to affect you profoundly.
<br /></p>
</blockquote>
<blockquote>
<p>The more unequal your society , the more prevalent all forms of mental illness are.
<br /></p>
</blockquote>
<blockquote>
<p>It strongly suggested that something about inequality seems to be driving up depression and anxiety.
<br /></p>
</blockquote>
<blockquote>
<p>We’ll lower our heads and our bodies and silently say: Leave me alone. You beat me. I can’t take this any more.
<br /></p>
</blockquote>
<blockquote>
<p>“We had to find a way to speak … that everyone could understand. That forced us — me — to think about what I wanted to say, not to take refuge in some well - formulated phrases that in the end don’t say anything at all.”
<br /></p>
</blockquote>
<blockquote>
<p>We say we’re a democracy , but people are so far removed from the concept.</p>
</blockquote>
<h2 id="conclusion">Conclusion</h2>
<blockquote>
<p>So I told myself: if you hear a thought in your head telling you that we can’t deal with the social causes of depression and anxiety, you should stop and realize—that’s a symptom of the depression and anxiety itself.
<br /></p>
</blockquote>
<blockquote>
<p>Depression and anxiety have three kinds of causes—biological, psychological, and social. They are all real, and none of these three can be described by something as crude as the idea of a chemical imbalance.</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.goodreads.com/book/show/54615391-lost-connections">Hari, Johann. Lost Connections (p. 309). Bloomsbury Publishing. Kindle Edition.</a></p>
The people in programming2020-08-26T00:00:00+00:00https://www.gienverschatse.com//books/2020/08/26/people-in-programming<ol>
<li>How to Win Friends and Influence People
<ul>
<li>by Dale Carnegie</li>
</ul>
</li>
<li>The Basic Laws of Human Stupidity
<ul>
<li>by Carlo M. Cipolla</li>
</ul>
</li>
<li>Predictably Irrational: The Hidden Forces That Shape Our Decisions
<ul>
<li>by Dan Ariely</li>
</ul>
</li>
<li>Thinking, Fast and Slow
<ul>
<li>by Daniel Kahneman</li>
</ul>
</li>
<li>Getting to Yes: Negotiating an Agreement Without Giving In
<ul>
<li>by Roger Fisher, William Ury, Bruce Patton</li>
</ul>
</li>
<li>Quiet: The Power of Introverts in a World That Can’t Stop Talking
<ul>
<li>by Susan Cain</li>
</ul>
</li>
<li>The Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good Life
<ul>
<li>by Mark Manson</li>
</ul>
</li>
<li>The Upside of Irrationality: The Unexpected Benefits of Defying Logic at Work and at Home
<ul>
<li>by Dan Ariely</li>
</ul>
</li>
<li>Crucial Conversations: Tools for Talking When Stakes Are High
<ul>
<li>by Kerry Patterson, Joseph Grenny, Ron McMillan, Al Switzler, Stephen R. Covey</li>
</ul>
</li>
<li>Never Split the Difference: Negotiating As If Your Life Depends On It
<ul>
<li>by Chris Voss</li>
</ul>
</li>
<li>Becoming a technical leader: an organic problem-solving approach
<ul>
<li>by Gerald M. Weinberg</li>
</ul>
</li>
<li>Exercising influence: A Guide for Making Things Happen at Work, at Home, and in Your Community
<ul>
<li>By B. Kim Barnes</li>
</ul>
</li>
<li>Polarity Management: Identifying and Managing Unsolvable Problems
<ul>
<li>By Barry Johnson</li>
</ul>
</li>
</ol>
On being apolitical as a conference organisor2020-06-06T00:00:00+00:00https://www.gienverschatse.com//no-category/2020/06/06/an-apolitical-post<p>For the past 24 hours I have been told that, as a conference organisor:</p>
<ul>
<li>I should be careful about getting involved in US politics</li>
<li>I am supposed to stay out of politics</li>
<li>I shouldn’t try to be “politically correct”</li>
<li>I should remain apolitical</li>
<li>etc…</li>
</ul>
<p>I am tired of hearing that over and over again. So here is my answer:</p>
<ul>
<li>When I show compassion for my speakers, is seen as me being political,</li>
<li>When I want to invite a wide range of speakers with different backgrounds, is me trying to be “politically correct”,</li>
<li>When I say ‘Black Lives Matter’ and people think I am making a political statement,</li>
<li>When I want to support a good cause such as <a href="https://twitter.com/BlackGirlsCode">@BlackGirlsCode</a> by asking to donate, is viewed as me “not being apolitical”,</li>
</ul>
<p>then there is something wrong with people thinking I am being political, not with me.</p>
<blockquote>
<p>Being apolitical means: not interested or involved in politics.</p>
</blockquote>
<ul>
<li>How am I supposed to stay out of politics, when my speakers are affected by the protests in the United States?</li>
<li>How am I supposed to ignore United States politics, when Belgian politicians started using their tactics, such as ‘The war on drugs’ to get votes?</li>
<li>How am I supposed to say apolitical things, when they have abused the language I speak for their political agenda?</li>
<li>How am I supposed to stay apolitical, when politicians tap into my hopes and dreams?</li>
<li>How am I supposed to be apolitical when they try to tap into my fears?</li>
</ul>
<p>If I have to stay away from politics, then politics has to stay away from me. Politics abuses <strong>my</strong> emotions, <strong>my</strong> values, <strong>my</strong> language, <strong>my</strong> gender, <strong>my</strong> culture, <strong>my</strong> identity for its own gain. There is no boundary it is not willing to cross, so I don’t know how or where to draw a line anymore.</p>
<p><br /></p>
<p>Politics is about us, our community, our lives. I am making a stand. Why aren’t you?</p>
Pro-Con-Fix list, a simple tool for visualising a trade-off2020-05-16T00:00:00+00:00https://www.gienverschatse.com//decision-theory/2020/05/16/pro-con-fix<p>There is no better feeling than an well planned meeting ending on a high note. It is true, I find that an amazing feeling. The problem is that it happens very rarely. Most of my meetings are utterly frustrating, turning into endless discussions instead of constructive conversations. More often than not I walk away without knowing what was decided (if anything was decided at all) or how to proceed moving forward with a clear overview of actionable steps. Often those discussions go hand in hand with focusing on one negative aspect that we would have to deal with in our code, without even talking about all the positive implications this would have on our system.</p>
<p>The idea of having to do that for the rest of my career was pretty depressing. I just couldn’t accept that this was the way I would feel about meetings for the rest of my career. It is not possible to avoid all meetings and I don’t want to be frustrated every time I come out of one. So I went looking for a better way. It has been a long and slow process, with many experiments that did not go well, but I am starting to get the hang of it.</p>
<!--more-->
<p>One important thing I realised is that visualisation while having a discussion is super important. Information needs to be visualised in an easy format. I want to start sharing those visualisations with you, in case you are also looking for a better way to do meetings. One of those easy structures to visualize decisions or discussions during a meeting is the Pro-Con-Fix list. I found it to be very helpful when thinking about the benefits or drawbacks each option would have on the current situation.</p>
<h2 id="what-is-a-pro-con-fix-list">What is a Pro-Con-Fix list?</h2>
<p>The Pro-Con-Fix list<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> is an extension of the Pro’s and Cons list, that will help you deal with the tendency to overfocus on the drawbacks of an option.</p>
<p>We start by writing down all the advantages of the option, all the things you will gain when you pick this option. I know it is tempting to start with summing up the Cons first, because it is a lot easier to come up with those, but remember we are starting with the Pro’s for a good reason. We don’t want to end up in a discussion where we only talk about the Cons.</p>
<p>Thinking about biking to work for a second. I am sure you can come up with a lot more downsides than benefits from biking to work. Oh, here we go: it takes longer, you arrive sweaty, you lose your company car, you get wet when it rains, etc… Please make it stop!
Now think about the benefits. Euh… It is healthy to exercise? That is it, that is all I have, but back to those Cons…</p>
<p>So, write down the Pro’s first! After that, you write down all the disadvantages of the option. This is where it gets interesting. After you write down a disadvantage, <em>you think about the way you could fix it</em>. It sounds simple (because it is) and it is very powerful. For example: one of the drawbacks of biking to work is that you get wet when it rains. There are a lot of ways to deal with that: put your office clothes in your office (that also works for being sweaty), buy water repelling clothes. Biking to work in the rain didn’t become a joy all of the sudden, but it did neutralise one of the disadvantage.</p>
<h2 id="when-do-you-use-it">When do you use it?</h2>
<p>The best situation in which you can use a Pro-Con-Fix list, is a situation where you want to compare two options with each other.
A binary decision is a very good fit for the Pro-Con-Fix list: yes or no on taking this specific job, yes or no on buying this specific car etc..</p>
<p>If you want to start comparing three or more options, there are other structures you could use. One of those, working with a comparison matrix, I demonstrate in my talk <a href="https://www.youtube.com/watch?v=5uKR3Py6ejo">The Curious Case of Freya, Suave and Giraffe: reducing risks in picking a new tech</a></p>
<h2 id="example">Example</h2>
<p>In this example I own a company car. My company wants to participate in the eco-swap that the government is promoting. This means that employees can hand in their company car and replace it with a eco-friendly commute such as biking, public transport, etc…</p>
<p>For me this means I would bike to work instead of taking my company car, so the two options we want to compare are:</p>
<ul>
<li>Biking to work</li>
<li>Keep company car</li>
</ul>
<p><img src="/public/images/pro-con-fix-example.png" alt="placeholder" title="Biking to work or keeping company car example" /></p>
<h2 id="tips-and-tricks-for-using-it">Tips and tricks for using it</h2>
<h3 id="make-the-second-list">Make the second list</h3>
<p>I think the most important tip I can give anyone is to make the second list of a binary decision.
When you have one option, it is very tempting to think that it suffices to create one list because you know and understand the current situation. Unfortunately it is very easy to have blind spots, so it is very benefitial to think about the current situation and what you would consider positive and negative about it and to think about neutralising certain negative aspects of it. Chances are you haven’t really done that before or the list is outdated.</p>
<h3 id="not-every-con-has-a-fix">Not every con has a fix</h3>
<p>You cannot neutralise every Con, sometimes you have to learn to accept the negative side of an option.</p>
<h3 id="you-are-comparing-lists-not-items-on-the-list">You are comparing lists, not items on the list</h3>
<p>Something I have noticed when working with a Pro-Con-Fix list, is that it is very tempting to fixate on a couple of items on a list, instead of talking about the lists as a whole. If you start doing that, you are just back to a pointless discussion that will not result in a decision with actionable steps to move forward. Draw the attention back to the list.</p>
<h3 id="a-fix-has-to-be-actionable">A fix has to be actionable</h3>
<p>Actionable means that you have to be able to do something when you read a fix. Things like ‘find out if’ or ‘encourage people to’ are not actionable steps. Find out if it is possible and think about how you will encourage people. The list is the research moment, the research does not come after creating the list. You can’t make an informed decision if you are not sure a fix is possible.</p>
<h3 id="each-item-has-to-be-able-to-stand-on-its-own">Each item has to be able to stand on its own</h3>
<p>Each item in the pro section of one option, more or less (not always) results in a Con-Fix item of the other option. So it is very tempting to write those items in comparison with each other.
If we take a look at the example from before, I could have written <code class="language-plaintext highlighter-rouge">40 minutes less free time</code> instead of <code class="language-plaintext highlighter-rouge">Commute is 60 minutes a day</code>. For the pro in “Keeping company car”, I could have gone for <code class="language-plaintext highlighter-rouge">40 minutes more free time</code> instead of <code class="language-plaintext highlighter-rouge">Commute is 20 minutes a day</code>. Although it captures the same information, if I write <code class="language-plaintext highlighter-rouge">40 minutes more/less free time</code>, there is a lot of information lost. I don’t know how long the commute is right now, and I don’t know how long the commute will be on bike. Even if I write <code class="language-plaintext highlighter-rouge">Commute is 20 minutes</code> and <code class="language-plaintext highlighter-rouge">40 minutes less free time</code>, I need to have both lists in order to have the full picture of those pro and con. It is better if you can focus on each list individually first, without having to show to other list. It keeps the discussion focused during meetings. Words such as “more”, “less”, “faster”, “extra”, etc… are good indications that you are not writing each item on a list to stand on its own.</p>
<h3 id="individual-brainstorming-before-team-collaboration">Individual brainstorming before team collaboration</h3>
<p>If you are creating the Pro-Con-Fix list in team, it is better to divide each step into two steps:</p>
<ol>
<li>write down all your pro’s individually</li>
<li>group them together and merge the individual items into one pro column.</li>
</ol>
<p>Same goes for summing up Cons and their Fixes.</p>
<hr />
<p>Resources:</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>The Thinker’s Toolkit: 14 Powerful Techniques for Problem Solving, by Morgan D. Jones <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Are your lights on by Gause and Weinberg2020-03-02T00:00:00+00:00https://www.gienverschatse.com//books/2020/03/02/are-your-lights-on<p>I loved reading Gerald Weinberg’s <a href="https://www.selketjah.com/books/2020/02/16/become-tech-lead/">Becoming a technical leader</a>, so when trying to select a new book, I looked at his bibliography. I came across this very short (129 pages) book on problem solving. I picked it up because it was so small, but I did not expect much from it. I was wrong. It is a very funny, well written book with excellent advice for anyone dealing with solving problems regularly. It also has some very nice heuristics to ask yourself when you are talking to the business and trying to understand them!</p>
<!--more-->
<h3 id="chapter-1-a-problem">Chapter 1. A Problem</h3>
<blockquote>
<p>The fledgling problem solver invariably rushes in with solutions before taking time to define the problem being solved. (Location 101)
<br /></p>
</blockquote>
<blockquote>
<p>without some common understanding of the problem, a solution will almost invariably be to the wrong problem. (Location 107)</p>
</blockquote>
<h3 id="chapter-3-whats-your-problem">Chapter 3. What’s Your Problem?</h3>
<blockquote>
<p>A PROBLEM IS A DIFFERENCE BETWEEN THINGS AS DESIRED AND THINGS AS PERCEIVED. (Location 191)
<br /></p>
</blockquote>
<blockquote>
<p>a phantom problem — a discomfort primarily attributable to perceptions. (Location 207)
<br /></p>
</blockquote>
<blockquote>
<p>the problem could be solved either by changing desires or changing perceptions (Location 223)</p>
</blockquote>
<h3 id="chapter-4-billy-brighteyes-bests-the-bidders">Chapter 4. Billy Brighteyes bests the bidders.</h3>
<blockquote>
<p>DON’T TAKE THEIR SOLUTION METHOD FOR A PROBLEM DEFINITION (Location 370)
<br /></p>
</blockquote>
<blockquote>
<p>IF YOU SOLVE THEIR PROBLEM TOO READILY, THEY’LL NEVER BELIEVE YOU’VE SOLVED THEIR REAL PROBLEM. (Location 372)</p>
</blockquote>
<h3 id="chapter-6-billy-back-to-the-bidders">Chapter 6. Billy Back to the Bidders</h3>
<blockquote>
<p>DON’T LEAP TO CONCLUSIONS, BUT DON’T IGNORE YOUR FIRST IMPRESSION. (Location 448)
<br /></p>
</blockquote>
<blockquote>
<p>You can never be sure you have a correct definition, but don’t ever stop trying to get one. (Location 461)</p>
</blockquote>
<h3 id="chapter-7-the-endless-chain">Chapter 7. The endless chain</h3>
<blockquote>
<p>EACH SOLUTION IS THE SOURCE OF THE NEXT PROBLEM (Location 502)
<br />
We never get rid of problems. Problems, solutions, and new problems weave an endless chain. (Location 504)
<br /></p>
</blockquote>
<blockquote>
<p>The best we can hope for is that the problems we substitute are less troublesome than the ones we " solve. " (Location 504)
<br /></p>
</blockquote>
<blockquote>
<p>putting them in someone else’s back yard — or back end. This technique is called problem displacement, and is often very useful when consciously and conscientiously done. (Location 506)
<br />
new problems — more often than not — are created unconsciously. (Location 507)
<br /></p>
</blockquote>
<blockquote>
<p>THE TRICKIEST PART OF CERTAIN PROBLEMS IS JUST RECOGNIZING THEIR EXISTENCE. (Location 509)
<br /></p>
</blockquote>
<blockquote>
<p>failed to see that it could be a problem for someone else — another case of problem displacement. (Location 515)
<br /></p>
</blockquote>
<blockquote>
<p>IF YOU CAN’T THINK OF AT LEAST THREE THINGS THAT MIGHT BE WRONG WITH YOUR UNDERSTANDING OF THE PROBLEM, YOU DON’T UNDERSTAND THE PROBLEM. (Location 520)</p>
</blockquote>
<h3 id="chapter-8-missing-the-misfit">Chapter 8. Missing the misfit</h3>
<blockquote>
<p>we’re inclined to blame the person who gets his bottom punched, rather than the person who made the tool. (Location 528)
<br /></p>
</blockquote>
<blockquote>
<p>The problem of displacement is compounded by the existence of designers — special people whose job it is to solve problems, in advance, for other people. Designers, like landlords, seldom if ever experience the consequences of their actions. In consequence, designers continually produce misfits. A misfit is a solution that produces a mismatch with the human beings who have to live with the solution. (Location 533)
<br /></p>
</blockquote>
<blockquote>
<p>DON’T LEAP TO CONCLUSIONS, BUT DON’T IGNORE YOUR FIRST IMPRESSION. (Location 568)
<br /></p>
</blockquote>
<blockquote>
<p>TEST YOUR DEFINITION ON A FOREIGNER, SOMEONE BLIND, OR A CHILD, OR MAKE YOURSELF FOREIGN, BLIND, OR CHILDLIKE. (Location 592)
<br /></p>
</blockquote>
<blockquote>
<p>EACH NEW POINT OF VIEW WILL PRODUCE A NEW MISFIT. (Location 615)</p>
</blockquote>
<h3 id="chapter-9-landing-on-the-level">Chapter 9. Landing on the level</h3>
<blockquote>
<p>HOW COULD WE CHANGE THE PROBLEM STATEMENT TO MAKE THE SOLUTION DIFFERENT? (Location 627)
<br /></p>
</blockquote>
<blockquote>
<p>AS YOU WANDER ALONG THE WEARY PATH OF PROBLEM DEFINITION, CHECK BACK HOME ONCE IN A WHILE TO SEE IF YOU HAVEN’T LOST YOUR WAY. (Location 677)</p>
</blockquote>
<h3 id="chapter-10-mind-your-meaning">Chapter 10. Mind your meaning</h3>
<blockquote>
<p>ONCE YOU HAVE A PROBLEM STATEMENT IN WORDS, PLAY WITH THE WORDS UNTIL THE STATEMENT IS IN EVERYONE’S HEAD. (Location 708)</p>
</blockquote>
<h3 id="chapter-11-smoke-gets-in-your-eyes">Chapter 11. Smoke gets in your eyes</h3>
<blockquote>
<p>DON’T SOLVE OTHER PEOPLE’S PROBLEMS WHEN THEY CAN SOLVE THEM PERFECTLY WELL THEMSELVES. (Location 819)
<br /></p>
</blockquote>
<blockquote>
<p>IF IT’S THEIR PROBLEM, MAKE IT THEIR PROBLEM. (Location 828)</p>
</blockquote>
<h3 id="chapter-12-the-campus-that-was-all-spaced-out">Chapter 12. The campus that was all spaced out</h3>
<blockquote>
<p>IF A PERSON IS IN A POSITION TO DO SOMETHING ABOUT A PROBLEM, BUT DOESN’T HAVE THE PROBLEM, THEN DO SOMETHING SO HE DOES. (Location 856)
<br /></p>
</blockquote>
<blockquote>
<p>TRY BLAMING YOURSELF FOR A CHANGE — EVEN FOR A MOMENT. (Location 905)</p>
</blockquote>
<h3 id="chapter-14-janet-jaworski-joggles-a-jerk">Chapter 14. Janet Jaworski joggles a jerk.</h3>
<blockquote>
<p>WHERE DOES THIS PROBLEM COME FROM? (Location 1011)</p>
</blockquote>
<h3 id="chapter-17-examinations-and-other-puzzles">Chapter 17. Examinations and other puzzles.</h3>
<blockquote>
<p>How amusing that students complain that school doesn’t prepare them for the " real world " — whatever that is — and fail to notice that it doesn’t even prepare them for the world of final examinations! (Location 1184)</p>
</blockquote>
<h3 id="chapter-19-patience-plays-politics">Chapter 19. Patience plays politics.</h3>
<blockquote>
<p>NOT TOO MANY PEOPLE. IN THE FINAL ANALYSIS, REALLY WANT THEIR PROBLEMS SOLVED. (Location 1365)</p>
</blockquote>
<h3 id="chapter-20-a-priority-assignment">Chapter 20. A priority assignment.</h3>
<blockquote>
<p>WE NEVER HAVE ENOUGH TIME TO DO IT RIGHT, BUT WE ALWAYS HAVE ENOUGH TIME TO DO IT OVER. (Location 1406)
<br /></p>
</blockquote>
<blockquote>
<p>WE NEVER HAVE ENOUGH TIME TO CONSIDER WHETHER WE WANT IT, BUT WE ALWAYS HAVE ENOUGH TIME TO REGRET IT. (Location 1409)
<br /></p>
</blockquote>
<blockquote>
<p>Fascinated with the problem - solving aspects, you may neglect to consider whether you would morally approve of a solution. (Location 1436)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.goodreads.com/book/show/11221270-are-your-lights-on">Weinberg, Gerald M. Are Your Lights On?. Weinberg & Weinberg. Kindle Edition.</a></p>
Becoming a technical leader by Gerald Weinberg2020-02-16T00:00:00+00:00https://www.gienverschatse.com//books/2020/02/16/become-tech-lead<p>It is time for my first book review of 2020!</p>
<p>A while back someone told me that they saw potential in me to take on a leadership function, but I needed to learn to communication in different styles. Although I appreciated the input, I had one problem: I don’t know any other communication style than my current one… Even worse, I don’t fully understand my current communication style and the impact it has on different people.</p>
<p>So, I started reading some different books on communication, but I just couldn’t motivate myself to keep reading it. Then I remembered a friend of mine talking about <code class="language-plaintext highlighter-rouge">Becoming a technical leader</code> and how great they thought the book was. I can only say one thing: they were right. Every chapter has a <code class="language-plaintext highlighter-rouge">Question</code> section with thoughtful questions so you can start looking into who you are and how you lead. Besides that, it offers some wonderful advice on how to be a better leader, including how you can communicate with other people.</p>
<!--more-->
<h3 id="chapter-2-models-of-leadership-style">Chapter 2. Models of Leadership Style</h3>
<blockquote>
<p>If we look more closely at how technical leaders emphasize innovation, we find that they concentrate on three major areas:
• understanding the problem
• managing the flow of ideas
• maintaining quality (Location 438)</p>
</blockquote>
<h3 id="chapter-3-a-problem-solving-style">Chapter 3. A Problem-Solving Style</h3>
<blockquote>
<p>Effective leaders build continuous testing of their own understanding into their work . They are self - confident, but realistic about their own intellectual limitations. (Location 517)
<br /></p>
</blockquote>
<blockquote>
<p>Drop one’s own idea in favor of an idea the team wants to develop, and Refuse to let an idea drop until everyone understands it. (Location 536)
<br /></p>
</blockquote>
<blockquote>
<p>Resist time pressure, and take the time to listen when other people explain their ideas. (Location 544)
<br /></p>
</blockquote>
<blockquote>
<p>Withhold quick criticism of teammates ’ ideas, in order to keep the ideas flowing. (Location 553)
<br /></p>
</blockquote>
<blockquote>
<p>When you must criticize an idea, make clear that you are criticizing the idea, not the person who offered the idea. (Location 558)
<br /></p>
</blockquote>
<blockquote>
<p>When time and labor are running short, stop working on new ideas and just pitch in. (Location 566)
<br /></p>
</blockquote>
<blockquote>
<p>Encourage the team to drop ideas that had succeeded earlier, but cannot be extended to the new situation. (Location 569)
<br /></p>
</blockquote>
<blockquote>
<p>Revive a dropped idea later, when it has value for another part of the problem. (Location 572)
<br /></p>
</blockquote>
<blockquote>
<p>Design tools and processes to measure quality as you build a solution. (Location 581)
<br /></p>
</blockquote>
<blockquote>
<p>Measure the speed of implementation, compare it to the schedule, and be prepared to change the solution procedure. (Location 585)
<br /></p>
</blockquote>
<blockquote>
<p>Step back from the project to refresh your perspective and to assess its viability. (Location 587)
<br /></p>
</blockquote>
<blockquote>
<p>Check ideas with the customer before implementing them. (Location 591)</p>
</blockquote>
<h3 id="chapter-6-the-three-great-obstacles-to-innovation">Chapter 6. The Three Great Obstacles to Innovation</h3>
<blockquote>
<p>Don’t ever volunteer your observations about people
Even when people ask for your observations, they won’t always like what you have to say. (Location 943 - 944)</p>
</blockquote>
<h3 id="chapter-10-the-first-great-obstacle-to-motivating-others">Chapter 10. The First Great Obstacle to Motivating Others</h3>
<blockquote>
<p>We tend to think that our messages are perfectly clear, but you can generally assume something will be lost in every reception. (Location 1493)
<br /></p>
</blockquote>
<blockquote>
<p>Perception: Neither of us perceives even the manifest part in the same way
Wrong time: The transformation refers to things in the past or future, things that have no logical bearing on the present communication.
Wrong place: The transformation refers to some other context.
Wrong person: The transformation refers to some other person.
Self-worth: My feelings about myself have a powerful influence on how I respond, but you have no direct access to how I feel about myself (Location 1555 - 1563)
<br /></p>
</blockquote>
<blockquote>
<p>Tell them what you perceive, how you feel about what you perceive, and if possible how you feel about that feeling. (Location 1579)</p>
</blockquote>
<h3 id="chapter-11-the-second-great-obstacle-to-motivating-others">Chapter 11. The Second Great Obstacle to Motivating Others</h3>
<blockquote>
<p>When I’m finished with them, do they care less about the subject? (Location 1660)
<br /></p>
</blockquote>
<blockquote>
<p>If you can’t do the task without exploiting people, perhaps you shouldn’t do it at all. (Location 1679)</p>
</blockquote>
<h3 id="chapter-12-the-problem-of-helping-others">Chapter 12. The Problem of Helping Others</h3>
<blockquote>
<p>Programming team leaders are promoted according to their technical skills, with the assumption that any normal person will be able to pick up leadership skills along the way. (Location 1743)
<br /></p>
</blockquote>
<blockquote>
<p>Wanting to help people may be a noble motive but that doesn’t make it any easier. (Location 1811)
<br /></p>
</blockquote>
<blockquote>
<p>If people don’t want your help, you’ll never succeed in helping them, no matter how smart or wonderful you are. (Location 1814)
<br /></p>
</blockquote>
<blockquote>
<p>Effective help can only start with mutual agreement on a clear definition of the problem. (Location 1818)
<br /></p>
</blockquote>
<blockquote>
<p>Always check whether they want your help. (Location 1823)
<br /></p>
</blockquote>
<blockquote>
<p>Even when people agree that they want your help, that agreement is not usually a lifetime contract. (Location 1827)
<br /></p>
</blockquote>
<blockquote>
<p>They don’t seem to realize that every offer to help is intended to do something for the helper. There are very few living saints. (Location 1830)
<br /></p>
</blockquote>
<blockquote>
<p>Most people understand that helpers are selfish, but also think they are exceptions to the rule. (Location 1838)
<br /></p>
</blockquote>
<blockquote>
<p>Attempts to help are often interpreted as attempts to interfere. (Location 1841)
<br /></p>
</blockquote>
<blockquote>
<p>No matter how strange it may look, most people are actually trying to be helpful. (Location 1843)</p>
</blockquote>
<h3 id="chapter-15-power-imperfection-and-congruence">Chapter 15. Power, Imperfection, and Congruence</h3>
<blockquote>
<p>If everyone wants so intensely to do good, how can so many people be doing such a miserable job? (Location 2135)
<br /></p>
</blockquote>
<blockquote>
<p>Maturity is, rather, a statistical collection of behaviors, behaviors we can improve a little at a time. (Location 2174)</p>
</blockquote>
<h3 id="chapter-24-finding-support-for-change">Chapter 24. Finding Support for Change</h3>
<blockquote>
<p>Whenever you try to change, some of the people you know will try to prevent you from changing. (Location 3369)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.goodreads.com/book/show/18620538-becoming-a-technical-leader">Weinberg, Gerald. Becoming a Technical Leader. leanpub.com. Kindle Edition.</a></p>
Decisions Part II - the elements of a decision2020-02-10T00:00:00+00:00https://www.gienverschatse.com//decision-theory/2020/02/10/elements-of-a-decision<p>In <a href="https://www.selketjah.com/decision%20theory/2019/10/17/what-is-a-decision/">Part I - What’s a decision anyway?</a> we defined what a decision is and looked briefly into the characteristics of a decision. Although understanding what a decision is already helps a lot, the goal most of us have is to make the best decision possible.
When you want to make a high quality decision, certain elements need to be present. Without those, you can’t really make a good decision.</p>
<!--more-->
<h1 id="basic-elements">Basic Elements</h1>
<p>There are three basic elements that need to be present to make a good decision:</p>
<ol>
<li>What you can do (alternatives)</li>
<li>What we know (information)</li>
<li>What we want (preferences)</li>
</ol>
<p>Decision analysis provides a way to convert those three elements into a course of action. This is sometimes referred to as the <code class="language-plaintext highlighter-rouge">decision model</code>.</p>
<h2 id="alternativesoptions">Alternatives/Options</h2>
<p>We already touched alternatives in the <a href="https://www.selketjah.com/decision-theory/2019/10/17/what-is-a-decision/">previous post</a>
Options are available actions that the decision maker can take that will lead them to a <code class="language-plaintext highlighter-rouge">different future</code>.
If you have multiple options, but all lead to the same outcome, than you have no decision to make, because it does not matter which one you pick.</p>
<p>There are some tools and techniques available to generate options for the decisions that you have to make. One example of this is the <a href="http://www.structureddecisionmaking.org/tools/toolsstrategytables/">Strategy table</a>.</p>
<h2 id="preferences">Preferences</h2>
<p>A decision maker will have <code class="language-plaintext highlighter-rouge">preferences</code> about the options. Preferences (what we want) are the criteria or values by which you will compare one option with another one. This means that certain options are more desirable, because the outcomes of those options are more desirable.
If the decision maker does not prefer one option over the other, they don’t care about the possible futures. This means that there is no decision to be made, because any option will do.</p>
<p>Our preferences and values are sometimes refered to <code class="language-plaintext highlighter-rouge">objectives</code> in a more professional setting. A good tool is <a href="https://www.amazon.com/Value-Focused-Thinking-Path-Creative-Decisionmaking/dp/067493198X/ref=sr_1_1?crid=3KJGY1OXP9351&keywords=value+focused+thinking&qid=1581251790&s=books&sprefix=value+focused+th%2Caps%2C232&sr=1-1">Objective Hierarchy</a>
to determine a decision makers preferences and criteria.</p>
<h2 id="information">Information</h2>
<p>The linking of what the decision maker can do (alternatives) with what they want to do (preference) is provided by <code class="language-plaintext highlighter-rouge">what they know</code>. What they know is called information.</p>
<p>Getting the right amount of data in order to make an informed decision is very important. You don’t want the gathering of information to be over- or underdone. Every decision involves a level of uncertainty, regardless of how much information you posses.</p>
<h1 id="other-elements">Other elements</h1>
<p>There are other elements that are present in each decision:</p>
<ul>
<li>a decision maker</li>
<li>a frame</li>
<li>logic</li>
</ul>
<h2 id="a-decision-maker">A decision maker</h2>
<p>A <code class="language-plaintext highlighter-rouge">decision maker</code> is a person with the authority to make a decision. To put it differently: the <code class="language-plaintext highlighter-rouge">decision maker</code> is the person who has the authority to allocate the resources. Making a decision is not just about authority, it is also about commitment. A decision maker also needs to be committed to making a decision.</p>
<p>In the beginning the <code class="language-plaintext highlighter-rouge">decision maker</code> could only be a single person. Since business has changed, Decision analysis is changing its view
on this too. A decision maker can also be a group: a team or a committee. However, there often is a head or lead selected that is in charge of the group. It is important to know who the decision maker is beforehand, because the criteria by which alternatives are compared depend on who the decision maker is. When analysing a decision, we will pick the criteria for the entire group and not just for the person in charge of it.</p>
<p>It is important to note that the decision maker might not be involved in the analysis.</p>
<h2 id="a-frame">A frame</h2>
<p>Before starting the analysis, it is important to frame the problem. It does not matter how well you analyse the decision, if you are solving the wrong problem. So the frame is the way of looking at the decision that has to be made.</p>
<p>In order to have the correct frame, you need to:</p>
<ul>
<li>identify the correct problem,</li>
<li>clarify the problem, so everyone understands it,</li>
<li>assess the bussiness situation in regard to the problem,</li>
<li>create the appropriate alternatives/options.</li>
</ul>
<p>There are many techniques that can help you create a good frame, which we will discuss later in the series.</p>
<h2 id="logic">Logic</h2>
<p>A <code class="language-plaintext highlighter-rouge">process</code> to derive the action we should take from what we can do (options), what we want to do (preferences), and what we know (information). As mentioned in the beginning of the blogpost, this is sometimes refered to as the <code class="language-plaintext highlighter-rouge">decision model</code>.</p>
<hr />
<p>Resources:</p>
<ul>
<li>Abbas, Ali E.; Howard, Ronald A.. Foundations of Decision Analysis, Global Edition. Kindle Edition.</li>
<li>Skinner, David C.. Introduction to decision analysis, Third edition. Hardcover Edition.</li>
</ul>
Decisions Part I - What's a decision anyway?2019-10-17T00:00:00+00:00https://www.gienverschatse.com//decision-theory/2019/10/17/what-is-a-decision<p>The word <code class="language-plaintext highlighter-rouge">decision</code> pops up very often in our day to day conversations, and it is not that surprising. Decisions form a very central role in our lives: we can sum up someone’s life by telling the sequence of decisions they made throughout it. We judge ourselves and other people by the decisions that we make:</p>
<ul>
<li>I can’t believe they are moving in together, that is just a nightmare waiting to happen…</li>
<li>You should ask your brother to go with when buying your car, he bought a really good one himself.</li>
<li>…</li>
</ul>
<p>The sad thing is that most of us never really learn anything about making decisions. <!--more--> So a few years ago, when a friend of mine told me that they actually taught this in certain courses, I wanted to sign up right away! Unfortunately for me, that wasn’t really possible, so I did the next best thing. I started reading books, watching talks and having long discussions on the topic, and I came to realize that this information is worth sharing. Having this knowledge makes me look at software in a completely different way. I finally have a framework to think about making a decision and I want to share that with you. So…</p>
<p>Let’s start by trying to answer a very basic question: what exactly is a decision?</p>
<h2 id="what-is-a-decision">What is a decision?</h2>
<p>If I had to explain a decision to someone unfamiliar with the concept, this is what I would say:</p>
<blockquote>
<p>You have to do something, and there a few options you could pick from to do it and you need to pick just one of them.</p>
</blockquote>
<p>It is not easy to come up with a good description of a concept. Before you read on, it would be fun to try and come up with a better explanation for a decision yourself.</p>
<p>Not that easy, right?
But luckily for us, we don’t have to come up with them all by ourselves, other people have done that for us. Let’s have a look how official sources explain it!</p>
<p>According to <a href="https://dictionary.cambridge.org/dictionary/english/decision">Cambridge dictionary</a>, a decision is:</p>
<blockquote>
<p>Decision:
a choice that you make about something after thinking about several possibilities.</p>
</blockquote>
<p>and here is another one, from the textbook <a href="https://www.amazon.com/Foundations-Decision-Analysis-Ronald-Howard/dp/0132336243/ref=sr_1_1?crid=3BHQUJF5YW9PC&keywords=foundations+of+decision+analysis&qid=1570889458&s=books&sprefix=foundations+of+deci%2Caps%2C234&sr=1-1">Foundations of Decision Analysis</a>:</p>
<blockquote>
<p>Decision:
a choice between two or more alternatives that involves an irrevocable allocation of resources.</p>
</blockquote>
<p>Although the definitions seem very different at first glance, they do have a couple of key concepts in common.</p>
<h3 id="alternatives">Alternatives</h3>
<p>To start with, the concept of <code class="language-plaintext highlighter-rouge">things you can select from</code> can be found in all three of the definitions. Whether it is called an <code class="language-plaintext highlighter-rouge">option</code>, a <code class="language-plaintext highlighter-rouge">possibility</code> or an <code class="language-plaintext highlighter-rouge">alternative</code>, they all try to express the same idea: there are multiple things available that you can choose from, or to use the definition of the textbook:</p>
<blockquote>
<p>Alternatives/Options are available courses of action that the person believes would lead to different futures.</p>
</blockquote>
<p>An option is defined here as something that will lead to a different future, which makes a lot of sense. If all your options have the same outcome, it doesn’t matter which one you pick. When it doesn’t matter which one you pick, you don’t have a decision to make.</p>
<p>All three also give an indication that you have to boil the options down to one.
So, this implies that there is always more than one option available. This is true when you think about it in this way: not making a decision, is a decision. We will get more into this in part II, making quality decisions</p>
<h3 id="irrevocable-allocation-of-resources">Irrevocable allocation of resources</h3>
<p>The second part of the definition talks about <code class="language-plaintext highlighter-rouge">irrevocable allocation of resources</code>. What this means is that there is a cost in being wrong. Undoing your decision will cost a loss of time, money or energy. This is important to determine whether or not a person has made a decision.</p>
<p>Think back on all those New Year’s resolutions… All those to-dos made on the first day of the year and most of them will never even start with the resolution. Declaring that you have made a decision is cheap, in order to actually make one, you need to put your money, euh, I mean resource, where your mouth is!</p>
<h3 id="what-is-missing">What is missing?</h3>
<p>One thing that is missing from previous definitions is the fact that a decision is something you do delibrate. <a href="https://www.amazon.com/Introduction-Decision-Analysis-David-Skinner/dp/0964793865/ref=sr_1_1?keywords=david+c+skinner&qid=1578651041&sr=8-1">David C. Skinner</a> describes a decision as:</p>
<blockquote>
<p>a conscious course of action and allocation of resources to achieve a set of objectives.</p>
</blockquote>
<p>So a decision is something you do consciously, which is in contrast to involuntary actions.</p>
<h2 id="a-decision-can-be-">A decision can be …</h2>
<p>Decisions can be classified according to a variety of characteristics. By categorising your decisions according to the following 3 categories, you will be able to make better decisions over time and it will help you to look more objectively to the decision that you make.</p>
<h3 id="easy-or-hard">Easy or hard</h3>
<p>What makes a decision easy or hard is how well informed you feel about the decision you have to make.
Picking your ice cream flavor can be labelled as an easy decision. Whether or not you want to invest money in a start-up is already a lot harder. Why is that?</p>
<p>Because the knowledge readily available for those two decisions is very different. I don’t have any knowledge that will help me assess whether or not a start-up is worth investing in, and most people don’t have that either. There is a lot of <code class="language-plaintext highlighter-rouge">uncertainty</code> involved here.</p>
<p>Uncertainty and the difficulty of a decision are intertwined with one another. In order to make a decision easier, you need to gain more information or get the right information. That way the uncertainty goes down, and the decision is easier to make than it was before.</p>
<h3 id="reactive-or-proactive">Reactive or proactive</h3>
<p>When you have to make a decision, there are two ways you could have reached this point:</p>
<ol>
<li>
<p>Something happened and now you have to make a decision.</p>
<p>This is called a reactive decision, because you are reacting to an event.
Couple of examples:</p>
<ul>
<li>You got fired and now you need a new job.</li>
<li>Your house stops being for rent, and now you need a new place to live.</li>
</ul>
</li>
<li>
<p>You want something, so you are going to make a decision.</p>
<p>You want something to change, so you take charge and try to change it. You are being proactive, so the decision is a proactive decision.
For example:</p>
<ul>
<li>you are starting to lose interest at work, so you want a new job.</li>
<li>your rent is getting too high, so you want a new living space.</li>
</ul>
</li>
</ol>
<p>It might not seem important to know what kind of decision you are making, but it is. Think about our first reactive example. Getting fired is something which will trigger different kind of emotions than when you just want to get a new job. So, the way you look at all the options available to you will be influenced, consciously or unconsciously by these emotions. The time you can spend to make the decision will also be different. So even though it might not seem important, it has a big impact on the decision and its process.</p>
<h3 id="good-or-bad">Good or bad</h3>
<p>A decision can be either good or bad, there is not much to it.
Don’t confuse this with <code class="language-plaintext highlighter-rouge">a decision has a good or bad outcome</code>. The quality of the decision and the outcome of that decision are things that are not tightly coupled. A good decision can have a bad outcome, and a bad decision can still have a good outcome.
I will talk about this more in a different part of the decision series.</p>
<h2 id="conclusion">Conclusion</h2>
<p>It is time to go back to our original question: <code class="language-plaintext highlighter-rouge">What is a decision?</code>
A decision is not a thing, but a process you have to go through. In that process you choose one option from multiple options that will give you a different outcome and there has a cost in being wrong.
<code class="language-plaintext highlighter-rouge">You want to avoid paying this cost, you want to make good decisions.</code> In order to make good decisions, you need to understand the elements that need to be present when making a decision. In my next blogpost I will walk you through all these elements!</p>
<hr />
<p>Resources definitions of decision:</p>
<ul>
<li>Abbas, Ali E.; Howard, Ronald A.. Foundations of Decision Analysis, Global Edition (Page 30). Kindle Edition.</li>
<li>Skinner, David C.. Introduction to decision analysis , Third edition (Page 14). Hardcover Edition.</li>
<li>https://dictionary.cambridge.org/dictionary/english/decision</li>
</ul>
<p>Resource definition of alternatives:</p>
<ul>
<li>Abbas, Ali E.; Howard, Ronald A.. Foundations of Decision Analysis, Global Edition (Page 37). Kindle Edition.</li>
</ul>
<p>Update log:</p>
<ul>
<li>10-01-2020 - add conscious course of action to definition</li>
</ul>
A Philosophy of Software Design by John Ousterhout2019-06-23T00:00:00+00:00https://www.gienverschatse.com//books/2019/06/23/philosophy-software-design<p>Since I mentioned this book during <a href="https://developeronfire.com/podcast/episode-421-gien-verschatse-choosing-your-way">my interview</a> with <a href="https://twitter.com/raelyard">Dave Rael</a> for the podcast <a href="https://developeronfire.com/">Developer on fire</a>, I thought it was time to put my favorite quotes of the book online.</p>
<p><code class="language-plaintext highlighter-rouge">A Philosophy of software design</code> looks at the creation of software through the lens of complexity in your system.
This book is very small, only 200 pages, so don’t expect an in depth explanation of every topic in it.
It covers the basics of every topic and it is up to you to venture out and find a more in-depth book about one of the topics in it.</p>
<blockquote>
<p>The most fundamental problem in computer science is problem decomposition: how to take a complex problem and divide it up into pieces that can be solved independently. (Location 198)</p>
</blockquote>
<!--more-->
<p><br /></p>
<h3 id="1-introduction">1 Introduction</h3>
<blockquote>
<p>the greatest limitation in writing software is our ability to understand the systems we are creating. (Location 258)</p>
</blockquote>
<h3 id="2-the-nature-of-complexity">2 The Nature of Complexity</h3>
<blockquote>
<p>Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system. (Location 339)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Change amplification: The first symptom of complexity is that a seemingly simple change requires code modifications in many different places .</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Cognitive load: The second symptom of complexity is cognitive load , which refers to how much a developer needs to know in order to complete a task. (Location 369)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Sometimes an approach that requires more lines of code is actually simpler , because it reduces cognitive load. (Location 379)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Unknown unknowns : The third symptom of complexity is that it is not obvious which pieces of code must be modified to complete a task , or what information a developer must have to carry out the task successfully. (Location 384)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>An obvious system is one where a developer can make a quick guess about what to do , without thinking very hard , and yet be confident that the guess is correct. (Location 399)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>a dependency exists when a given piece of code cannot be understood and modified in isolation ; the code relates in some way to other code , and the other code must be considered and / or modified if the given code is changed. Obscurity occurs when important information is not obvious. Complexity comes from an accumulation of dependencies and obscurities. (Location 406, 423, 446)</p>
</blockquote>
<h3 id="3-working-code-isnt-enough">3 Working Code Isn’t Enough</h3>
<blockquote>
<p>Most programmers approach software development with a mindset I call tactical programming . In the tactical approach , your main focus is to get something working, such as a new feature or a bug fix. The first step towards becoming a good software designer is to realize that working code isn’t enough. Your primary goal must be to produce a great design, which also happens to work. This is strategic programming. (Location 457, 482, 485)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I suggest spending about 10 – 20 % of your total development time on investments. This amount is small enough that it won’t impact your schedules significantly , but large enough to produce significant benefits over time. (Location 500)</p>
</blockquote>
<h3 id="4-modules-should-be-deep">4 Modules Should Be Deep</h3>
<blockquote>
<p>most important techniques for managing software complexity is to design systems so that developers only need to face a small fraction of the overall complexity at any given time. (Location 553)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>we think of each module in two parts : an interface and an implementation. (Location 564)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The interface to a module contains two kinds of information : formal and informal. (Location 582)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>An abstraction is a simplified view of an entity , which omits unimportant details. (Location 597)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The best modules are deep: they have a lot of functionality hidden behind a simple interface. (Location 623)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>a shallow module is one whose interface is relatively complex in comparison to the functionality that it provides. (Location 660)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>classitis, which stems from the mistaken view that “classes are good , so more classes are better.” (Location 685)</p>
</blockquote>
<h2 id="5-information-hiding-and-leakage">5 Information Hiding (and Leakage)</h2>
<blockquote>
<p>The most important technique for achieving deep modules is information hiding . This technique was first described by David Parnas1 . The basic idea is that each module should encapsulate a few pieces of knowledge , which represent design decisions. (Location 729)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The hidden information includes data structures and algorithms related to the mechanism . It can also include lower - level details such as the size of a page, and it can include higher - level concepts that are more abstract , such as an assumption that most files are small. (Location 736)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>In temporal decomposition , the structure of a system corresponds to the time order in which operations will occur. (Location 774)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>When designing modules, focus on the knowledge that’s needed to perform each task , not the order in which tasks occur. (Location 784)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Whenever possible , classes should “ do the right thing ” without being explicitly asked . Defaults are an example of this. (Location 876)</p>
</blockquote>
<h2 id="6-general-purpose-modules-are-deeper">6 General-Purpose Modules are Deeper</h2>
<blockquote>
<p>The most important (and perhaps surprising) benefit of the general - purpose approach is that it results in simpler and deeper interfaces than a special - purpose approach. (Location 923)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>What is the simplest interface that will cover all my current needs? (Location 1001)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>if you have to introduce lots of additional arguments in order to reduce the number of methods, then you may not really be simplifying things. (Location 1006)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>If you have to write a lot of additional code to use a class for your current purpose , that’s a red flag that the interface doesn’t provide the right functionality. (Location 1011)</p>
</blockquote>
<h2 id="7-different-layer-different-abstraction">7 Different Layer, Different Abstraction</h2>
<blockquote>
<p>A pass - through method is one that does little except invoke another method, whose signature is similar or identical to that of the calling method. (Location 1035)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>In order for an element to provide a net gain against complexity , it must eliminate some complexity that would be present in the absence of the design element. (Location 1196)</p>
</blockquote>
<h2 id="8-pull-complexity-downwards">8 Pull Complexity Downwards</h2>
<blockquote>
<p>Most modules have more users than developers, so it is better for the developers to suffer than the users. (Location 1208)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Another way of expressing this idea is that it is more important for a module to have a simple interface than a simple implementation. (Location 1209)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Thus , you should avoid configuration parameters as much as possible . Before exporting a configuration parameter , ask yourself : “will users (or higher - level modules) be able to determine a better value than we can determine here?” (Location 1246)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Ideally , each module should solve a problem completely; (Location 1249)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Pulling complexity down makes the most sense if (a) the complexity being pulled down is closely related to the class’s existing functionality , (b) pulling the complexity down will result in many simplifications elsewhere in the application , and (c) pulling the complexity down simplifies the class’s interface. (Location 1252)</p>
</blockquote>
<h2 id="9-better-together-or-better-apart">9 Better Together Or Better Apart?</h2>
<blockquote>
<p>the act of subdividing creates additional complexity that was not present before subdivision … Some complexity comes just from the number of components. Subdivision can result in additional code to manage the components. Subdivision creates separation. Subdivision can result in duplication. (Location 1271, 1272, 1274, 1275, 1281)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Here are a few indications that two pieces of code are related: They share information; They are used together; They overlap conceptually , in that there is a simple higher - level category that includes both of the pieces of code. It is hard to understand one of the pieces of code without looking at the other. (Location 1283, 1284, 1284, 1287, 1289)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>In general, the lower layers of a system tend to be more general - purpose and the upper layers more special - purpose. However, length by itself is rarely a good reason for splitting up a method. When designing methods, the most important goal is to provide clean and simple abstractions. (Location 1341, 1488, )</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Each method should do one thing and do it completely. (Location 1500)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>( a ) someone reading the child method doesn’t need to know anything about the parent method and ( b ) someone reading the parent method doesn’t need to understand the implementation of the child method.</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The decision to split or join modules should be based on complexity. (Location 1534)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.amazon.com/Philosophy-Software-Design-John-Ousterhout-ebook-dp-B07N1XLQ7D/dp/B07N1XLQ7D/ref=mt_kindle?_encoding=UTF8&me=&qid=1561306872">The philosophy of software design, John Ousterhout, kindle edition</a></p>
Humans vs Computers by Gojko Adzic2019-02-04T00:00:00+00:00https://www.gienverschatse.com//books/2019/02/04/humans-vs-computers<p>Humans vs Computers, the first book I read in 2019 and it was an excellent choice!
This book is a collection of (horror) stories about software design failures. There are 4 themes in the book:</p>
<ul>
<li>Names</li>
<li>Addresses</li>
<li>Numbers</li>
<li>Time</li>
<li>Process automation</li>
</ul>
<p>And the best part? The end of the book contains an overview of the ‘lessons learned’ you can take away from all these stories when designing software.</p>
<blockquote>
<p>Of course, computers couldn’t be upgraded so quickly, so people just typed VOID into the licence plate field, and Turner started receiving all the tickets. Mistakes such as these happen when a computer insists that humans provide a piece of information that isn’t immediately available or just doesn’t exist, so people find workarounds. (loc. 94)</p>
</blockquote>
<!--more-->
<p><br /></p>
<blockquote>
<p>People designing these systems made, in retrospect, silly mistakes. But the consequences were far from trivial. One system considered the lack of history as confirmation that there was nothing suspicious, (Get out of jail free stories, loc. 136)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>people might think they’re managing conceptual values such as quantity, but computers only care about numbers. (loc. 180)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>It’s often much better to allow the inventory to go slightly negative and order more supplies than to reject a sale. (loc. 184)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>it’s easy to blame computers. At the same time, computers do whatever they’re told, even if that’s as stupid as reusing old numbers. (loc. 210)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>that information provided by computers should not be blindly trusted, especially if it needs to fit into some kind of strict business context such as equal representation or total prize pay - out value. (loc. 253)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Most applications won’t blindly trust the data supplied by users, but for some reason data supplied by computers gets accepted without questioning. (loc. 311)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>computers don’t belong to any particular human race, so there’s no real need for cross - race effects to spill over to the digital world. (loc. 433)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>we try to shape the world into something more logical, easier to square, or at least simpler to validate. (loc. 443)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>judging what exactly is a valid name is a lot more difficult than it might seem at first. (loc. 532)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>people lose track of the fact that automating makes things faster, not better. (loc. 846)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The dangerous trend for automated government penalties seems to mean that the accused are guilty until proven innocent, and that the whole burden of proof shifts to the individuals caught between software bugs and too much automation. (loc. 1156)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>One of the most common wrong assumptions software developers make about the world is that everyone is connected to the Internet as well as they are, and has access to the same types of modern gadgets. (loc. 1210)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>On 29 January 2038, around 3am GMT, Unix epoch timestamps will go over the storage limit for 32 - bit signed integers. Due to how integer arithmetic works on computers, 32 - bit timestamps will go into negative values at that point. (loc. 1522)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>how critical it is to monitor not just the effects of the whole automated process, but also the individual collaborators in the pipeline. (loc. 1647)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.amazon.com/Humans-vs-Computers-Gojko-Adzic-ebook/dp/B074WLHL69/ref=sr_1_1_twi_kin_1?ie=UTF8&qid=1549288269&sr=8-1&keywords=humans+vs+computers">Gojko Adzic. Humans vs Computers. Kindle Edition</a></p>
F# Fable 2.0 -> 2.12018-12-18T00:00:00+00:00https://www.gienverschatse.com//fable/2018/12/18/migrate-to-fable21<p>This morning one of my colleagues ran into a weird error when trying to build one of our web applications with Fable:</p>
<blockquote>
<p>ERROR in ./src/path/to/your/Client.fsproj
Module build failed (from ./node_modules/fable-loader/index.js):
Error: Cannot find module ‘fable-compiler’</p>
</blockquote>
<p>At first I was very confused because as far as I could tell, fable-loader didn’t use a module called fable-compiler.</p>
<p>But then I remembered something from Twitter: there were plans to eliminate the dotnet cli tool in the next Fable release and replace is with a javascript module again. Yeey for reading Twitter!?</p>
<!--more-->
<h2 id="steps-to-update-to-fable-21-from-fable-20">Steps to update to Fable 2.1 (from Fable 2.0):</h2>
<h3 id="update-yarn">Update yarn</h3>
<p>Add <code class="language-plaintext highlighter-rouge">fable-compiler</code> and <code class="language-plaintext highlighter-rouge">npx</code> and upgrade <code class="language-plaintext highlighter-rouge">fable-loader</code> to the latest version.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>> yarn add fable-compiler --dev
> yarn add npx --dev
> yarn upgrade fable-loader@latest
</code></pre></div></div>
<h3 id="packagesjson">packages.json</h3>
<table>
<thead>
<tr>
<th>Old</th>
<th style="text-align: center">New</th>
</tr>
</thead>
<tbody>
<tr>
<td>“fable-loader”: “^2.0.0”</td>
<td style="text-align: center">“fable-loader”: “^2.1.2”</td>
</tr>
<tr>
<td>-</td>
<td style="text-align: center">“fable-compiler”: “^2.1.8”</td>
</tr>
<tr>
<td>-</td>
<td style="text-align: center">“npx”: “^10.2.0”</td>
</tr>
</tbody>
</table>
<h3 id="update-paket">Update paket</h3>
<p>Remove <code class="language-plaintext highlighter-rouge">clitool dotnet-fable</code> from your paket.dependencies and paket.references</p>
<h3 id="update-build-scripts">Update build scripts</h3>
<p>Instead of using the cli tool, you need to update your FAKE5 script to work with npx or yarn</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yarn.exec "npx webpack --config whatever/the/path/is/to/webpack.config.js" (fun o -> { o with WorkingDirectory = "whatever/the/path/is/to/client.fsproj" })
</code></pre></div></div>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://www.npmjs.com/package/fable-loader#usage">fable-loader usage</a></li>
</ul>
My F# aesthetics2018-12-17T00:00:00+00:00https://www.gienverschatse.com//f%23/2018/12/17/fsharp-aesthetic<p>I love churches, more specifically I love the architecture of a Catholic church build during the Gothic time period. I know, a weird way to begin an F# blogpost for the fsadvent, but bear with me for a moment.</p>
<p>I have tried to explain by enthusiasm for churches, cathedrals and such to many people but I have rarely succeeded in doing so. But still, I will keep trying.</p>
<p>Imagine a church that you visited, perhaps Notre Dame de Paris? Picture yourself standing in front of her.</p>
<p>In the middle of the building you have double doors, which divide the entire building into two halves. One tower on the left, one tower on the right. <!--more--> Each tower has three levels: first level has a Gothic arch, which you could fold in two and you would have a perfect match. For the other levels you have the same symmetry: a window on the left, a window on the right. You start moving forward to entry and you look at the door in more detail. The door is surrounded by statues: for every statue on the left, you will find a similar one on the right. You walk through the door and onwards to the altar in front of you. As you walk through the hallway, you see that symmetry again: for every pillar on the left, you will find a pillar on the right. For every stained-glass window on the left, you will find one on the right. For every shrine on the left, you have a shrine … Ah… Well, almost always a shrine on the right I guess.</p>
<p>The harmony and predictability of that building is so strong that the outside world fades away and a tranquility comes over me from walking through it. That applies to most the Catholic churches I have visited. I could cut any of them in half and end up with two similar halves.</p>
<p>That is what it should feel like when walking through your code: a strong sense of harmony that brings tranquility to the reader of it, 99% predictability, 1% deviation.</p>
<h3 id="what-are-aesthetics-anyway">What are aesthetics anyway?</h3>
<p>When you mention aesthetics, most people think about whether or not something is beautiful. But on a more abstract level, aesthetics is about offering a set of guidelines that will allow you to create beauty.</p>
<blockquote>
<p>An underlying principle, a set of principles, or a view often manifested by outward appearances or style of behavior <a href="https://www.thefreedictionary.com/aesthetic">free dictionary</a></p>
</blockquote>
<blockquote>
<p>(noun) A set of principles underlying the work of a particular artist or artistic movement. <a href="https://en.oxforddictionaries.com/definition/aesthetic">Oxford dictionary</a>
‘the Cubist aesthetic’</p>
</blockquote>
<p><br /></p>
<p>We stare at our code all day long, yet we seem to care so very little about what makes it pleasant or beautiful to look at. So this is my fsadvent present for the F# software developers this year. A set of principles that will guarantee beautiful code … 99% of the time ;-)</p>
<h3 id="whatever-is-on-the-left-">Whatever is on the left …</h3>
<p>… must be on the right. In general, the more symmetry something has, the more beautiful we find it.
So, make your code symmetrical:</p>
<ul>
<li>anything with 2 or less elements, goes on one line</li>
<li>anything with more than 2 elements, goes on separate lines</li>
<li>spaces before and after symbols (f.e. <code class="language-plaintext highlighter-rouge">:</code>, <code class="language-plaintext highlighter-rouge">*</code>, <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">;</code>)</li>
</ul>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="nc">Behavior</span> <span class="p">=</span> <span class="nc">Naughty</span> <span class="p">|</span> <span class="nc">Nice</span> <span class="c1">// Don't write the first |</span>
<span class="k">type</span> <span class="nc">Nickname</span> <span class="p">=</span> <span class="kt">string</span>
<span class="k">type</span> <span class="nc">Elf</span> <span class="p">=</span> <span class="p">{</span> <span class="nc">FirstName</span> <span class="p">:</span> <span class="kt">string</span> <span class="p">;</span> <span class="nc">LastName</span> <span class="p">:</span> <span class="kt">string</span> <span class="p">}</span>
<span class="k">type</span> <span class="nc">Child</span> <span class="p">=</span>
<span class="p">{</span> <span class="nc">FirstName</span> <span class="p">:</span> <span class="kt">string</span>
<span class="nc">LastName</span> <span class="p">:</span> <span class="kt">string</span>
<span class="nc">City</span> <span class="p">:</span> <span class="kt">string</span>
<span class="nc">Behavior</span> <span class="p">:</span> <span class="nc">Behavior</span> <span class="p">}</span>
<span class="c1">// This is a:</span>
<span class="c1">// discrimated union, with 4 union cases.</span>
<span class="c1">// Each union case has a Tag, some have a component type too.</span>
<span class="k">type</span> <span class="nc">Character</span> <span class="p">=</span>
<span class="p">|</span> <span class="nc">Santa</span> <span class="c1">// Always write the first |</span>
<span class="p">|</span> <span class="nc">Elf</span> <span class="k">of</span> <span class="nc">Elf</span>
<span class="p">|</span> <span class="nc">Deer</span> <span class="k">of</span> <span class="nc">Nickname</span>
<span class="p">|</span> <span class="nc">Child</span> <span class="k">of</span> <span class="nc">Child</span>
</code></pre></div></div>
<p>Principle #1 of my code: balance your types with spaces and new lines</p>
<h3 id="creating-harmony-in-your-code">Creating harmony in your code</h3>
<p>As you saw in my code sample above: I am a 4 spaces sort of person, if that is a thing… Always have been. I would prefer a tab, but those have gone out of style, so I had no choice but to embrace the 4 space equivalent of it.</p>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="nc">Tree</span> <span class="p">=</span>
<span class="p">|</span> <span class="nc">Leaf</span> <span class="k">of</span> <span class="kt">int</span>
<span class="p">|</span> <span class="nc">Branch</span> <span class="k">of</span> <span class="p">(</span><span class="nc">Tree</span> <span class="p">*</span> <span class="nc">Tree</span><span class="p">)</span>
<span class="k">let</span> <span class="n">tree</span> <span class="p">=</span>
<span class="nc">Branch</span><span class="p">(</span>
<span class="nc">Leaf</span><span class="p">(</span><span class="mi">1</span><span class="o">),</span>
<span class="nc">Branch</span><span class="p">(</span>
<span class="nc">Leaf</span><span class="p">(</span><span class="mi">2</span><span class="o">),</span><span class="nc">Leaf</span><span class="p">(</span><span class="mi">3</span><span class="o">)))</span>
<span class="k">let</span> <span class="k">rec</span> <span class="n">sum</span> <span class="p">(</span><span class="n">acc</span> <span class="p">:</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="n">tree</span> <span class="p">:</span> <span class="nc">Tree</span><span class="p">)</span> <span class="p">=</span>
<span class="k">match</span> <span class="n">tree</span> <span class="k">with</span>
<span class="p">|</span> <span class="nc">Leaf</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">-></span> <span class="n">acc</span> <span class="o">+</span> <span class="n">x</span>
<span class="p">|</span> <span class="nc">Branch</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span> <span class="p">-></span>
<span class="k">let</span> <span class="n">sumleft</span> <span class="p">=</span> <span class="n">sum</span> <span class="n">acc</span> <span class="n">left</span>
<span class="n">sum</span> <span class="n">sumleft</span> <span class="n">right</span>
<span class="n">sum</span> <span class="mi">0</span> <span class="n">tree</span><span class="p">;;</span>
</code></pre></div></div>
<p>The reason I like tabs is because it gives you a separate symbol to add meaning to your code. Like you have punctuation marks in spoken languages, you had a set of marks in programming languages that hold meaning and a tab was part of that. Without that, I felt a bit lost in my F# code. I use to add 2 empty lines between top level functions, but when I swapped back to tabs (well, the 4 space equivalent), I noticed the need to group like that went away because I could take the tab into account to figure out the grouping.</p>
<p>Rules for harmony</p>
<ul>
<li>group logic that belongs together by adding an empty line</li>
<li>level indication with tabs (yes yes, 4 spaces)</li>
<li>code colors must be in harmony (Although I am still swapping Color Themes in vscode every couple of months because I haven’t found the right one yet)</li>
</ul>
<p>That way I can roughly understand the flow of my code 2 meters away from my desk.</p>
<p>So, principle #2 of my code: design your code to understand it 2 meters away from your desk.</p>
<h3 id="parameters">Parameters</h3>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="n">example</span> <span class="n">name</span> <span class="n">age</span> <span class="n">birth</span> <span class="n">city</span> <span class="p">=</span> <span class="bp">()</span> <span class="c1">// A - best case scenario</span>
<span class="k">let</span> <span class="n">example</span> <span class="p">(</span><span class="n">name</span> <span class="p">:</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="n">age</span> <span class="p">:</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="n">birth</span> <span class="p">:</span> <span class="nc">DateTime</span><span class="p">)</span> <span class="p">(</span><span class="n">city</span> <span class="p">:</span> <span class="kt">string</span><span class="p">)</span> <span class="p">=</span> <span class="bp">()</span> <span class="c1">// B - best case scenario on the other end</span>
<span class="k">let</span> <span class="n">example</span> <span class="p">(</span><span class="n">name</span> <span class="p">:</span> <span class="kt">string</span><span class="p">)</span> <span class="n">age</span> <span class="p">(</span><span class="n">birth</span> <span class="p">:</span> <span class="nc">DateTime</span><span class="p">)</span> <span class="n">city</span> <span class="p">=</span> <span class="bp">()</span> <span class="c1">// C - try to avoid</span>
<span class="k">let</span> <span class="n">example</span> <span class="p">(</span><span class="n">name</span> <span class="p">:</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="n">birth</span> <span class="p">:</span> <span class="nc">DateTime</span><span class="p">)</span> <span class="n">age</span> <span class="n">city</span> <span class="p">=</span> <span class="bp">()</span> <span class="c1">// D - grouped</span>
</code></pre></div></div>
<p>One of the cool things about F# is <a href="https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/type-inference">type inference</a>. Unfortunately, it is not infallible, sometimes conflicts occur and you need to specify your type.
I try to group them and put the parameters with type annotation first.</p>
<p>Principle #3: be consistent in your function signatures.</p>
<h3 id="match-expressions">Match expressions</h3>
<p>Same as with a Discrimated Unions, if you only have two union cases in your match expression (and they are short), I write it on one line.</p>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">match</span> <span class="n">found</span> <span class="k">with</span> <span class="nc">Some</span> <span class="n">day</span> <span class="p">-></span> <span class="n">day</span> <span class="p">|</span> <span class="nc">None</span> <span class="p">-></span> <span class="s2">"-"</span>
<span class="k">match</span> <span class="n">found</span> <span class="k">with</span>
<span class="p">|</span> <span class="nc">Some</span> <span class="n">day</span> <span class="p">-></span> <span class="n">day</span>
<span class="p">|</span> <span class="nc">None</span> <span class="p">-></span> <span class="s2">"-"</span>
<span class="k">match</span> <span class="n">moment</span> <span class="k">with</span>
<span class="p">|</span> <span class="nc">Yesterday</span> <span class="p">-></span>
<span class="bp">()</span>
<span class="p">|</span> <span class="nc">Today</span> <span class="p">-></span>
<span class="bp">()</span>
<span class="p">|</span> <span class="nc">Tomorrow</span> <span class="p">-></span>
<span class="bp">()</span>
</code></pre></div></div>
<p>I try to avoid more than two lines in a <a href="https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/match-expressions">match expression</a>. I started doing this because of my match expressions in Elmish Fable. Your <code class="language-plaintext highlighter-rouge">update</code> function can run away easily from you there. Seeing how the readability of my code improved, I’ve extended this to my server-side code too.</p>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="n">skipOrGive</span> <span class="n">behavior</span> <span class="p">=</span>
<span class="k">let</span> <span class="n">skipHouse</span> <span class="p">=</span> <span class="bp">()</span>
<span class="k">let</span> <span class="n">givePresents</span> <span class="p">=</span> <span class="bp">()</span>
<span class="k">match</span> <span class="n">behavior</span> <span class="k">with</span>
<span class="p">|</span> <span class="nc">Naughty</span> <span class="p">-></span> <span class="n">skipHouse</span> <span class="bp">()</span>
<span class="p">|</span> <span class="nc">Nice</span> <span class="p">-></span> <span class="n">givePresents</span> <span class="bp">()</span>
</code></pre></div></div>
<p>Client side I create <code class="language-plaintext highlighter-rouge">private</code> functions to keep my <code class="language-plaintext highlighter-rouge">update</code> function as compact as possible, but server side I just make subfunctions in my top level function, as shown in the example above.</p>
<p><a href="https://twitter.com/jbrains">J.B. Rainsberger</a> talks about creating black boxes of code. And if you open the black box, you find more black boxes, and so on and so on. All the way down. I like that analogy, so:</p>
<p>Principle #4: create tiny black boxes of code.</p>
<h3 id="no-robotic-naming">No robotic naming</h3>
<p>For the past month I have been pondering the concept of having 5 simple rules by which the team can validate the quality of the code that we deliver or review both on a technical and aesthetical level.</p>
<p>So, I finally found a good name for one of my principles that I have been applying: <code class="language-plaintext highlighter-rouge">no robotic naming</code>, which means:</p>
<ul>
<li>no suffixes (*Repository, *Manager, *Request, *Response)</li>
<li>no prefixes</li>
<li>no abbreviations</li>
<li>know the difference between acronym and abbreviation</li>
</ul>
<p>This principle is not written in stone, my code example also contained an <code class="language-plaintext highlighter-rouge">acc</code> and <code class="language-plaintext highlighter-rouge">x</code>. That is just fine. This exists to make sure that I think about the concepts that I am introducing and perhaps even discover missing concepts that are hidden by these kind of naming patterns.
So, this is my last principle: no robotic naming.</p>
<h3 id="the-end">The End</h3>
<p>Software developers like to pretend that there is this objective way to write and judge code aesthetics, but there isn’t. A tab or a space often turns into a quibble…
I guess that is why it took me so long to write this blogpost… I don’t want this to turn into a quible. I mean, how could I be sure that my set of principles actually made any sense?</p>
<p>I was lucky, I got the confirmation I was looking for a while back when I looked at the proposition of the <a href="https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/">F# guidelines</a> and I discovered that the way I thought about code aesthetics, matched the draft version of the guidelines pretty closely.</p>
<p>Maybe yours don’t. That is fine too. Whether or not you adapt them, It doesn’t really matter. In the end there is really only one principle you need to remember: your code has to feel like walking through a Gothic Catholic church. Predictability and harmony, 99% of the time, 1% deviation.</p>
A small matter of programming by Bonnie A. Nardi2018-12-09T00:00:00+00:00https://www.gienverschatse.com//books/2018/12/09/a-small-matter<p>‘A Small Matter of Programming: Perspectives on End User Computing’ was recommended to me (and everybody else on Twitter) by <a href="https://twitter.com/Felienne">Felienne Hermans</a> after <a href="https://twitter.com/mathiasverraes">Mathias Verraes</a> threw this hypothesis into the Twitter void:</p>
<blockquote>
<p>Hypothesis: “Any tool that lets a non-programmer build executable programs will eventually become sufficiently complicated that the user is effectively a programmer.” I wonder if anyone has named this (or perhaps even proven)?</p>
</blockquote>
<!--more-->
<p>For me the most interesting part was chapter 6, Collaborative Work Practices, where they investigate how everybody works together and discuss the different layers of knowledge that a group of people can have.</p>
<p>There are a couple of ways that studies have classified the people involved in the process, but this one spoke to me the most:</p>
<ul>
<li>Systems programmers: deep level of programming knowledge, no domain knowledge.</li>
<li>Translators (intermediate position on the side of the systems programmers): intermediate level of domain knowledge, deep level of end user programming</li>
<li>Local developers (intermediate position on the side of the end users): unspecified level of domain knowledge, deep level of end user programming</li>
<li>End users: deep level of domain knowledge, light level of end user programming knowledge.</li>
</ul>
<p>It would be easy to try to rank the importance of these categories, but the book made it clear that all are equally important to make end user programs a success:</p>
<blockquote>
<p>though we should make tailoring mechanisms more accessible to everyone, it is also important to make tailoring a “community nity effort” that draws on the varied expertise of different kinds of users. (loc. 1275-1276)</p>
</blockquote>
<h3 id="my-favorite-quotes">My favorite quotes</h3>
<blockquote>
<p>a carefully chosen set of task-specific operations that allow programming gramming within a particular set of tasks. (loc. 36)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>They lack the power of general programming languages, but they also lack the steep learning curve-hence hence they are much better suited to the needs of users who have little or no training in computer science, and often little interest in computers per se. (loc. 36)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>end users will freely write their own applications when they have task-specific programming languages embedded ded in appropriate visual frameworks, and they will write applications in collaboration with other users. (loc. 53)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>a broad base of potential end users with a tiny point of professional programmers. (loc. 113)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>It is helpful to understand that a key difference between professional programmers grammers and end users is that programmers like computers because they get to program, and end users like computers because they get to get their work done. (loc. 122)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>We can define programming gramming as a behavior in which sequences of procedural instructions (typically in textual format) are written in a language that is compiled or interpreted into the application. (loc. 130)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>However, we would suggest that writing high level, declarative, textual program specifications ifications also constitutes programming, as does creating diagrammatic representations of system behavior. (loc. 132)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>A pervasive assumption about human-computer communication is that ideally it should mimic human conversation. (loc. 199)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>first thing we must attend to in any attempt to design a system of communication is to assess goals, (loc. 292)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>For many conversational situations imperfect communication is acceptable; unambiguous, biguous, precise communication is not needed. (loc. 316)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Formal systems permit activity to unfold in such a way that tasks can be accomplished accurately and reliably. (loc. 367)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Knitting patterns look remarkably like computer programs. (loc. 406)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>this kind of problem solving-which demands knowledge of a set of formal elements and rules about their relations-is a relaxing leisure time pursuit, a kind of “formality mality for fun.” (loc. 434)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>People are likely to be better at learning and using computer languages that closely match their interests and their domain knowledge. (loc. 451)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>People consistently performed better at problems couched in familiar terms; (loc. 457)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>it affords users ready understanding of what the primitives of the language do ‘because they already know them from their task domain’, and it eases application development because users can directly express domain semantics in the high-level operations of the language-there is no need to string together lower-level operations to get the desired behavior. (loc. 470)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>the problem with programming is not programming; it is the languages in which people are asked to program. (loc. 478)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Introducing ducing a new [programming] language doesn’t work … but people will embrace what looks like a useful new application in itself.” (loc. 482)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>When a man learns his profession he must learn the problem-oriented languages to go with that profession. (loc. 489)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>its complexity lies in the relationships between entities in the domain itself-not in the programming needed to create the formulas that model the relationships. (loc. 500)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>most users normally use fewer than ten functions in their models; (loc. 508)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The formula language has much less flexibility and generality than a general programming language, but the learning curve is flatter, and the basic operations accomplish tasks that users want to do. (loc. 515)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>It is not enough to say that users need systems that are “easy to use”; end user programming systems should allow users to solve simple problems within their domain of interest within a few hours of use. (loc. 525)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>systems that are more task-specific than general programming languages, extensible in the way that spreadsheets, FrameMaker, and other such systems are, and (3) easy to use. (loc. 622)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>an activity as being composed of subject, object, actions, and operations. erations. A subject is a person or a group engaged in an activity. An object (in the sense of “objective”) is held by the subject and motivates activity, giving it a specific direction: (loc. 653)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Visual programming systems utilize notations that are primarily visual rather than linguistic (loc. 737)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>visual notations do not deliver miracle solutions in terms of naturalness (loc. 762)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>“Naturalness,” in toto, is a function of the relationship between the system language, the users’ language abilities, the communication task in question, and the computer’s abilities, including hardware capabilities (loc. 977)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>end users are often much better at identifying and communicating their needs if they have a concrete program to criticize, (loc. 986)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>users incrementally develop successive versions of their programs to help them in understanding their own requirements. (loc. 988)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>text and graphics each have their own special strengths and weaknesses, and the best strategy is to exploit each according to its particular characteristics. (loc. 1029)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Hybrid visual programming is not iconic or pictorial in nature but uses graphics to display program state, rather than to represent operations and data flow. (loc. 1036)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Changing the constraints, when that is necessary, is a difficult and dangerous task because changing ing one constraint can of course propagate changes to many (unknown) parts of the model. (loc. 1142)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>We often envision a lonely end user laboring in isolation, just barely keeping the computer at bay at the best of times, and mano a mano with the machine at the worst of times. (loc. 1241)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>true-end users make good use of other people in their social environments to help them solve their computing problems and to compensate for gaps in their own knowledge of computers. (loc. 1243)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>we tend to think of customization as a private, personal matter, the dominant mode of setting up and modifying customization files in her study involved a great deal of social interaction; (loc. 1261-1262)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>A final point to be made about the importance of a layered software design is that such a design provides a growth path for individual users, even if they are not classic local developer types. (loc. 1374)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>full-time gardeners may lose touch with the domain side of gardening as their activities come to be defined purely in terms of support. (loc. 1450)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The process of transferring ring domain knowledge to a programmer, and going through the necessary iterations to get the desired application, is inefficient. (loc. 1495)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>with the right tools, abolish the distinction between “end user” and “programmer.” (loc. 1607)</p>
</blockquote>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://twitter.com/mathiasverraes/status/1037261350995718145">Hypothesis</a>.</li>
</ul>
<hr />
<p>Version of the book</p>
<p><a href="https://www.amazon.com/gp/product/B00BJGM0NE/ref=oh_aui_d_detailpage_o07_?ie=UTF8&psc=1">Bonnie A. Nardi. A Small Matter of Programming: Perspectives on End User Computing. Kindle Edition</a></p>
Hunger by Roxane Gay2018-08-03T00:00:00+00:00https://www.gienverschatse.com//books/2018/08/03/hunger<p>Hunger is a book by <a href="http://www.roxanegay.com/">Roxane Gay</a>, where she describes what it is like to be a fat woman in our society.</p>
<p>She talks about how she became morbidly obese, what it feels like to hate what you look like, but at the same time still crave acceptance for that appearance from the world you live in.</p>
<p>The assumptions that people make about her, the intended or unintended cruelty towards her … and I am guilty of having a lot of the assumptions and behavior that she talks about.</p>
<!--more-->
<blockquote>
<p>I ate because I thought that if my body became repulsive, I could keep men away. (loc. 161-162)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>fat created a new body, one that shamed me but one that made me feel safe, and more than anything, I desperately needed to feel safe. I needed to feel like a fortress, impermeable. I did not want anything or anyone to touch me. (loc. 179-181)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The frustrating thing about cages is that you’re trapped but you can see exactly what you want. (loc. 184-185)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I don’t want them to think me more fragile than I am. I am stronger than I am broken. (loc. 368)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>staring at the ceiling or reading myself out of my body and out of my life and into something better. (loc. 742)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I liked the idea of a boy asking me out, taking me on a date, kissing me, but I did not want to actually be alone with a boy, because a boy could hurt me. (loc. 827-828)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>The men I talked to online allowed me to enjoy the idea of romance and love and lust and sex while keeping my body safe. I could pretend to be thin and sexy and confident. (loc. 828-829)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I was broke all the time, which is not to be confused with being poor. I had a safety net and I knew I had a safety net (loc. 908)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I tried to do what was expected of me. Some days, I tried really hard. (loc. 926-927)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Every time I watch a yoghurt commercial I think, My god, I want to be that happy. I really do. It is a powerful lie to equate thinness with self - worth. (loc. 1179-1180)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>society tells me I am supposed to hate myself, so I guess this, at least, is something I am doing right. (loc. 1266-1267)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>On bad days, though, I forget how to separate my personality, the heart of who I am, from my body. I forget how to shield myself from the cruelties of the world. (loc. 1279-1280)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>We’re supposed to restrict our eating while indulging in the fantasy that we can, indeed, indulge. (loc. 1309-1310)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I do not suffer from ignorance where exercise is related. I suffer from inertia. (loc. 1356)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Most of us have these versions of ourselves that terrify us. (loc. 1576)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I don’t want fake junk food, I want real junk food, and if I cannot have real junk food, I’d rather have no junk food at all. (loc. 1835-1836)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>loneliness, like losing control of my body, is a matter of accretion. (loc. 2106)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I am not a hugger. I never have been and I never will be. I hug my friends, and do so happily, but I am sparing with such affections. A hug means something to me; it is an act of profound intimacy, so I try not to get too promiscuous with it. (loc. 2148-2150)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Why do we view the boundaries people create for them selves as challenges? Why do we see someone setting a limit and then try to push? (loc. 2158)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>Because I am not a touchy - feely person, I always feel this light shock, this surprise, really, when my skin comes into contact with another person’s skin. Sometimes that shock is pleasant, like Oh, here is my body in the world. Sometimes, it is not. I never know which it will be. (loc. 2162-2164)</p>
</blockquote>
<p><br /></p>
<blockquote>
<p>I am as healed as I am ever going to be. I have accepted that I will never be the girl I could have been if, if, if. (loc. 2536-2537)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="https://www.amazon.com/Hunger-Memoir-Body-Roxane-Gay-ebook/dp/B01921JS8W/ref=sr_1_4?s=books&ie=UTF8&qid=1533291406&sr=1-4&keywords=roxane+gay">Gay, Roxane. Hunger: A Memoir of (My) Body. Little, Brown and Company. Kindle Edition.</a></p>
Adding Fulma to an existing Fable project2018-05-22T00:00:00+00:00https://www.gienverschatse.com//fable/2018/05/22/adding-fulma<p>About a month ago I went to F# eXchange, I wandered into a talk about Fable and Elmish, given by <a href="https://twitter.com/MangelMaxime">Maxime Mangel</a>.</p>
<p>Before you read any further, you have to know something: I don’t really like front-end development. But I have to know how to do it either way.</p>
<p>So, I sat myself down in the last row and started listening with half an ear.</p>
<p>But then I heard a magical sentence:</p>
<blockquote>
<p>“We could take the benefits of the compiler and intellisense by using another project, called Fulma, which allows you to strongly type your css.”</p>
</blockquote>
<!--more-->
<p>I hate css. It is just one of those necessary evils that comes with the job. It is safe to say, the talk had my full attention at that point. Anything that makes it possible to avoid hard-coded class names and a lot of frustration because I make a lot of typos, is worth checking out! So I did and it is great.
I made a nice summary so I will never forget how to make the necessary evil in my job a little bit more pleasant.</p>
<h2 id="so-what-exactly-is-fulma">So, what exactly is Fulma?!</h2>
<p>In order the understand what Fulma is, you first need to know <a href="https://bulma.io/">Bulma</a> is. Bulma is an open source CSS framework based on <a href="https://www.w3schools.com/csS/css3_flexbox.asp">Flexbox</a>. The Flexible Box Layout Module, makes it easier to design flexible responsive layout structure without using float or positioning. <a href="https://mangelmaxime.github.io/Fulma/#fulma">Fulma</a> are F# bindings for Bulma. Here is a simple example:</p>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">Tag</span><span class="p">.</span><span class="n">list</span>
<span class="p">[</span> <span class="nn">Tag</span><span class="p">.</span><span class="nn">List</span><span class="p">.</span><span class="nc">HasAddons</span> <span class="p">]</span>
<span class="p">[</span> <span class="nn">Tag</span><span class="p">.</span><span class="n">tag</span>
<span class="p">[</span> <span class="nn">Tag</span><span class="p">.</span><span class="nc">Color</span> <span class="nc">IsDanger</span> <span class="p">]</span>
<span class="p">[</span> <span class="n">str</span> <span class="s2">"High priority"</span> <span class="p">]</span>
<span class="nn">Tag</span><span class="p">.</span><span class="n">delete</span> <span class="p">[</span> <span class="p">]</span> <span class="p">[</span> <span class="p">]</span>
<span class="p">]</span>
</code></pre></div></div>
<p>which will result in this html with the correct class names added to it:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"tags has-addons"</span><span class="nt">></span>
<span class="nt"><span</span> <span class="na">class=</span><span class="s">"tag is-danger"</span><span class="nt">></span>High priority<span class="nt"></span></span>
<span class="nt"><span</span> <span class="na">class=</span><span class="s">"tag is-delete"</span><span class="nt">></span></span>
<span class="nt"></div></span>
</code></pre></div></div>
<h2 id="please-tell-me-more">Please tell me more!</h2>
<p>Basically, there are two ways to get started with Fulma. The first one is to use the minimal template that is available, the second is to add it manually.</p>
<p>Using the template it really easy:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>> dotnet new -i Fable.Template.Fulma.Minimal
> dotnet new fulma-minimal -n MyApp [-lang F#]
</code></pre></div></div>
<p>I like easy, but I also like understanding what exactly I’m doing. So I added Fulma manually to an already existing project first.
I highly recommend that you do this manually at least once. Although templates are fantastic things to have and I am very grateful they exist, they prevent you from banging your head against a desk to deeper insights into how Fulma works behind the scenes.</p>
<h2 id="installing-fulma-in-an-existing-project">Installing Fulma in an existing project</h2>
<p>First thing you need to do, is add <code class="language-plaintext highlighter-rouge">Fulma</code>. I know, very surprising!</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>paket add Fulma --project <your project>
</code></pre></div></div>
<p>You also need to install <code class="language-plaintext highlighter-rouge">Bulma</code> and <code class="language-plaintext highlighter-rouge">FontAwesome</code>…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yarn add bulma --dev
yarn add font-awesome
</code></pre></div></div>
<p>… and import them into your <code class="language-plaintext highlighter-rouge">main.scss</code></p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@import</span> <span class="s1">"./../../node_modules/bulma/sass/utilities/initial-variables"</span><span class="p">;</span>
<span class="k">@import</span> <span class="s1">"./../../node_modules/bulma/sass/utilities/functions"</span><span class="p">;</span>
<span class="err">$</span><span class="nt">fa-font-path</span><span class="o">:</span> <span class="s1">"./../../node_modules/font-awesome/fonts/"</span><span class="o">;</span>
<span class="k">@import</span> <span class="s2">'./../../node_modules/font-awesome/scss/font-awesome.scss'</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">'./../../node_modules/bulma/bulma.sass'</span><span class="p">;</span>
</code></pre></div></div>
<p>After that, you need to update your <code class="language-plaintext highlighter-rouge">webpack.config.js</code> file.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//config entry</span>
<span class="nx">resolve</span><span class="p">(</span><span class="dl">'</span><span class="s1">./../whateverthepathmaybe/scss/main.scss</span><span class="dl">'</span><span class="p">)</span>
<span class="c1">// module rules</span>
<span class="p">{</span>
<span class="nl">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.</span><span class="sr">s</span><span class="se">?[</span><span class="sr">ac</span><span class="se">]</span><span class="sr">ss$/</span><span class="p">,</span>
<span class="nx">use</span><span class="p">:</span> <span class="p">[</span>
<span class="nx">isProduction</span> <span class="p">?</span> <span class="nx">MiniCssExtractPlugin</span><span class="p">.</span><span class="nx">loader</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">style-loader</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">css-loader</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">sass-loader</span><span class="dl">'</span><span class="p">,</span>
<span class="p">],</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="na">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.</span><span class="sr">css$/</span><span class="p">,</span>
<span class="na">use</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">style-loader</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">css-loader</span><span class="dl">'</span><span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="na">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.(</span><span class="sr">png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot</span><span class="se">)(\?</span><span class="sr">.*$|$</span><span class="se">)</span><span class="sr">/</span><span class="p">,</span>
<span class="na">use</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">file-loader</span><span class="dl">"</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div></div>
<p>And that’s it! A few extra bruises on your forehead, but you are good to go ;-)</p>
<h3 id="packagejson">package.json</h3>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"dependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"babel-polyfill"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.26.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"font-awesome"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^4.7.0"</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="err">,</span><span class="w">
</span><span class="nl">"devDependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"bulma"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.7.1"</span><span class="p">,</span><span class="w">
</span><span class="nl">"css-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.28.11"</span><span class="p">,</span><span class="w">
</span><span class="nl">"file-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^1.1.11"</span><span class="p">,</span><span class="w">
</span><span class="nl">"node-sass"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^4.8.3"</span><span class="p">,</span><span class="w">
</span><span class="nl">"sass-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^7.0.1"</span><span class="p">,</span><span class="w">
</span><span class="nl">"style-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.21.0"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h3 id="info">Info</h3>
<p>On 22-05-2018, when this blogpost was written:</p>
<blockquote>
<p>The current version of <code class="language-plaintext highlighter-rouge">Fulma</code> is 1.0.0-beta-022</p>
</blockquote>
<blockquote>
<p>The current version of <code class="language-plaintext highlighter-rouge">Bulma</code> supported by Fulma is 0.7.1</p>
</blockquote>
<blockquote>
<p>The current version of <code class="language-plaintext highlighter-rouge">FontAwesome</code> supported by Fulma is 4.7.0</p>
</blockquote>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://mangelmaxime.github.io/Fulma/">Docs</a></li>
<li><a href="https://github.com/MangelMaxime/Fulma/">Github project</a></li>
<li><a href="https://skillsmatter.com/skillscasts/11310-elmish-get-your-dev-stack-back-under-control">F# eXchange talk - Fulma starts around 15:10</a></li>
</ul>
My git flow for contributing to an open source repository2018-02-06T00:00:00+00:00https://www.gienverschatse.com//oss/2018/02/06/flow-of-open-source<p>You can contribute to an open source repository by submitting Pull Requests to the project maintainers.
In order to do that, you need to set up the project first.</p>
<!--more-->
<h1 id="initial-setup">Initial setup</h1>
<h2 id="fork-the-repository">Fork the repository</h2>
<p>A fork is a copy of a repository and allows you to contribute safely to project.
You can create a fork by clicking the matching button in the repository.</p>
<p><img src="https://www.gienverschatse.com/public/images/fork.PNG" alt="Fork button" /></p>
<h2 id="clone-your-fork">Clone your fork</h2>
<p>If you go back to your profile, you will see that a copy of repository was added to your personal repositories. Clone your copy of the repository locally.</p>
<p><code class="language-plaintext highlighter-rouge">git clone https://github.com/your_username/yourrepo.git</code></p>
<p>To see the current configuration of your remote repository type the following command:</p>
<p><code class="language-plaintext highlighter-rouge">git remote -v</code></p>
<p>Add the repo to your current configuration</p>
<p><code class="language-plaintext highlighter-rouge">git remote add upstream https://github.com/oss_username/theirrepo.git</code></p>
<p>If you list the current configuration again, you will see that the upstream repository has been added to your configuration.</p>
<p><img src="https://www.gienverschatse.com/public/images/configuration.png" alt="git configuration origin and upstream" /></p>
<p><em>origin</em> is your forked remote repository.
<em>upstream</em> is the original remote repository</p>
<h1 id="contributing">Contributing</h1>
<h2 id="create-a-branch-and-push-it-to-your-fork">Create a branch and push it to your fork</h2>
<p>Checkout master and create a branch.</p>
<p><code class="language-plaintext highlighter-rouge">git checkout -b yourbranchname</code></p>
<p>Make your changes, commit it locally and push it to your fork.</p>
<p><code class="language-plaintext highlighter-rouge">git add ...</code></p>
<p><code class="language-plaintext highlighter-rouge">git commit -m 'descirption of commit here'</code></p>
<p><code class="language-plaintext highlighter-rouge">git push --set-upstream origin yourbranchname</code></p>
<h2 id="create-a-pull-request">Create a pull request</h2>
<p>Now you can create a pull request to have your changes merged. Go to your fork and click the button ‘new pull request’.
You will see a screen similar to the one below.</p>
<p><img src="https://www.gienverschatse.com/public/images/openpullrequest.png" alt="create pull request" /></p>
<p>Fill in the title and add a small description and press ‘create pull request’.
And that’s it, you just made your first contribution to Forge!</p>
<h1 id="sync-fork">Sync fork</h1>
<p>Before you make a second contribution, you may need to sync your fork.</p>
<p><code class="language-plaintext highlighter-rouge">git fetch upstream</code></p>
<p>If you are not on your local master branch, checkout master</p>
<p><code class="language-plaintext highlighter-rouge">git checkout master</code></p>
<p>Merge the changes made to the upstream branch into your local branch and push it to your fork’s remote branch.</p>
<p><code class="language-plaintext highlighter-rouge">git merge upstream/master</code></p>
<p><code class="language-plaintext highlighter-rouge">git push origin master</code></p>
Getting started with F# Fable2018-01-25T00:00:00+00:00https://www.gienverschatse.com//fable/2018/01/25/getting-started-with-fable<p>Getting started with fable is really easy! If you use dotnet, all you need to learn are these 5 simple commands to have a Fable project up and running:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet new -i Fable.Template
dotnet new fable -n YourName -lang F#
npm install
dotnet restore
dotnet fable npm-start
</code></pre></div></div>
<!--more-->
<p>There is some great documentation on the website with some explanation about the commands, how and when to execute them, which you can find <a href="http://fable.io/docs/">here</a>.</p>
<p>There is just one problem: I haven’t been paying a lot of attention to the whole front-end scene these last few years and things have really changed. I just didn’t understand what was going on behind the scene…
So when I tried to move away from the default layout that the template offers, I ran into a few problems and I didn’t even know how to start fixing things. So, that is why I decided to get <a href="https://fable-elmish.github.io/react/">Fable-Elmish with react</a> up and running without using the template that is available.</p>
<!--more-->
<p>These are the steps that I took to get to a working application from scratch. I kept the same structure as the default template has. I do have some preknowledge about certain libraries/frameworks, which made it a bit easier on me.</p>
<ul>
<li>I know the basics of dotnet</li>
<li>I know Paket and have worked with it for the passed 2 years, so I won’t go into detail about that.</li>
<li>Surprisingly, I already had npm and node installed. I am not sure how having both already up and running correctly could influence the installation steps if you don’t have that installed yet.</li>
</ul>
<p>As a side note:</p>
<ul>
<li>I still have no idea what webpack is or how it works :-( (but I’ll get there in the end)
<br /></li>
</ul>
<!-- -->
<h3 id="1-add-paket">1. Add <a href="https://fsprojects.github.io/Paket/getting-started.html">Paket</a></h3>
<h3 id="2-add-the-dependencies">2. Add the <a href="https://fsprojects.github.io/Paket/getting-started.html#Installing-dependencies">dependencies</a></h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source https://nuget.org/api/v2
storage:none
nuget Fable.Core
nuget Fable.Elmish.Browser
nuget Fable.Elmish.Debugger
nuget Fable.Elmish.HMR
nuget Fable.Elmish.React
nuget FSharp.Core
clitool dotnet-fable
</code></pre></div></div>
<h3 id="3-initiate-the-structure">3. Initiate the structure</h3>
<ul>
<li>create src and public folders</li>
<li>Add a new library project in the src folder</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet new classlib -n Client -lang F#
</code></pre></div></div>
<h3 id="4-add-references">4. Add <a href="https://fsprojects.github.io/Paket/getting-started.html#Installing-dependencies-into-projects">references</a></h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>FSharp.Core
Fable.Core
Fable.Elmish.React
Fable.Elmish.Browser
Fable.Elmish.Debugger
Fable.Elmish.HMR
dotnet-fable
</code></pre></div></div>
<h3 id="5-create-webpackconfigjs-file-in-your-root-folder-and-dont-forget-to-change-the-path-in-moduleexports-so-it-can-find-your-fsproj-correctly">5. Create <code class="language-plaintext highlighter-rouge">webpack.config.js</code> file in your root folder and don’t forget to change the path in <code class="language-plaintext highlighter-rouge">module.exports</code> so it can find your fsproj correctly.</h3>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">path</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">webpack</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">webpack</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">fableUtils</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">fable-utils</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">function</span> <span class="nx">resolve</span><span class="p">(</span><span class="nx">filePath</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="nx">filePath</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">babelOptions</span> <span class="o">=</span> <span class="nx">fableUtils</span><span class="p">.</span><span class="nx">resolveBabelOptions</span><span class="p">({</span>
<span class="na">presets</span><span class="p">:</span> <span class="p">[[</span><span class="dl">"</span><span class="s2">es2015</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">modules</span><span class="dl">"</span><span class="p">:</span> <span class="kc">false</span> <span class="p">}]],</span>
<span class="na">plugins</span><span class="p">:</span> <span class="p">[[</span><span class="dl">"</span><span class="s2">transform-runtime</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span>
<span class="dl">"</span><span class="s2">helpers</span><span class="dl">"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="c1">// We don't need the polyfills as we're already calling</span>
<span class="c1">// cdn.polyfill.io/v2/polyfill.js in index.html</span>
<span class="dl">"</span><span class="s2">polyfill</span><span class="dl">"</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">regenerator</span><span class="dl">"</span><span class="p">:</span> <span class="kc">false</span>
<span class="p">}]]</span>
<span class="p">});</span>
<span class="kd">var</span> <span class="nx">isProduction</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="dl">"</span><span class="s2">-p</span><span class="dl">"</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Bundling for </span><span class="dl">"</span> <span class="o">+</span> <span class="p">(</span><span class="nx">isProduction</span> <span class="p">?</span> <span class="dl">"</span><span class="s2">production</span><span class="dl">"</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">development</span><span class="dl">"</span><span class="p">)</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">...</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">devtool</span><span class="p">:</span> <span class="dl">"</span><span class="s2">source-map</span><span class="dl">"</span><span class="p">,</span>
<span class="na">entry</span><span class="p">:</span> <span class="nx">resolve</span><span class="p">(</span><span class="dl">'</span><span class="s1">./src/Client/Client.fsproj</span><span class="dl">'</span><span class="p">),</span>
<span class="na">output</span><span class="p">:</span> <span class="p">{</span>
<span class="na">filename</span><span class="p">:</span> <span class="dl">'</span><span class="s1">bundle.js</span><span class="dl">'</span><span class="p">,</span>
<span class="na">path</span><span class="p">:</span> <span class="nx">resolve</span><span class="p">(</span><span class="dl">'</span><span class="s1">./public</span><span class="dl">'</span><span class="p">),</span>
<span class="p">},</span>
<span class="na">resolve</span><span class="p">:</span> <span class="p">{</span>
<span class="na">modules</span><span class="p">:</span> <span class="p">[</span>
<span class="dl">"</span><span class="s2">node_modules</span><span class="dl">"</span><span class="p">,</span> <span class="nx">resolve</span><span class="p">(</span><span class="dl">"</span><span class="s2">./node_modules/</span><span class="dl">"</span><span class="p">)</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="na">devServer</span><span class="p">:</span> <span class="p">{</span>
<span class="na">contentBase</span><span class="p">:</span> <span class="nx">resolve</span><span class="p">(</span><span class="dl">'</span><span class="s1">./public</span><span class="dl">'</span><span class="p">),</span>
<span class="na">port</span><span class="p">:</span> <span class="mi">8080</span><span class="p">,</span>
<span class="na">hot</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="na">inline</span><span class="p">:</span> <span class="kc">true</span>
<span class="p">},</span>
<span class="na">module</span><span class="p">:</span> <span class="p">{</span>
<span class="na">rules</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="na">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.</span><span class="sr">fs</span><span class="se">(</span><span class="sr">x|proj</span><span class="se">)?</span><span class="sr">$/</span><span class="p">,</span>
<span class="na">use</span><span class="p">:</span> <span class="p">{</span>
<span class="na">loader</span><span class="p">:</span> <span class="dl">"</span><span class="s2">fable-loader</span><span class="dl">"</span><span class="p">,</span>
<span class="na">options</span><span class="p">:</span> <span class="p">{</span>
<span class="na">babel</span><span class="p">:</span> <span class="nx">babelOptions</span><span class="p">,</span>
<span class="na">define</span><span class="p">:</span> <span class="nx">isProduction</span> <span class="p">?</span> <span class="p">[]</span> <span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">DEBUG</span><span class="dl">"</span><span class="p">]</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="na">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.</span><span class="sr">js$/</span><span class="p">,</span>
<span class="na">exclude</span><span class="p">:</span> <span class="sr">/node_modules/</span><span class="p">,</span>
<span class="na">use</span><span class="p">:</span> <span class="p">{</span>
<span class="na">loader</span><span class="p">:</span> <span class="dl">'</span><span class="s1">babel-loader</span><span class="dl">'</span><span class="p">,</span>
<span class="na">options</span><span class="p">:</span> <span class="nx">babelOptions</span>
<span class="p">},</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="na">test</span><span class="p">:</span> <span class="sr">/</span><span class="se">\.</span><span class="sr">sass$/</span><span class="p">,</span>
<span class="na">use</span><span class="p">:</span> <span class="p">[</span>
<span class="dl">"</span><span class="s2">style-loader</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">css-loader</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">sass-loader</span><span class="dl">"</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="na">plugins</span><span class="p">:</span> <span class="nx">isProduction</span> <span class="p">?</span> <span class="p">[]</span> <span class="p">:</span> <span class="p">[</span>
<span class="k">new</span> <span class="nx">webpack</span><span class="p">.</span><span class="nx">HotModuleReplacementPlugin</span><span class="p">(),</span>
<span class="k">new</span> <span class="nx">webpack</span><span class="p">.</span><span class="nx">NamedModulesPlugin</span><span class="p">()</span>
<span class="p">]</span>
<span class="p">};</span>
</code></pre></div></div>
<h3 id="6-create-packagejson-file">6. Create <code class="language-plaintext highlighter-rouge">package.json</code> file</h3>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Client"</span><span class="p">,</span><span class="w">
</span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Simple Fable App"</span><span class="p">,</span><span class="w">
</span><span class="nl">"scripts"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"build"</span><span class="p">:</span><span class="w"> </span><span class="s2">"webpack -p"</span><span class="p">,</span><span class="w">
</span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="s2">"webpack-dev-server"</span><span class="p">,</span><span class="w">
</span><span class="nl">"test"</span><span class="p">:</span><span class="w"> </span><span class="s2">"echo </span><span class="se">\"</span><span class="s2">Error: no test specified</span><span class="se">\"</span><span class="s2"> && exit 1"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"keywords"</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w">
</span><span class="nl">"author"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Author"</span><span class="p">,</span><span class="w">
</span><span class="nl">"license"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ISC"</span><span class="p">,</span><span class="w">
</span><span class="nl">"dependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"babel-runtime"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.26.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"react"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^15.6.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"react-dom"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^15.6.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"remotedev"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.2.7"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"devDependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"babel-core"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.26.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"babel-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^7.1.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"babel-plugin-transform-runtime"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.23.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"babel-preset-es2015"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.24.1"</span><span class="p">,</span><span class="w">
</span><span class="nl">"bulma"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.5.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"css-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.28.7"</span><span class="p">,</span><span class="w">
</span><span class="nl">"fable-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^1.1.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"fable-utils"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^1.0.6"</span><span class="p">,</span><span class="w">
</span><span class="nl">"loglevel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^1.5.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"node-sass"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^4.5.3"</span><span class="p">,</span><span class="w">
</span><span class="nl">"sass-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^6.0.6"</span><span class="p">,</span><span class="w">
</span><span class="nl">"style-loader"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^0.18.2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"webpack"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^3.6.0"</span><span class="p">,</span><span class="w">
</span><span class="nl">"webpack-dev-server"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^2.8.2"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h3 id="7-create-indexhtml-in-the-public-folder">7. Create <code class="language-plaintext highlighter-rouge">index.html</code> in the <code class="language-plaintext highlighter-rouge">public</code> folder</h3>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!doctype html></span>
<span class="nt"><html></span>
<span class="nt"><head></span>
<span class="nt"><title></span>Your app name here<span class="nt"></title></span>
<span class="nt"><meta</span> <span class="na">http-equiv=</span><span class="s">'Content-Type'</span> <span class="na">content=</span><span class="s">'text/html; charset=utf-8'</span><span class="nt">></span>
<span class="nt"><meta</span> <span class="na">name=</span><span class="s">"viewport"</span> <span class="na">content=</span><span class="s">"width=device-width, initial-scale=1"</span><span class="nt">></span>
<span class="nt"><link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css"</span> <span class="nt">/></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"https://cdn.polyfill.io/v2/polyfill.js?features=default,fetch"</span><span class="nt">></script></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"main-app"</span><span class="nt">></div></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"bundle.js"</span><span class="nt">></script></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<h3 id="8-run-npm-install">8. run <code class="language-plaintext highlighter-rouge">npm install</code></h3>
<h3 id="9-create-appfs-and-add-it-to-your-project-file">9. create <code class="language-plaintext highlighter-rouge">App.fs</code> and add it to your project file</h3>
<div class="language-fsharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="nn">App</span><span class="p">.</span><span class="nc">View</span>
<span class="k">open</span> <span class="nn">Fable</span><span class="p">.</span><span class="nc">Core</span>
<span class="k">open</span> <span class="nn">Fable</span><span class="p">.</span><span class="nn">Import</span><span class="p">.</span><span class="nc">React</span>
<span class="k">open</span> <span class="nn">Fable</span><span class="p">.</span><span class="nn">Helpers</span><span class="p">.</span><span class="nn">React</span><span class="p">.</span><span class="nc">Props</span>
<span class="k">open</span> <span class="nn">Fable</span><span class="p">.</span><span class="nn">Helpers</span><span class="p">.</span><span class="nc">React</span>
<span class="k">open</span> <span class="nc">Elmish</span>
<span class="k">open</span> <span class="nn">Elmish</span><span class="p">.</span><span class="nc">React</span>
<span class="k">module</span> <span class="nc">R</span> <span class="p">=</span> <span class="nn">Fable</span><span class="p">.</span><span class="nn">Helpers</span><span class="p">.</span><span class="nc">React</span>
<span class="k">type</span> <span class="nc">Model</span> <span class="p">=</span> <span class="kt">int</span>
<span class="k">type</span> <span class="nc">Msg</span> <span class="p">=</span> <span class="nc">Increment</span> <span class="p">|</span> <span class="nc">Decrement</span>
<span class="k">let</span> <span class="n">init</span> <span class="bp">()</span> <span class="p">=</span>
<span class="mi">0</span>
<span class="k">let</span> <span class="n">update</span> <span class="p">(</span><span class="n">msg</span><span class="p">:</span><span class="nc">Msg</span><span class="p">)</span> <span class="n">count</span> <span class="p">=</span>
<span class="k">match</span> <span class="n">msg</span> <span class="k">with</span>
<span class="p">|</span> <span class="nc">Increment</span> <span class="p">-></span> <span class="n">count</span> <span class="o">+</span> <span class="mi">1</span>
<span class="p">|</span> <span class="nc">Decrement</span> <span class="p">-></span> <span class="n">count</span> <span class="p">-</span> <span class="mi">1</span>
<span class="k">let</span> <span class="n">view</span> <span class="n">model</span> <span class="n">dispatch</span> <span class="p">=</span>
<span class="nn">R</span><span class="p">.</span><span class="n">div</span> <span class="bp">[]</span>
<span class="p">[</span> <span class="nn">R</span><span class="p">.</span><span class="n">button</span> <span class="p">[</span> <span class="nc">OnClick</span> <span class="p">(</span><span class="k">fun</span> <span class="p">_</span> <span class="p">-></span> <span class="n">dispatch</span> <span class="nc">Decrement</span><span class="p">)</span> <span class="p">]</span> <span class="p">[</span> <span class="nn">R</span><span class="p">.</span><span class="n">str</span> <span class="s2">"-"</span> <span class="p">]</span>
<span class="nn">R</span><span class="p">.</span><span class="n">div</span> <span class="bp">[]</span> <span class="p">[</span> <span class="nn">R</span><span class="p">.</span><span class="n">str</span> <span class="p">(</span><span class="n">sprintf</span> <span class="s2">"%A"</span> <span class="n">model</span><span class="p">)</span> <span class="p">]</span>
<span class="nn">R</span><span class="p">.</span><span class="n">button</span> <span class="p">[</span> <span class="nc">OnClick</span> <span class="p">(</span><span class="k">fun</span> <span class="p">_</span> <span class="p">-></span> <span class="n">dispatch</span> <span class="nc">Increment</span><span class="p">)</span> <span class="p">]</span> <span class="p">[</span> <span class="nn">R</span><span class="p">.</span><span class="n">str</span> <span class="s2">"+"</span> <span class="p">]</span> <span class="p">]</span>
<span class="c1">// App</span>
<span class="nn">Program</span><span class="p">.</span><span class="n">mkSimple</span> <span class="n">init</span> <span class="n">update</span> <span class="n">view</span>
<span class="p">|></span> <span class="nn">Program</span><span class="p">.</span><span class="n">withReact</span> <span class="s2">"main-app"</span>
<span class="p">|></span> <span class="nn">Program</span><span class="p">.</span><span class="n">run</span>
</code></pre></div></div>
<h3 id="10-add-yourappsln-file-in-your-root-folder">10. add <code class="language-plaintext highlighter-rouge">yourapp.sln</code> file in your root folder</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "Client", "src\Client\Client.fsproj", "{25053F1A-0F95-4CFD-994B-F87F81670C91}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{25053F1A-0F95-4CFD-994B-F87F81670C91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{25053F1A-0F95-4CFD-994B-F87F81670C91}.Debug|Any CPU.Build.0 = Debug|Any CPU
{25053F1A-0F95-4CFD-994B-F87F81670C91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{25053F1A-0F95-4CFD-994B-F87F81670C91}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
</code></pre></div></div>
<h3 id="11-run-dotnet-restore">11. run <code class="language-plaintext highlighter-rouge">dotnet restore</code></h3>
<h3 id="12-run-dotnet-fable-npm-run-start-in-the-srcclient-folder-this-creates-bundlejs-and-bundlejsmap-files-in-public-folder">12. run <code class="language-plaintext highlighter-rouge">dotnet fable npm-run start</code> in the <code class="language-plaintext highlighter-rouge">src/Client</code> folder. This creates bundle.js and bundle.js.map files in public folder.</h3>
Adding a project to a solution file manually2018-01-16T00:00:00+00:00https://www.gienverschatse.com//vs/2018/01/16/add-project-to-solution<p>To add a project to your solution manually, you need to do two things:</p>
<ul>
<li>add the project itself</li>
<li>add the project to the ProjectConfigurationPlatforms</li>
</ul>
<!--more-->
<h1 id="adding-a-project-to-a-solution">Adding a project to a solution</h1>
<ol>
<li>Add the project itself</li>
</ol>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Project("{project type GUID}") = "<Project name>", "<project file location>",
"{<Unique project GUID>}"
EndProject
</code></pre></div></div>
<p><a href="https://www.codeproject.com/script/Membership/View.aspx?mid=1740717">Yvan Rodrigues</a> was nice enough to post the entire list in 2016 online for us!
You can find it <a href="https://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs">here</a></p>
<ol>
<li>Add the project to the ProjectConfigurationPlatforms</li>
</ol>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{<Unique project GUID>}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{<Unique project GUID>}.Debug|Any CPU.Build.0 = Debug|Any CPU
{<Unique project GUID>}.Release|Any CPU.ActiveCfg = Release|Any CPU
{<Unique project GUID>}.Release|Any CPU.Build.0 = Release|Any CPU
</code></pre></div></div>
<h1 id="example">Example</h1>
<p>This is an example of a F# library project being added to the solution.
As far as I can tell, it is not required that the GUIDs are in uppercase, it is just my personal preference.</p>
<ol>
<li>Project
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "QuizBot", "src\QuizBot\QuizBot.fsproj", "{4A0B663D-C0C3-491F-9B07-2DACE25DB816}"
EndProject
</code></pre></div> </div>
</li>
<li>ProjectConfigurationPlatforms
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{4A0B663D-C0C3-491F-9B07-2DACE25DB816}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A0B663D-C0C3-491F-9B07-2DACE25DB816}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A0B663D-C0C3-491F-9B07-2DACE25DB816}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A0B663D-C0C3-491F-9B07-2DACE25DB816}.Release|Any CPU.Build.0 = Release|Any CPU
</code></pre></div> </div>
</li>
</ol>
Detective Emmanuel Cooper books by Malla Nunn2017-08-12T00:00:00+00:00https://www.gienverschatse.com//books/2017/08/12/malla-nunn-novels<h3 id="book-1-a-beautiful-place-to-die">Book 1: A Beautiful Place to Die</h3>
<blockquote>
<p>The army had discharged him, but it hadn’t let him go. (p. 6)
<br /></p>
</blockquote>
<!--more-->
<!-- -->
<h3 id="book-2-let-the-dead-lie">Book 2: Let the Dead Lie</h3>
<blockquote>
<p>Ask, listen and nod. A surprising amount of police work hinged on these three simple actions. (p. 162)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>The rules were, in Emmanuel’s experience, the laziest way a man had to convince himself of his own worth. (p. 172)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Inevitably people ran into danger for their memories. (p. 187)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>He knew from experience that perception and reality often had nothing in common. (p. 198)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>“Never plant a poisonous tree in your backyard. One day your children might be forced to eat the fruit.” (p. 265)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>the past could not be bargained with or changed. (p. 368)</p>
</blockquote>
<hr />
<p>Version of the books</p>
<p><a href="http://amzn.to/2hT9pM2">Nunn, Malla. A Beautiful Place to Die: An Emmanuel Cooper Mystery. Atria Books. Kindle Edition.</a></p>
<p><a href="http://amzn.to/2vsyy4R">Nunn, Malla. Let the Dead Lie: An Emmanuel Cooper Mystery. Atria Books. Kindle Edition.</a></p>
First time speaker2017-08-05T00:00:00+00:00https://www.gienverschatse.com//speaker/2017/08/05/first-time-speaker<p>In the beginning of this year, I submitted a talk to some conferences and … it got accepted! A yeey and oh dear moment in one. Talking was a great experience and I will continue to do it, but it was also difficult at times. So I thought I would cover some aspects of preparing for public speaking that helped me a lot.
Let’s start with the most difficult thing: finding a topic.</p>
<!--more-->
<h2 id="topic">Topic</h2>
<p>One good way to find a topic is to look at problems you have and where you can find very little advice for online.
The other one is to find a subject you have some general knowledge about, but you want to take a deep dive into it.
I wouldn’t recommend submitting a topic someone knew absolutely nothing about, especially if you just started this whole ‘public speaking thing’. Don’t get me wrong, some speakers do it and get fantastic results, but it can also easily turn out completely different.</p>
<!--more-->
<h2 id="structure">Structure</h2>
<p>Start by introducing yourself, make sure the audience have a sense of who you are, what you like to do.</p>
<p>Giving a talk is like telling a story: it has a beginning, a middle and an end.
After you did that for your general talk, go over ‘the middle’ and divide it into beginning, middle and end again. Keep repeating until you have your content included! (This is starting to sound like a cooking recipe)</p>
<p>This way your content gets divided in blocks and you can freely add or remove them depending on how long your talk has to be without loosing the flow of your talk. And if you forget something, it won’t be that noticable too ;-)
Which brings us to another difficult thing to master as a speaker:</p>
<h2 id="time">Time</h2>
<p>One of the most difficult things is getting the timing right. 45 minutes may seem like a long time, but it is really short for giving a talk.
The most important thing I learned from giving a talk is: during the talk you always talk faster than when you are practicing.</p>
<p>Time yourself when you are practicing the separate blocks and write down how long they take. You can keep that with you during the talk, so you can skip one if you are running out of time.</p>
<p>Also time the entire talk length, because once you get into ‘the rhythm’, you talk a bit more fluent and the duration of the separate blocks don’t always add up to entire duration of the talk.</p>
<h2 id="audience">Audience</h2>
<p>One thing is for sure after just a few talks: every audience is different. You can ask this to any speaker and they will tell you the same thing.</p>
<p>Giving a talk for a meetup and for a conference are very different.
When you give your talk at a conference, you get a mic strapped on and a camera pointed at your face.
For me, speaking at a meetup was much more relaxing and less stressful than speaking at a conference.
People pay to go to conferences and I wanted to do an excellent job. Ironically, this made my talk at a conference a bit worse. ;-)
I’m still looking for a way to be less stressy about a conference talk. If I have to guess, I think just do a lot of talking at a conference might get me there.</p>
<h2 id="questions">Questions</h2>
<p>For me, the questions were the most scary part. Specifically the thought that I would loose track because I was being interrupted by them and the notion that there might be questions that I would not be able to answer. And yes, that happened!</p>
<p>There were questions that I couldn’t answer, and I just told them. And I’m still alive! ;-) There is no problem in telling someone you don’t know the answer.
I told them that if they got in touch with me (how to get in touch was on my slides when I introduced myself), I would be more than happy to look into it and try to answer it.</p>
<p>If you don’t want your talk to be interrupted by questions from the audience, tell them that there will be time at the end of the talk to answer any questions that they have.</p>
<h2 id="advice">Advice</h2>
<p>Something which helped me a lot during preparations was to ask a seasoned speaker for advice on my talk.
I had a topic in mind, which would be very interesting to talk about, but I had no idea how to start. So, I asked someone with experience in creating a talk if we could Skype and go over my talk.</p>
<p>There are many ways to create a talk and not every speaker will give you the same advice, but after a while you will find your own style of doing this.</p>
<h2 id="practice-makes-perfect">Practice makes ‘perfect’</h2>
<p>Join a local community that offer their attendees a chance to learn how to speak. Some meetups promote lightning talks or invite local
members to present their talk.
For me that was SoCraTesBE and DDDBE. They gave me a chance to practice my speaking skills and my talk and provided me with some helpful feedback! I am very happy to be part of these communities! <3</p>
<p>And don’t forget:</p>
<h2 id="enjoy-it-because-it-really-is-super-fun-to-do--">Enjoy it! Because it really is super fun to do :-)</h2>
<p>(note: there is a lot more that I could say about public speaking, but I’ll keep that for another blog post)</p>
The soul of a new machine by Tracy Kidder2017-05-18T00:00:00+00:00https://www.gienverschatse.com//books/2017/05/18/soul-of-machine<p>A while back I started listening to audio books on my way to work.</p>
<p>The last book I listened to was called “The soul of a new machine”, written by Tracy Kidder.
“The soul of a new machine” talks about the development of a new 32-bit minicomputer in the late 70s. It received a Pulitzer prize.</p>
<!--more-->
<p>At the end of the book, there was one quote that made me pause the audio because I thought it was so interesting to think about.
In my talk “Playing nice together”, I explain the context in which our C# monolith was developed. I believe it is very important to understand (and respect) why things are the way they are.
These two sentences sum up that part of the talk perfectly.</p>
<p>The strange thing was that I couldn’t find it online. I googled for it, but I couldn’t find it anywhere in the lists of favorite quotes from people.
So I decided to buy the epub version of the book, just to look up the quote and share it with you:</p>
<blockquote>
<p>What is usually meant by the term craftsmanship is the production of things of high quality; Ruskin makes the crucial point that a thing may also be judged according to the conditions under which it was built.</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="http://amzn.to/2pIp0RN">Kidder, Tracy. The Soul of A New Machine. Little, Brown and Company. Kindle Edition.</a></p>
Cakes, Custard and Category Theory by Eugenia Cheng2017-04-11T00:00:00+00:00https://www.gienverschatse.com//books/2017/04/11/cake-and-custard<p>If you want to get a general feeling of what category theory is all about and whether or not it is something you want to learn more about, this is the right book for you! The analogies between everyday actions, like making food, and category theory are easy to understand.</p>
<!--more-->
<h3 id="part-i-mathematics">PART I: Mathematics</h3>
<blockquote>
<p>I am going to argue that maths is defined by the techniques it uses to study things, and that the things it studies are determined by those techniques. (p. 5)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>In order to build a machine to do something rather than doing it yourself, you have to understand that thing at a different level. (p. 28)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>I still think it’s a good idea to know the principles of something that you’re using all the time, so that you’re less at its mercy when it goes wrong (p. 45)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>In mathematics, ‘harm’ means ‘causing a logical contradiction’. If something doesn’t cause a logical contradiction, you might as well do it. (p. 113)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>As long as your new idea doesn’t cause a contradiction, you are free to invent it. (p. 115)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>As I have mentioned before, in maths the basic ingredients are called axioms and the process of breaking something down into its basic ingredients is called axiomatisation. (p. 117)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Maths is about removing the human judgement from things, so that everything proceeds just by logic. (p. 125)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>If you start with nothing, you get nothing. So maths isn’t about ‘absolute truth’ after all (p. 129)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>So, in fact, rationality is a sociological notion. (p. 157)</p>
</blockquote>
<h3 id="part-ii-category-theory">PART II: Category theory</h3>
<blockquote>
<p>it emphasises their relationships with other objects, as the main way of placing them in context. (p. 184)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>The relationships are actually called ‘morphisms’ to allow for the fact that they might not be quite like relationships. (p. 186)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>You can wonder whether there’s one ‘special object’ in your world that somehow encapsulates tons of important information all by itself. That is, a sort of barometer object, a litmus test object, a benchmark object, an Erdős-like figure. Mathematicians call this a universal property. (p. 188)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>The first rule is reflexivity, which says that everyone is related to themselves. The second rule is symmetry, which says that if A is related to B then B is related to A. The third and last rule is transitivity, which we already saw in Chapter 4. This rule says that if A is related to B and B is related to C, then A is related to C. (p. 194)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>A category in mathematics starts with a set of objects, and a set of relationships between them. (p. 201)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Understanding something from only one point of view is far too restrictive. (p. 213)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>The only useful equations are those that tell us two different ways of doing something are ‘somehow the same’. (p. 228)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>I think a lot of our personal scientific knowledge is just that – knowledge that we believe because somebody we trust has told it to us. We have taken it on trust, or on authority. (p. 274)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>‘Because we’ve proved it’ is not a satisfactory answer, from a human point of view. (p. 276)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="http://amzn.to/2on0stQ">Cheng, Eugenia. How to Bake Pi: Easy recipes for understanding complex maths. Profile Books. Kindle Edition. </a></p>
Always catching up2017-04-05T00:00:00+00:00https://www.gienverschatse.com//books/2017/04/05/catching-up<p>Often I get the feeling that I’m always catching up with what is going on in the world.
There is just so much available to read and only so much time available to actually read it.
Not only that, but you also have to be careful: is it actually worth it?</p>
<p>Here are some of my tips and tricks on how to keep up.</p>
<!--more-->
<h2 id="organisation-organisation-organisation">Organisation, organisation, organisation</h2>
<p>About a year ago I had this feeling that so much of my time was being wasted on reading things that were totally useless.
Up until that point, I never really thought to optimize my reading, but I decided to give it a try.</p>
<p>I’m very happy with feedly, it saves me a lot of time going through my booksmarks like I use to.</p>
<p>But using feedly to have all the possible articles stored, wasn’t enough.
Hence, the creation of a ‘drama test’.
(Many of the blogs I followed have been eliminated from my reading list because they failed it)</p>
<h2 id="the-drama-test">The drama test</h2>
<h3 id="the-4-basics-date-links-introduction-comments">The 4 basics: date, links, introduction, comments</h3>
<p>If the articles on the blog doesn’t have these four basic things, I don’t even start reading it.
There are so much blogs out there these days, that the chances are very slim that it is the only blog out there that covers the subject.
And if it is, you can always turn to papers or books to understand the subject better.</p>
<h3 id="how-do-you-know-this">How do you know this?</h3>
<p>‘A paper was published today … ‘
‘New research suggest that … ‘
‘A study shows … ‘</p>
<p>They might as well start their articles with ‘I heard it through the grapevine.’ It would provide an equal amount of information to the reader.
If you don’t tell me where I can find the paper, or ever worse, if you don’t even bother to tell me the name of the study/paper, well, I won’t bother reading your article at all.
After three articles without any references, I remove the blog from my feedly.</p>
<h3 id="lists-lists-everywhere--">Lists, lists everywhere :-(</h3>
<p>If I see three articles in a row that are just “10 things that”, “5 ways to”, I remove it from my reading list.
Most of those articles are too shallow to give you a clear understanding of the subject.</p>
<h3 id="roll-eye-articles">roll eye articles</h3>
<p>Check out the screenshot below. They all cover the same topic, but the way the information represent it, is very different from one another.
Some blogs or online newspapers care more about creating sensation than informing their readers.
If the articles make me roll my eyes spontaneously, I stop following the blog or newspaper.</p>
<p><img src="/public/images/bats.PNG" alt="placeholder" title="Bats article in google" /></p>
<h2 id="bookspapers--blogs">Books/papers > blogs</h2>
<p>A friend of mine said to me a couple of years ago that he prefered reading books over blogposts because it takes a lot of time and effort to write a book.
Since than I started prefering books over blogposts.</p>
<p>At any given moment I have at least three books that I’m ‘reading’ (and I put my maximum on five):</p>
<ul>
<li>two book on my kindle (most of the time a fiction and a non-fiction)</li>
<li>an audio book (audible)</li>
</ul>
<p>Anyways, these were my tips and tricks on reading. I’m always interested in hearing about other peoples methods!</p>
Mort by Terry Pratchett2017-04-04T00:00:00+00:00https://www.gienverschatse.com//books/2017/04/04/mort<p>Four Discworld novels in four months, not bad!
Here are my favorite quotes for the fourth one, Mort.</p>
<!--more-->
<blockquote>
<p>It doesn’t prove anything very much except that the awesome splendour of the universe is much easier to deal with if you think of it as a series of small chunks. (p. 30)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>THAT’S MORTALS FOR YOU, Death continued. THEY’VE ONLY GOT A FEW YEARS IN THIS WORLD AND THEY SPEND THEM ALL IN MAKING THINGS COMPLICATED FOR THEMSELVES. FASCINATING. (p. 41)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Klatchian, a language so ancient and sophisticated that it had fifteen words meaning ‘assassination’ before the rest of the world had caught on to the idea of bashing one another over the head with rocks (p. 60)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>He’d learned in recent days, though, that rather than drown in uncertainty it was best to surf right over the top of it. (p. 71)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>His subconscious was worrying him. It appeared to have a direct line to parts of his body that he wanted to ignore at the moment. (p. 137)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Light on the Discworld isn’t like light elsewhere. It’s grown up a bit, it’s been around, it doesn’t feel the need to rush everywhere. It knows that however fast it goes darkness always gets there first, so it takes it easy. (p. 235)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>‘We talked about it,’ he said. ‘Then we thought, just because you happen to rescue a princess, you shouldn’t rush into things.’ (. 254)
<br /></p>
</blockquote>
<!-- -->
<blockquote>
<p>Death grinned because, as has so often been remarked, he didn’t have much option. (p. 257)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="http://amzn.to/2oBJUkv">Pratchett, Terry. Mort: (Discworld Novel 4) (Discworld series) Transworld. Kindle Edition.</a></p>
The Light Fantastic by Terry Pratchett2017-03-19T00:00:00+00:00https://www.gienverschatse.com//books/2017/03/19/the-light-fantastic<p>In the beginning of 2017 I decided to try and read as much Discworld novels as possible. (Besides the 25 book challenge that I set for myself)
My guess is that I will be able to read 10! As a motivation for myself, I decided to post the highlights I make while reading online.</p>
<!--more-->
<p>The first book I have in paperback, so I can’t give you my favorite quotes for that one, but for all the others I will post them here.
So, yesterday I did <a href="http://selketjah.github.io/2017/03/18/equal-rites-quotes/">Equal Rites</a> and today I give you the highlights of the second book, <a href="https://www.goodreads.com/book/show/34506.The_Light_Fantastic">The Light Fantastic</a>.
(I know, wrong direction)</p>
<blockquote>
<p>‘Have you ever heard of culture shock?’ he hissed. ‘What’s that?’ ‘It’s what happens when people spend five hundred years trying to get a stone circle to work properly and then someone comes up with a little book with a page for every day and little chatty bits saying things like “Now is a good time to plant broad beans” (p. 70)
<br /></p>
</blockquote>
<blockquote>
<p>‘Oh, yes,’ said Twoflower, to whom sarcasm was merely a seven letter word beginning with S. (p. 72)
<br /></p>
</blockquote>
<blockquote>
<p>Cohen had heard of fighting fair, and had long ago decided he wanted no part of it. (p. 196)
<br /></p>
</blockquote>
<blockquote>
<p>‘Inside every sane person there’s a madman struggling to get out,’ … No one goes mad quicker than a totally sane person.’ (p. 221)
<br /></p>
</blockquote>
<blockquote>
<p>The wizards were learning that while it was all very fine and impressive to have a set of gates that were locked by magic, it ought to have occurred to the builders to include some sort of emergency back-up device such as, for example, a pair of ordinary, unimpressive stout iron bolts. (p. 229)
<br /></p>
</blockquote>
<blockquote>
<p>Sometimes things can fail to happen in quite impressive ways, but as far as non-events went this one just couldn’t compete. (pp. 263-264)</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="http://amzn.to/2mG3UOM">Pratchett, Terry. The Light Fantastic: (Discworld Novel 2) (Discworld series) Transworld. Kindle Edition.</a></p>
Equal rites by Terry Pratchett2017-03-18T00:00:00+00:00https://www.gienverschatse.com//books/2017/03/18/equal-rites-quotes<p>I just finished reading the third book of the Discworld novels by Terry Pratchett, <a href="https://www.goodreads.com/book/show/34507.Equal_Rites">Equal Rites</a>.
Here are my most favorite sentences from the book:</p>
<!--more-->
<blockquote>
<p>‘You’re a bit young for this,’ she said, ‘but as you grow older you’ll find most people don’t set foot outside their own heads much. You too,’ she added gnomically. (p. 46)
<br /></p>
</blockquote>
<blockquote>
<p>The landlord of the Fiddler’s Riddle considered himself to be a man of the world, and this was right, because he was too stupid to be really cruel, and too lazy to be really mean and although his body had been around quite a lot his mind had never gone further than the inside of his own head. (p. 82)
<br /></p>
</blockquote>
<blockquote>
<p>He was stupid, yes, in the particular way that very clever people can be stupid. (p. 122).
<br /></p>
</blockquote>
<blockquote>
<p>Her clients had money, which was useful, but they also paid in respect, and that was a rock-hard currency. (p. 137).
<br /></p>
</blockquote>
<blockquote>
<p>They both savoured the strange warm glow of being much more ignorant than ordinary people, who were ignorant of only ordinary things. (p. 182).</p>
</blockquote>
<hr />
<p>Version of the book</p>
<p><a href="http://amzn.to/2nCAnXg">Pratchett, Terry. Equal Rites: (Discworld Novel 3) (Discworld series) Transworld. Kindle Edition.</a></p>
Forge, my first OSS contribution2016-12-09T00:00:00+00:00https://www.gienverschatse.com//f%23/2016/12/09/my-first-oss-contribution<p>When speaking to <a href="http://hintjens.com/">Pieter Hintjens</a> about open source communities and how they should behave towards newcomers,
he said that a first successful contribution is one of the most important things in a project. Successful meaning that their pull request gets merged back into the project.
Even if the pull request breaks the build, just merge it back. Especially, if you want them to keep contributing.</p>
<!--more-->
<p>Aftwards you can send them a nice message saying: ‘Hey, your PR broke the build because of x or y, but we merged it anyways. This is how you can prevent it from happening again.’
If they keep submitting pull requests that break the build and don’t bother fixing it, draw your conclusions.</p>
<p>The win is more important. I always liked that vision.</p>
<!--more-->
<h2 id="the-path-to-forge">The path to Forge</h2>
<p>When I learned F#, I fell in love with the language and the community. The community was very open and welcoming and it made me want to help out, but
starting to contribute was very scary for me for a couple of reasons.</p>
<p>The idea that you can do something wrong in a very public setting, is one of the reasons I kept postponing a contribution.
During BuildStuff this year, I had the pleasure of meeting a few community members, including <a href="https://twitter.com/k_cieslak">Krzysztof Cieslak</a>. He has done some really great work in the F# community
with projects like <a href="http://ionide.io/">Ionide</a> and <a href="http://forge.run/">Forge</a></p>
<p>It was a good opportunity to remove some of the reasons I kept postponing.
I strapped on my Boots of Courage and asked him if he would be willing to take me through the <a href="https://github.com/fsharp-editing/Forge">code of Forge</a>.
He was.</p>
<p>So we sat down and went through the code. He explained the big lines of the project: how Forge works, the tests and the general architecture.
He challenged me to make my first pull request by the next week and I accepted that challenge.</p>
<p>After a while we started talking about open source in general. His way of handling his open source projects is very similar
to Pieter’s: any contribution, no matter how small it may seem, is valued.
It was.</p>
<h2 id="forging-ahead">Forging ahead</h2>
<p>If you never contributed, the best place to start are the contribution guidelines.
Although the setup can vary from project to project, the initial setup can be generalised in the following steps:</p>
<ul>
<li>fork the repository</li>
<li>clone your fork locally</li>
<li>add the original repository as an upstream for synchronisation purposes</li>
<li>make sure it builds</li>
<li>start contributing</li>
</ul>
<p>When I’m trying something for the very first time, I find it easier to start over when I execute one of the steps incorrect.
And yes, I had to start over a couple of times:</p>
<p>The first time, I forgot to fork the repository. I got this really nice ‘fatal error’ when I tried to push my branch.
I threw everything away and started again.</p>
<p>Second time, I forgot to create a branch for my changes.
I added my test implementation to my local master and created a pull request from there.
Once the pull request was merged back into Forge and I synchronised my local copy with the upstream. After that I saw that my master was 3 commits ahead again.
This was because the commits had different SHAs.</p>
<p>So depending on how your pull request gets merged, your master can get out of sync even more when you are trying to sync it.
It’s easier not to add your changes to your master, but create a new branch and start from there.</p>
<p>So I just deleted my fork and tried again.
I just implemented another test an when my pull request was merged back, I had no problems with syncing my fork.
In the end my first successful cycle contained two PR’s and I have a very clear picture in my head how an inital setup works now.</p>
<h2 id="unforged-feelings">Unforged feelings</h2>
<p>Every project can be helped from adding a few tests, cleaning up a few lines of code and the maintainers will be extremely grateful.
To see so many fantastic reactions for even such a small contribution, well … it made me feel pretty great!</p>
<p>So I will leave the small stuff for those who want to <a href="https://github.com/fsharp-editing/Forge/wiki/How-to-contribute-to-Forge">start contributing</a>, and try something a bit bigger. ;-)</p>
About a bot [Part III - the Groove]2016-10-22T00:00:00+00:00https://www.gienverschatse.com//f%23/2016/10/22/about-a-bot-the-groove<p>As you already know from <a href="http://selketjah.github.io/2016/07/24/about-a-bot-start/">my previous blogpost</a>, I did a F# mentorship with <a href="http://brandewinder.com/">Mathias Brandewinder</a> in the beginning of the year.
Below you can find a list of topics covered, with links towards extra learning material.</p>
<!--more-->
<h2 id="seq-list-and-array-session-1">seq, list and array (session 1)</h2>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/ee353635.aspx">Seq module</a></li>
<li><a href="http://fsharpforfunandprofit.com/posts/list-module-functions/">Choosing between collection functions</a></li>
</ul>
<h2 id="introduction-into-function-partial-application--and-composition-session-2">Introduction into function, partial application, |> and composition (session 2)</h2>
<ul>
<li><a href="http://fsharpforfunandprofit.com/posts/partial-application/">Partial Application</a></li>
<li><a href="http://theburningmonk.com/2011/09/fsharp-pipe-forward-and-pipe-backward/">Pipe forward and pipe backward</a></li>
<li><a href="https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/symbol-and-operator-reference/">symbols and operators</a></li>
<li><a href="https://fsharpforfunandprofit.com/posts/conciseness-functions-as-building-blocks/">»</a></li>
</ul>
<h2 id="discriminated-unions-and-pattern-matching-session-3">discriminated unions and pattern matching (session 3)</h2>
<ul>
<li><a href="https://vimeo.com/97315970">Tomas Petricek, Domain Specific Languages, the functional way</a></li>
<li><a href="http://fsharpforfunandprofit.com/posts/designing-with-types-intro/">Scott Wlaschin, Designing with Types</a></li>
<li><a href="https://github.com/c4fsharp/Dojo-Turtles/blob/master/Dojo/Turtles.fsx">Turtles dojo</a></li>
</ul>
<h2 id="type-providers-list-comprehension-syntax-computation-expressions-and-async-session-4">type providers, list comprehension syntax, computation expressions and async (Session 4)</h2>
<ul>
<li><a href="https://en.wikibooks.org/wiki/F_Sharp_Programming/Lists#Using_List_Comprehensions">List comprehensions</a></li>
<li><a href="https://github.com/mathias-brandewinder/Presentations/tree/master/fsharp-for-csharp-devs/code/Type-Providers">Type provider example</a></li>
<li><a href="http://hestia.typepad.com/flatlander/2010/12/f-computation-expressions-for-beginners-part-1-whats-the-problem.html">Computation expressions</a></li>
</ul>
<h2 id="fscheck-unquote-session-5">FsCheck, Unquote (Session 5)</h2>
<ul>
<li><a href="https://fscheck.github.io/FsCheck/QuickStart.html">FsCheck (property based testing)</a></li>
<li><a href="http://www.swensensoftware.com/unquote">Unquote (F# testing library)</a></li>
<li><a href="http://fsharpforfunandprofit.com/rop/">ROP (Useful, dense and mind-expanding, even though we might not use it yet)</a></li>
<li><a href="http://blog.ploeh.dk/2014/03/10/solid-the-next-step-is-functional/">Classes & Functions</a></li>
</ul>
<h2 id="single-case-discriminated-unions-mailbox-processor-session-6">Single case discriminated unions, mailbox processor (Session 6)</h2>
<ul>
<li><a href="http://fsharpforfunandprofit.com/posts/designing-with-types-single-case-dus/">Single case discriminated unions</a></li>
<li><a href="https://en.wikibooks.org/wiki/F_Sharp_Programming/MailboxProcessor">Mailbox processor</a></li>
<li><a href="http://fsharp.org/specs/component-design-guidelines/">F# design guidelines</a></li>
<li><a href="https://msdn.microsoft.com/en-us/library/ms229042(v=vs.110).aspx">(Bonus/unrelated to F#)</a></li>
</ul>
<h2 id="active-patterns-and-imports-session-7">Active patterns and imports (Session 7)</h2>
<ul>
<li><a href="http://blogs.msdn.com/b/chrsmith/archive/2008/02/21/introduction-to-f_2300_-active-patterns.aspx">Active patterns</a></li>
<li><a href="http://blogs.msdn.com/b/chrsmith/archive/2008/02/22/regular-expressions-via-active-patterns.aspx">Active patterns 2</a></li>
<li><a href="https://msdn.microsoft.com/en-us/library/dd393787.aspx">imports</a></li>
<li><a href="http://blog.codinghorror.com/quantity-always-trumps-quality/">(Bonus/unrelated to F#): quantity always trumps quality</a></li>
<li><a href="https://topshelf.readthedocs.org/en/latest/index.html">(Bonus/unrelated to F#): TopShelf</a></li>
</ul>
<h2 id="rec-for-and-distances-session-8">rec, for and distances (Session 8)</h2>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/recursive-functions-the-rec-keyword-%5bfsharp%5d">rec</a></li>
<li><a href="http://fsharpforfunandprofit.com/posts/control-flow-expressions/">for</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hamming_distance">Hamming distance</a></li>
<li><a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein distance</a></li>
</ul>
<h2 id="generics-sets-and-maps-session-9">Generics, sets and maps (Session 9)</h2>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/dd233215.aspx">Generics</a></li>
<li><a href="http://theburningmonk.com/2011/12/f-inline-functions-and-member-constraints/">Inline functions, member constraints</a></li>
<li><a href="https://en.wikibooks.org/wiki/F_Sharp_Programming/Sets_and_Maps">Sets & Maps</a></li>
</ul>
<h2 id="material">Material</h2>
<ul>
<li><a href="http://codekata.com/">http://codekata.com/</a></li>
<li><a href="https://projecteuler.net/">https://projecteuler.net/</a></li>
<li><a href="http://adventofcode.com/">http://adventofcode.com/</a></li>
<li><a href="https://www.codingame.com/">https://www.codingame.com/</a></li>
<li><a href="http://rosalind.info/">http://rosalind.info/</a></li>
<li><a href="http://exercism.io/">http://exercism.io/</a></li>
</ul>
<p>If you have other material or suggested readings for a topic, please feel free to leave them in the comments below.</p>
How to win friends and influence people by Dale Carnegie2016-09-23T00:00:00+00:00https://www.gienverschatse.com//books/2016/09/23/win-friends-and-influence-people<p>The hardest part about programming is people.</p>
<p>Well, that might be a bit exaggerated, but ‘How do I deal with person X or behavior Y in my company?’ is a question that often pops up during meetups or (un)conferences. Apparently, a lot of developers struggle with the people part of programming, and I am no exception.</p>
<!--more-->
<p>That is why I started reading up on it. In the end communication, conflict handling and all such are just skills that we need to
practice to get better at it.</p>
<p>How to win friends and influence people is an ‘oldie but goodie’. It was first published in 1936, but still totally worth reading as far
as I’m concerned. :-)</p>
<!--more-->
<p><img src="/public/mindmaps/win-friends.jpeg" alt="placeholder" title="How to win friends and influence people" /></p>
The design of everyday things by Donald A. Norman2016-08-07T00:00:00+00:00https://www.gienverschatse.com//books/2016/08/07/design-of-everyday-things<p>Most of the books I read have a less obvious impact on my way of thinking. You can only see the value of reading it after a couple of months.
The design of everyday things was not one of those books. It changes the way you look at usability instantaneously.</p>
<!--more-->
<p>It was first published in 1988. Due to its popularity, it was revised and extended in 2013.
It is sometimes a bit wordy, but in general a very interesting read.</p>
<p><img src="/public/mindmaps/doet1.jpeg" alt="placeholder" title="DOET 1" /></p>
<p><img src="/public/mindmaps/doet2.jpeg" alt="placeholder" title="DOET 2" /></p>
<p><img src="/public/mindmaps/doet3.jpeg" alt="placeholder" title="DOET 3" /></p>
About a bot [Part II - some numbers]2016-07-27T00:00:00+00:00https://www.gienverschatse.com//f%23/2016/07/27/about-a-bot-some-numbers<p>In the beginning of this year, I did an F# mentorship with Mathias Brandewinder.</p>
<p>If you want the quick version of the general setup of the mentorship, you are in the right place!
This is just a summary with little detail as a future reference point for those who read the entire thing.
You can find the full story <a href="http://selketjah.github.io/2016/07/24/about-a-bot-start/">here</a>.</p>
<!--more-->
<h2 id="1">1</h2>
<p>Duration of each session.
Also the number of finished projects in F# after the mentorship (yes, finished!)</p>
<h2 id="2">2</h2>
<p>Number of people involved
This is also the number of retrospectives we did.</p>
<h2 id="4">4</h2>
<p>Number of weeks getting into the F# ‘groove’.</p>
<h2 id="6">6</h2>
<p>Number of weeks working on a real project (More about that later)</p>
<h2 id="5">5</h2>
<p>Minimum amount of hours doing my homework, (or hours spend preparing for the next session.)</p>
<h2 id="9">9</h2>
<p>time zone difference. Settle quickly on a fixed moment to do the sessions to overcome struggling with it.</p>
<h2 id="10">10</h2>
<p>Number of sessions</p>
<h2 id="15">15</h2>
<p>Maximum of hours spend doing my homework.</p>
<h2 id="infinite">Infinite</h2>
<p>Amount of suffering we had trying to find the right tools for the job. In the end we settled for TeamViewer
for screen collaboration and Skype for audio/video.</p>
<h2 id="42">42</h2>
<p>If you have any questions about the mentorship, please feel free to contact me via Twitter (or other means)</p>
<p>If you would like to participate in one, you are lucky! The F# community also organizes mentorships!
more info can be found <a href="http://fsharp.org/mentorship/about.html">here</a> Next round will start somewhere in September.</p>
About a bot [Part I - How it started]2016-07-24T00:00:00+00:00https://www.gienverschatse.com//f%23/2016/07/24/about-a-bot-start<p>So, in the beginning of the year I did a remote F# mentorship with <a href="http://brandewinder.com/">Mathias Brandewinder</a>.
This is the first blogpost that will be part of a series about the mentorship.</p>
<p>It was a super fun experience, but organising remote programming sessions does come with some struggles.
In this blogpost I will cover the general setup of the mentorship and the issues we came across during it.</p>
<!--more-->
<h2 id="strangers-on-a-train">Strangers on a train</h2>
<p>For some people it is very easy to get to know others and make friends. I am not one of those people.
I knew Mathias by ‘reputation’, but we hadn’t seen one another in person.
Before the sessions started, we did a small introduction via e-mail, but when they started, we went ‘straight to work’.
Although I loved the level of focus, this is one of the things I recommend doing different.
Take a bit of time during that first session to have a general conversation if you are not acquainted with one another to break the ice.</p>
<p>Having a camera up and running during the sessions is also a big help to make them better (read less awkward ;-)).
During the fourth there was a video feed. We hadn’t been able to get the video working up until then (more about that later),
but I noticed that it made it a lot easier for me to speak up.</p>
<h2 id="hello-can-you-hear-me">Hello, can you hear me?</h2>
<p>The most repeated (and extremely frustrating) question during the entire sessions. Setting up your environment so that you can talk to each
other and share your screen was actually a difficult process in the beginning.</p>
<p>We tried a variety of ways to do it:
First, there was Google Hangouts. It hates us, I swear!
Although we both had successful hangouts with other people, we did not get this to work <em>at all</em>. Why? Well, because.</p>
<p>Second, I looked into ScreenHero because I heard good things about the tool. Unfortunately, at that point in time they were
migrating into Slack and I couldn’t check it out. Right now the migration is finished, but it was a full Slack integration
and you cannot use the product separately anymore. How exactly it works right now, I don’t know.</p>
<p>Next up was TeamViewer. TeamViewer is a collaboration tool and is available for most operating systems and is free for private usage.
It should be able to do audio, video and screen collaboration, but we did not get the audio and video to work. To be honest, after all the trouble
we had with the other tools, I wasn’t in the mood anymore to try to get it to work.</p>
<p>We ended up with a combination of TeamViewer and Skype.
You have screen sharing on Skype, but not screen collaboration (as far as I know). It’s important that both parties have control
over the screen. Even if you don’t type, it’s very handy to be able to point or select some code when asking a question.</p>
<p>Having to tackle these kind of problems is very frustrating, but it did have an upside too.
It helped with the ‘strangers on a train’. There is something about cursing together at Google Hangouts that breaks the ice and takes away
some of the nerves you have. ;-)</p>
<h2 id="lets-get-this-party-started">Let’s get this party started</h2>
<p>Besides finding the right tools for the job, finding the right moment to have a session is the second hurdle
you have to take.
Although we didn’t have difficulties with this, I can imagine this being a bit of a struggle.
We were living in different time zones, so when we e-mailed about setting up the sessions, we always
included both times. Very handy!
Mathias mailed me some possible moments in which we could hold the sessions, we picked one and stuck with it.</p>
<p>The first 4 sessions were a general introduction into F# itself, aka getting into the groove.
I will dedicate the next blogpost about those sessions, so I will not go into detail right now.</p>
<p>After that, we had 6 sessions where we worked on a project together. We made a twitter quiz bot! So cool :-D
Because we hadn’t covered all interesting F# topics yet (we still haven’t), the homework continued.
Going over it ate up a lot of our project time, so we introduced a 15 minute time box to answer the questions I had
during the week about it. After the 15 minutes were up, we continued on the project.
In the coming posts of this series I will go into more detail of the project.</p>
<p>One thing we agreed upon during the retrospective was that one hour wasn’t long enough to make serious progress on the
bot, and the sessions never ended after one hour (we were having too much fun). It would be better to find a different format for the project sessions.
You could do 4 sessions of 2 hours, or 5 of one and a half…</p>
<h2 id="how-did-we-do">How did we do?</h2>
<p>Seeing how this was the first time for both of us to participate in a mentorship, we knew it would be a trial-and-error approach.
I am actually very happy with the way the mentorship went: pretty much everything was trial, but we had very little error.
Still, it is important to know where things could be improved for mentor and mentee, so we had two retrospectives:
one after the first 4 sessions, before we started the project and the other at the end of the mentorship.</p>
<p>The first one was initiated by Mathias and was via e-mail. I really liked that.
It gave me some time to think about the answers and how to formulate my feedback in a way that didn’t sound negative.</p>
<p>The second retrospective was organized as an eleventh session. We both thought about what we wanted to ask (or say) and
send the questions upfront to each other so we had some time to formulate the answers. Open and honest retrospectives can be
a hardship sometimes, so preparing for it can make all the difference.
Below you can find our questions for inspiration.</p>
<h2 id="questions">Questions</h2>
<p>My questions:</p>
<ol>
<li>What did we do well during our sessions that you would recommend to others?</li>
<li>
<p>What did we do well during our sessions that you might forget to mention when blogging/talking about the sessions?</p>
</li>
<li>What would you have done differently?</li>
<li>
<p>What do you think I would want you to do differently?</p>
</li>
<li>What is the most important thing that you learned from our sessions?</li>
<li>
<p>What do you think is the most important thing I learned?</p>
</li>
<li>Did you ever get the impression that I had not prepared my homework good enough?</li>
<li>Did you ever get the feeling I wasted your time with a question/conversation?</li>
<li>Did you ever get the impression that my questions were due to insufficient search for the answer?</li>
<li>If you could give me one advice for the future which would improve me as a developer, what would it be?</li>
</ol>
<p>Mathias’ questions:</p>
<ul>
<li>Was it prepared enough on my side? I think it’s valuable to think through problems together live, but it can also slow things down, would more guidance have been better?</li>
<li>If a friend asked you to take a look at their F# code, would you be comfortable with it? What would be missing?</li>
<li>If a friend asked you whether it would be worth their time to do a similar mentorship with me, what would you ask them and tell them?</li>
<li>If a friend asked you to mentor them on F#, how would you change the “program”?</li>
<li>Was there anything surprising, in a good or bad way, over the 10 weeks? Was it different from what you expected?</li>
<li>Based on the initial description/commitment, did you expect something that didn’t happen/was missing?</li>
<li>What type of person do you think I should do this with? Who would not get much out of it?</li>
<li>Do you think you will get stuck on the bot project? Why/how/where?</li>
<li>What are the 3 most valuable things you learnt over the 10 weeks? Will you do anything differently in the future?</li>
<li>Any input on my attitude, on the content, on the format!</li>
</ul>
<h2 id="what-comes-next">What comes next?</h2>
<p>In the next part of the series, I will dig a little deeper into each session.
First I will go into the 4 ‘Into the groove’ sessions and after that I will go into detail about the quiz bot!</p>
Pragmatic Thinking and Learning by Andy Hunt2016-05-20T00:00:00+00:00https://www.gienverschatse.com//books/2016/05/20/pragmatic-thinking<p>About one and a half years ago I read the book ‘Pragmatic Thinking and Learning: Refactor Your Wetware’ by Andy Hunt.</p>
<!--more-->
<p>About 75 percent of the tips and tricks from the book I still apply today, which is a first.</p>
<p>I hope my first attempt in creating a summary of a book (as you can see, creating mind maps is one of them) is a good teaser
to read the book yourself.</p>
<p><img src="/public/mindmaps/pragmatic-thinking-and-learning.jpeg" alt="placeholder" title="Pragmatic thinking and learning" /></p>