<?xml version="1.0" encoding="UTF-8"?>
<rss version='2.0' xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Marius Butuc</title>
    <description>lab notes; connecting the dots</description>
    <link>http://www.mariusbutuc.com/feed</link>
    <atom:link href="http://www.mariusbutuc.com/feed" rel="self" type="application/rss+xml"/>
    <category domain="www.mariusbutuc.com">Content Management/Blog</category>
    <language>en-us</language>
      <pubDate>Thu, 30 Nov 2017 19:01:00 -0500</pubDate>
    <managingEditor>marius.butuc@gmail.com (Marius Butuc)</managingEditor>
      <item>
        <guid>http://www.mariusbutuc.com/the-new-managers-death-spiral#35682</guid>
          <pubDate>Thu, 30 Nov 2017 19:01:00 -0500</pubDate>
        <link>http://www.mariusbutuc.com/the-new-managers-death-spiral</link>
        <title>The New Managers Death Spiral</title>
        <description>with @rands and #TeamLeadTO</description>
        <content:encoded><![CDATA[<p>This week, Michael Lopp, a.k.a. <a href="https://twitter.com/rands">@rands</a> or &quot;Slack&#39;s VP Engineering&quot;, was in Toronto and he was kind enough to <a href="https://www.eventbrite.ca/e/the-new-manager-death-spiral-lessons-in-management-from-slacks-vp-engineering-tickets-39902171469">meet with us</a> and share some of the more common don&#39;ts and do&#39;s that he encountered in his experience thus far.</p>

<blockquote>
<p>[…] walk us through a story where a new manager successfully performs every single common mistake in their new role. <strong>The New Manager Death Spiral</strong> is a cautionary tale full of good advice.</p>
</blockquote>

<h2 id="meta">Meta</h2>

<ul>
<li>You might also know @rands as the author of <a href="https://www.goodreads.com/book/show/30454232-managing-humans">Managing Humans</a>, <a href="https://www.goodreads.com/book/show/8473471-being-geek">Being Geek</a> or <a href="http://randsinrepose.com/">randsinrepose.com</a></li>
<li>Upon a quick raise of hands, he assesed the room to be ~60% full of introverts.</li>
<li>His <em>disclaimer</em>: this hypothetical story is a <strong>worst case</strong> scenario.</li>
<li>My <em>disclaimer</em>: following is a log of my personal notes; sometimes out of context, sometimes missunderstood.</li>
</ul>

<h2 id="the-new-managers-death-spiral-or-the-insightful-part">The New Managers Death Spiral <em>(or the insightful part)</em></h2>

<h3 id="affirmation-1-i-can-do-it-im-the-boss">Affirmation #1: &quot;I can do it. I&#39;m the Boss&quot;</h3>

<ul>
<li>You think you&#39;ve been promoted!</li>
<li>First, you sign-up for all the things. 

<ul>
<li>Hey, it worked for you as an IC.</li>
</ul></li>
<li>You are instinctually reluctant to delegate to others. 

<ul>
<li>Feels like giving away power.</li>
</ul></li>
<li>Your first failure mode

<ul>
<li>The quality of your work drops.</li>
</ul></li>
</ul>

<h3 id="affirmation-2-i-can-do-it-all-myself-im-in-control-because-im-the-boss">Affirmation #2: &quot;I can do it all myself. I&#39;m in control because I&#39;m the Boss.&quot;</h3>

<ul>
<li>The ineptitude of fake delegation.

<ul>
<li>Lacking context, goals etc.</li>
<li><em>&quot;Go figure it out… or else.&quot;</em></li>
<li>Your job is to <strong>aggressively delegate</strong>.</li>
<li>You are not listening

<ul>
<li>So the team starts to talk amongst themselves. </li>
<li>You did not build trust. </li>
<li><em>Opinions</em> become <em>facts</em>.</li>
<li>Poor communication</li>
</ul></li>
<li>They think they have failed.

<ul>
<li>Irreparably harmed the relationship with your team. </li>
<li><em>&quot;Hey Rob, your team is saying this thing about you.&quot;</em></li>
<li>And it hurts, it&#39;s toxic.</li>
</ul></li>
</ul></li>
</ul>

<h3 id="affirmation-3-this-is-not-me">Affirmation #3: &quot;This is not me.&quot;</h3>

<ul>
<li>Teacup pigs. :o) </li>
<li>Management is not a <em>promotion</em>. </li>
<li>It&#39;s a totally different game/role. </li>
<li>Management is <em>career restart</em>.</li>
</ul>

<h3 id="lesson-1-let-others-shape-your-thinking">Lesson #1: Let others <em>shape your thinking</em></h3>

<ul>
<li>People disagree with you. That&#39;s great! </li>
<li>Augment your obvious and non-obvious weakness with <em>a diverse team</em>.</li>
<li>The first 30% of a project lifecycle.

<ul>
<li><em>&quot;I surround myself with people that design […]&quot;</em></li>
</ul></li>
</ul>

<h3 id="lesson-3-delegate-more-than-is-comfortable">Lesson #3: <em>Delegate</em> more than is comfortable.</h3>

<ul>
<li>A vote of confidence in their ability.</li>
<li>You build yourself by building others.</li>
<li>Trust.</li>
<li>The burden is on you to prove that you deserve.</li>
<li>Start small.</li>
<li>Am I building or am I erroding trust with this action that I&#39;m about to take?</li>
</ul>

<h2 id="ama-or-the-juicy-part">AMA <em>(or the juicy part…)</em></h2>

<ul>
<li><p>How do you identify early signs of &quot;management&quot; in engineers?</p>

<ul>
<li>Empathy</li>
<li>Ability to read the room</li>
</ul></li>
<li><p>Managing up</p>

<ul>
<li>The same rules apply</li>
<li>Clear communication </li>
<li>Constant communication</li>
<li>What do you worry about most as a compay grows? Politics.</li>
</ul></li>
<li><p>Biggest management mistake, in the last year?</p>

<ul>
<li><em>I (Marius) chose to leave this out; if you&#39;re interested, ask @rands personally. ;o)</em></li>
</ul></li>
<li><p>Giving critical feedback</p>

<ul>
<li>1-1: every week, 30 minutes. </li>
<li>Feedback

<ul>
<li>You did this great, </li>
<li>This less great, </li>
<li>This is how I would do it. </li>
</ul></li>
<li>Listen

<ul>
<li>Is this what you meant? </li>
<li>Paraphrase it. </li>
<li>Build trust.</li>
</ul></li>
<li><em>Djoume:</em> How can I be a better lead / manager for you?</li>
</ul></li>
<li><p>New managers, with friends on the team. </p>

<ul>
<li>It&#39;s a difficult situation: void it, as much as possible.</li>
<li>Manager hat, friend hat. </li>
<li><em>&quot;Speaking as your manager now […]&quot;</em></li>
<li>Be deliberate about the role in the relationship.</li>
</ul></li>
<li><p>Managing up: </p>

<ul>
<li>What makes for a &quot;good&quot; 1-1? </li>
<li>What are some quick wins on improving them?</li>
</ul></li>
<li><p>Key characteristics</p>

<ul>
<li><strong>Vision</strong>

<ul>
<li>Can you describe a compelling future?</li>
</ul></li>
<li><strong>Strategy</strong>

<ul>
<li>How are we getting there? </li>
<li>Can you build the roads and the roadsigns?</li>
</ul></li>
<li><strong>Tactics</strong>

<ul>
<li>Can you describe the growth path for all your direct reports?</li>
<li>Feedback for every 6 months</li>
<li>Judgement</li>
<li>Experience</li>
</ul></li>
<li><strong>Communication</strong> 

<ul>
<li>Can you build the roadsigns</li>
<li>Can you read the roadsigns?</li>
</ul></li>
</ul></li>
<li><p>Formal training is lacking. Where to get it?</p>

<ul>
<li>External

<ul>
<li>Harrison Metal — Leadership training</li>
</ul></li>
<li>How are we training the managers at Slack?

<ul>
<li>Internal talks </li>
<li>Mentorship circles</li>
</ul></li>
</ul></li>
<li><p>Judgement</p>

<ul>
<li>How do you interview for judgement? </li>
<li>How do you judge for judgement? </li>
<li>Look for a  non-obvious judgement call, and the ability to explain it. </li>
<li>Can you walk me through your thinking? </li>
<li>Can you tell me <em>why</em>? Or was it just a coin flip?</li>
</ul></li>
<li><p>Self-management renders managers obsolete?</p>

<ul>
<li>Holocracy? 

<ul>
<li>Did it work at Zappos? </li>
<li>Did it work at Medium? </li>
<li>Managers are a force multiplication factor. </li>
<li>Information conduits.</li>
</ul></li>
</ul></li>
<li><p>Coaching in a distributed team. </p>

<ul>
<li>Biased towards face to face interactions 

<ul>
<li>Lightspeed.</li>
<li>Read the room. </li>
</ul></li>
<li>A lot of traveling. </li>
<li>Different cultures, being aware of that. </li>
<li>Remote people can be made to feel like second class citizens.</li>
</ul></li>
<li><p>Growth paths? It depends.</p>

<ul>
<li>CEO 

<ul>
<li>Move outside of engineering</li>
<li>Experience other facets of the business</li>
</ul></li>
<li>VP engineering

<ul>
<li>People, process, etc.</li>
</ul></li>
<li>CTO 

<ul>
<li>Still coding</li>
<li><em>&quot;Bringing the app back to life&quot;</em></li>
</ul></li>
<li>Chief Architect 

<ul>
<li>Coding as well.</li>
<li>No direct reports? </li>
</ul></li>
</ul></li>
<li><p>Failing…</p>

<ul>
<li>…is where you can learn. </li>
<li>Managers fail just as much as everyone else. </li>
<li>Fail faster, feel safe. </li>
<li><em>&quot;You screwed up, but I got you: we&#39;ll fix this.&quot;</em></li>
</ul></li>
<li><p>Delegation</p>

<ul>
<li>Rework, book by Jason Fried </li>
<li>Do you triple down on their strengths? </li>
<li>Or delegate it to Julia who&#39;s going to get a B on this? </li>
<li>Try to work towards a growth mindset.</li>
</ul></li>
<li><p>Being able to read the room: how do I improve? A</p>

<ul>
<li>A lot of introverts run companies… </li>
<li>Listen, get people to talk to you.</li>
<li>Conversation about how to get better.</li>
</ul></li>
<li><p>Quitting my job </p>

<ul>
<li>Every 3 years. </li>
<li>The moment I get bored… deathly afraid of becoming irrelevant in this industry.</li>
</ul></li>
</ul>

<p><em>Disclaimer:</em> Remember that you have been forewarned: this was just a log of my personal notes; sometimes out of context, sometimes missunderstood.</p>

<p>Now, if you&#39;ve read this far, what are your thoughts?</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://www.mariusbutuc.com/day-to-day-team-lead-practices#30410</guid>
          <pubDate>Wed, 08 Mar 2017 00:37:00 -0500</pubDate>
        <link>http://www.mariusbutuc.com/day-to-day-team-lead-practices</link>
        <title>Team Lead: Day to Day Practices</title>
        <description>Panel discussion with #TeamLeadTO</description>
        <content:encoded><![CDATA[<p>A panel discussion around the <em><a href="https://www.meetup.com/Toronto-Software-Team-Lead-Meetup/events/237755638/">Day to Day TL Practices</a></em> topic sparked tonight amongst the <a href="https://www.meetup.com/Toronto-Software-Team-Lead-Meetup/">#TeamLeadTO</a> members:</p>

<blockquote>
<p>We each get through our everyday TL lives with our own bag of best practices, life hacks and mindful habits. We’ve collected those from books, blogs, mentors, and our own hard-earned experience.</p>

<p>Now it’s time to share!</p>

<p>We’ve gathered a small panel of folks with team lead experience to share some of the strategies they use to do their very best TLing.</p>
</blockquote>

<h2 id="the-panel">The Panel</h2>

<p>In the order in which I was seeing them from my seat, the panel was composed of:</p>

<ul>
<li>Ofer Guttman - Director of Software Engineering, Points</li>
<li>Luke Reeves - Developer Lead, Shopify</li>
<li>Ash Christopher - Director of Engineering, Wave HQ</li>
<li>Ania Halliop - Development Manager, Freshbooks</li>
<li>Will Harford - Integrations Architect, Unata</li>
</ul>

<h2 id="the-topics">The Topics</h2>

<p>The original plan was to as many of the following topics as we could</p>

<ul>
<li>How do you give positive/negative feedback?</li>
<li>How do you deal with inter-team conflict?</li>
<li>How do you run your one-on-ones?</li>
<li>How do you deal with a frustrated person who reports to you?</li>
<li>How do you deal with complaints from people who report to you about your superiors/the company?</li>
<li>How do you deal with complaints about people who report to you from others in the company?</li>
<li>How do you help your reports plan their career growth?</li>
<li>How do you manage high performers vs low performers?</li>
<li>How do you onboard new employees?</li>
</ul>

<p>In the light of what happened about week ago, I wished I knew how other people handled issues like that. So I joined the meetup, went, and I even took notes.</p>

<h2 id="my-notes">My notes</h2>

<ul>
<li><em>Ash:</em> Defensive versus heroic</li>
<li><em>Ash:</em> tactic versus strategy</li>
<li><em>Will:</em> People are not mathematical models. The sum of the inputs doesn&#39;t always equal the sum of the outputs.</li>
<li><em>Ania:</em> Trust — if you go in good faith, 99% of the people will match that. Similarly about respect.</li>
<li>one-on-ones

<ul>
<li>This is their time, not yours: you put yourself out there, be there to help them, let them own the conversation.</li>
<li><em>Luke:</em> Notebooks, no computers.</li>
<li><em>How are you?</em> versus <em>What&#39;s on your mind?</em> Either as soon as you walked through the door, or since the beginning of the week.</li>
<li>What do you want to do in three years. <em>blank</em></li>
<li>If you were to leave Freshbooks today, what would make you go?</li>
<li><em>Luke:</em> There is no book, no Wikipedia page on what to do in one-on-ones.</li>
<li>Ania wrote an internal handbook in mentoring, one-on-ones etc.</li>
</ul></li>
<li>Performance

<ul>
<li><em>Luke:</em> What is your impact? How do you make it broader?</li>
<li>Anonymous feedback: How is your manager doing?</li>
<li>Low hanging fruit.

<ol>
<li>Be clear with your expectations.</li>
<li>Document them. Easy to come back and keep track.</li>
</ol></li>
<li>How do you define a performance metric?</li>
</ul></li>
<li><em>Paul:</em> Experience working with someone with Asperger / autism

<ul>
<li>Very performant, maybe difficult to deal with socially.</li>
<li>In the majority of interviews, it&#39;s teamwork that is sought after.</li>
<li>Remote work? Not accepted in some companies.</li>
<li>Building rapport, safe to ask for help.</li>
</ul></li>
<li>Depression, social anxiety, mental health

<ul>
<li>Build a safe environment.</li>
<li><em>James W:</em> employee assistance program (EAP).</li>
</ul></li>
<li><em>Ania:</em> the <a href="https://www.amazon.ca/dp/B00AFPVP0Y/">Turn the ship around</a> book</li>
<li><em>Ash:</em> Humility is a very heroic human trait</li>
</ul>

<p>David Marquet&#39;s book, plus many of the topics that were touced, they all remind me of this article about <a href="https://medium.com/@kimber_lockhart/don-t-create-a-sense-of-urgency-foster-a-sense-of-purpose-724e309ecdb0">creating not a sense of urgency, but fostering a sense of purpose instead</a>.</p>

<p>These were my notes on Day to Day team leading practice. And yes, it’s time to share! Which practices managed to catch your attention?</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://www.mariusbutuc.com/elixir-bootcamp#28670</guid>
          <pubDate>Tue, 29 Nov 2016 16:13:45 -0500</pubDate>
        <link>http://www.mariusbutuc.com/elixir-bootcamp</link>
        <title>Elixir Bootcamp</title>
        <description>Notes on the Elixir and Phoenix Bootcamp, part 1</description>
        <content:encoded><![CDATA[<p>These notes come as breadcrumbs left along <a href="https://github.com/mariusbutuc/my-ude/tree/master/complete_elixir_phoenix_bootcamp">my journey</a> through <a href="https://www.udemy.com/the-complete-elixir-and-phoenix-bootcamp-and-tutorial">the Complete Elixir and Phoenix Bootcamp</a>. This is the first part that covers discovering Elixir. The second part will cover Phoenix. Here we go:</p>

<ol>
<li><p><a href="https://elixirforum.com/t/there-are-no-methods-in-elixir-just-functions/2451">There are no methods in Elixir—just <strong>functions</strong></a>:</p>

<blockquote>
<p>There are no objects in Elixir (nor methods). If they are about structs, then they should be referred to as structs (or generally as data) (and use &quot;functions&quot; instead of &quot;methods&quot;).</p>
</blockquote>

<p>–José Valim</p></li>
<li><p><a href="https://en.wikipedia.org/wiki/List_comprehension">List comprehension</a></p>

<ul>
<li>create a list based on existing lists</li>
<li><em>distinct</em> from the use of map and filter functions</li>
</ul></li>
<li><p>We played with <a href="http://elixir-lang.org/docs/stable/elixir/List.html">Lists</a>, let&#39;s learn about <a href="http://elixir-lang.org/docs/stable/elixir/Tuple.html">Tuples</a>:</p>

<ul>
<li> &quot;like an array, where each index has a very special meaning&quot;</li>
<li>the ordering / contract is in the developer&#39;s head!</li>
<li>can be seen as a key/value pair, where the key is the index</li>
</ul></li>
<li><p>Pattern Matching</p>

<ul>
<li>&quot;Elixir&#39;s replacement for variable assignment&quot;</li>
<li>Elixir, as a language governed by its design</li>
<li><code>=</code> starts the pattern matching sequence

<ul>
<li>create a mirror structure on the left hand side</li>
<li>matches the data structure</li>
<li>matches the number of values / elements</li>
</ul></li>
<li>enables you to <em>avoid</em> writing <code>if</code> statements

<ul>
<li>pattern matching in <code>case</code> statements</li>
</ul></li>
<li>pattern matching can also be done directly in the argument list</li>
</ul></li>
<li><p>The Elixir Ecosystem</p>

<ul>
<li><strong>Code</strong> we write » 

<ul>
<li><em>fed into</em> » <strong>Elixir</strong> » </li>
<li><em>transpiled into</em> » <strong>Erlang</strong> » </li>
<li><em>compiled and executed on</em> » <strong>BEAM</strong></li>
</ul></li>
<li>leveraging underlying Erlang modules:

<ul>
<li><code>:erlang.term_to_binary/1</code></li>
<li><code>:erlang.binary_to_term/1</code></li>
<li><code>:file.format_error/1</code> —<a href="https://pragprog.com/book/elixir13/programming-elixir-1-3">thanks @pragdave</a></li>
<li><code>:egd</code> —the <a href="http://erlang.org/doc/man/egd.html">erlang graphical drawer</a></li>
</ul></li>
</ul></li>
<li><p>Atoms</p>

<ul>
<li>personally, I prefer the definition from <a href="https://pragprog.com/book/elixir13/programming-elixir-1-3">Programming Elixir 1.3</a></li>
</ul>

<blockquote>
<p>Atoms are constants that represent something’s name. […]<br><br>
An atom’s name is its value. Two atoms with the same name will always compare as being equal, even if they were created by different applications on two computers separated by an ocean.</p>
</blockquote></li>
<li><p>Unused variables</p>

<ul>
<li>Elixir provides a friendly warning at compile time</li>
<li>Solution: underscore them: <code>_</code> or <code>_reason</code></li>
</ul></li>
<li><p>The Pipe operator</p>

<ul>
<li>the key is to write functions that take consistent first arguments

<ul>
<li>the return of the previous function gets applied as the first argument in the subsequent function</li>
</ul></li>
<li><a href="http://joearms.github.io/2013/05/31/a-week-with-elixir.html#head_7">Joe Armstrong&#39;s explanation of the pipe operator</a> made the most sense for me:<br></li>
</ul>

<blockquote>
<p>This is the recessive monadic gene of Prolog. The gene was dominant in Prolog, recessive in Erlang (son-of-prolog) but re-emerged in Elixir (son-of-son-of-prolog).  </p>

<p><code>x |&gt; y*</code> means call <code>x</code> then take the output of <code>x</code> and add it as an extra argument to <code>y</code> in the first argument position.  </p>

<p>So</p>
<div class="highlight"><pre><span></span><span class="n">x</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="n">y</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span> 
</pre></div>
<p>Means</p>
<div class="highlight"><pre><span></span><span class="n">newvar</span> <span class="o">=</span> <span class="n">x</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">);</span> 
<span class="n">y</span><span class="p">(</span><span class="n">newvar</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">);</span>
</pre></div></blockquote></li>
<li><p>Documentation</p>

<ul>
<li><a href="https://github.com/elixir-lang/ex_doc">ExDoc</a>

<ul>
<li><code>@moduledoc</code> for module documentation</li>
<li><code>@doc</code> for function documentation</li>
<li><code>mix docs</code> to generate</li>
</ul></li>
</ul></li>
<li><p>Testing</p>

<ul>
<li>first-class citizen: fully featured out of the box</li>
<li><code>mix test</code></li>
<li><a href="http://elixir-lang.org/getting-started/mix-otp/docs-tests-and-with.html#doctests">Doctests</a>

<ul>
<li>write docs and tests at the same time</li>
<li>examples in documentation stay up to date</li>
<li>Scenario: explain to another engineer the simplest case of using a given function</li>
<li>Additional assertions are <em>possible</em>, but you generally want to make only one assertion about the very last line: this is a documentation test about the <code>contains?/2</code> function, and not about <code>create_deck/0</code>. So in practice we want to have just one, very small, very targeted assertion about the given function.</li>
<li>Ran by the <code>doctest Cards</code> line inside out test file</li>
<li>parse the module</li>
<li>run any examples as an actual test</li>
</ul></li>
<li>Case Tests

<ul>
<li>What behaviour do we want to test?</li>
<li><code>assert</code> versus <code>refute</code></li>
<li>Elixir&#39;s functional programming style makes it so easy to test</li>
<li>create basic object, representing our working data</li>
<li>pass it off to the function we&#39;re testing</li>
<li>do some basic checks on the returned object</li>
</ul></li>
</ul></li>
<li><p>Maps</p>

<ul>
<li><p>key-value stores, similar to Ruby hashes, or Javascript objects  </p>
<div class="highlight"><pre><span></span>  <span class="n">colours</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">primary</span><span class="p">:</span> <span class="s2">&quot;red&quot;</span><span class="p">,</span> <span class="ss">secondary</span><span class="p">:</span> <span class="s2">&quot;blue&quot;</span><span class="p">}</span>
</pre></div></li>
<li><p>accessing properties</p>

<ul>
<li>dot notation</li>
<li>pattern matching</li>
</ul></li>
<li><p>updating values</p>

<ul>
<li>immutable data: to update means to create a new data structure with the modifications</li>
<li>two ways of achieving this:</li>
<li>with a function: <a href="http://elixir-lang.org/docs/stable/elixir/Map.html"><code>Map.put/3</code></a>, <a href="https://dockyard.com/blog/2016/03/07/til-elixir-maps-have-built-in-syntax-for-updating">etc</a></li>
<li><p>leveraging the <a href="http://elixir-lang.org/getting-started/structs.html#accessing-and-updating-structs">built in syntax</a> —<a href="http://elm-lang.org/docs/records#updating-records">similar to Elm</a></p>
<div class="highlight"><pre><span></span><span class="p">%{</span><span class="n">colours</span> <span class="o">|</span> <span class="ss">primary</span><span class="p">:</span> <span class="s2">&quot;green&quot;</span><span class="p">}</span>
</pre></div>
<ul>
<li>only works for existing keys:</li>
</ul>

<blockquote>
<p>the VM is aware that <strong>no new keys will be added</strong> to the struct, allowing the maps underneath to share their structure in memory.</p>
</blockquote></li>
</ul></li>
</ul></li>
<li><p>Keyword Lists</p>

<ul>
<li><code>List</code> and <code>Tuple</code> merged into one

<ul>
<li>lists: like arrays, can be used for an arbitrary number of elements</li>
<li>tuples: like arrays, where each index has a special meaning to us</li>
</ul></li>
<li>versus <code>Map</code>: there can be duplicate keys</li>
<li><p>a list that contains tuples</p>
<div class="highlight"><pre><span></span><span class="n">colours</span> <span class="o">=</span> <span class="p">[{</span><span class="ss">:primary</span><span class="p">,</span> <span class="s2">&quot;red&quot;</span><span class="p">},</span> <span class="p">{</span><span class="ss">:secondary</span><span class="p">,</span> <span class="s2">&quot;blue&quot;</span><span class="p">}]</span>
<span class="c1"># or</span>
<span class="n">colours</span> <span class="o">=</span> <span class="p">[</span><span class="ss">primary</span><span class="p">:</span> <span class="s2">&quot;red&quot;</span><span class="p">,</span> <span class="ss">secondary</span><span class="p">:</span> <span class="s2">&quot;blue&quot;</span><span class="p">]</span>
</pre></div></li>
</ul></li>
<li><p>Identicon Image Manipulation</p>

<ul>
<li>describing the business logic

<ul>
<li>one root object / piece of data</li>
<li>gets passed around through a Main Pipeline</li>
<li>a series of small functions, that transform the data</li>
</ul></li>
</ul></li>
<li><p>Data Modeling</p>

<ul>
<li><code>Struct</code>

<ul>
<li>it&#39;s just a <code>Map</code> plus</li>
<li>compile-time checks</li>
<li>default values</li>
<li>Looks a lot like a <code>Map</code>; why would we use a <code>Struct</code> over a <code>Map</code>?</li>
<li>a <code>Struct</code> enforces that the only properties that can be stored are the ones defined in the module</li>
<li>a normal <code>Map</code> is happy to let you insert any different property that you&#39;d like</li>
<li>Why not add functions (methods / properties / instance methods) to structs? From an FP perspective</li>
<li>it&#39;s a Map under the hood</li>
<li>has no ability to attach any functions to it</li>
<li>it can only hold some primitive data</li>
<li>A single location to store all the data inside of our app</li>
<li>The <a href="http://elixir-lang.org/getting-started/structs.html#accessing-and-updating-structs">update syntax</a> works best, as properties on a <code>Struct</code> are already defined</li>
</ul></li>
<li><code>List</code>

<ul>
<li>Acessing the first X values from an arbitrarily long list</li>
<li>the head and tail split pattern <code>[h | t]</code></li>
<li>extended to <code>[a, b, c | _tail]</code></li>
</ul></li>
<li><code>Tuple</code>

<ul>
<li>use a <code>Tuple</code> instead of a <code>List</code> when the index has particular semantic</li>
</ul></li>
</ul></li>
<li><p>First-class functions</p>

<ul>
<li>in Elixir, referring to a function—<code>mirror_row</code>—it will call it by default</li>
<li>to pass a reference to a function, we use <a href="http://elixir-lang.org/crash-course.html#first-class-functions">a special syntax</a></li>
<li>Elixir provides guidance even through its compile error</li>
</ul>

<blockquote>
<p>[…] invalid args for <code>&amp;</code>, expected an expression in the format of <code>&amp;Mod.fun/arity</code>, <code>&amp;local/arity</code> or a capture containing at least one argument as <code>&amp;1</code></p>
</blockquote></li>
<li><p><a href="http://stackoverflow.com/a/18023790/341929">Anonymous Functions</a></p>

<ul>
<li>we can&#39;t mix clauses that expect a different number of arguments. A  function always has a fixed arity.</li>
<li>anonymous functions are closures, similar to lambdas in Ruby</li>
</ul></li>
<li><p>A working Identicon program</p>

<ul>
<li>the pipe operator</li>
<li>working with Erlang (<a href="http://erlang.org/doc/man/egd.html"><code>egd</code></a>)</li>
<li><code>Enum</code></li>
<li>anonymous functions</li>
</ul></li>
</ol>

<p>The second part will cover Phoenix. Back to the bootcamp now!</p>
]]></content:encoded>
      </item>
  </channel>
</rss>