<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <channel>
    <atom:link href="https://feeds.simplecast.com/YmvH1ayC" rel="self" title="MP3 Audio" type="application/atom+xml"/>
    <atom:link href="https://simplecast.superfeedr.com/" rel="hub" xmlns="http://www.w3.org/2005/Atom"/>
    <generator>https://simplecast.com</generator>
    <title>iteration</title>
    <description>A podcast about development and design. 

We do our best to be code-agnostic but we talk a lot about Rails, JavaScript, React, React Native, design, business and startups. </description>
    <copyright>¯\_(ツ)_/¯</copyright>
    <language>en</language>
    <pubDate>Mon, 10 May 2021 12:00:00 +0000</pubDate>
    <lastBuildDate>Mon, 10 May 2021 12:00:10 +0000</lastBuildDate>
    <image>
      <link>http://www.iterationpodcast.com</link>
      <title>iteration</title>
      <url>https://image.simplecastcdn.com/images/d517663e-9c51-4b30-8f73-c285569796d8/e29644c2-e4a0-4945-851a-896132550553/3000x3000/1510888764artwork.jpg?aid=rss_feed</url>
    </image>
    <link>http://www.iterationpodcast.com</link>
    <itunes:type>episodic</itunes:type>
    <itunes:summary>A podcast about development and design. 

We do our best to be code-agnostic but we talk a lot about Rails, JavaScript, React, React Native, design, business and startups. </itunes:summary>
    <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
    <itunes:explicit>yes</itunes:explicit>
    <itunes:image href="https://image.simplecastcdn.com/images/d517663e-9c51-4b30-8f73-c285569796d8/e29644c2-e4a0-4945-851a-896132550553/3000x3000/1510888764artwork.jpg?aid=rss_feed"/>
    <itunes:new-feed-url>https://feeds.simplecast.com/YmvH1ayC</itunes:new-feed-url>
    <itunes:keywords>Web Development, Programing, Design, Ruby on Rails, JavaScript, Ruby, Code, Software development</itunes:keywords>
    <itunes:owner>
      <itunes:name>iteration podcast</itunes:name>
      <itunes:email>johnsalzarulo@gmail.com</itunes:email>
    </itunes:owner>
    <itunes:category text="Technology"/>
    <itunes:category text="Technology"/>
    <itunes:category text="Business"/>
    <item>
      <guid isPermaLink="false">723c0b80-6d75-46b2-ae17-dadc350e79a0</guid>
      <title>➡️ One on One&apos;s ⬅️</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><h2>What makes a good 1:1 (IC perspective)?</h2><ul><li>JP a manager who listens</li><li>JP clear action items for problems</li></ul><h2>What makes a good 1:1 (Manager perspective)?</h2><ul><li>John When reports are honest about motivations (I want more money, etc)</li><li>John Clear feedback about my management</li></ul><h2>What makes a bad 1:1?</h2><ul><li>JP when 1:1s just become another medium for standup updates</li><li>JP when 1:1s become a way for your manager to micromanage</li></ul><h2>Format</h2><h2>What do you talk about?</h2><p>Basic framework John follows:</p><ul><li>private running doc between manager and report, either party can always add to it, reviewed on a regular cadence. I've found every 2 weeks to be really effective.</li><li>This meeting is for building trust, context, sharing progress on goals, professional development things like that.</li><li>Principles / concepts<ul><li>Focus on the report — 1:1's are primarily for the report, the employee, not for the manager or the company.</li><li>70/30 — Manager should be 70% listening less than 30% talking.</li><li>Honesty — be direct. Forbidden conversations.</li><li>Objective — Do the work to find objective examples, provide numbers and letter grades.</li><li>Flexible — Don't overthink or over structure, let it flow, let report guide conversation</li></ul></li><li><a href="https://www.youtube.com/watch?v=fTjhHrcyiQI">Moneyball firing clip</a></li></ul><h3>Picks</h3><ul><li>John: <a href="https://www.chia.net/">https://www.chia.net/</a></li><li>JP: Tailwind is coming out with official React support!</li></ul>
]]></description>
      <pubDate>Mon, 10 May 2021 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/one-on-ones-k__8nz__</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><h2>What makes a good 1:1 (IC perspective)?</h2><ul><li>JP a manager who listens</li><li>JP clear action items for problems</li></ul><h2>What makes a good 1:1 (Manager perspective)?</h2><ul><li>John When reports are honest about motivations (I want more money, etc)</li><li>John Clear feedback about my management</li></ul><h2>What makes a bad 1:1?</h2><ul><li>JP when 1:1s just become another medium for standup updates</li><li>JP when 1:1s become a way for your manager to micromanage</li></ul><h2>Format</h2><h2>What do you talk about?</h2><p>Basic framework John follows:</p><ul><li>private running doc between manager and report, either party can always add to it, reviewed on a regular cadence. I've found every 2 weeks to be really effective.</li><li>This meeting is for building trust, context, sharing progress on goals, professional development things like that.</li><li>Principles / concepts<ul><li>Focus on the report — 1:1's are primarily for the report, the employee, not for the manager or the company.</li><li>70/30 — Manager should be 70% listening less than 30% talking.</li><li>Honesty — be direct. Forbidden conversations.</li><li>Objective — Do the work to find objective examples, provide numbers and letter grades.</li><li>Flexible — Don't overthink or over structure, let it flow, let report guide conversation</li></ul></li><li><a href="https://www.youtube.com/watch?v=fTjhHrcyiQI">Moneyball firing clip</a></li></ul><h3>Picks</h3><ul><li>John: <a href="https://www.chia.net/">https://www.chia.net/</a></li><li>JP: Tailwind is coming out with official React support!</li></ul>
]]></content:encoded>
      <enclosure length="40528156" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/afce8d19-efb0-4b34-9b34-7ba9da8d1695/audio/bee93548-05a6-4c69-ae7f-b050a8322b75/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>➡️ One on One&apos;s ⬅️</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:42:13</itunes:duration>
      <itunes:summary>In this episode JP and John talk through one on one&apos;s or 1:1&apos;s. What they are, why they matter, how to do them how to be part of them. </itunes:summary>
      <itunes:subtitle>In this episode JP and John talk through one on one&apos;s or 1:1&apos;s. What they are, why they matter, how to do them how to be part of them. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>96</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8130897d-02fb-432f-be7d-067a1e2edc53</guid>
      <title>Engineering Management 🔨</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><p>Context:</p><p>John ran an agency for a couple years with a few developers + Designers, now runs a team of 12(ish) developers + Designers</p><p><strong>Few Topics</strong></p><p><strong>IC vs Manager</strong></p><ul><li>Code on the side only to show things</li><li>Not coding for production</li><li>Code outside of your core code</li></ul><p><strong>Right sizing a team</strong></p><ul><li>Systems Thinking "Stocks + Flows" (Slack)</li></ul><p><strong>Mythical Man Month</strong></p><ul><li>False premise: More heads = faster results</li></ul><p><strong>Remove bottlenecks</strong></p><ul><li>Break up the work<ul><li>Kitchen Metaphor</li></ul></li><li>Context + Documentation</li></ul><p><strong>Safety + Empowerment</strong></p><ul><li>Permission + Trust</li><li>Access</li></ul><p><strong>Leading by example</strong></p><ul><li>"Law of the lid"</li></ul><p><strong>Don't scar on the first cut</strong></p><p><strong>Forbidden Conversations / honesty</strong></p><h3>Picks</h3><ul><li>John: <a href="https://handmirror.app/">https://handmirror.app/</a></li><li>JP: <a href="https://freezingcam.com/">https://freezingcam.com/</a></li></ul>
]]></description>
      <pubDate>Mon, 3 May 2021 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/engineering-management-Qrv6bTUI</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><p>Context:</p><p>John ran an agency for a couple years with a few developers + Designers, now runs a team of 12(ish) developers + Designers</p><p><strong>Few Topics</strong></p><p><strong>IC vs Manager</strong></p><ul><li>Code on the side only to show things</li><li>Not coding for production</li><li>Code outside of your core code</li></ul><p><strong>Right sizing a team</strong></p><ul><li>Systems Thinking "Stocks + Flows" (Slack)</li></ul><p><strong>Mythical Man Month</strong></p><ul><li>False premise: More heads = faster results</li></ul><p><strong>Remove bottlenecks</strong></p><ul><li>Break up the work<ul><li>Kitchen Metaphor</li></ul></li><li>Context + Documentation</li></ul><p><strong>Safety + Empowerment</strong></p><ul><li>Permission + Trust</li><li>Access</li></ul><p><strong>Leading by example</strong></p><ul><li>"Law of the lid"</li></ul><p><strong>Don't scar on the first cut</strong></p><p><strong>Forbidden Conversations / honesty</strong></p><h3>Picks</h3><ul><li>John: <a href="https://handmirror.app/">https://handmirror.app/</a></li><li>JP: <a href="https://freezingcam.com/">https://freezingcam.com/</a></li></ul>
]]></content:encoded>
      <enclosure length="48834259" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/8b753050-4de9-49b9-a6dc-0b4d5937e95f/audio/3e695a9e-4e36-4144-b463-4d98f458804d/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Engineering Management 🔨</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:50:53</itunes:duration>
      <itunes:summary>In this episode JP and John talk through engineering management principles, experiences and tips. </itunes:summary>
      <itunes:subtitle>In this episode JP and John talk through engineering management principles, experiences and tips. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>95</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">58089bf4-88ff-4ec7-a0de-60ba3c4653b7</guid>
      <title>💬 Technical Interviews</title>
      <description><![CDATA[<h3>Welcome to Iteration, a podcast about programming, development, and design</h3><p><strong>John has been asked:</strong></p><ul><li><strong>When I perform a google search, what happens? Be as specific and accurate as possible including every layer of technology.</strong></li><li><strong>Can you tell me what Indexes are and what they do?</strong></li><li><strong>What is CORS?</strong></li></ul><p><strong>Questions JP has been asked:</strong></p><ul><li><strong>What is the difference between something like SQL and Mongo - what are the trade offs?</strong></li><li><strong>How does the JS bridge work in React Native?</strong></li><li>Describe what Redux is for and how you'd implement it in a React project</li></ul><p><strong>Maybe some from our own?</strong></p><ul><li><strong>If you could add one feature or change to the Rails framework what would it be?</strong></li><li>How do feel about testing? How do you think about testing? When does it make sense to write tests?</li><li>If I have a really huge model, let's say 500+ lines, how would you go about refactoring it? Example link: <a href="https://github.com/discourse/discourse/blob/master/app/models/post.rb">https://github.com/discourse/discourse/blob/master/app/models/post.rb</a></li></ul><h2>Picks</h2><p>JP: <a href="https://tuple.app/">https://tuple.app/</a></p><ul><li>I used this to pair with Joe and it was SICK</li></ul><p>John: YNAB (<a href="https://www.youneedabudget.com/">https://www.youneedabudget.com/</a>)</p><ul><li>Different approach to budgeting that sucks less</li></ul>
]]></description>
      <pubDate>Tue, 27 Apr 2021 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/technical-interviews-vaLghXuE</link>
      <content:encoded><![CDATA[<h3>Welcome to Iteration, a podcast about programming, development, and design</h3><p><strong>John has been asked:</strong></p><ul><li><strong>When I perform a google search, what happens? Be as specific and accurate as possible including every layer of technology.</strong></li><li><strong>Can you tell me what Indexes are and what they do?</strong></li><li><strong>What is CORS?</strong></li></ul><p><strong>Questions JP has been asked:</strong></p><ul><li><strong>What is the difference between something like SQL and Mongo - what are the trade offs?</strong></li><li><strong>How does the JS bridge work in React Native?</strong></li><li>Describe what Redux is for and how you'd implement it in a React project</li></ul><p><strong>Maybe some from our own?</strong></p><ul><li><strong>If you could add one feature or change to the Rails framework what would it be?</strong></li><li>How do feel about testing? How do you think about testing? When does it make sense to write tests?</li><li>If I have a really huge model, let's say 500+ lines, how would you go about refactoring it? Example link: <a href="https://github.com/discourse/discourse/blob/master/app/models/post.rb">https://github.com/discourse/discourse/blob/master/app/models/post.rb</a></li></ul><h2>Picks</h2><p>JP: <a href="https://tuple.app/">https://tuple.app/</a></p><ul><li>I used this to pair with Joe and it was SICK</li></ul><p>John: YNAB (<a href="https://www.youneedabudget.com/">https://www.youneedabudget.com/</a>)</p><ul><li>Different approach to budgeting that sucks less</li></ul>
]]></content:encoded>
      <enclosure length="47522285" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/5943917a-406d-41eb-842f-8c4feb643de6/audio/f363d9f7-988b-4439-bef8-e4cc83fbc9ca/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>💬 Technical Interviews</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:49:31</itunes:duration>
      <itunes:summary>This week JP + John talk through technical interviews. Give war stories from interviews they have been given, tips on how to go through them and tips on giving technical  interviews. </itunes:summary>
      <itunes:subtitle>This week JP + John talk through technical interviews. Give war stories from interviews they have been given, tips on how to go through them and tips on giving technical  interviews. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>94</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">069f4cee-897d-46b9-8b4c-25b23405caee</guid>
      <title>💬 Interview Screeners: Questions and Answers</title>
      <description><![CDATA[<p>NOTE THIS IS A RE-UPLOAD AS THERE WAS ISSUES WITH OUR PREVIOUS UPLOAD </p><p> </p><p>> Welcome to Iteration, a podcast about programming, development, and design.</p><p> </p><p>* John Intro — My name is John and I am a software developer for a home services startup.</p><p>* JP Intro — Hi, I'm JP and I am a software developer.</p><p> </p><p># Questions</p><p> </p><p>* What is your testing philosophy?</p><p>* Why work on that team specifically? Why are you interested in this job?</p><p>* What kind of problems he like's to work on?</p><p>* What are some challenges with maintaining a public api?</p><p>* If I was your manager, what can I do to get the most out of your contribution? What do you need from me to succeed as a developer?</p><p> </p><p>### Picks</p><p> </p><p>* John M1 MacBook — So throughly impressed</p><p>* JP - [https://github.com/procore/handcuffs](https://github.com/procore/handcuffs)</p>
]]></description>
      <pubDate>Mon, 15 Feb 2021 18:33:54 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/interview-screener-questions-and-answers-b5SEyBHB</link>
      <content:encoded><![CDATA[<p>NOTE THIS IS A RE-UPLOAD AS THERE WAS ISSUES WITH OUR PREVIOUS UPLOAD </p><p> </p><p>> Welcome to Iteration, a podcast about programming, development, and design.</p><p> </p><p>* John Intro — My name is John and I am a software developer for a home services startup.</p><p>* JP Intro — Hi, I'm JP and I am a software developer.</p><p> </p><p># Questions</p><p> </p><p>* What is your testing philosophy?</p><p>* Why work on that team specifically? Why are you interested in this job?</p><p>* What kind of problems he like's to work on?</p><p>* What are some challenges with maintaining a public api?</p><p>* If I was your manager, what can I do to get the most out of your contribution? What do you need from me to succeed as a developer?</p><p> </p><p>### Picks</p><p> </p><p>* John M1 MacBook — So throughly impressed</p><p>* JP - [https://github.com/procore/handcuffs](https://github.com/procore/handcuffs)</p>
]]></content:encoded>
      <enclosure length="43906102" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/a0f12a08-9aee-491c-a793-e97a72ed4d70/audio/a0da2a07-80bb-4fe8-a96e-da096382dcff/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>💬 Interview Screeners: Questions and Answers</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:45:45</itunes:duration>
      <itunes:summary>In this episode we walk through common interview screener questions, our answers to them, tips tricks and solutions for getting through them. </itunes:summary>
      <itunes:subtitle>In this episode we walk through common interview screener questions, our answers to them, tips tricks and solutions for getting through them. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>93</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">26f637aa-2176-474a-b432-aa287a3ba1c7</guid>
      <title>Agile Methodologies and Tools</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><p><a href="https://www.planview.com/resources/guide/introduction-to-kanban/kanban-vs-scrum/">https://www.planview.com/resources/guide/introduction-to-kanban/kanban-vs-scrum/</a></p><p>AGILE!!! SCRUM!!! KANBAN!!!</p><h2>Different Tools</h2><ul><li>Jira</li><li>Trello John<ul><li>Asana John</li><li>Github (issues + projects) John</li></ul></li><li>Zenhub John</li><li>Pivotal Tracker</li><li>Notion John</li><li>Special mention: <a href="http://canny.io">Canny.io</a> → <a href="https://main-street.canny.io/admin">https://main-street.canny.io/admin</a></li></ul><p><strong>New Blood</strong></p><ul><li>Linear App: <a href="https://linear.app/">https://linear.app/</a></li><li>Height App: <a href="https://height.app/">https://height.app/</a> (private beta)</li><li>Monday? I always see ads for this on youtube: <a href="https://monday.com/">https://monday.com/</a></li><li>BASECAMP</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://martinfowler.com/articles/feature-toggles.html">https://martinfowler.com/articles/feature-toggles.html</a></li><li>John: <a href="https://supabase.io/">https://supabase.io/</a> (Open Source Firebase)</li><li><a href="https://elainewherry.com/2012/06/26/the-recruiter-honeypot/">https://elainewherry.com/2012/06/26/the-recruiter-honeypot/</a></li></ul>
]]></description>
      <pubDate>Mon, 1 Feb 2021 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/agile-methodologies-and-tools-wSyVkFxr</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><p><a href="https://www.planview.com/resources/guide/introduction-to-kanban/kanban-vs-scrum/">https://www.planview.com/resources/guide/introduction-to-kanban/kanban-vs-scrum/</a></p><p>AGILE!!! SCRUM!!! KANBAN!!!</p><h2>Different Tools</h2><ul><li>Jira</li><li>Trello John<ul><li>Asana John</li><li>Github (issues + projects) John</li></ul></li><li>Zenhub John</li><li>Pivotal Tracker</li><li>Notion John</li><li>Special mention: <a href="http://canny.io">Canny.io</a> → <a href="https://main-street.canny.io/admin">https://main-street.canny.io/admin</a></li></ul><p><strong>New Blood</strong></p><ul><li>Linear App: <a href="https://linear.app/">https://linear.app/</a></li><li>Height App: <a href="https://height.app/">https://height.app/</a> (private beta)</li><li>Monday? I always see ads for this on youtube: <a href="https://monday.com/">https://monday.com/</a></li><li>BASECAMP</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://martinfowler.com/articles/feature-toggles.html">https://martinfowler.com/articles/feature-toggles.html</a></li><li>John: <a href="https://supabase.io/">https://supabase.io/</a> (Open Source Firebase)</li><li><a href="https://elainewherry.com/2012/06/26/the-recruiter-honeypot/">https://elainewherry.com/2012/06/26/the-recruiter-honeypot/</a></li></ul>
]]></content:encoded>
      <enclosure length="49730363" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/70dff42e-ccb4-42a9-8986-dd532171bcef/audio/85dfc0ea-2932-4869-b600-909d0b5dec20/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Agile Methodologies and Tools</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:51:49</itunes:duration>
      <itunes:summary>Scrum, Kanban, methodologies, tools and tips. This episode we do a deep dive into these project management methods </itunes:summary>
      <itunes:subtitle>Scrum, Kanban, methodologies, tools and tips. This episode we do a deep dive into these project management methods </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>91</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c6be9028-2e8c-4e2e-917b-6150023d0cf2</guid>
      <title>All About eCommerce Development 🤑</title>
      <description><![CDATA[<h1><strong>E-commerce Episode</strong></h1><blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><h2>What is e-commerce?</h2><h2>Build vs. Buy (roll your own vs. e-commerce software)</h2><h2>Nitty-Gritty</h2><ul><li>How to model purchases</li><li>Model Payments</li><li>How to test payments</li><li>Gotchas when building e-commerce</li><li><strong>Discounts</strong></li><li><strong>Sales</strong></li><li><strong>Coupons</strong></li><li><strong>Refunds</strong></li><li>Inventory vs digital goods</li><li>Headless vs “full stack”</li></ul><h2>Stacks / Services</h2><p>Inventory and More (full stack)</p><ul><li>Shopify</li><li><strong>BigCommerce</strong></li><li>Magneto</li><li>Solidus</li><li>Spree</li></ul><h2>Simple / digital only</h2><ul><li>Instagram + Paypal</li><li>Gum road</li></ul><p>Saas Solutions </p><ul><li>Stripe Checkout</li><li>Paddle</li><li>Fast Spring</li><li>Chargify</li><li><a href="https://recurly.com/">https://recurly.com/</a></li></ul><h1>Picks</h1><ul><li>JP: <a href="https://hotwire.dev/">https://hotwire.dev/</a> (hehe)</li><li>John: <a href="https://linear.app/">https://linear.app/</a></li></ul><p>References</p><ul><li><a href="https://github.com/crowdint/acts_as_shopping_cart">Acts as shoping cart gem</a></li><li><a href="https://github.com/pay-rails/pay">Pay gem</a></li><li>Foundation</li></ul>
]]></description>
      <pubDate>Mon, 25 Jan 2021 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/ecommerce-development-6KOytt1j</link>
      <content:encoded><![CDATA[<h1><strong>E-commerce Episode</strong></h1><blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer.</li></ul><h2>What is e-commerce?</h2><h2>Build vs. Buy (roll your own vs. e-commerce software)</h2><h2>Nitty-Gritty</h2><ul><li>How to model purchases</li><li>Model Payments</li><li>How to test payments</li><li>Gotchas when building e-commerce</li><li><strong>Discounts</strong></li><li><strong>Sales</strong></li><li><strong>Coupons</strong></li><li><strong>Refunds</strong></li><li>Inventory vs digital goods</li><li>Headless vs “full stack”</li></ul><h2>Stacks / Services</h2><p>Inventory and More (full stack)</p><ul><li>Shopify</li><li><strong>BigCommerce</strong></li><li>Magneto</li><li>Solidus</li><li>Spree</li></ul><h2>Simple / digital only</h2><ul><li>Instagram + Paypal</li><li>Gum road</li></ul><p>Saas Solutions </p><ul><li>Stripe Checkout</li><li>Paddle</li><li>Fast Spring</li><li>Chargify</li><li><a href="https://recurly.com/">https://recurly.com/</a></li></ul><h1>Picks</h1><ul><li>JP: <a href="https://hotwire.dev/">https://hotwire.dev/</a> (hehe)</li><li>John: <a href="https://linear.app/">https://linear.app/</a></li></ul><p>References</p><ul><li><a href="https://github.com/crowdint/acts_as_shopping_cart">Acts as shoping cart gem</a></li><li><a href="https://github.com/pay-rails/pay">Pay gem</a></li><li>Foundation</li></ul>
]]></content:encoded>
      <enclosure length="47394389" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/06706914-5c66-4bb7-ac53-772dfe8fc2f5/audio/394ca3ac-d9cc-4539-9ef1-326466238c4c/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>All About eCommerce Development 🤑</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:49:23</itunes:duration>
      <itunes:summary>This episode we walk through tons of lessons tips, services and key concepts for developing ecommerce. If you want to spin up a quick online store or do ecommerce development full time this is a pretty good starting point. </itunes:summary>
      <itunes:subtitle>This episode we walk through tons of lessons tips, services and key concepts for developing ecommerce. If you want to spin up a quick online store or do ecommerce development full time this is a pretty good starting point. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>90</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">23594c85-146b-4dba-bfef-00a1c9f808d0</guid>
      <title>🎉2021 Predictions + Trends</title>
      <description><![CDATA[<h2>Approaches to Building Apps</h2><ul><li>Severless (Lambda functions)</li><li>PWA (progressive web apps)</li><li>Headless (Ecom / cms)<ul><li>Contentful</li><li>Shopify</li></ul></li></ul><h2>Tech Trending Upwards</h2><ul><li>E-commerce (up 37% from last year)</li><li>Artificial Intelligence<ul><li>(AWS sagemaker, GPT-3)</li></ul></li><li>Voice search<ul><li>66million smart speakers - 1/3 27% of mobile searches are voice based</li></ul></li><li>AMP'd</li><li>Apps will continue to ruin the internet</li><li>Chatbots<ul><li>JP: I personally hate these things. Just get me to a customer service rep ASAP</li></ul></li></ul><h1>Picks</h1><p>JP: <a href="https://baratza.com/grinder/encore/">https://baratza.com/grinder/encore/</a></p><p>John: <a href="https://www.youtube.com/watch?v=PqbB07n_uQ4&t=574s">A conversation with GPT-3</a></p>
]]></description>
      <pubDate>Mon, 11 Jan 2021 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/2021-predictions-trends-zXwa9IlR</link>
      <content:encoded><![CDATA[<h2>Approaches to Building Apps</h2><ul><li>Severless (Lambda functions)</li><li>PWA (progressive web apps)</li><li>Headless (Ecom / cms)<ul><li>Contentful</li><li>Shopify</li></ul></li></ul><h2>Tech Trending Upwards</h2><ul><li>E-commerce (up 37% from last year)</li><li>Artificial Intelligence<ul><li>(AWS sagemaker, GPT-3)</li></ul></li><li>Voice search<ul><li>66million smart speakers - 1/3 27% of mobile searches are voice based</li></ul></li><li>AMP'd</li><li>Apps will continue to ruin the internet</li><li>Chatbots<ul><li>JP: I personally hate these things. Just get me to a customer service rep ASAP</li></ul></li></ul><h1>Picks</h1><p>JP: <a href="https://baratza.com/grinder/encore/">https://baratza.com/grinder/encore/</a></p><p>John: <a href="https://www.youtube.com/watch?v=PqbB07n_uQ4&t=574s">A conversation with GPT-3</a></p>
]]></content:encoded>
      <enclosure length="39714389" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/226ac1d9-b2ae-46c3-84e2-c79b9724287a/audio/0388593c-41e9-42b2-9413-b52adacd1ce1/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>🎉2021 Predictions + Trends</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:41:23</itunes:duration>
      <itunes:summary>In this episode we jump right into our top predictions and trends for this year, </itunes:summary>
      <itunes:subtitle>In this episode we jump right into our top predictions and trends for this year, </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>89</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1c34878f-5de5-48bf-8fea-84b15d5fa75f</guid>
      <title>2020 Look-back Top Development Trends + Goals</title>
      <description><![CDATA[<blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer at a small analytics startup</li></ul><h3>Our 2020 Goals Episode → <a href="https://iteration.simplecast.com/episodes/2020-developer-goals">Link</a></h3><p><a href="https://iteration.simplecast.com/episodes/2020-developer-goals">✅ 2020 Developer Goals</a></p><h2>2020 Review</h2><p>JP</p><ul><li>Goal 1 (JP): Build Elixir App: (C+)<ul><li>I did build a really quick proof of concept Rust API that spits out some JSON</li><li>I also followed a tutorial for a full stack Golang app</li></ul></li><li>Goal 2 (JP): System Design (F)<ul><li>Did not read the books that I wanted to read</li></ul></li><li>Goal 3 (JP): Algorithms - (C+)<ul><li>Just haven't had the time - but I have reviewed some array based algorithms FWIW</li></ul></li></ul><p>John</p><ul><li>Goal 1 (John): Blog More (C+) (12+ posts)</li><li>Goal 2 (John): (F) System Design (Nope)</li><li>Goal 3 (John): JavaScript (B+) 2 Courses, built way more shit in JS Stimulus Mainly</li><li>Goal 4 (John): Focus 💯 (Closed agency, no more clients, doubled down on what I am good at)</li></ul><h2>Top 2020 Trends (From John)</h2><ul><li><strong>Remote Work 😷</strong><ul><li>Remote jobs used to have a requirement of having remote experience... now everyone has this experience</li></ul></li><li>Commercialization of Open source 🤑<ul><li>"Open source" that's also a product / company</li><li><a href="https://www.gatsbyjs.com/">https://www.gatsbyjs.com/</a></li><li><a href="https://nextjs.org/">https://nextjs.org/</a> (Vercel)</li><li><a href="https://www.cypress.io/">https://www.cypress.io/</a></li><li><a href="https://www.sanity.io/">https://www.sanity.io/</a></li><li><a href="https://github.com/mperham/sidekiq">https://github.com/mperham/sidekiq</a></li><li>Even Microsoft acquisition of Github and continued changes there VS Code → Atom</li></ul></li><li>"Niche" frameworks 🍾<ul><li><a href="https://svelte.dev/">https://svelte.dev/</a></li><li><a href="https://github.com/alpinejs/alpine">https://github.com/alpinejs/alpine</a><ul><li>This is Tailwinds' go-to for a JS solution</li><li>bridgetown</li></ul></li></ul></li><li><strong>"Hey" made server rendered sexy again 👋</strong></li><li>JavaScript continued to eat the world 🍽️<ul><li>Vue 3 added a composition API that's very similar to React Hooks</li></ul></li><li>Low Code / No Code ✨<ul><li><a href="https://bubble.io/">https://bubble.io/</a></li><li><a href="https://pipedream.com/">https://pipedream.com/</a></li><li><a href="https://stacker.app/">https://stacker.app/</a></li></ul></li><li>Data warehousing 🤓<ul><li><a href="https://www.tableau.com/">https://www.tableau.com/</a></li><li><a href="https://mode.com/">https://mode.com/</a></li><li><a href="https://looker.com/">https://looker.com/</a></li></ul></li></ul><p>Picks</p><p>JP: <a href="https://www.rrauction.com/preview_gallery.cfm?Category=449">https://www.rrauction.com/preview_gallery.cfm?Category=449</a></p><p>John: Rails starters:  <a href="https://jumpstartrails.com/">https://jumpstartrails.com/</a> — <a href="https://bullettrain.co/">https://bullettrain.co/</a></p>
]]></description>
      <pubDate>Mon, 28 Dec 2020 08:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/2020-look-back-top-development-trends-goals-sIXU7iVg</link>
      <content:encoded><![CDATA[<blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer at a small analytics startup</li></ul><h3>Our 2020 Goals Episode → <a href="https://iteration.simplecast.com/episodes/2020-developer-goals">Link</a></h3><p><a href="https://iteration.simplecast.com/episodes/2020-developer-goals">✅ 2020 Developer Goals</a></p><h2>2020 Review</h2><p>JP</p><ul><li>Goal 1 (JP): Build Elixir App: (C+)<ul><li>I did build a really quick proof of concept Rust API that spits out some JSON</li><li>I also followed a tutorial for a full stack Golang app</li></ul></li><li>Goal 2 (JP): System Design (F)<ul><li>Did not read the books that I wanted to read</li></ul></li><li>Goal 3 (JP): Algorithms - (C+)<ul><li>Just haven't had the time - but I have reviewed some array based algorithms FWIW</li></ul></li></ul><p>John</p><ul><li>Goal 1 (John): Blog More (C+) (12+ posts)</li><li>Goal 2 (John): (F) System Design (Nope)</li><li>Goal 3 (John): JavaScript (B+) 2 Courses, built way more shit in JS Stimulus Mainly</li><li>Goal 4 (John): Focus 💯 (Closed agency, no more clients, doubled down on what I am good at)</li></ul><h2>Top 2020 Trends (From John)</h2><ul><li><strong>Remote Work 😷</strong><ul><li>Remote jobs used to have a requirement of having remote experience... now everyone has this experience</li></ul></li><li>Commercialization of Open source 🤑<ul><li>"Open source" that's also a product / company</li><li><a href="https://www.gatsbyjs.com/">https://www.gatsbyjs.com/</a></li><li><a href="https://nextjs.org/">https://nextjs.org/</a> (Vercel)</li><li><a href="https://www.cypress.io/">https://www.cypress.io/</a></li><li><a href="https://www.sanity.io/">https://www.sanity.io/</a></li><li><a href="https://github.com/mperham/sidekiq">https://github.com/mperham/sidekiq</a></li><li>Even Microsoft acquisition of Github and continued changes there VS Code → Atom</li></ul></li><li>"Niche" frameworks 🍾<ul><li><a href="https://svelte.dev/">https://svelte.dev/</a></li><li><a href="https://github.com/alpinejs/alpine">https://github.com/alpinejs/alpine</a><ul><li>This is Tailwinds' go-to for a JS solution</li><li>bridgetown</li></ul></li></ul></li><li><strong>"Hey" made server rendered sexy again 👋</strong></li><li>JavaScript continued to eat the world 🍽️<ul><li>Vue 3 added a composition API that's very similar to React Hooks</li></ul></li><li>Low Code / No Code ✨<ul><li><a href="https://bubble.io/">https://bubble.io/</a></li><li><a href="https://pipedream.com/">https://pipedream.com/</a></li><li><a href="https://stacker.app/">https://stacker.app/</a></li></ul></li><li>Data warehousing 🤓<ul><li><a href="https://www.tableau.com/">https://www.tableau.com/</a></li><li><a href="https://mode.com/">https://mode.com/</a></li><li><a href="https://looker.com/">https://looker.com/</a></li></ul></li></ul><p>Picks</p><p>JP: <a href="https://www.rrauction.com/preview_gallery.cfm?Category=449">https://www.rrauction.com/preview_gallery.cfm?Category=449</a></p><p>John: Rails starters:  <a href="https://jumpstartrails.com/">https://jumpstartrails.com/</a> — <a href="https://bullettrain.co/">https://bullettrain.co/</a></p>
]]></content:encoded>
      <enclosure length="34754050" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/69c5e25d-65e0-413e-a059-3255afd6327f/audio/af6df002-d0e5-43a4-b0cf-db35fab4d6d7/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>2020 Look-back Top Development Trends + Goals</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:36:13</itunes:duration>
      <itunes:summary>In this episode JP and John do a retrospective look on the past year. Our goals and what we accomplished as well as some key industry trends. </itunes:summary>
      <itunes:subtitle>In this episode JP and John do a retrospective look on the past year. Our goals and what we accomplished as well as some key industry trends. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>88</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">43522f75-c7f3-4ee3-b595-e830e76e257a</guid>
      <title>The SPA Episode (Single Page Apps)</title>
      <description><![CDATA[<blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer at a small analytics startup</li></ul><p><a href="https://macwright.com/2020/05/10/spa-fatigue.html">https://macwright.com/2020/05/10/spa-fatigue.html</a></p><h1>Topics / Guiding Questions</h1><h2>What's a SPA?</h2><p><strong>From the article</strong></p><ol><li>The main UI is built & updated in JavaScript using React or something similar.</li><li>The backend is an API that that application makes requests against.</li></ol><p>The more techincal one:</p><p><a href="https://developer.mozilla.org/en-US/docs/Glossary/SPA">https://developer.mozilla.org/en-US/docs/Glossary/SPA</a></p><blockquote><p>An SPA (Single-page application) is a web app implementation that loads only a single web document, and then updates the body content of that single document via JavaScript APIs such as [XMLHttpRequest](<https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest>) and <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a> when different content is to be shown.</p></blockquote><blockquote><p>This therefore allows users to use websites without loading whole new pages from the server, which can result in performance gains and a more dynamic experience, with some tradeoff disadvantages such as SEO, more effort required to maintain state, implement navigation, and do meaningful performance monitoring.</p></blockquote><h2>Why do developers choose SPAs?</h2><ul><li> </li></ul><h2>Do end-users care about SPAs?</h2><h2>What SPAs have you worked on / maintained?</h2><ul><li>0 —</li></ul><h2>When should you reach for a SPA?</h2><ul><li>That's the right use case: Desktop app to the web.<ul><li>Spotify, Figma, <a href="http://photopea.com">photopea.com</a></li></ul></li><li>Breaks REST might be a good time to consider</li><li>Community</li></ul><h2>What's wrong with this SPA's?</h2><p><strong>Increased complexity — Development and deployment</strong></p><ul><li>Often times: 2 repositories, 2 languages or frameworks<ul><li>(Rails + Vue)</li><li>(Node + Angular)</li><li>(Rails + React)</li></ul></li></ul><p><strong>SEO + Speed — Have to do "Server Side Rendering"</strong></p><ul><li>This reminds me of the light switches for "Smart" light bulbs. You've increased the complexity by a factor of 10 to get the exact same results.</li></ul><p>Maintainability? Stability?</p><h1>If not a SPA then what? (Is this a different Episode?)</h1><h3>What's good about server rendered?</h3><ul><li>How much you get for free</li><li>Async fetching</li><li>State management</li><li>URL's just work</li><li>Strong Conventions</li><li>Stable minimal maintenance</li></ul><h3>What's bad about Server Rendered?</h3><ul><li>Page Reload</li><li>Can feel clunky</li><li>Less Reactive</li><li>Mobile App — Now what? SPA lays a stronger groundwork</li></ul><h2>What's good about SPA's</h2><ul><li>Benefits are for the user</li><li>Developer Ego's</li><li>Data foundations</li><li>Breaks CRUD</li><li>Community</li><li>Pushing technology forward is a good thing.</li></ul><h3>What's bad about SPA's</h3><ul><li>How much of a pain in the ass it is to Manage URL's</li><li>Complexity — Front end + Back end</li><li>Authentication</li><li>Image Upload</li><li>Multiple API endpoints for a single page</li><li>State is way harder in a SPA</li><li>Debugging</li></ul><h2>Closing Thoughts</h2><ul><li>SPA's are great when you are breaking "REST / CRUD"</li><li>SPA's are great when you need multiple consumers of the same data</li><li>This is highly personal, you gotta go with what you love.</li><li>WiFi</li></ul><h1>Picks</h1><ul><li>John — <a href="https://medium.com/make-time/six-years-with-a-distraction-free-iphone-8cf5eb4f97e3">Distraction Free Phone</a> from the book <a href="https://www.amazon.com/Make-Time-Focus-Matters-Every/dp/0525572422/ref=as_li_ss_tl?ie=UTF8&qid=1541556502&sr=8-2&keywords=make+time&linkCode=sl1&tag=sprint-medium-20&linkId=54d0a76607d698d2657a28eab066af98&language=en_US">Make Time</a><ul><li>Mobile: Uninstall all "Infinity Pools" put "Parental controls" on for the rest. 3.5 hours down to 1 hour screen time. So much time back. Switched out twitter for Kindle.</li><li>Other tip: Instagram Threads — only the shit you care about with no ads</li><li>Desktop: <a href="https://selfcontrolapp.com/">https://selfcontrolapp.com/</a> —</li></ul></li><li>JP - <a href="https://railsnew.io/">https://railsnew.io/</a></li></ul>
]]></description>
      <pubDate>Wed, 16 Dec 2020 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/single-page-apps-j3IRnMkU</link>
      <content:encoded><![CDATA[<blockquote><p><strong>John:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>John Intro — My name is John and I am a software developer for a home services startup.</li><li>JP Intro — Hi, I'm JP and I am a software developer at a small analytics startup</li></ul><p><a href="https://macwright.com/2020/05/10/spa-fatigue.html">https://macwright.com/2020/05/10/spa-fatigue.html</a></p><h1>Topics / Guiding Questions</h1><h2>What's a SPA?</h2><p><strong>From the article</strong></p><ol><li>The main UI is built & updated in JavaScript using React or something similar.</li><li>The backend is an API that that application makes requests against.</li></ol><p>The more techincal one:</p><p><a href="https://developer.mozilla.org/en-US/docs/Glossary/SPA">https://developer.mozilla.org/en-US/docs/Glossary/SPA</a></p><blockquote><p>An SPA (Single-page application) is a web app implementation that loads only a single web document, and then updates the body content of that single document via JavaScript APIs such as [XMLHttpRequest](<https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest>) and <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a> when different content is to be shown.</p></blockquote><blockquote><p>This therefore allows users to use websites without loading whole new pages from the server, which can result in performance gains and a more dynamic experience, with some tradeoff disadvantages such as SEO, more effort required to maintain state, implement navigation, and do meaningful performance monitoring.</p></blockquote><h2>Why do developers choose SPAs?</h2><ul><li> </li></ul><h2>Do end-users care about SPAs?</h2><h2>What SPAs have you worked on / maintained?</h2><ul><li>0 —</li></ul><h2>When should you reach for a SPA?</h2><ul><li>That's the right use case: Desktop app to the web.<ul><li>Spotify, Figma, <a href="http://photopea.com">photopea.com</a></li></ul></li><li>Breaks REST might be a good time to consider</li><li>Community</li></ul><h2>What's wrong with this SPA's?</h2><p><strong>Increased complexity — Development and deployment</strong></p><ul><li>Often times: 2 repositories, 2 languages or frameworks<ul><li>(Rails + Vue)</li><li>(Node + Angular)</li><li>(Rails + React)</li></ul></li></ul><p><strong>SEO + Speed — Have to do "Server Side Rendering"</strong></p><ul><li>This reminds me of the light switches for "Smart" light bulbs. You've increased the complexity by a factor of 10 to get the exact same results.</li></ul><p>Maintainability? Stability?</p><h1>If not a SPA then what? (Is this a different Episode?)</h1><h3>What's good about server rendered?</h3><ul><li>How much you get for free</li><li>Async fetching</li><li>State management</li><li>URL's just work</li><li>Strong Conventions</li><li>Stable minimal maintenance</li></ul><h3>What's bad about Server Rendered?</h3><ul><li>Page Reload</li><li>Can feel clunky</li><li>Less Reactive</li><li>Mobile App — Now what? SPA lays a stronger groundwork</li></ul><h2>What's good about SPA's</h2><ul><li>Benefits are for the user</li><li>Developer Ego's</li><li>Data foundations</li><li>Breaks CRUD</li><li>Community</li><li>Pushing technology forward is a good thing.</li></ul><h3>What's bad about SPA's</h3><ul><li>How much of a pain in the ass it is to Manage URL's</li><li>Complexity — Front end + Back end</li><li>Authentication</li><li>Image Upload</li><li>Multiple API endpoints for a single page</li><li>State is way harder in a SPA</li><li>Debugging</li></ul><h2>Closing Thoughts</h2><ul><li>SPA's are great when you are breaking "REST / CRUD"</li><li>SPA's are great when you need multiple consumers of the same data</li><li>This is highly personal, you gotta go with what you love.</li><li>WiFi</li></ul><h1>Picks</h1><ul><li>John — <a href="https://medium.com/make-time/six-years-with-a-distraction-free-iphone-8cf5eb4f97e3">Distraction Free Phone</a> from the book <a href="https://www.amazon.com/Make-Time-Focus-Matters-Every/dp/0525572422/ref=as_li_ss_tl?ie=UTF8&qid=1541556502&sr=8-2&keywords=make+time&linkCode=sl1&tag=sprint-medium-20&linkId=54d0a76607d698d2657a28eab066af98&language=en_US">Make Time</a><ul><li>Mobile: Uninstall all "Infinity Pools" put "Parental controls" on for the rest. 3.5 hours down to 1 hour screen time. So much time back. Switched out twitter for Kindle.</li><li>Other tip: Instagram Threads — only the shit you care about with no ads</li><li>Desktop: <a href="https://selfcontrolapp.com/">https://selfcontrolapp.com/</a> —</li></ul></li><li>JP - <a href="https://railsnew.io/">https://railsnew.io/</a></li></ul>
]]></content:encoded>
      <enclosure length="59554076" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/4c29d2c2-f0ad-4575-afb0-cab0c00c3d3b/audio/516e0f5d-de90-45ce-8de6-bc616ac89c96/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>The SPA Episode (Single Page Apps)</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>01:02:03</itunes:duration>
      <itunes:summary>In this episode we walk through pros / cons of SPA&apos;s. Pros / Cons, when to use them, what they are good at, frameworks, alternatives and more. </itunes:summary>
      <itunes:subtitle>In this episode we walk through pros / cons of SPA&apos;s. Pros / Cons, when to use them, what they are good at, frameworks, alternatives and more. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>87</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">922c9fb2-2235-4f60-8588-6176de0cdabb</guid>
      <title>Does Tech Stack Matter? 🥞</title>
      <description><![CDATA[In this episode we dive deep on tech stack choices, why they matter, how to choose one, when tech stack doesn't matter and when it makes all the difference in the world. ]]></description>
      <pubDate>Mon, 7 Dec 2020 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/does-tech-stack-matter-nKtofZ1e</link>
      <enclosure length="38274102" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/e19063bc-1e15-47e4-9607-fd1528a5fcbf/audio/319972d6-b5b6-48f7-a74b-3d14d705da72/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Does Tech Stack Matter? 🥞</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:39:52</itunes:duration>
      <itunes:summary>In this episode we dive deep on tech stack choices, why they matter, how to choose one, when tech stack doesn&apos;t matter and when it makes all the difference in the world. </itunes:summary>
      <itunes:subtitle>In this episode we dive deep on tech stack choices, why they matter, how to choose one, when tech stack doesn&apos;t matter and when it makes all the difference in the world. </itunes:subtitle>
      <itunes:keywords>ruby on rails, software development, software, web development</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>86</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">324d0da4-540f-450b-8e5e-9e7d1d7699dc</guid>
      <title>Spaghetti Episode 🍝 Testing, API outages, Unblocking your Team and More</title>
      <description><![CDATA[Back from break: In this episode JP + John cover all kinds of topics. Balancing life with a baby, testing, API dependencies and more. ]]></description>
      <pubDate>Mon, 30 Nov 2020 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/spaghetti-episode-Da4EZ5SC</link>
      <enclosure length="52322128" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/96c015b0-64dd-4630-9ac6-57ba30f3c1c6/audio/ed6dda26-9a0d-4900-b059-55d88b96d5ba/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Spaghetti Episode 🍝 Testing, API outages, Unblocking your Team and More</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:54:30</itunes:duration>
      <itunes:summary>Back from break: In this episode JP + John cover all kinds of topics. Balancing life with a baby, testing, API dependencies and more. </itunes:summary>
      <itunes:subtitle>Back from break: In this episode JP + John cover all kinds of topics. Balancing life with a baby, testing, API dependencies and more. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>85</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8c91d733-c086-48c3-b739-a9da822b1667</guid>
      <title>Low Code / No Code ✨</title>
      <description><![CDATA[<blockquote><p><strong>JP:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>JP Intro — Hi, I'm JP and I am a software engineer at an analytics startup. Today, I am joined by John:</li><li>John Intro — My name is John and I am a software developer based in Los Angeles CA</li></ul><h3>Today's topic</h3><p>The "Codeless" movement, otherwise known as "Low Code / No Code"</p><p>Said another way: Is Bubble and GPT-3 coming to take all of our jobs?</p><p><strong>We aren't talking about "Serverless" (Ex: Firebase / Aws Amplify / Parse) — Could be a good future episode.</strong></p><p><strong>NOT tools like Auth0 or Twillio</strong></p><p>This is a "Full Stack" — No code app development framework in the cloud.</p><p>WYSIWYG for "Apps"</p><p>This isn't software!</p><h2>Popular Codeless tools</h2><p><strong>Full "App" Development</strong></p><ul><li><a href="https://bubble.io/">https://bubble.io/</a> (Most Powerful, widely used)</li><li><a href="https://www.appsheet.com/">https://www.appsheet.com/</a></li><li><a href="https://www.glideapps.com/">https://www.glideapps.com/</a></li><li><a href="https://thunkable.com/">https://thunkable.com/</a></li></ul><p><strong>Internal Tool replacements — Kind of mini-modern salesforce or filemaker clones</strong></p><ul><li><a href="https://airtable.com/">Airtable</a></li><li><a href="https://retool.com/">Retool</a></li><li><a href="https://www.smartsheet.com/platform">Smartsheet</a></li><li><a href="https://www.notion.so/">Notion</a></li><li><a href="https://www.quickbase.com/">Quickbase</a></li></ul><p><strong>Domain Specific Codeless</strong></p><ul><li><a href="https://www.shopify.com/">Shopify</a> ← eCommerce</li><li><a href="https://www.sharetribe.com/">Sharetribe</a> ← Build a Marketplace App</li><li><a href="https://substack.com/">Substack</a> ← Paid Newsletters</li><li><a href="https://www.mightynetworks.com/membership">Mighty Networks</a> ← Paid Communities</li><li><a href="https://www.podia.com/">Podia</a> ← Sell online courses</li><li>So so many more</li></ul><h2>Upsides of Low Code</h2><ul><li><strong>Low Code / No Code is an incredible tool for going from 0-1.</strong></li><li>All Notes</li></ul><h3>Downsides of Low Code</h3><ul><li>Low Code / No Code is most ideal for basic <a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> or internal simpler tools. Reading, updating and managing listings of data. Or — Very Domain specific (Shopify for eCommerce)</li><li>It can be very hard to maintain, since you don't "own" your stack.</li><li>Very very expensive to scale (Still cheaper than a team of Devs)</li><li>Tons and tons of gotchas</li></ul><p>John's Opinion:</p><ul><li><strong>Prototype + Build V1 of everything you can with no-code or off the shelf systems. Get things in customers hands.</strong></li></ul><h2>Biggest Issue — Low Code doesn't fix the Hard Part of Software</h2><ul><li>Notes</li></ul><h2>Other thoughts regarding of Low code</h2><ul><li>Non tech sees code as "Barrier" not "Force Multiplier"</li><li>Often times the time saved is actually due to the compromises made with a low-code / no code tool.<ul><li><strong>Examples of compromises include:</strong></li></ul></li></ul><h1>Recommendations for Using Low Code Tools</h1><ul><li><strong>Accept the limitations</strong><ul><li>Spending too much time trying to solve for nit-picky edge-cases is likely to be a time suck here. Low-code / no-code will likely have rough edges and performance issues. Just embrace the hackyness.</li></ul></li><li><strong>Don't ignore best practices of user interviews, research and domain design.</strong><ul><li>Just because your not "coding" doesn't mean you shouldn't do your homework and have confidence before building. It's very easy to waste time building the wrong thing.</li></ul></li><li><strong>Think about the data and lock in</strong><ul><li>Where does data live? Is it secure? is it backed up? Is it in a silo? Can it be migrated / exported?</li></ul></li></ul><h2>Popular Codeless Resources</h2><ul><li><a href="https://www.nocode.tech/">https://www.nocode.tech/</a> (Community and resource list)</li><li><a href="https://zeroqode.com/">https://zeroqode.com/</a> (Templates — Literally Buy an Airbnb clone for $300)</li></ul><h1>Good Articles / Podcasts on Low code / no code</h1><ul><li><a href="https://medium.com/@rrhoover/the-rise-of-no-code-e733d7c0944d">Ryan Hoover: The Rise of No-Code</a></li><li><a href="https://postlight.com/podcast/going-codeless-is-this-the-way-of-the-future">Podcast: Going Codeless: Is this the way of the future?</a></li><li><a href="https://www.forbes.com/sites/jasonbloomberg/2017/07/20/the-low-codeno-code-movement-more-disruptive-than-you-realize/#503d7f3c722a">Forbes: The Low-Code/No-Code Movement: More Disruptive Than You Realize</a></li></ul><h1>Picks</h1><ul><li>John — Lighthouse Chrome Dev Tools</li><li>JP - <a href="https://github.com/kelseyhightower/nocode">https://github.com/kelseyhightower/nocode</a></li></ul>
]]></description>
      <pubDate>Tue, 6 Oct 2020 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/low-code-no-code-92hbNysC</link>
      <content:encoded><![CDATA[<blockquote><p><strong>JP:</strong> Welcome to Iteration, a podcast about programming, development, and design.</p></blockquote><ul><li>JP Intro — Hi, I'm JP and I am a software engineer at an analytics startup. Today, I am joined by John:</li><li>John Intro — My name is John and I am a software developer based in Los Angeles CA</li></ul><h3>Today's topic</h3><p>The "Codeless" movement, otherwise known as "Low Code / No Code"</p><p>Said another way: Is Bubble and GPT-3 coming to take all of our jobs?</p><p><strong>We aren't talking about "Serverless" (Ex: Firebase / Aws Amplify / Parse) — Could be a good future episode.</strong></p><p><strong>NOT tools like Auth0 or Twillio</strong></p><p>This is a "Full Stack" — No code app development framework in the cloud.</p><p>WYSIWYG for "Apps"</p><p>This isn't software!</p><h2>Popular Codeless tools</h2><p><strong>Full "App" Development</strong></p><ul><li><a href="https://bubble.io/">https://bubble.io/</a> (Most Powerful, widely used)</li><li><a href="https://www.appsheet.com/">https://www.appsheet.com/</a></li><li><a href="https://www.glideapps.com/">https://www.glideapps.com/</a></li><li><a href="https://thunkable.com/">https://thunkable.com/</a></li></ul><p><strong>Internal Tool replacements — Kind of mini-modern salesforce or filemaker clones</strong></p><ul><li><a href="https://airtable.com/">Airtable</a></li><li><a href="https://retool.com/">Retool</a></li><li><a href="https://www.smartsheet.com/platform">Smartsheet</a></li><li><a href="https://www.notion.so/">Notion</a></li><li><a href="https://www.quickbase.com/">Quickbase</a></li></ul><p><strong>Domain Specific Codeless</strong></p><ul><li><a href="https://www.shopify.com/">Shopify</a> ← eCommerce</li><li><a href="https://www.sharetribe.com/">Sharetribe</a> ← Build a Marketplace App</li><li><a href="https://substack.com/">Substack</a> ← Paid Newsletters</li><li><a href="https://www.mightynetworks.com/membership">Mighty Networks</a> ← Paid Communities</li><li><a href="https://www.podia.com/">Podia</a> ← Sell online courses</li><li>So so many more</li></ul><h2>Upsides of Low Code</h2><ul><li><strong>Low Code / No Code is an incredible tool for going from 0-1.</strong></li><li>All Notes</li></ul><h3>Downsides of Low Code</h3><ul><li>Low Code / No Code is most ideal for basic <a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> or internal simpler tools. Reading, updating and managing listings of data. Or — Very Domain specific (Shopify for eCommerce)</li><li>It can be very hard to maintain, since you don't "own" your stack.</li><li>Very very expensive to scale (Still cheaper than a team of Devs)</li><li>Tons and tons of gotchas</li></ul><p>John's Opinion:</p><ul><li><strong>Prototype + Build V1 of everything you can with no-code or off the shelf systems. Get things in customers hands.</strong></li></ul><h2>Biggest Issue — Low Code doesn't fix the Hard Part of Software</h2><ul><li>Notes</li></ul><h2>Other thoughts regarding of Low code</h2><ul><li>Non tech sees code as "Barrier" not "Force Multiplier"</li><li>Often times the time saved is actually due to the compromises made with a low-code / no code tool.<ul><li><strong>Examples of compromises include:</strong></li></ul></li></ul><h1>Recommendations for Using Low Code Tools</h1><ul><li><strong>Accept the limitations</strong><ul><li>Spending too much time trying to solve for nit-picky edge-cases is likely to be a time suck here. Low-code / no-code will likely have rough edges and performance issues. Just embrace the hackyness.</li></ul></li><li><strong>Don't ignore best practices of user interviews, research and domain design.</strong><ul><li>Just because your not "coding" doesn't mean you shouldn't do your homework and have confidence before building. It's very easy to waste time building the wrong thing.</li></ul></li><li><strong>Think about the data and lock in</strong><ul><li>Where does data live? Is it secure? is it backed up? Is it in a silo? Can it be migrated / exported?</li></ul></li></ul><h2>Popular Codeless Resources</h2><ul><li><a href="https://www.nocode.tech/">https://www.nocode.tech/</a> (Community and resource list)</li><li><a href="https://zeroqode.com/">https://zeroqode.com/</a> (Templates — Literally Buy an Airbnb clone for $300)</li></ul><h1>Good Articles / Podcasts on Low code / no code</h1><ul><li><a href="https://medium.com/@rrhoover/the-rise-of-no-code-e733d7c0944d">Ryan Hoover: The Rise of No-Code</a></li><li><a href="https://postlight.com/podcast/going-codeless-is-this-the-way-of-the-future">Podcast: Going Codeless: Is this the way of the future?</a></li><li><a href="https://www.forbes.com/sites/jasonbloomberg/2017/07/20/the-low-codeno-code-movement-more-disruptive-than-you-realize/#503d7f3c722a">Forbes: The Low-Code/No-Code Movement: More Disruptive Than You Realize</a></li></ul><h1>Picks</h1><ul><li>John — Lighthouse Chrome Dev Tools</li><li>JP - <a href="https://github.com/kelseyhightower/nocode">https://github.com/kelseyhightower/nocode</a></li></ul>
]]></content:encoded>
      <enclosure length="25624732" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d517663e-9c51-4b30-8f73-c285569796d8/episodes/2fa1e6d8-fc6c-46d0-8887-73770319c18c/audio/be52194e-4317-452c-8e82-7bef18b881f5/default_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Low Code / No Code ✨</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:42:42</itunes:duration>
      <itunes:summary>This episode John + JP discuss Low Code / No Code tools that are supposed to take our jobs. What&apos;s the current landscape and what&apos;s the future look like? </itunes:summary>
      <itunes:subtitle>This episode John + JP discuss Low Code / No Code tools that are supposed to take our jobs. What&apos;s the current landscape and what&apos;s the future look like? </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>84</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">4ecb84f5-76da-4572-830c-cbe79da92b4a</guid>
      <title>Breaking Into Tech 💻</title>
      <description><![CDATA[<h3>Welcome to Iteration, a podcast about programming, development, and design.</h3><p><a href="https://dev.to/johnsalzarulo/0-to-dev-in-6-months-recommended-syllabus-52mk">John's blog post on the topic</a> </p><h3>Picks</h3><ul><li>JP: <a href="https://github.com/pawelgrzybek/siema">Siema Slider</a></li><li>John: <a href="https://github.com/rough-stuff/rough-notation">Rough Notation JS</a></li></ul>
]]></description>
      <pubDate>Mon, 7 Sep 2020 12:00:01 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/breaking-into-tech-pEPJuLXa</link>
      <content:encoded><![CDATA[<h3>Welcome to Iteration, a podcast about programming, development, and design.</h3><p><a href="https://dev.to/johnsalzarulo/0-to-dev-in-6-months-recommended-syllabus-52mk">John's blog post on the topic</a> </p><h3>Picks</h3><ul><li>JP: <a href="https://github.com/pawelgrzybek/siema">Siema Slider</a></li><li>John: <a href="https://github.com/rough-stuff/rough-notation">Rough Notation JS</a></li></ul>
]]></content:encoded>
      <enclosure length="52770180" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/245d8754-b9c6-4280-bf92-c76c81f492d2/83-breaking-into-tech_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Breaking Into Tech 💻</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:54:58</itunes:duration>
      <itunes:summary>This week John and JP talk through breaking into tech in 2020. What it takes to learn to be a web developer and build a portfolio. </itunes:summary>
      <itunes:subtitle>This week John and JP talk through breaking into tech in 2020. What it takes to learn to be a web developer and build a portfolio. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>83</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">10f163bb-2bae-4e9e-9eb3-9a6f7babf3b9</guid>
      <title>🆆🆃🅵 Essential Abbreviations in Software Development</title>
      <description><![CDATA[<p>Welcome to Iteration, a podcast about programming, development, and design.</p><p>This week we talk through the most common abbreviations in software. </p><p>For a whole complete list and discussion — <a href="https://dev.to/johnsalzarulo/abbreviations-in-software-development-4jjf">visit this link</a></p><p> </p><h3>Picks</h3><ul><li><strong>John: Teladoc</strong></li><li><a href="https://github.com/scenic-views/scenic">JP: https://github.com/scenic-views/scenic</a></li></ul><h3>Links </h3><ul><li><a href="https://twitter.com/jeanpaulsio">JP on Twitter</a></li><li><a href="https://twitter.com/johnjacobdev">John on Twitter</a></li></ul>
]]></description>
      <pubDate>Sun, 26 Jul 2020 17:44:34 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/essential-abbreviations-in-software-development-sRZUkGEo</link>
      <content:encoded><![CDATA[<p>Welcome to Iteration, a podcast about programming, development, and design.</p><p>This week we talk through the most common abbreviations in software. </p><p>For a whole complete list and discussion — <a href="https://dev.to/johnsalzarulo/abbreviations-in-software-development-4jjf">visit this link</a></p><p> </p><h3>Picks</h3><ul><li><strong>John: Teladoc</strong></li><li><a href="https://github.com/scenic-views/scenic">JP: https://github.com/scenic-views/scenic</a></li></ul><h3>Links </h3><ul><li><a href="https://twitter.com/jeanpaulsio">JP on Twitter</a></li><li><a href="https://twitter.com/johnjacobdev">John on Twitter</a></li></ul>
]]></content:encoded>
      <enclosure length="42818154" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/1179af44-3e13-4b2f-aa86-0c44f111ed0d/82-abbreviations-in-software-development_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>🆆🆃🅵 Essential Abbreviations in Software Development</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:44:36</itunes:duration>
      <itunes:summary>The audio kind of sucks in this episode, sorry. John messed up his recording. In this episode JP and John walk though some of the most common abbreviations in software development and talk through the concepts and give you a good overview. </itunes:summary>
      <itunes:subtitle>The audio kind of sucks in this episode, sorry. John messed up his recording. In this episode JP and John walk though some of the most common abbreviations in software development and talk through the concepts and give you a good overview. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>82</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ddbbd7e5-d1da-4996-b14f-d333301dc48d</guid>
      <title>Onboarding into a new codebase 👋</title>
      <description><![CDATA[<p>Today's topic:</p><p>Onboarding into a new codebase</p><h3><strong>As a new hire / contractor for a freelance project</strong></h3><p>From JP:</p><ul><li>Reviewing other people's PRs on a new codebase</li><li>Submitting your first PR</li><li>Understanding how data flows through the app<ul><li>I've found that the organization of the code and the quality of abstractions makes or breaks this point</li></ul></li><li>Ramping up complexity of feature stories that you can tackle. How do you get there?</li></ul><p>From John:</p><ul><li><strong>First — Understand the domain, talk with team, read books, use competitor software, language in that domain.</strong></li><li>Then — Understand the software<ul><li><strong>Read the Docs, all that you can get your hands on</strong></li><li>Review closed issues / tickets, try to understand the language /culture of the team</li><li><strong>Review the tests, this is a good place to start if there is any, especially integration or feature tests that are higher level</strong></li><li><strong>Find the "God" objects if you</strong> can.</li><li><strong>Write docs as you go, great way to get it into your head</strong></li></ul></li></ul><h3>Onboarding someone else onto a new codebase</h3><p>From JP</p><ul><li>Hiring contractors for a project</li><li>Onboarding new hires</li><li>Reviewing new hires' pull requests **it's own episode maybe? Code Review?**</li><li>How do you onboard someone else?<ul><li>I think domain context is important</li></ul></li></ul><p><strong>From John</strong></p><ul><li><strong>Support the advise given above! It's just the reverse</strong></li><li>First: Domain Context</li><li>Then —<ul><li>Provide Docs</li><li>Tests</li><li>Simple first issue</li></ul></li><li><strong>Pair on the onboarding Dev's first PR VS sink or swim</strong></li><li>Try to demonstrate what tools and process you use in a project</li></ul><h2>Picks</h2><p>JP: <a href="https://apps.apple.com/de/app/meeter-fast-call-initiation/id1510445899?l=en&mt=12">https://apps.apple.com/de/app/meeter-fast-call-initiation/id1510445899?l=en&mt=12</a></p><p>John:</p><ul><li><a href="https://github.com/github/view_component">Rails View Components</a></li><li>It's a new pattern in rails to produce reusable front end "Partials" but more abstracted and re-usable.</li><li>This pattern plus stimulus.js is really magic.</li></ul>
]]></description>
      <pubDate>Mon, 29 Jun 2020 12:00:04 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/onboarding-into-a-new-codebase-Y6qvMrHn</link>
      <content:encoded><![CDATA[<p>Today's topic:</p><p>Onboarding into a new codebase</p><h3><strong>As a new hire / contractor for a freelance project</strong></h3><p>From JP:</p><ul><li>Reviewing other people's PRs on a new codebase</li><li>Submitting your first PR</li><li>Understanding how data flows through the app<ul><li>I've found that the organization of the code and the quality of abstractions makes or breaks this point</li></ul></li><li>Ramping up complexity of feature stories that you can tackle. How do you get there?</li></ul><p>From John:</p><ul><li><strong>First — Understand the domain, talk with team, read books, use competitor software, language in that domain.</strong></li><li>Then — Understand the software<ul><li><strong>Read the Docs, all that you can get your hands on</strong></li><li>Review closed issues / tickets, try to understand the language /culture of the team</li><li><strong>Review the tests, this is a good place to start if there is any, especially integration or feature tests that are higher level</strong></li><li><strong>Find the "God" objects if you</strong> can.</li><li><strong>Write docs as you go, great way to get it into your head</strong></li></ul></li></ul><h3>Onboarding someone else onto a new codebase</h3><p>From JP</p><ul><li>Hiring contractors for a project</li><li>Onboarding new hires</li><li>Reviewing new hires' pull requests **it's own episode maybe? Code Review?**</li><li>How do you onboard someone else?<ul><li>I think domain context is important</li></ul></li></ul><p><strong>From John</strong></p><ul><li><strong>Support the advise given above! It's just the reverse</strong></li><li>First: Domain Context</li><li>Then —<ul><li>Provide Docs</li><li>Tests</li><li>Simple first issue</li></ul></li><li><strong>Pair on the onboarding Dev's first PR VS sink or swim</strong></li><li>Try to demonstrate what tools and process you use in a project</li></ul><h2>Picks</h2><p>JP: <a href="https://apps.apple.com/de/app/meeter-fast-call-initiation/id1510445899?l=en&mt=12">https://apps.apple.com/de/app/meeter-fast-call-initiation/id1510445899?l=en&mt=12</a></p><p>John:</p><ul><li><a href="https://github.com/github/view_component">Rails View Components</a></li><li>It's a new pattern in rails to produce reusable front end "Partials" but more abstracted and re-usable.</li><li>This pattern plus stimulus.js is really magic.</li></ul>
]]></content:encoded>
      <enclosure length="31202233" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/d1b58678-04a6-4a79-a854-a36974158038/sep81-new-codebase_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Onboarding into a new codebase 👋</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:32:30</itunes:duration>
      <itunes:summary>This episode covers what it&apos;s like to come into a new codebase, also how to help onboard other devs into a codebase you are already on. </itunes:summary>
      <itunes:subtitle>This episode covers what it&apos;s like to come into a new codebase, also how to help onboard other devs into a codebase you are already on. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>81</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9d6f05e2-bdd9-4e0b-9da1-f5649ddb9153</guid>
      <title>The Soft Skills Episode 🍦</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><ul><li>JP Intro — Hi, I'm JP and I am a full stack developer. Today, I am joined by John:</li><li>John Intro — My name is John and I am a software developer for a home services startup.</li></ul><p>What are soft skills? Why are they important? Are they important?</p><p>Wikipedia defines "soft skills" ...</p><blockquote><p>Soft skills are a combination of people skills, social skills, communication skills, character or personality traits, attitudes, career attributes, social intelligence and emotional intelligence quotients, among others, that enable people to navigate their environment, work well with others, perform well, and achieve their goals with complementing hard skills.</p></blockquote><p>tldr; people skills</p><blockquote><p>Hard skills, also called technical skills, are any skills relating to a specific task or situation. It involves both understanding and proficiency in such specific activity that involves methods, processes, procedures, or techniques</p></blockquote><p>Conversation is loosely based on <a href="https://www.amazon.com/Soft-Skills-software-developers-manual/dp/1617292397/ref=sr_1_1?keywords=Soft+Skills:+The+Software+Developer%27s+Life+Manual&qid=1563198735&s=gateway&sr=8-1">this book</a>, the author is famously kind of a dick. Doesn't mean there aren't some solid takeaways, using it as a framework for conversation.</p><ul><li><a href="https://dev.to/jhotterbeekx/soft-skills-the-software-developers-life-manual---book-review-24bm">Link</a> to summary of "Soft Skills"</li><li><a href="http://www.devthoughts.pl/2016/09/18/soft-skills-by-john-sonmez/">Another summary</a></li></ul><h3>Section 1: Career</h3><p>Few tips to improve your career:</p><ul><li>From SS: Specialize, don't generalize.</li><li>From SS: <strong>"Fake it till you make it"</strong></li></ul><p>John</p><ul><li>Always be working on yourself: "Luck is when preparation meets opportunity"</li><li>Meet lots of people, be helpful and friendly</li><li>Do a lot of interviews.</li><li>Confidence and enthusiasm — "Being enthusiastic is worth 25 IQ points."</li></ul><p>JP</p><ul><li>The importance of friendliness. How does this work for introverts?</li></ul><p><strong>Recommended Career Books</strong></p><ul><li><a href="https://www.amazon.com/Linchpin-Are-Indispensable-Seth-Godin/dp/1591844096">Linchpin</a></li><li><a href="https://www.amazon.com/gp/product/0307888908/ref=as_li_tf_tl?ie=UTF8&tag=startupofyou-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0307888908">Startup of You</a></li><li>JP: <a href="https://www.amazon.com/Crucial-Conversations-Talking-Stakes-Second/dp/1469266822">Crucial Conversations</a></li></ul><h3>Section 2: Marketing yourself</h3><ul><li>From SS: <strong>See yourself more as offering a service and not as a employee.</strong><ul><li>Less about Salary and work hours, more about the uniqe "Features and beniftis" you bring to the table, you solve problems, you are an investment not an expense.</li></ul></li></ul><p>John</p><ul><li>Blog, be vocal — Share what you learn, don't be afraid to look dumb.</li><li>Teach others when you can</li><li>Take speaking and presentation gigs (Was a speaker at GA and got work out of it, you never know)</li><li>Again — Specialize</li></ul><p>JP</p><ul><li>I love this idea around you being a service. EAAS: Engineer as a service</li><li>I have mixed feelings about marketing yourself. I go back and forth on whether or not I want a bigger online presence</li></ul><h3>Section 3: Learning</h3><p>From SS: "Learn you want? Teach you must."</p><p>John:</p><ul><li>Be consistent. 1 hour a day for 12 days is way better than a single 12 hour day.</li><li>Try to understand the concepts, not the syntax.<ul><li>Concepts and fundamentals you can take anywhere. Good domain design, testing, clean code. All these concepts work in any language / framework.</li></ul></li></ul><p>JP:</p><ul><li>Deliberate practice. I just hammer concepts into my brain until it sticks.</li><li>Honestly, just keep writing code but more importantly keep READING code</li><li>Whiteboard, talk about problems from a domain perspective</li></ul><h3>Section 4: Productivity</h3><p>From SS: Focus</p><ul><li>John: +1 (20% done isn't worth anything. 5 tasks 20% done, or 1, 100% done)</li></ul><p>From SS: Pomodoro Technique</p><p>From SS: Kanban</p><p>John:</p><ul><li>Getting Things Done</li><li>Break down the work.</li><li>80/20 — Pareto principle</li><li>Eat that Frog</li></ul><p>JP:</p><ul><li>I'm currently giving Pomodoro a shot. I'm trying to figure out how to effectively context shift</li><li>How do you eat an elephant?</li></ul><p>Sections 5 and 6 — Financial and Fitness</p><h3>Section 7: Spirit</h3><p>From SS: power of positive thinking</p><p>From John:</p><ul><li>Mental space, day off, unplug sometimes.</li><li>Confidence + enthusiasm</li></ul><p>JP:</p><ul><li>I could use some tips from this section...</li></ul><p>BONUS From John: Communication</p><ul><li>This one probably goes at the top of my list.</li><li>#1 — Learn to be a better writer.<ul><li>Book: On Writing Well</li><li>Tool: Hemingway Editor</li><li>Headline writing — Most important things first</li></ul></li><li>Learn how to explain complicated topics. ELI5</li></ul><p>Picks</p><ul><li>John: Naps</li><li>JP: Loom screen recording</li></ul>
]]></description>
      <pubDate>Mon, 15 Jun 2020 12:00:16 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/the-soft-skills-episode-2rlUM9uj</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><ul><li>JP Intro — Hi, I'm JP and I am a full stack developer. Today, I am joined by John:</li><li>John Intro — My name is John and I am a software developer for a home services startup.</li></ul><p>What are soft skills? Why are they important? Are they important?</p><p>Wikipedia defines "soft skills" ...</p><blockquote><p>Soft skills are a combination of people skills, social skills, communication skills, character or personality traits, attitudes, career attributes, social intelligence and emotional intelligence quotients, among others, that enable people to navigate their environment, work well with others, perform well, and achieve their goals with complementing hard skills.</p></blockquote><p>tldr; people skills</p><blockquote><p>Hard skills, also called technical skills, are any skills relating to a specific task or situation. It involves both understanding and proficiency in such specific activity that involves methods, processes, procedures, or techniques</p></blockquote><p>Conversation is loosely based on <a href="https://www.amazon.com/Soft-Skills-software-developers-manual/dp/1617292397/ref=sr_1_1?keywords=Soft+Skills:+The+Software+Developer%27s+Life+Manual&qid=1563198735&s=gateway&sr=8-1">this book</a>, the author is famously kind of a dick. Doesn't mean there aren't some solid takeaways, using it as a framework for conversation.</p><ul><li><a href="https://dev.to/jhotterbeekx/soft-skills-the-software-developers-life-manual---book-review-24bm">Link</a> to summary of "Soft Skills"</li><li><a href="http://www.devthoughts.pl/2016/09/18/soft-skills-by-john-sonmez/">Another summary</a></li></ul><h3>Section 1: Career</h3><p>Few tips to improve your career:</p><ul><li>From SS: Specialize, don't generalize.</li><li>From SS: <strong>"Fake it till you make it"</strong></li></ul><p>John</p><ul><li>Always be working on yourself: "Luck is when preparation meets opportunity"</li><li>Meet lots of people, be helpful and friendly</li><li>Do a lot of interviews.</li><li>Confidence and enthusiasm — "Being enthusiastic is worth 25 IQ points."</li></ul><p>JP</p><ul><li>The importance of friendliness. How does this work for introverts?</li></ul><p><strong>Recommended Career Books</strong></p><ul><li><a href="https://www.amazon.com/Linchpin-Are-Indispensable-Seth-Godin/dp/1591844096">Linchpin</a></li><li><a href="https://www.amazon.com/gp/product/0307888908/ref=as_li_tf_tl?ie=UTF8&tag=startupofyou-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0307888908">Startup of You</a></li><li>JP: <a href="https://www.amazon.com/Crucial-Conversations-Talking-Stakes-Second/dp/1469266822">Crucial Conversations</a></li></ul><h3>Section 2: Marketing yourself</h3><ul><li>From SS: <strong>See yourself more as offering a service and not as a employee.</strong><ul><li>Less about Salary and work hours, more about the uniqe "Features and beniftis" you bring to the table, you solve problems, you are an investment not an expense.</li></ul></li></ul><p>John</p><ul><li>Blog, be vocal — Share what you learn, don't be afraid to look dumb.</li><li>Teach others when you can</li><li>Take speaking and presentation gigs (Was a speaker at GA and got work out of it, you never know)</li><li>Again — Specialize</li></ul><p>JP</p><ul><li>I love this idea around you being a service. EAAS: Engineer as a service</li><li>I have mixed feelings about marketing yourself. I go back and forth on whether or not I want a bigger online presence</li></ul><h3>Section 3: Learning</h3><p>From SS: "Learn you want? Teach you must."</p><p>John:</p><ul><li>Be consistent. 1 hour a day for 12 days is way better than a single 12 hour day.</li><li>Try to understand the concepts, not the syntax.<ul><li>Concepts and fundamentals you can take anywhere. Good domain design, testing, clean code. All these concepts work in any language / framework.</li></ul></li></ul><p>JP:</p><ul><li>Deliberate practice. I just hammer concepts into my brain until it sticks.</li><li>Honestly, just keep writing code but more importantly keep READING code</li><li>Whiteboard, talk about problems from a domain perspective</li></ul><h3>Section 4: Productivity</h3><p>From SS: Focus</p><ul><li>John: +1 (20% done isn't worth anything. 5 tasks 20% done, or 1, 100% done)</li></ul><p>From SS: Pomodoro Technique</p><p>From SS: Kanban</p><p>John:</p><ul><li>Getting Things Done</li><li>Break down the work.</li><li>80/20 — Pareto principle</li><li>Eat that Frog</li></ul><p>JP:</p><ul><li>I'm currently giving Pomodoro a shot. I'm trying to figure out how to effectively context shift</li><li>How do you eat an elephant?</li></ul><p>Sections 5 and 6 — Financial and Fitness</p><h3>Section 7: Spirit</h3><p>From SS: power of positive thinking</p><p>From John:</p><ul><li>Mental space, day off, unplug sometimes.</li><li>Confidence + enthusiasm</li></ul><p>JP:</p><ul><li>I could use some tips from this section...</li></ul><p>BONUS From John: Communication</p><ul><li>This one probably goes at the top of my list.</li><li>#1 — Learn to be a better writer.<ul><li>Book: On Writing Well</li><li>Tool: Hemingway Editor</li><li>Headline writing — Most important things first</li></ul></li><li>Learn how to explain complicated topics. ELI5</li></ul><p>Picks</p><ul><li>John: Naps</li><li>JP: Loom screen recording</li></ul>
]]></content:encoded>
      <enclosure length="36238223" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/9c5eeb34-5916-4e02-b5a1-00890ec1f7b6/sep81-soft-skills_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>The Soft Skills Episode 🍦</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:37:45</itunes:duration>
      <itunes:summary>This episode we talk through everything that isn&apos;t code. Career, communication, productivity and more. Learn all the tips and ticks to make yourself a more effective software developer. </itunes:summary>
      <itunes:subtitle>This episode we talk through everything that isn&apos;t code. Career, communication, productivity and more. Learn all the tips and ticks to make yourself a more effective software developer. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>80</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">313f5535-de6c-4fee-be94-b085b137c220</guid>
      <title>JavaScript Frameworks 🖼</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><p>This week — javascript frameworks</p><h3>What is a JavaScript Framework? How would you explain it?</h3><ul><li><code>John</code>:<ul><li>Concept of a framework, is essentially a collection of best practices and starting points.</li><li>When you build a fence, you could literally cut down trees and make boards, make nails out of raw iron<ul><li>At Lowe's the other day, they had pre-assembled fence sections. This is what a framework is.</li></ul></li><li>Some frameworks offer really prescriptive and complex components, others offer really basic ones. (2x4's vs pre-built fence sections)</li><li>in JS — It's basically a pre-existing library and collection of JavaScript code you can use to do other things with.</li></ul></li><li><code>JP</code>: wrappers around document.querySelector + some sort of state management<ul><li>Programing is all about abstractions —</li><li>Shared abstractions</li></ul></li></ul><h3>Framework vs Library</h3><ul><li>Line is blurry here, example: JQuerry, lodash  underscore are closer to libraries. These are more collections of useful utilities and functions. Frameworks are more comprehensive. Offer a more end to end solution for back end, front end or both.</li></ul><h3><code>JP</code> JavaScript Ecosystem is Frustrating</h3><ul><li><a href="https://www.zdnet.com/article/another-one-line-npm-package-breaks-the-javascript-ecosystem/">https://www.zdnet.com/article/another-one-line-npm-package-breaks-the-javascript-ecosystem/</a></li><li>This one line change in an npm package broke deploys for one of my sites</li></ul><h3>The 4 most Popular Frameworks (in order of creation date)</h3><p><a href="https://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks">There are SO MANY JS frameworks</a>, feels like new ones every day. </p><ul><li><p><strong><a href="https://jquery.com/">JQuery</a>:</strong></p><ul><li>The "Original Gangster". Oldest and biggest project, not the most modern, still heavily used worldwide. Not really a "Framework" with modern JavaScript, it's not really needed, especially if you use one of these other frameworks, it's definitely not needed in my opinion.</li><li>Github Stars: 53k</li><li>Initial Release: 2006<ul><li>From JP: <a href="https://mootools.net/">https://mootools.net/</a></li></ul></li></ul></li><li><p><a href="https://angular.io/">Angular</a></p><ul><li>Github Stars: 60k</li><li>Initial Release: 2010<ul><li>John: It's been years since I've worked in an angular project. It was a previous version of Angular, but it was close to writing HTML, using Vue reminds me of Angular at it's best.</li><li>JP: Never bothered to touch it! I don't have any opinions on it</li></ul></li></ul></li><li><p><a href="https://reactjs.org/">React</a></p><ul><li>Github Stars: 148k</li><li>Initial Release 2013<ul><li>John: I've written a good chunk of react native and react. I've never fallen in love. It's a lot of boiler plate, I don't like JSX and the whole thing just doesn't work the way my brain works. A lot of my projects are perfectly fine with simpler server rendered pages. So I generally don't work in it.</li><li>JP: On the other hand, I love writing React - I guess as much as any Rails developer can love writing JavaScript. That's right, I said it, I'm a Rails developer.</li></ul></li></ul></li><li><p><a href="https://vuejs.org/">Vue.js</a></p><ul><li>Github Stars: 164k</li><li>Initial Release 2014<ul><li>John: I really like Vue because you can just extend existing HTML elements. Handles the data binding and event handling for you. It's lightweight and be brought into all kinds of back ends. Really great for "sprinkles". Don't need a whole SPA but some drag and drop would be good here, or this chat interface needs live reloading.</li><li>JP: Currently learning Vue and it breaks my brain a little. Let me tell you why...</li></ul></li></ul></li></ul><h3>honorable mentions</h3><ul><li><a href="https://github.com/meteor/meteor">Meteor</a> / <a href="https://emberjs.com/">Ember</a> / <a href="https://backbonejs.org/">Backbone</a></li></ul><h3>Frameworks of Frameworks:</h3><ul><li><a href="https://nextjs.org/">Next js</a> — New up and coming —  <a href="https://github.com/blitz-js/blitz">Blitz</a><ul><li><a href="https://www.gatsbyjs.org/">Gatsbty</a></li><li><a href="https://sailsjs.com/">Sails JS</a></li></ul></li></ul><h3>Last Mention</h3><ul><li>Stimulus (Mostly for Rails)<ul><li>Initial release 2019</li><li>John uses heavily, it's like a lightweight Vue customized for Rails.</li></ul></li></ul><h2>Tips for Using a JS Framework</h2><ul><li>JP: Learn Vanila JavaScript first</li><li>John: Go all in</li></ul><h3>JP's Pick</h3><p><a href="https://www.instagram.com/archipics.ig/">https://www.instagram.com/archipics.ig/</a></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04df2471-3543-42d3-a73d-7b4f838406d0/Screen_Shot_2020-05-09_at_12.56.11_PM.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04df2471-3543-42d3-a73d-7b4f838406d0/Screen_Shot_2020-05-09_at_12.56.11_PM.png" /></p><h1>John's Pick</h1><h2>Getting back to Basics  Beginner JavaScript (Wes Bos Course)</h2><ul><li>I'm halfway through a <a href="https://www.beginnerjavascript.com/">Beginner JavaScript</a> course, 80% of it is really really easy, the other 20% is such good missing pieces.<ul><li><a href="https://github.com/Johnsalzarulo/hot_tips/#destructing">Destructing</a></li><li><a href="https://github.com/Johnsalzarulo/hot_tips/#methods-in-javascript-objects">Methods in JS Objects</a></li><li>Understanding Hoisting</li></ul></li></ul>
]]></description>
      <pubDate>Mon, 1 Jun 2020 12:00:02 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/javascript-frameworks-WUKhuyVB</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><p>This week — javascript frameworks</p><h3>What is a JavaScript Framework? How would you explain it?</h3><ul><li><code>John</code>:<ul><li>Concept of a framework, is essentially a collection of best practices and starting points.</li><li>When you build a fence, you could literally cut down trees and make boards, make nails out of raw iron<ul><li>At Lowe's the other day, they had pre-assembled fence sections. This is what a framework is.</li></ul></li><li>Some frameworks offer really prescriptive and complex components, others offer really basic ones. (2x4's vs pre-built fence sections)</li><li>in JS — It's basically a pre-existing library and collection of JavaScript code you can use to do other things with.</li></ul></li><li><code>JP</code>: wrappers around document.querySelector + some sort of state management<ul><li>Programing is all about abstractions —</li><li>Shared abstractions</li></ul></li></ul><h3>Framework vs Library</h3><ul><li>Line is blurry here, example: JQuerry, lodash  underscore are closer to libraries. These are more collections of useful utilities and functions. Frameworks are more comprehensive. Offer a more end to end solution for back end, front end or both.</li></ul><h3><code>JP</code> JavaScript Ecosystem is Frustrating</h3><ul><li><a href="https://www.zdnet.com/article/another-one-line-npm-package-breaks-the-javascript-ecosystem/">https://www.zdnet.com/article/another-one-line-npm-package-breaks-the-javascript-ecosystem/</a></li><li>This one line change in an npm package broke deploys for one of my sites</li></ul><h3>The 4 most Popular Frameworks (in order of creation date)</h3><p><a href="https://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks">There are SO MANY JS frameworks</a>, feels like new ones every day. </p><ul><li><p><strong><a href="https://jquery.com/">JQuery</a>:</strong></p><ul><li>The "Original Gangster". Oldest and biggest project, not the most modern, still heavily used worldwide. Not really a "Framework" with modern JavaScript, it's not really needed, especially if you use one of these other frameworks, it's definitely not needed in my opinion.</li><li>Github Stars: 53k</li><li>Initial Release: 2006<ul><li>From JP: <a href="https://mootools.net/">https://mootools.net/</a></li></ul></li></ul></li><li><p><a href="https://angular.io/">Angular</a></p><ul><li>Github Stars: 60k</li><li>Initial Release: 2010<ul><li>John: It's been years since I've worked in an angular project. It was a previous version of Angular, but it was close to writing HTML, using Vue reminds me of Angular at it's best.</li><li>JP: Never bothered to touch it! I don't have any opinions on it</li></ul></li></ul></li><li><p><a href="https://reactjs.org/">React</a></p><ul><li>Github Stars: 148k</li><li>Initial Release 2013<ul><li>John: I've written a good chunk of react native and react. I've never fallen in love. It's a lot of boiler plate, I don't like JSX and the whole thing just doesn't work the way my brain works. A lot of my projects are perfectly fine with simpler server rendered pages. So I generally don't work in it.</li><li>JP: On the other hand, I love writing React - I guess as much as any Rails developer can love writing JavaScript. That's right, I said it, I'm a Rails developer.</li></ul></li></ul></li><li><p><a href="https://vuejs.org/">Vue.js</a></p><ul><li>Github Stars: 164k</li><li>Initial Release 2014<ul><li>John: I really like Vue because you can just extend existing HTML elements. Handles the data binding and event handling for you. It's lightweight and be brought into all kinds of back ends. Really great for "sprinkles". Don't need a whole SPA but some drag and drop would be good here, or this chat interface needs live reloading.</li><li>JP: Currently learning Vue and it breaks my brain a little. Let me tell you why...</li></ul></li></ul></li></ul><h3>honorable mentions</h3><ul><li><a href="https://github.com/meteor/meteor">Meteor</a> / <a href="https://emberjs.com/">Ember</a> / <a href="https://backbonejs.org/">Backbone</a></li></ul><h3>Frameworks of Frameworks:</h3><ul><li><a href="https://nextjs.org/">Next js</a> — New up and coming —  <a href="https://github.com/blitz-js/blitz">Blitz</a><ul><li><a href="https://www.gatsbyjs.org/">Gatsbty</a></li><li><a href="https://sailsjs.com/">Sails JS</a></li></ul></li></ul><h3>Last Mention</h3><ul><li>Stimulus (Mostly for Rails)<ul><li>Initial release 2019</li><li>John uses heavily, it's like a lightweight Vue customized for Rails.</li></ul></li></ul><h2>Tips for Using a JS Framework</h2><ul><li>JP: Learn Vanila JavaScript first</li><li>John: Go all in</li></ul><h3>JP's Pick</h3><p><a href="https://www.instagram.com/archipics.ig/">https://www.instagram.com/archipics.ig/</a></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04df2471-3543-42d3-a73d-7b4f838406d0/Screen_Shot_2020-05-09_at_12.56.11_PM.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04df2471-3543-42d3-a73d-7b4f838406d0/Screen_Shot_2020-05-09_at_12.56.11_PM.png" /></p><h1>John's Pick</h1><h2>Getting back to Basics  Beginner JavaScript (Wes Bos Course)</h2><ul><li>I'm halfway through a <a href="https://www.beginnerjavascript.com/">Beginner JavaScript</a> course, 80% of it is really really easy, the other 20% is such good missing pieces.<ul><li><a href="https://github.com/Johnsalzarulo/hot_tips/#destructing">Destructing</a></li><li><a href="https://github.com/Johnsalzarulo/hot_tips/#methods-in-javascript-objects">Methods in JS Objects</a></li><li>Understanding Hoisting</li></ul></li></ul>
]]></content:encoded>
      <enclosure length="48954213" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/36417b1d-cca9-45d8-8ba0-19a56548454a/javascript-frameworks_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>JavaScript Frameworks 🖼</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:51:00</itunes:duration>
      <itunes:summary>This week we dig into some of the most popular JavaScript frameworks. Give our 2 cents on ones we&apos;ve worked on a little history, hot takes, gotchas and more. </itunes:summary>
      <itunes:subtitle>This week we dig into some of the most popular JavaScript frameworks. Give our 2 cents on ones we&apos;ve worked on a little history, hot takes, gotchas and more. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>15</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">86e261ec-5702-4248-a40c-b1b21c1bac11</guid>
      <title>Tech in a Covid World 😷</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><h3><code>JP</code> Layoffs</h3><ul><li>Let's talk about layoffs!</li><li><a href="https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/">https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/</a></li><li>600+ employees</li><li>I got laid off on my birthday! The response has been overwhelmingly supportive and I've talked to dozens of startups in the last two weeks. (It's been exactly two weeks at the time of the recording)</li><li>Sometimes you have to realize how incredibly privileged we are to be in the tech industry. I can't imagine people in the food service industry, for example, getting the same kind of attention</li><li>Collab tools:<ul><li>vid streaming is hot now</li><li><a href="https://github.com/jeanpaulsio/action-cable-signaling-server">https://github.com/jeanpaulsio/action-cable-signaling-server</a></li></ul></li></ul><h3><code>John</code> Layoffs</h3><ul><li>C19 forced our company to extend our runway, laying off half our team.</li><li>7 of 11 got laid off</li><li>This has been hard to adapt, created a lot of work and pushed out our timelines.</li></ul><h3>Interviews?</h3><ul><li>Phone Screens over a dozen<ul><li>Leads from personal network + spreadsheets</li><li>Hot tip: If you are in high demand set up a calendly</li><li>Hot tip: Block out time in your calendar so it's not wall to wall meetings<ul><li>30 minutes is bad 25 minutes and 55 minutes</li></ul></li></ul></li><li>Interviews 4 or 5 technical interviews</li></ul><h3>State of tech</h3><ul><li>Restaurants with awkward apps</li></ul><h3><code>John</code> Bad IRS Site</h3><ul><li>The new IRS website to get stimmy money breaks every single UI best practice. It’s a perfect case study usability 101<ul><li>Validations aren't until after submission</li><li>Not responsive</li><li>Only supports firefox  (Officially)</li><li>Very strange validations - money with no coma or $</li><li>ST vs Street with no previous notice.<ul><li><a href="https://www.reddit.com/r/IRS/comments/g2kf62/the_information_you_have_entered_does_not_match/">Reddit thread</a></li></ul></li></ul></li></ul><h3><code>JP</code> Government Websites are just kind of funny in general</h3><ul><li>I filled out the Census 2020 form yesterday (I know, I procrastinated)</li><li>Why are the options in the form of questions?</li></ul><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7a1ba855-0f9e-477f-9ec3-ef81a8cd9472/podcast_1.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7a1ba855-0f9e-477f-9ec3-ef81a8cd9472/podcast_1.png" /></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f517f483-d25a-450f-94eb-af8161464453/podcast_2.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f517f483-d25a-450f-94eb-af8161464453/podcast_2.png" /></p><p>save for another convo? vvv Yea for sure — Going too long. </p><p>Let's wrap </p><ul><li>Future Topics</li></ul><h1>Picks</h1><ul><li><p>John - <a href="https://www.notion.so/Ben-1710eda86d034224b431afff7631b09d">Notion Pro</a>  — <a href="https://www.notion.so/8c324a26348843d4800ba9b4afe68608?v=1208f3a058ed46b89ce948624225f490">Notion Examples</a> - Progress bars, advanced formulas Dependent tasks. A lot of fun tips / tricks / hacks</p><p>  <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c20823cd-3d28-47cc-8b31-c853445666a8/Screen_Shot_2020-04-28_at_5.24.43_PM.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c20823cd-3d28-47cc-8b31-c853445666a8/Screen_Shot_2020-04-28_at_5.24.43_PM.png" /></p></li><li><p><code>command + k</code> for links!</p></li><li><p><code>Shift + Enter</code> for new lines JP -</p></li><li><p>JP: <a href="https://www.youtube.com/playlist?list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo">Really cool PBS series - Crash Course Comp Sci</a></p></li></ul><h1>Links + References</h1><ul><li><a href="https://github.com/jeanpaulsio/action-cable-signaling-server">JP's Action Cable Signaling Server Repo</a></li><li><a href="https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/">OpenDoor Layoffs announcement</a></li></ul>
]]></description>
      <pubDate>Mon, 25 May 2020 12:00:10 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/tech-in-a-covid-world-tLl7L59l</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><h3><code>JP</code> Layoffs</h3><ul><li>Let's talk about layoffs!</li><li><a href="https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/">https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/</a></li><li>600+ employees</li><li>I got laid off on my birthday! The response has been overwhelmingly supportive and I've talked to dozens of startups in the last two weeks. (It's been exactly two weeks at the time of the recording)</li><li>Sometimes you have to realize how incredibly privileged we are to be in the tech industry. I can't imagine people in the food service industry, for example, getting the same kind of attention</li><li>Collab tools:<ul><li>vid streaming is hot now</li><li><a href="https://github.com/jeanpaulsio/action-cable-signaling-server">https://github.com/jeanpaulsio/action-cable-signaling-server</a></li></ul></li></ul><h3><code>John</code> Layoffs</h3><ul><li>C19 forced our company to extend our runway, laying off half our team.</li><li>7 of 11 got laid off</li><li>This has been hard to adapt, created a lot of work and pushed out our timelines.</li></ul><h3>Interviews?</h3><ul><li>Phone Screens over a dozen<ul><li>Leads from personal network + spreadsheets</li><li>Hot tip: If you are in high demand set up a calendly</li><li>Hot tip: Block out time in your calendar so it's not wall to wall meetings<ul><li>30 minutes is bad 25 minutes and 55 minutes</li></ul></li></ul></li><li>Interviews 4 or 5 technical interviews</li></ul><h3>State of tech</h3><ul><li>Restaurants with awkward apps</li></ul><h3><code>John</code> Bad IRS Site</h3><ul><li>The new IRS website to get stimmy money breaks every single UI best practice. It’s a perfect case study usability 101<ul><li>Validations aren't until after submission</li><li>Not responsive</li><li>Only supports firefox  (Officially)</li><li>Very strange validations - money with no coma or $</li><li>ST vs Street with no previous notice.<ul><li><a href="https://www.reddit.com/r/IRS/comments/g2kf62/the_information_you_have_entered_does_not_match/">Reddit thread</a></li></ul></li></ul></li></ul><h3><code>JP</code> Government Websites are just kind of funny in general</h3><ul><li>I filled out the Census 2020 form yesterday (I know, I procrastinated)</li><li>Why are the options in the form of questions?</li></ul><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7a1ba855-0f9e-477f-9ec3-ef81a8cd9472/podcast_1.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7a1ba855-0f9e-477f-9ec3-ef81a8cd9472/podcast_1.png" /></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f517f483-d25a-450f-94eb-af8161464453/podcast_2.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f517f483-d25a-450f-94eb-af8161464453/podcast_2.png" /></p><p>save for another convo? vvv Yea for sure — Going too long. </p><p>Let's wrap </p><ul><li>Future Topics</li></ul><h1>Picks</h1><ul><li><p>John - <a href="https://www.notion.so/Ben-1710eda86d034224b431afff7631b09d">Notion Pro</a>  — <a href="https://www.notion.so/8c324a26348843d4800ba9b4afe68608?v=1208f3a058ed46b89ce948624225f490">Notion Examples</a> - Progress bars, advanced formulas Dependent tasks. A lot of fun tips / tricks / hacks</p><p>  <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c20823cd-3d28-47cc-8b31-c853445666a8/Screen_Shot_2020-04-28_at_5.24.43_PM.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c20823cd-3d28-47cc-8b31-c853445666a8/Screen_Shot_2020-04-28_at_5.24.43_PM.png" /></p></li><li><p><code>command + k</code> for links!</p></li><li><p><code>Shift + Enter</code> for new lines JP -</p></li><li><p>JP: <a href="https://www.youtube.com/playlist?list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo">Really cool PBS series - Crash Course Comp Sci</a></p></li></ul><h1>Links + References</h1><ul><li><a href="https://github.com/jeanpaulsio/action-cable-signaling-server">JP's Action Cable Signaling Server Repo</a></li><li><a href="https://techcrunch.com/2020/04/15/softbank-backed-opendoor-has-announced-a-massive-layoff-cutting-35-of-its-employees/">OpenDoor Layoffs announcement</a></li></ul>
]]></content:encoded>
      <enclosure length="46018050" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/bc9746df-83af-48cb-8a51-ee1ea92511a5/s08e14_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Tech in a Covid World 😷</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:47:56</itunes:duration>
      <itunes:summary>This episode we talk about recent layoffs, government websites and lots of other examples and state of the union right now in tech. </itunes:summary>
      <itunes:subtitle>This episode we talk about recent layoffs, government websites and lots of other examples and state of the union right now in tech. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>14</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d1231c69-bbae-44f2-be13-522c0c1239c3</guid>
      <title>Hiring + Interviews 🤝</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><p><a href="https://medium.com/@alexallain/what-ive-learned-interviewing-500-people-the-interviewer-skills-ladder-for-high-growth-software-37778d2aae85">Article that inspired the episode</a></p><p>Quick notes from this article:</p><ul><li><strong>problem statement:</strong> interviewing can be annoying because it's an interruption from deep work</li><li><strong>problem statement:</strong> after you've done a ton, it can be boring</li><li><strong>two critical skillsets:</strong> attracting talent (making candidates want to work with you) + spotting talent (accurately assessing whether you want the candidate to work with you)</li><li>then it goes on to talk about beginner, competent, proficient, and expert interviewers</li><li>read this article to see where you are in both attracting and assessing talent</li></ul><h3>Context</h3><blockquote><p>How many interviews have you conducted?</p></blockquote><p>JP: At 2 years of Opendoor, I have conducted somewhere between 30-40 interviews. I wouldn't consider this a lot, but my last 10 have definitely been an improvement from my first 10.</p><p>John: Pre-tech I did around 50+ interviews. In tech I've done as well 30-40 interviews</p><blockquote><p>What type of interviews do you conduct? Behavioral? Technical?</p></blockquote><p>JP: I've only ever conducted technical interviews</p><p>John: I cover mostly behavioral/cultural and cover technical as well.</p><h3>Take me through your interview process:</h3><blockquote><p>what should a candidate expect if they were to be interviewed by you?</p></blockquote><p>JP: I set expectations really early on and give candidates a whole layout for the entire interview. The basic format for my interview is:</p><ol><li>quick intros, try to keep this to a maximum of: 3 minutes</li><li>introduction to the question + planning before execution: 5 minutes</li><li>pair programming: 45-50 minutes</li><li>closing questions: the remainder</li></ol><p>John: I always over-communicate and try to "do" as little as possible during the interview. I prioritize "Async" interviews as much as possible.</p><ul><li>More recent process:<ul><li><strong>Job Listing</strong> Job listing with very clear compensation listed</li><li><strong>Applications</strong> Applicants Apply (150+ for last open position)</li><li><strong>Shortlist</strong> Pick the top 10 (or so) I am interested in ignoring name or email address (Hide the columns) and look at the objective experience, read their writing (because we are remote)</li><li><strong>Code Challenge</strong> Email that top 5-10 and offer $100 to do a code challenge, takes anywhere from 2-4 hours. Last time it was implementing an API, they get the $100 when they submit a PR for review. Again set expectations on the start date, role, compensation etc. Set expectations for a review. It's a small test to see how we work together.</li><li><strong>Async Code Review</strong> Sr Developer and I leave comments, ask questions about the implementation Async.</li><li><strong>Real-time interviews —</strong> Then pick the top 2-3 from that phase and do real-time interviews.<ul><li>Re-iterate the position, compensation and expectations</li><li>We talk background, career goals and motivations for applying to this job</li><li>They walk me through their code challenge, why they wrote it the way they did.</li><li>Then I allow time for them to ask me questions about the position.</li></ul></li></ul></li></ul><h2>What would it take for someone to pass <i>your</i> interview?</h2><ul><li>JP: We have to fill out a form after we conduct interviews so there is some grading criteria. i.e. code quality, tests, communication, algorithm speed, etc. I try not to nit pick language specific, trivia-like things. For example, it doesn't matter to me if a candidate doesn't know off the top of their head the syntax of setTimeout if they've spent the last year coding mostly in Python.<ul><li>Things are obviously different for hiring a new grad vs. a senior engineer. The bar varies</li></ul></li><li>John: Core things I am looking for: effective communication (written and spoken), self-motivated individuals (managers of one), skilled learner, Very competent in at least one language or framework (not even my own stack).</li></ul><h2>Hot tips / Things to keep in mind</h2><p><strong>JP</strong></p><p>Don't let a candidate spin their wheels - try to unblock them. See what working with them would actually be like.</p><p><strong>John</strong></p><p>My interview style is a bit different.</p><ul><li>Honest — Never set any kind of false expectation, be yourself</li><li>Unpretentious — No trick questions or techno-bable</li><li>Real — Try to communicate and work with candidates as you would in the job.<ul><li>You'd never toss out a question "just to stump" a coworker</li></ul></li></ul><h3>Picks</h3><p>JP: <a href="https://github.com/ayu-theme/ayu-vim">https://github.com/ayu-theme/ayu-vim</a> - I've moved away from Dracula</p><p>JP: <a href="https://whimsical.com/">https://whimsical.com/</a></p><p>John: Book: <a href="https://www.amazon.com/Every-Tools-Hammer-Life-What-ebook/dp/B07MNJX8B5/ref=sr_1_2?crid=1VQV8NT7ML5DY&dchild=1&keywords=every+tools+a+hammer&qid=1586306726&sprefix=every+tool%2Caps%2C195&sr=8-2">Every Tool's a Hammer</a> by Adam Savage — Yes, Mythbusters guy but also incredible maker and leader of technical teams building really complex things</p><ul><li>so many great similarities to tech.</li><li>Planning, Working, Creativity, burnout, estimating,</li><li>plus a whole chapter on types of glue and random stories from his special effects days.</li><li>I've really dug this book, doing the audiobook, will be buying a physical copy.</li></ul>
]]></description>
      <pubDate>Mon, 27 Apr 2020 12:00:02 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/hiring-and-interviews-8YpIzGio</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><p><a href="https://medium.com/@alexallain/what-ive-learned-interviewing-500-people-the-interviewer-skills-ladder-for-high-growth-software-37778d2aae85">Article that inspired the episode</a></p><p>Quick notes from this article:</p><ul><li><strong>problem statement:</strong> interviewing can be annoying because it's an interruption from deep work</li><li><strong>problem statement:</strong> after you've done a ton, it can be boring</li><li><strong>two critical skillsets:</strong> attracting talent (making candidates want to work with you) + spotting talent (accurately assessing whether you want the candidate to work with you)</li><li>then it goes on to talk about beginner, competent, proficient, and expert interviewers</li><li>read this article to see where you are in both attracting and assessing talent</li></ul><h3>Context</h3><blockquote><p>How many interviews have you conducted?</p></blockquote><p>JP: At 2 years of Opendoor, I have conducted somewhere between 30-40 interviews. I wouldn't consider this a lot, but my last 10 have definitely been an improvement from my first 10.</p><p>John: Pre-tech I did around 50+ interviews. In tech I've done as well 30-40 interviews</p><blockquote><p>What type of interviews do you conduct? Behavioral? Technical?</p></blockquote><p>JP: I've only ever conducted technical interviews</p><p>John: I cover mostly behavioral/cultural and cover technical as well.</p><h3>Take me through your interview process:</h3><blockquote><p>what should a candidate expect if they were to be interviewed by you?</p></blockquote><p>JP: I set expectations really early on and give candidates a whole layout for the entire interview. The basic format for my interview is:</p><ol><li>quick intros, try to keep this to a maximum of: 3 minutes</li><li>introduction to the question + planning before execution: 5 minutes</li><li>pair programming: 45-50 minutes</li><li>closing questions: the remainder</li></ol><p>John: I always over-communicate and try to "do" as little as possible during the interview. I prioritize "Async" interviews as much as possible.</p><ul><li>More recent process:<ul><li><strong>Job Listing</strong> Job listing with very clear compensation listed</li><li><strong>Applications</strong> Applicants Apply (150+ for last open position)</li><li><strong>Shortlist</strong> Pick the top 10 (or so) I am interested in ignoring name or email address (Hide the columns) and look at the objective experience, read their writing (because we are remote)</li><li><strong>Code Challenge</strong> Email that top 5-10 and offer $100 to do a code challenge, takes anywhere from 2-4 hours. Last time it was implementing an API, they get the $100 when they submit a PR for review. Again set expectations on the start date, role, compensation etc. Set expectations for a review. It's a small test to see how we work together.</li><li><strong>Async Code Review</strong> Sr Developer and I leave comments, ask questions about the implementation Async.</li><li><strong>Real-time interviews —</strong> Then pick the top 2-3 from that phase and do real-time interviews.<ul><li>Re-iterate the position, compensation and expectations</li><li>We talk background, career goals and motivations for applying to this job</li><li>They walk me through their code challenge, why they wrote it the way they did.</li><li>Then I allow time for them to ask me questions about the position.</li></ul></li></ul></li></ul><h2>What would it take for someone to pass <i>your</i> interview?</h2><ul><li>JP: We have to fill out a form after we conduct interviews so there is some grading criteria. i.e. code quality, tests, communication, algorithm speed, etc. I try not to nit pick language specific, trivia-like things. For example, it doesn't matter to me if a candidate doesn't know off the top of their head the syntax of setTimeout if they've spent the last year coding mostly in Python.<ul><li>Things are obviously different for hiring a new grad vs. a senior engineer. The bar varies</li></ul></li><li>John: Core things I am looking for: effective communication (written and spoken), self-motivated individuals (managers of one), skilled learner, Very competent in at least one language or framework (not even my own stack).</li></ul><h2>Hot tips / Things to keep in mind</h2><p><strong>JP</strong></p><p>Don't let a candidate spin their wheels - try to unblock them. See what working with them would actually be like.</p><p><strong>John</strong></p><p>My interview style is a bit different.</p><ul><li>Honest — Never set any kind of false expectation, be yourself</li><li>Unpretentious — No trick questions or techno-bable</li><li>Real — Try to communicate and work with candidates as you would in the job.<ul><li>You'd never toss out a question "just to stump" a coworker</li></ul></li></ul><h3>Picks</h3><p>JP: <a href="https://github.com/ayu-theme/ayu-vim">https://github.com/ayu-theme/ayu-vim</a> - I've moved away from Dracula</p><p>JP: <a href="https://whimsical.com/">https://whimsical.com/</a></p><p>John: Book: <a href="https://www.amazon.com/Every-Tools-Hammer-Life-What-ebook/dp/B07MNJX8B5/ref=sr_1_2?crid=1VQV8NT7ML5DY&dchild=1&keywords=every+tools+a+hammer&qid=1586306726&sprefix=every+tool%2Caps%2C195&sr=8-2">Every Tool's a Hammer</a> by Adam Savage — Yes, Mythbusters guy but also incredible maker and leader of technical teams building really complex things</p><ul><li>so many great similarities to tech.</li><li>Planning, Working, Creativity, burnout, estimating,</li><li>plus a whole chapter on types of glue and random stories from his special effects days.</li><li>I've really dug this book, doing the audiobook, will be buying a physical copy.</li></ul>
]]></content:encoded>
      <enclosure length="42210024" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/98d04783-407b-4e51-ac32-36d6ba16139f/s08e13-hiring_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Hiring + Interviews 🤝</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:43:58</itunes:duration>
      <itunes:summary>This week JP and John walk through lots of good lessons learned, mistakes made and tips and tricks for being a better interviewer, interviewee and some high level on how to make a good hire. </itunes:summary>
      <itunes:subtitle>This week JP and John walk through lots of good lessons learned, mistakes made and tips and tricks for being a better interviewer, interviewee and some high level on how to make a good hire. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>13</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">11ea84cf-5d8c-4c2c-9e8d-8287042e0b3c</guid>
      <title>CSS Frameworks 🏗</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><h3>First, some fun questions:</h3><ol><li><p>👍or 👎 on writing CSS?</p></li><li><p>What do you love about CSS, what do you hate?</p></li><li><p>To this day, what are some of the things you don't understand?</p><ul><li>JP: CSS Grid, Floats (kind of. I always forget what the clearfix thing is for)</li></ul></li></ol><h2>Frameworks</h2><p>WTF ?— Here is a set of components you can build, pre-defined styles, gives you a starting point. Pre-buit UI.</p><p><strong>Popular Ones</strong></p><ul><li><p><strong>Boostrap — Pre-defined class "Components" <code>card shadow</code></strong></p></li><li><p><strong>Tailwinds — Much more like Tachyons <code>md:flex g-white rounded-lg p-6</code></strong></p></li><li><p>Material UI</p></li><li><p>Foundation</p></li><li><p>Atomic CSS / Tachyons</p></li><li><p>Skeleton</p></li></ul><h3>Pros / Cons</h3><ul><li><p>Tailwind</p><ul><li><p>Pro: Using tailwind for side project. Wrote 0 css</p><ul><li>Tailwind components (Basically a better looking bootstrap)</li></ul></li><li><p>Con: Output is derivative</p><ul><li><p>JP's argument — you could design <strong>anything</strong> you wanted</p></li><li><p>It's more of a function of what the docs provide.</p></li></ul></li><li><p>Pro for Tailwind — Tailwind doesn't come with baked in components</p></li></ul></li></ul><ul><li><p>How do we overcome derivative sites?</p><ul><li><p>Could be tools</p></li><li><p>But I think it's more about pushing the design side more</p></li><li><p>Thinking in terms of "Bootstrap Components"</p></li><li><p>Think more first principle</p></li><li><p>Strong designer to push you too break the bounds of these frameworks</p></li></ul></li></ul><h2>Frameworks - Pros and Cons of Each</h2><ul><li><p>Boostrap</p><ul><li>John: My top choice. I know it better than any other framework. I don't think it's "The best"</li></ul></li><li><p>Tailwinds</p></li><li><p>Tachyons</p><ul><li><p>John: Worked with it a lot, had some client projects use their own fork. Really powerful but it starts just feeling like "inline styles" SO MANY Classes</p><ul><li><p><code>bg-dark-green ba bw5 dshadow2 br2 pb3</code></p></li><li><p>It's like ok ok calm down.</p></li></ul></li></ul></li><li><p>Material UI</p></li><li><p>Skeleton</p><ul><li>Nice for quick projects. Super lightweight. Our agency site was built in Skeleton</li></ul></li></ul><h2>Implementation</h2><ul><li><p>Customizing it</p><ul><li><p>Tailwind</p><ul><li><p>Example: H1's — identifying patterns</p></li><li><p>Take a set of classes and use the "apply" function</p></li><li><p>Single set to define your custom classes.</p></li><li><p>You throw those into a single class called "Heading"</p></li></ul></li><li><p>Bootstrap</p><ul><li><p>Starts with customizing variables</p></li><li><p>These variabels are used in the</p></li></ul></li></ul></li></ul><h2>Picks</h2><p>JP:  <a href="https://thoughtbot.com/blog/running-specs-from-vim">https://thoughtbot.com/blog/running-specs-from-vim</a></p><p><strong>John:</strong></p><ul><li><p><strong>"Copy css" from sketch</strong></p></li><li><p>Css in Figma</p></li><li><p>Re-pick: <a href="https://refactoringui.com/">https://refactoringui.com/</a> (Same guy behind Tailwind)</p></li><li><p>Referenced: <a href="https://a.singlediv.com/">https://a.singlediv.com/</a></p></li></ul>
]]></description>
      <pubDate>Mon, 20 Apr 2020 12:00:08 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/css-frameworks-jrzmwkgD</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><h3>First, some fun questions:</h3><ol><li><p>👍or 👎 on writing CSS?</p></li><li><p>What do you love about CSS, what do you hate?</p></li><li><p>To this day, what are some of the things you don't understand?</p><ul><li>JP: CSS Grid, Floats (kind of. I always forget what the clearfix thing is for)</li></ul></li></ol><h2>Frameworks</h2><p>WTF ?— Here is a set of components you can build, pre-defined styles, gives you a starting point. Pre-buit UI.</p><p><strong>Popular Ones</strong></p><ul><li><p><strong>Boostrap — Pre-defined class "Components" <code>card shadow</code></strong></p></li><li><p><strong>Tailwinds — Much more like Tachyons <code>md:flex g-white rounded-lg p-6</code></strong></p></li><li><p>Material UI</p></li><li><p>Foundation</p></li><li><p>Atomic CSS / Tachyons</p></li><li><p>Skeleton</p></li></ul><h3>Pros / Cons</h3><ul><li><p>Tailwind</p><ul><li><p>Pro: Using tailwind for side project. Wrote 0 css</p><ul><li>Tailwind components (Basically a better looking bootstrap)</li></ul></li><li><p>Con: Output is derivative</p><ul><li><p>JP's argument — you could design <strong>anything</strong> you wanted</p></li><li><p>It's more of a function of what the docs provide.</p></li></ul></li><li><p>Pro for Tailwind — Tailwind doesn't come with baked in components</p></li></ul></li></ul><ul><li><p>How do we overcome derivative sites?</p><ul><li><p>Could be tools</p></li><li><p>But I think it's more about pushing the design side more</p></li><li><p>Thinking in terms of "Bootstrap Components"</p></li><li><p>Think more first principle</p></li><li><p>Strong designer to push you too break the bounds of these frameworks</p></li></ul></li></ul><h2>Frameworks - Pros and Cons of Each</h2><ul><li><p>Boostrap</p><ul><li>John: My top choice. I know it better than any other framework. I don't think it's "The best"</li></ul></li><li><p>Tailwinds</p></li><li><p>Tachyons</p><ul><li><p>John: Worked with it a lot, had some client projects use their own fork. Really powerful but it starts just feeling like "inline styles" SO MANY Classes</p><ul><li><p><code>bg-dark-green ba bw5 dshadow2 br2 pb3</code></p></li><li><p>It's like ok ok calm down.</p></li></ul></li></ul></li><li><p>Material UI</p></li><li><p>Skeleton</p><ul><li>Nice for quick projects. Super lightweight. Our agency site was built in Skeleton</li></ul></li></ul><h2>Implementation</h2><ul><li><p>Customizing it</p><ul><li><p>Tailwind</p><ul><li><p>Example: H1's — identifying patterns</p></li><li><p>Take a set of classes and use the "apply" function</p></li><li><p>Single set to define your custom classes.</p></li><li><p>You throw those into a single class called "Heading"</p></li></ul></li><li><p>Bootstrap</p><ul><li><p>Starts with customizing variables</p></li><li><p>These variabels are used in the</p></li></ul></li></ul></li></ul><h2>Picks</h2><p>JP:  <a href="https://thoughtbot.com/blog/running-specs-from-vim">https://thoughtbot.com/blog/running-specs-from-vim</a></p><p><strong>John:</strong></p><ul><li><p><strong>"Copy css" from sketch</strong></p></li><li><p>Css in Figma</p></li><li><p>Re-pick: <a href="https://refactoringui.com/">https://refactoringui.com/</a> (Same guy behind Tailwind)</p></li><li><p>Referenced: <a href="https://a.singlediv.com/">https://a.singlediv.com/</a></p></li></ul>
]]></content:encoded>
      <enclosure length="64770206" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/d9dc6a45-124e-439e-9b07-aa84a9159763/s08e12-css_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>CSS Frameworks 🏗</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>01:07:28</itunes:duration>
      <itunes:summary>Deep dive into some of the popular CSS frameworks. Bootstrap, tachyons tailwind and more. Tips, tricks, pros cons lessons and frustrations. It&apos;s all here. </itunes:summary>
      <itunes:subtitle>Deep dive into some of the popular CSS frameworks. Bootstrap, tachyons tailwind and more. Tips, tricks, pros cons lessons and frustrations. It&apos;s all here. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>12</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">44a40ecf-09b4-43e7-a4f6-1b872bc4aa7f</guid>
      <title>Developer Roadmap 2020 🗺</title>
      <description><![CDATA[<p><strong>Welcome to Iteration, a weekly podcast about programming, development, and design.</strong></p><ul><li>My name is JP, I am a software engineer at Opendoor. Today I am joined by John</li><li>John Intro — I build and maintain Web Apps for startups.</li></ul><h3>Developer roadmap 2020</h3><ul><li>Web search "Developer roadmap 2020" and you'll find this Github repo</li><li><a href="https://github.com/kamranahmedse/developer-roadmap">https://github.com/kamranahmedse/developer-roadmap</a></li><li>You can also find it at <a href="https://roadmap.sh/">https://roadmap.sh/</a></li><li>Its a set of charts demonstrating the paths that you can take and the technologies that you would want to adopt in order to become a frontend, backend or a DevOps.</li><li>Looking at a chart with hundreds of "Nodes" each representing potentially hundreds of hours and their own specialties all-together</li></ul><h2>Looking at this for 2 reasons</h2><p>1 — If you are new to development, this helps you make sense of all the resources, languages and frameworks. These roadmaps cover <strong>everything</strong> that is there to learn.  Don't feel overwhelmed, you don't need to learn it all in the beginning if you are just getting started, focus on the core and the rest comes over time </p><p>2 — If you are experienced it helps you identify and organize gaps in your knowledge. </p><h3>The two Paths</h3><ul><li>Front End  — "Everything the user sees"</li><li>Back end</li><li>Dev ops</li></ul><p>John: What about Mobile? This is called the "Web Developer Roadmap" but there is a lot of overlap</p><h2>Basics</h2><p>Web Dev 2020</p><ul><li>Front end + back end + dev ops</li><li>Pre-reqs:</li></ul><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a60fa0e7-ccdc-4c95-8012-e0fb89a3f045/Untitled.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a60fa0e7-ccdc-4c95-8012-e0fb89a3f045/Untitled.png" /></p><p><strong>John: How does someone choose a path?</strong> </p><ul><li>JP: It depends — what interests you? Everything is biasing toward the front end.</li><li>John: When in doubt pick front-end, especially in 2020. Serverless, GraphQL etc</li></ul><h2>Front End Roadmap</h2><p>"Everything the user sees" </p><p><a href="https://roadmap.sh/frontend">https://roadmap.sh/frontend</a></p><ul><li>JP: Honestly, I don't know how DNS works. I should really do a google search for what happens when you do a google search</li><li>JP: Surprisingly, I know a lot of the stuff up until it drops down into PWA stuff.</li><li>JP: mmm... do you really need to know GraphQL? This might be one of those things where I'm old man shaking fist at cloud</li></ul><h2>Back-end Roadmap</h2><p>"Everything that the user doesn't see" </p><p><a href="https://roadmap.sh/backend">https://roadmap.sh/backend</a></p><p>JP: I wonder why javascript is the personal recommendation for back end language</p><p>John: Web: JavaScript, Ruby, Go or PHP seem to be good choices in today's landscape. Mobile of course is C# or Java</p><h2>DevOps Roadmap</h2><p>"The equipment it all runs on" — The boiler room in titanic </p><p><a href="https://roadmap.sh/devops">https://roadmap.sh/devops</a></p><p>JP and John are least experienced in this bucket. </p><p>JP: Learn heroku lol</p><ul><li>"Get some administration knowledge in some OS"</li></ul><h2>Wrap Up</h2><h3>Picks:</h3><ul><li><a href="https://www.getcloudapp.com/">Cloud App</a> — Way easier way to share screenshots + gifs</li><li><a href="https://www.onsched.com/">https://www.onsched.com/</a> - Appointment API</li></ul>
]]></description>
      <pubDate>Mon, 23 Mar 2020 12:00:35 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/developer-roadmap-2020-twAN8H8B</link>
      <content:encoded><![CDATA[<p><strong>Welcome to Iteration, a weekly podcast about programming, development, and design.</strong></p><ul><li>My name is JP, I am a software engineer at Opendoor. Today I am joined by John</li><li>John Intro — I build and maintain Web Apps for startups.</li></ul><h3>Developer roadmap 2020</h3><ul><li>Web search "Developer roadmap 2020" and you'll find this Github repo</li><li><a href="https://github.com/kamranahmedse/developer-roadmap">https://github.com/kamranahmedse/developer-roadmap</a></li><li>You can also find it at <a href="https://roadmap.sh/">https://roadmap.sh/</a></li><li>Its a set of charts demonstrating the paths that you can take and the technologies that you would want to adopt in order to become a frontend, backend or a DevOps.</li><li>Looking at a chart with hundreds of "Nodes" each representing potentially hundreds of hours and their own specialties all-together</li></ul><h2>Looking at this for 2 reasons</h2><p>1 — If you are new to development, this helps you make sense of all the resources, languages and frameworks. These roadmaps cover <strong>everything</strong> that is there to learn.  Don't feel overwhelmed, you don't need to learn it all in the beginning if you are just getting started, focus on the core and the rest comes over time </p><p>2 — If you are experienced it helps you identify and organize gaps in your knowledge. </p><h3>The two Paths</h3><ul><li>Front End  — "Everything the user sees"</li><li>Back end</li><li>Dev ops</li></ul><p>John: What about Mobile? This is called the "Web Developer Roadmap" but there is a lot of overlap</p><h2>Basics</h2><p>Web Dev 2020</p><ul><li>Front end + back end + dev ops</li><li>Pre-reqs:</li></ul><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a60fa0e7-ccdc-4c95-8012-e0fb89a3f045/Untitled.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a60fa0e7-ccdc-4c95-8012-e0fb89a3f045/Untitled.png" /></p><p><strong>John: How does someone choose a path?</strong> </p><ul><li>JP: It depends — what interests you? Everything is biasing toward the front end.</li><li>John: When in doubt pick front-end, especially in 2020. Serverless, GraphQL etc</li></ul><h2>Front End Roadmap</h2><p>"Everything the user sees" </p><p><a href="https://roadmap.sh/frontend">https://roadmap.sh/frontend</a></p><ul><li>JP: Honestly, I don't know how DNS works. I should really do a google search for what happens when you do a google search</li><li>JP: Surprisingly, I know a lot of the stuff up until it drops down into PWA stuff.</li><li>JP: mmm... do you really need to know GraphQL? This might be one of those things where I'm old man shaking fist at cloud</li></ul><h2>Back-end Roadmap</h2><p>"Everything that the user doesn't see" </p><p><a href="https://roadmap.sh/backend">https://roadmap.sh/backend</a></p><p>JP: I wonder why javascript is the personal recommendation for back end language</p><p>John: Web: JavaScript, Ruby, Go or PHP seem to be good choices in today's landscape. Mobile of course is C# or Java</p><h2>DevOps Roadmap</h2><p>"The equipment it all runs on" — The boiler room in titanic </p><p><a href="https://roadmap.sh/devops">https://roadmap.sh/devops</a></p><p>JP and John are least experienced in this bucket. </p><p>JP: Learn heroku lol</p><ul><li>"Get some administration knowledge in some OS"</li></ul><h2>Wrap Up</h2><h3>Picks:</h3><ul><li><a href="https://www.getcloudapp.com/">Cloud App</a> — Way easier way to share screenshots + gifs</li><li><a href="https://www.onsched.com/">https://www.onsched.com/</a> - Appointment API</li></ul>
]]></content:encoded>
      <enclosure length="55877261" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/dc9835fb-d4a6-4519-913f-aae8469a2744/s08e09_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Developer Roadmap 2020 🗺</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:57:29</itunes:duration>
      <itunes:summary>In this episode, we walk through the 2020 developer roadmap. These roadmaps layout all the essential steps and pieces it takes to become a web developer in 2020. </itunes:summary>
      <itunes:subtitle>In this episode, we walk through the 2020 developer roadmap. These roadmaps layout all the essential steps and pieces it takes to become a web developer in 2020. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>11</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">41a3ca13-0fd7-4afb-85bf-59aabe05ba19</guid>
      <title>😷 Working Remote: Coronavirus Special</title>
      <description><![CDATA[<h2>Welcome to Iteration, a weekly podcast about programming, development, and design.</h2><ul><li>John: Hi I'm John a software engineer at a tech start up — Joined by JP</li><li>JP: I'm JP, I'm a software engineer at a tech start up</li></ul><p>Today we're going to be talking about something that's frequently discussed on the Twitters-phere:</p><h1>Remote work.</h1><h2>Take me through your day</h2><p><i>(day in the life of a remote developer)</i></p><ul><li>Get dressed</li><li>Take a lunch</li></ul><h2>What are some of the challenges you've faced?</h2><ul><li>John: schedule work just becomes intertwined with life. Dedicated meeting days or blocks make life so much better. Having some kind of boundaries.</li><li>John: communications making sure to have a place for “chatter” and an “updates” cadence.</li></ul><h3><strong>Some tips?</strong></h3><p><strong>Get dressed every morning</strong></p><p><strong>Have a dedicated space or device</strong></p><p><strong>Get good at notification settings and use them</strong></p><ul><li>Slack Status vs "Snooze" — For the hour</li></ul><p><strong>Office Hours / Schedule</strong></p><p><strong>Over communicate in passive channels</strong></p><p><strong>Video / Audio Setup</strong></p><ul><li>Good Audio is most important</li><li>Invest in lighting before a camera.</li><li>A bad camera with good lighting is better than good camera with bad lighting.</li></ul><p><strong>Change your scenery</strong></p><p><strong>Work from energy not time.</strong></p><p><strong>Reduce distractions. Really don’t work with Netflix on in the background.</strong></p><h2>What are some of the pros / cons of working remote?</h2><ul><li>John: Pros: random bunch dates with the wife. We brunch hard.</li><li>John: Flexibility to travel and work. (Trip to Nashville this weekend) .</li><li>John: Lunch break bike rides and dip in the ocean.</li><li>John: Changing scenery, will regularly work from a park on a mountain top or pretentious coffee shops</li></ul><h2>What are your favorite tools?</h2><ul><li>Standing Desk</li><li>Loom</li><li>Slack</li><li><a href="https://apps.apple.com/us/app/miranda-time-zone-converter-world-clock-meeting-scheduler/id906788140">Miranda time zones app</a></li></ul><h3>Audio / Video Setup</h3><ul><li>Headphones with Good Audio #1 priority, #2 is noise canceling (if you need it)</li><li><a href="https://www.amazon.com/Blue-Yeti-USB-Microphone-Blackout/dp/B00N1YPXW2/ref=sr_1_2?keywords=Blue+Yeti+Mic&qid=1583986810&sr=8-2">Blue Yeti Mic</a></li><li>A bad camera with good lighting is better than a good camera with bad lighting.</li><li><a href="https://www.elgato.com/en/gaming/key-light">Elgato Key Light</a></li><li><a href="https://www.amazon.com/Logitech-BRIO-Conferencing-Recording-Streaming/dp/B01N5UOYC4/ref=sr_1_1?crid=1E20F70N6SFMN&keywords=logetic+brio&qid=1583986793&sprefix=logitic+bri%2Caps%2C203&sr=8-1">Logitech Brio Webcam</a></li></ul><p><a href="https://github.com/KyleAMathews/typefaces">https://github.com/KyleAMathews/typefaces</a></p><h2><a href="https://imgur.com/a/WZBfVG4">Photos of our home office Desk Setups</a></h2><h2>Resources</h2><ul><li><a href="https://www.amazon.com/Remote-Office-Required-Jason-Fried/dp/0804137501">Book: Remote</a></li><li><a href="https://zapier.com/learn/remote-work/">Book: Ultimate Guide to remote work</a></li></ul><h2>Picks</h2><ul><li><a href="https://github.com/ptsochantaris/trailer">Trailer Github App</a></li><li><a href="https://github.com/KyleAMathews/typefaces">Typefaces — Self host google fonts</a></li><li><a href="http://www.supermarketbook.com/">Supermarket</a> — Just a fun book</li></ul>
]]></description>
      <pubDate>Fri, 13 Mar 2020 12:00:17 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/working-remote-coronavirus-special-5Mr1h5_S</link>
      <content:encoded><![CDATA[<h2>Welcome to Iteration, a weekly podcast about programming, development, and design.</h2><ul><li>John: Hi I'm John a software engineer at a tech start up — Joined by JP</li><li>JP: I'm JP, I'm a software engineer at a tech start up</li></ul><p>Today we're going to be talking about something that's frequently discussed on the Twitters-phere:</p><h1>Remote work.</h1><h2>Take me through your day</h2><p><i>(day in the life of a remote developer)</i></p><ul><li>Get dressed</li><li>Take a lunch</li></ul><h2>What are some of the challenges you've faced?</h2><ul><li>John: schedule work just becomes intertwined with life. Dedicated meeting days or blocks make life so much better. Having some kind of boundaries.</li><li>John: communications making sure to have a place for “chatter” and an “updates” cadence.</li></ul><h3><strong>Some tips?</strong></h3><p><strong>Get dressed every morning</strong></p><p><strong>Have a dedicated space or device</strong></p><p><strong>Get good at notification settings and use them</strong></p><ul><li>Slack Status vs "Snooze" — For the hour</li></ul><p><strong>Office Hours / Schedule</strong></p><p><strong>Over communicate in passive channels</strong></p><p><strong>Video / Audio Setup</strong></p><ul><li>Good Audio is most important</li><li>Invest in lighting before a camera.</li><li>A bad camera with good lighting is better than good camera with bad lighting.</li></ul><p><strong>Change your scenery</strong></p><p><strong>Work from energy not time.</strong></p><p><strong>Reduce distractions. Really don’t work with Netflix on in the background.</strong></p><h2>What are some of the pros / cons of working remote?</h2><ul><li>John: Pros: random bunch dates with the wife. We brunch hard.</li><li>John: Flexibility to travel and work. (Trip to Nashville this weekend) .</li><li>John: Lunch break bike rides and dip in the ocean.</li><li>John: Changing scenery, will regularly work from a park on a mountain top or pretentious coffee shops</li></ul><h2>What are your favorite tools?</h2><ul><li>Standing Desk</li><li>Loom</li><li>Slack</li><li><a href="https://apps.apple.com/us/app/miranda-time-zone-converter-world-clock-meeting-scheduler/id906788140">Miranda time zones app</a></li></ul><h3>Audio / Video Setup</h3><ul><li>Headphones with Good Audio #1 priority, #2 is noise canceling (if you need it)</li><li><a href="https://www.amazon.com/Blue-Yeti-USB-Microphone-Blackout/dp/B00N1YPXW2/ref=sr_1_2?keywords=Blue+Yeti+Mic&qid=1583986810&sr=8-2">Blue Yeti Mic</a></li><li>A bad camera with good lighting is better than a good camera with bad lighting.</li><li><a href="https://www.elgato.com/en/gaming/key-light">Elgato Key Light</a></li><li><a href="https://www.amazon.com/Logitech-BRIO-Conferencing-Recording-Streaming/dp/B01N5UOYC4/ref=sr_1_1?crid=1E20F70N6SFMN&keywords=logetic+brio&qid=1583986793&sprefix=logitic+bri%2Caps%2C203&sr=8-1">Logitech Brio Webcam</a></li></ul><p><a href="https://github.com/KyleAMathews/typefaces">https://github.com/KyleAMathews/typefaces</a></p><h2><a href="https://imgur.com/a/WZBfVG4">Photos of our home office Desk Setups</a></h2><h2>Resources</h2><ul><li><a href="https://www.amazon.com/Remote-Office-Required-Jason-Fried/dp/0804137501">Book: Remote</a></li><li><a href="https://zapier.com/learn/remote-work/">Book: Ultimate Guide to remote work</a></li></ul><h2>Picks</h2><ul><li><a href="https://github.com/ptsochantaris/trailer">Trailer Github App</a></li><li><a href="https://github.com/KyleAMathews/typefaces">Typefaces — Self host google fonts</a></li><li><a href="http://www.supermarketbook.com/">Supermarket</a> — Just a fun book</li></ul>
]]></content:encoded>
      <enclosure length="40341745" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/589eb165-41fa-4cd0-8947-b05ed908a75a/iteration-se08e10-3-11-20-9-16-pm_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>😷 Working Remote: Coronavirus Special</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:42:01</itunes:duration>
      <itunes:summary>With Corona Virus turning every company into a remote company JP and John go through tips tricks and recommendations for working remote. </itunes:summary>
      <itunes:subtitle>With Corona Virus turning every company into a remote company JP and John go through tips tricks and recommendations for working remote. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>10</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">971b1dcc-a103-4617-80df-767e6120f841</guid>
      <title>Third-Party API&apos;s 🔌</title>
      <description><![CDATA[<h3>This week: Essential integrations / services / API' s</h3><p>We are going to be talking through the main / really popular API partners out there and give some quick feedback on how to integrate/go about them. Plus some lessons learned to keep in mind when planning integrations like this.</p><p><strong>Sendgrid + Other Transactional Email</strong></p><p>John: Formatting emails — inline styles only.</p><p>John: Some services have "Templates" with "Placeholders", some you pass the full HTML</p><p>John: Having some kind fo "log" object in your own domain can be very helpful.</p><p>John: Priority on background jobs for timely emails —</p><p>JP: Iterable. Opendoor uses this tool to send text, email, and push notifications. Everything hinges around handlebars / mustache and OOF - inline styles</p><p>JP: Side project with send grid, just a list of template ids</p><p>await deliverTemplateEmail({ to: user.emailAddress, templateId: SOME_TEMPLATE_ID, data: { contactFirstName: user.firstName, viewMyAccountLink: ${config.BASE_URL}/user/dashboard, }, });</p><p><strong>Stripe + Other Payment Providers</strong></p><ul><li>John: Tokenization and data storage</li><li>John: Drop in vs Whitelabel — "Checkout" vs "Elements"</li><li>John: Embrace Test Mode in Stipe (Super powerful)</li><li>John: Subscriptions, Promocodes + More</li><li>JP: I actually don't have much to say about payment providers. The interesting thing is that in Opendoor world, we hand off our users to an operator. I.e. you wouldn't purchase a home a la Amazon</li></ul><p><strong>Twilio (SMS)</strong></p><ul><li>John: STOP replies edge case</li><li>John: Logs are helpful</li><li>John: Twilio Webhooks</li><li>John: Testing mocks is really useful</li><li>JP: Seriously, twilio powers the world. We've used tools that hook into Twilio that provide an interface for customer support. See Front App</li></ul><p><strong>Scheduler / Chron Jobs</strong></p><ul><li>John: Heroku Scheduler</li><li>John: Think about failure handling, resend logic into scheudulers</li></ul><p><strong>OAuth Login?</strong></p><p>Other?</p><h3>Picks</h3><ul><li>John: <a href="https://www.sweetmarias.com/">Sweet Maria's Green Coffee Beans and Roasting Guides</a></li><li>JP: None!</li></ul>
]]></description>
      <pubDate>Mon, 9 Mar 2020 12:00:15 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/third-party-apis-XQ6fCZN3</link>
      <content:encoded><![CDATA[<h3>This week: Essential integrations / services / API' s</h3><p>We are going to be talking through the main / really popular API partners out there and give some quick feedback on how to integrate/go about them. Plus some lessons learned to keep in mind when planning integrations like this.</p><p><strong>Sendgrid + Other Transactional Email</strong></p><p>John: Formatting emails — inline styles only.</p><p>John: Some services have "Templates" with "Placeholders", some you pass the full HTML</p><p>John: Having some kind fo "log" object in your own domain can be very helpful.</p><p>John: Priority on background jobs for timely emails —</p><p>JP: Iterable. Opendoor uses this tool to send text, email, and push notifications. Everything hinges around handlebars / mustache and OOF - inline styles</p><p>JP: Side project with send grid, just a list of template ids</p><p>await deliverTemplateEmail({ to: user.emailAddress, templateId: SOME_TEMPLATE_ID, data: { contactFirstName: user.firstName, viewMyAccountLink: ${config.BASE_URL}/user/dashboard, }, });</p><p><strong>Stripe + Other Payment Providers</strong></p><ul><li>John: Tokenization and data storage</li><li>John: Drop in vs Whitelabel — "Checkout" vs "Elements"</li><li>John: Embrace Test Mode in Stipe (Super powerful)</li><li>John: Subscriptions, Promocodes + More</li><li>JP: I actually don't have much to say about payment providers. The interesting thing is that in Opendoor world, we hand off our users to an operator. I.e. you wouldn't purchase a home a la Amazon</li></ul><p><strong>Twilio (SMS)</strong></p><ul><li>John: STOP replies edge case</li><li>John: Logs are helpful</li><li>John: Twilio Webhooks</li><li>John: Testing mocks is really useful</li><li>JP: Seriously, twilio powers the world. We've used tools that hook into Twilio that provide an interface for customer support. See Front App</li></ul><p><strong>Scheduler / Chron Jobs</strong></p><ul><li>John: Heroku Scheduler</li><li>John: Think about failure handling, resend logic into scheudulers</li></ul><p><strong>OAuth Login?</strong></p><p>Other?</p><h3>Picks</h3><ul><li>John: <a href="https://www.sweetmarias.com/">Sweet Maria's Green Coffee Beans and Roasting Guides</a></li><li>JP: None!</li></ul>
]]></content:encoded>
      <enclosure length="37458785" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/7fbdb9c1-0324-4eac-b0aa-214612c1c064/s08e08_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Third-Party API&apos;s 🔌</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:38:24</itunes:duration>
      <itunes:summary>This episode we talk through third-party API&apos;s, integrations and more. From Stipe, Twilio, transactional emails and moe. </itunes:summary>
      <itunes:subtitle>This episode we talk through third-party API&apos;s, integrations and more. From Stipe, Twilio, transactional emails and moe. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>9</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7abf7746-9bb6-4492-b91f-c18514f123fa</guid>
      <title>Code Reviews 🤓</title>
      <description><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><ul><li>My name is JP, I am a software engineer at Opendoor. Today I am joined by John</li><li>John Intro</li></ul><p>This week on code reviews </p><p>What makes good code review? Here's a link I found on reddit a while ago:</p><p><a href="http://cassandra.apache.org/doc/latest/development/how_to_review.html">http://cassandra.apache.org/doc/latest/development/how_to_review.html</a></p><p><a href="https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/">https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/</a></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9a157e12-0e24-491a-83de-c69f7637ec77/FullSizeRender.jpeg" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9a157e12-0e24-491a-83de-c69f7637ec77/FullSizeRender.jpeg" /></p><p>Another tweet:</p><p><a href="https://twitter.com/addyosmani/status/1198502828425150465">https://twitter.com/addyosmani/status/1198502828425150465</a></p><ul><li><strong>Any good / bad experiences with CR?</strong><ul><li>JP: It's not personal</li><li>John: I've worked with team members who take feedback as a prescription for every time<ul><li>Rant about chefs, recipes and concepts</li></ul></li><li>John: People not giving the PR in context. It's flagged WIP and then calling out a comment or a long method. Focus on the approach not the syntax at this point.</li><li>John: I give code reviews for my clients team or other agencies.<ul><li>Can feel like a power struggle.</li><li>I have to sometimes be open minded about solutions.</li><li>If tests are passing and it's reasonably documented and maintainable, it gets merged.</li><li>Example: Very javascript heavy interaction that could of just been Markup</li></ul></li></ul></li><li><strong>What was your first CR like (receiving it and giving it)?</strong><ul><li>JP: it took me a while to get comfortable leaving code review for people who I looked up to.  <strong>+1</strong></li><li>John: It's hard getting feedback from the team who works under you, they can be shy about it. Can be frustrating. That's why at several points I've literally paid a tutor.</li></ul></li><li><strong>How frequently do you do it?</strong><ul><li>John: I get reviewed once a week. I give reviews multiple times a day.</li></ul></li></ul><h2>How is CR Conducted at John's agency vs at Opendoor?</h2><ul><li>JP: Different kinds of PR's - WIP, Ready for Code Review, etc</li><li>JP: CR Etiquette</li><li>John: It's pretty informal — working on stronger processes around this. We "Sometimes" do a WIP review. Lead Dev or I always do a final review before deployments.</li><li>John: For more "final" reviews, I try to summarize my thoughts into an actual checklist into the main comment body.</li></ul><h2>CR Tips</h2><ul><li>JP: Take your time with it</li><li>JP: Pull the code down and run it. Tinker around. This helps me see the bigger picture</li><li>JP: Know when to leave nit pick comments.</li><li>JP: Think of the potential test cases before you read them.</li><li>John: Giving Good feedback<ul><li>Consider the <a href="https://www.businessinsider.com/5-tips-for-giving-constructive-feedback-in-the-office-2012-11">McKinsey Approach</a><ul><li>Permission</li><li>Observation</li><li>I noticed that... Have you considered...</li><li>Try to take ego out of it</li><li>Never assume</li><li>Compliment Sandwich —</li><li>Bring it all together: Wow, this was a lot of hard work. Great job overall. I noticed that you brought in JQuery as a dependency. Have you considered using Vanila JS instead? That way we keep our site fast and avoid possibly uneccisary dependencies. Here's an article that might help. Very impressed by your CSS skills in this. Keep rocking!</li></ul></li></ul></li><li>JP: Get other engineers involved <strong>+1 Mob Review</strong></li><li>John: Ideally the person who submitted the PR takes the time to fix their own code. Sometimes you've just got to get code live.<ul><li>Async "Pair" — turn on screen recorder, walk through all your comments as you fix them. Do this when code is pressed for time.</li></ul></li></ul><hr /><h3>Picks</h3><ul><li>JP: <a href="https://www.gitify.io/">https://www.gitify.io/</a></li><li>JP2: <a href="https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/">https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/</a></li><li>John: Rocket Emoji's - <a href="https://matthewpalmer.net/rocket/">https://matthewpalmer.net/rocket/</a></li></ul>
]]></description>
      <pubDate>Mon, 2 Mar 2020 13:00:28 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/code-reviews-xUFsiN4Y</link>
      <content:encoded><![CDATA[<blockquote><p>Welcome to Iteration, a weekly podcast about programming, development, and design.</p></blockquote><ul><li>My name is JP, I am a software engineer at Opendoor. Today I am joined by John</li><li>John Intro</li></ul><p>This week on code reviews </p><p>What makes good code review? Here's a link I found on reddit a while ago:</p><p><a href="http://cassandra.apache.org/doc/latest/development/how_to_review.html">http://cassandra.apache.org/doc/latest/development/how_to_review.html</a></p><p><a href="https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/">https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/</a></p><p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9a157e12-0e24-491a-83de-c69f7637ec77/FullSizeRender.jpeg" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9a157e12-0e24-491a-83de-c69f7637ec77/FullSizeRender.jpeg" /></p><p>Another tweet:</p><p><a href="https://twitter.com/addyosmani/status/1198502828425150465">https://twitter.com/addyosmani/status/1198502828425150465</a></p><ul><li><strong>Any good / bad experiences with CR?</strong><ul><li>JP: It's not personal</li><li>John: I've worked with team members who take feedback as a prescription for every time<ul><li>Rant about chefs, recipes and concepts</li></ul></li><li>John: People not giving the PR in context. It's flagged WIP and then calling out a comment or a long method. Focus on the approach not the syntax at this point.</li><li>John: I give code reviews for my clients team or other agencies.<ul><li>Can feel like a power struggle.</li><li>I have to sometimes be open minded about solutions.</li><li>If tests are passing and it's reasonably documented and maintainable, it gets merged.</li><li>Example: Very javascript heavy interaction that could of just been Markup</li></ul></li></ul></li><li><strong>What was your first CR like (receiving it and giving it)?</strong><ul><li>JP: it took me a while to get comfortable leaving code review for people who I looked up to.  <strong>+1</strong></li><li>John: It's hard getting feedback from the team who works under you, they can be shy about it. Can be frustrating. That's why at several points I've literally paid a tutor.</li></ul></li><li><strong>How frequently do you do it?</strong><ul><li>John: I get reviewed once a week. I give reviews multiple times a day.</li></ul></li></ul><h2>How is CR Conducted at John's agency vs at Opendoor?</h2><ul><li>JP: Different kinds of PR's - WIP, Ready for Code Review, etc</li><li>JP: CR Etiquette</li><li>John: It's pretty informal — working on stronger processes around this. We "Sometimes" do a WIP review. Lead Dev or I always do a final review before deployments.</li><li>John: For more "final" reviews, I try to summarize my thoughts into an actual checklist into the main comment body.</li></ul><h2>CR Tips</h2><ul><li>JP: Take your time with it</li><li>JP: Pull the code down and run it. Tinker around. This helps me see the bigger picture</li><li>JP: Know when to leave nit pick comments.</li><li>JP: Think of the potential test cases before you read them.</li><li>John: Giving Good feedback<ul><li>Consider the <a href="https://www.businessinsider.com/5-tips-for-giving-constructive-feedback-in-the-office-2012-11">McKinsey Approach</a><ul><li>Permission</li><li>Observation</li><li>I noticed that... Have you considered...</li><li>Try to take ego out of it</li><li>Never assume</li><li>Compliment Sandwich —</li><li>Bring it all together: Wow, this was a lot of hard work. Great job overall. I noticed that you brought in JQuery as a dependency. Have you considered using Vanila JS instead? That way we keep our site fast and avoid possibly uneccisary dependencies. Here's an article that might help. Very impressed by your CSS skills in this. Keep rocking!</li></ul></li></ul></li><li>JP: Get other engineers involved <strong>+1 Mob Review</strong></li><li>John: Ideally the person who submitted the PR takes the time to fix their own code. Sometimes you've just got to get code live.<ul><li>Async "Pair" — turn on screen recorder, walk through all your comments as you fix them. Do this when code is pressed for time.</li></ul></li></ul><hr /><h3>Picks</h3><ul><li>JP: <a href="https://www.gitify.io/">https://www.gitify.io/</a></li><li>JP2: <a href="https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/">https://www.reddit.com/r/cscareerquestions/comments/byxmk1/what_makes_for_a_good_code_review_session/</a></li><li>John: Rocket Emoji's - <a href="https://matthewpalmer.net/rocket/">https://matthewpalmer.net/rocket/</a></li></ul>
]]></content:encoded>
      <enclosure length="45647787" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/877c58af-c0ca-4d2c-a4a0-cf3ad2666f18/s08e07_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Code Reviews 🤓</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:46:55</itunes:duration>
      <itunes:summary>This week we walk through tips and tricks for good code reviews. </itunes:summary>
      <itunes:subtitle>This week we walk through tips and tricks for good code reviews. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2741132a-b3bf-4ef9-9c16-bd1b4a8d7665</guid>
      <title>The Freelance Episode 💰</title>
      <description><![CDATA[<h3>Iteration: A weekly podcast about programming, development, and design.</h3><p><strong>JP's Experience</strong></p><ul><li>Minimal</li><li>Often saying "yes" too frequently</li><li>This year I only said yes to opportunities I could deliver on</li><li>Doing consulting work for friends.... 🤔❌</li><li>I come from a design background where I was known as the "design guy". To this day, people still ask me if I can make logos for them.</li></ul><p><strong>John's experience with freelance</strong></p><ul><li>I started Freelancing in June 2015 (Small Rails work)</li><li>The last 5 years I've built it into a small agency</li><li>We did over $350k last year</li><li>I've been able to travel, have flexible hours, and pick and choose projects and learning.</li></ul><p><strong>Pros of freelancing</strong></p><ul><li>Extra cash (on the side)</li><li>Flexibility</li><li>Lot of different projects</li><li>Less politics</li><li>You have the power to negotiate and capture your full value with no lost efficiency or politics at play.</li></ul><p><strong>Cons of freelance</strong></p><ul><li>No paid time off</li><li>No benefits</li><li>No growth opportunities - You have to be a self-starter</li><li>Taxes, paperwork business development</li><li>Sometimes you get boring projects</li><li>Loneliness</li><li>Hard to find work at first</li><li><strong>You have to be paid less than you are worth. That’s capitalism. There has to be a gap between what you cost and the value you provide.</strong></li><li><strong>Moving from project to project gets hard. You need to be sure you really like / want shallow variety.</strong></li></ul><h3>Getting started</h3><ul><li>You need to pick a skill/stack/specialty.</li><li>Make sure you have someone out there who’s paying people for it.</li><li>People need to understand what you do and who you do it for.</li><li>“I build Wordpress sites for dentists”</li><li>“I do Ruby on Rails for medical startups”</li><li>It positions you as a specialist. Specialists have more authority, less competition and make more money.</li></ul><h3><strong>How to find clients (at first)</strong></h3><ul><li>Free or discounted work for Nonprofits</li><li>Upwork / Thumbtack / Craigslist</li><li>Portfolio work that's as close to a real project as possible</li><li>Equity work for startups</li><li>Open source</li><li>Blogging (my top 2 biggest clients were from my blog)</li><li>This season shouldn’t last for more than a year. If it does, you may want to consider a "joby job"</li></ul><h3><strong>Once leads are coming to you:</strong></h3><ul><li>Raise your rate by at least 20% or so every estimate until your rejection rate is over half.</li><li>If you are landing every bid, it’s a bad sign. You are too cheap.</li><li><strong>JP's Formula</strong> = Hourly rate at his "joby job" ~ $50/hr — double it or triple it</li></ul><h2>Billing approaches</h2><h2>Fixed Fee</h2><ul><li>Milestone payments</li><li>You get to a point of your hourly being diluted</li></ul><h3><strong>Value based billing</strong></h3><ul><li>Milestone payments</li><li>Understand the business enough to get a sense of the potential value you can provide.</li><li>Ask lots of questions to really understand their business. Skim books, YouTube anything to be able to speak intelligently about their business needs.</li><li><strong>Once you quantify the outcome:</strong><ul><li>“You make $300k a year from your website leads now, you think my work could improve that by 20%. That’s $60,000. My services are just an investment of $12,000 that you’ve estimated will give you a return of $60k in your first year”</li><li>So instead of charging $2k for that static marketing site, you can be confident in charging $12,000 - it’s a small investment for the returns the client says they should get. It’s a deal.</li></ul></li><li>Charge more.<ul><li>By pricing yourself “competitively,” you inadvertently signal to them that you’re “average” — and great clients, by definition, aren’t looking for average.</li></ul></li><li>It takes time.</li><li>My average client lead to close has been about 2-3 months in the last 3 years. The average client revenue has been over $50k per client.</li></ul><h2>Hourly / Retainer Billing</h2><ul><li>Pre-pay is the way I was doing it. Discounts for higher chunks of hours. This worked really well for ongoing development and maintence contracts.</li></ul><h3>Tools</h3><ul><li><a href="https://www.getharvest.com/">Harvest</a></li><li><a href="https://www.upwork.com/">Upwork</a></li><li><a href="https://www.catch.co/">Catch</a></li><li><a href="https://transferwise.com/us">Transferwise</a></li><li><a href="https://bench.co/">Bench</a></li><li>Project Management software (notion, sheets, basecamp)</li></ul><h2><strong>How to write estimates</strong></h2><ul><li><strong>fixed price</strong></li><li><strong>Retainer</strong></li><li><strong>Hourly</strong></li><li><strong>Value based fixed price</strong></li></ul><h2><strong>Mistakes / misconceptions</strong></h2><ul><li>it’s a numbers game. This is false! Don’t spray 300 people with a cold email and no context. I get these constantly. Spend 3 hours researching 3 clients you can offer value too. Build a relationship, be a resource, it takes time.</li><li>Provide a ton of value at a sustainable but low wage.</li><li>Selling outcomes you don’t fully control. Example: I want this rich interactive functionality on a square space site that I can’t give you admin access for. Not having copy, not having design assets, domain access. Etc.</li><li>Fixed price billing with a lack of scope.</li><li>Growing to quickly</li><li>Having a closed mind to unknown domains.</li></ul><h3>Taxes + LLC's WTF?</h3><ul><li>In the states - you have to pay taxes (I retain at least 20% of my income)</li><li>LLC protects you</li><li>Errors and omissions insurance is good to have as well</li></ul><p><strong>Links / Resources</strong></p><ul><li>Seth Godin Freelancers workshop</li><li>The business of authority</li></ul><h3>Picks</h3><ul><li><a href="https://www.llcuniversity.com/">https://www.llcuniversity.com/</a> - LLC University</li><li><a href="https://stripe.com/atlas">Stipe Atlas</a> — Pay the money get an LLC</li></ul>
]]></description>
      <pubDate>Mon, 24 Feb 2020 13:00:03 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/the-freelance-episode-EyOgpSfl</link>
      <content:encoded><![CDATA[<h3>Iteration: A weekly podcast about programming, development, and design.</h3><p><strong>JP's Experience</strong></p><ul><li>Minimal</li><li>Often saying "yes" too frequently</li><li>This year I only said yes to opportunities I could deliver on</li><li>Doing consulting work for friends.... 🤔❌</li><li>I come from a design background where I was known as the "design guy". To this day, people still ask me if I can make logos for them.</li></ul><p><strong>John's experience with freelance</strong></p><ul><li>I started Freelancing in June 2015 (Small Rails work)</li><li>The last 5 years I've built it into a small agency</li><li>We did over $350k last year</li><li>I've been able to travel, have flexible hours, and pick and choose projects and learning.</li></ul><p><strong>Pros of freelancing</strong></p><ul><li>Extra cash (on the side)</li><li>Flexibility</li><li>Lot of different projects</li><li>Less politics</li><li>You have the power to negotiate and capture your full value with no lost efficiency or politics at play.</li></ul><p><strong>Cons of freelance</strong></p><ul><li>No paid time off</li><li>No benefits</li><li>No growth opportunities - You have to be a self-starter</li><li>Taxes, paperwork business development</li><li>Sometimes you get boring projects</li><li>Loneliness</li><li>Hard to find work at first</li><li><strong>You have to be paid less than you are worth. That’s capitalism. There has to be a gap between what you cost and the value you provide.</strong></li><li><strong>Moving from project to project gets hard. You need to be sure you really like / want shallow variety.</strong></li></ul><h3>Getting started</h3><ul><li>You need to pick a skill/stack/specialty.</li><li>Make sure you have someone out there who’s paying people for it.</li><li>People need to understand what you do and who you do it for.</li><li>“I build Wordpress sites for dentists”</li><li>“I do Ruby on Rails for medical startups”</li><li>It positions you as a specialist. Specialists have more authority, less competition and make more money.</li></ul><h3><strong>How to find clients (at first)</strong></h3><ul><li>Free or discounted work for Nonprofits</li><li>Upwork / Thumbtack / Craigslist</li><li>Portfolio work that's as close to a real project as possible</li><li>Equity work for startups</li><li>Open source</li><li>Blogging (my top 2 biggest clients were from my blog)</li><li>This season shouldn’t last for more than a year. If it does, you may want to consider a "joby job"</li></ul><h3><strong>Once leads are coming to you:</strong></h3><ul><li>Raise your rate by at least 20% or so every estimate until your rejection rate is over half.</li><li>If you are landing every bid, it’s a bad sign. You are too cheap.</li><li><strong>JP's Formula</strong> = Hourly rate at his "joby job" ~ $50/hr — double it or triple it</li></ul><h2>Billing approaches</h2><h2>Fixed Fee</h2><ul><li>Milestone payments</li><li>You get to a point of your hourly being diluted</li></ul><h3><strong>Value based billing</strong></h3><ul><li>Milestone payments</li><li>Understand the business enough to get a sense of the potential value you can provide.</li><li>Ask lots of questions to really understand their business. Skim books, YouTube anything to be able to speak intelligently about their business needs.</li><li><strong>Once you quantify the outcome:</strong><ul><li>“You make $300k a year from your website leads now, you think my work could improve that by 20%. That’s $60,000. My services are just an investment of $12,000 that you’ve estimated will give you a return of $60k in your first year”</li><li>So instead of charging $2k for that static marketing site, you can be confident in charging $12,000 - it’s a small investment for the returns the client says they should get. It’s a deal.</li></ul></li><li>Charge more.<ul><li>By pricing yourself “competitively,” you inadvertently signal to them that you’re “average” — and great clients, by definition, aren’t looking for average.</li></ul></li><li>It takes time.</li><li>My average client lead to close has been about 2-3 months in the last 3 years. The average client revenue has been over $50k per client.</li></ul><h2>Hourly / Retainer Billing</h2><ul><li>Pre-pay is the way I was doing it. Discounts for higher chunks of hours. This worked really well for ongoing development and maintence contracts.</li></ul><h3>Tools</h3><ul><li><a href="https://www.getharvest.com/">Harvest</a></li><li><a href="https://www.upwork.com/">Upwork</a></li><li><a href="https://www.catch.co/">Catch</a></li><li><a href="https://transferwise.com/us">Transferwise</a></li><li><a href="https://bench.co/">Bench</a></li><li>Project Management software (notion, sheets, basecamp)</li></ul><h2><strong>How to write estimates</strong></h2><ul><li><strong>fixed price</strong></li><li><strong>Retainer</strong></li><li><strong>Hourly</strong></li><li><strong>Value based fixed price</strong></li></ul><h2><strong>Mistakes / misconceptions</strong></h2><ul><li>it’s a numbers game. This is false! Don’t spray 300 people with a cold email and no context. I get these constantly. Spend 3 hours researching 3 clients you can offer value too. Build a relationship, be a resource, it takes time.</li><li>Provide a ton of value at a sustainable but low wage.</li><li>Selling outcomes you don’t fully control. Example: I want this rich interactive functionality on a square space site that I can’t give you admin access for. Not having copy, not having design assets, domain access. Etc.</li><li>Fixed price billing with a lack of scope.</li><li>Growing to quickly</li><li>Having a closed mind to unknown domains.</li></ul><h3>Taxes + LLC's WTF?</h3><ul><li>In the states - you have to pay taxes (I retain at least 20% of my income)</li><li>LLC protects you</li><li>Errors and omissions insurance is good to have as well</li></ul><p><strong>Links / Resources</strong></p><ul><li>Seth Godin Freelancers workshop</li><li>The business of authority</li></ul><h3>Picks</h3><ul><li><a href="https://www.llcuniversity.com/">https://www.llcuniversity.com/</a> - LLC University</li><li><a href="https://stripe.com/atlas">Stipe Atlas</a> — Pay the money get an LLC</li></ul>
]]></content:encoded>
      <enclosure length="55041318" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/baef6cc4-c1b7-405c-af9d-3d93e550a64d/s08e06_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>The Freelance Episode 💰</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:56:45</itunes:duration>
      <itunes:summary>This week we go deep into consulting and freelancing. Lessons learned, finding clients, pricing projects and more. </itunes:summary>
      <itunes:subtitle>This week we go deep into consulting and freelancing. Lessons learned, finding clients, pricing projects and more. </itunes:subtitle>
      <itunes:keywords>ruby on rails, freelancing, software, web development, consulting</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">408487b4-3ed0-441c-a24e-e7c840e8581b</guid>
      <title>🚂Rails: Hate it or Love it</title>
      <description><![CDATA[<p><strong>Welcome to Iteration, a weekly podcast about programming, development, and design.</strong></p><p>Ruby on Rails: 5 Things we hate 5 things we love. A quick overview of some of the key concepts, limitations, and strengths of the Ruby on Rails Framework.</p><h3>😍John - Convention over configuration</h3><p>There is a strong "Rails way" this lets you focus on product, higher level abstractions, and move quicker through your day to day. You have less decisions to make.</p><h3>🤮Convention over configuration</h3><p>The "Rails way" is stupid, puts you in a box. Sometimes my needs and problems don't fit into the rails conventions.</p><h3>😍Love: It's Stable and reliable.</h3><p>No "shiny object" syndrome that you get in the JavaScript community.</p><h3>🤮Hate: It's boring and doesn't keep up with modern trends. [jp]</h3><p>I never know the right balance of "React" sprinkles inside of my .erb files. Sometimes it feels like I should just do a full blown SPA? Plus, sometimes making a form in React is so much easier for me than remembering all of the weird Rails Form shit</p><h3>😍Love: It's server rendered.</h3><h3>🤮Hate: It's server rendered.</h3><h3>😍Love: It' just Ruby</h3><h3>🤮Hate: Forms</h3><p>Why are forms so damn complicated? Maybe I just don't have a good understanding of data modeling...</p><h3>😍Love: Old tutorials for things are mostly still relevant</h3><h3>🤮Hate: Rails devs are just "Script kiddies"</h3><h2>Picks</h2><p>JP: 🧦 <a href="https://bombas.com/">https://bombas.com/</a> </p><p>John: Abstract — Netfilx</p>
]]></description>
      <pubDate>Mon, 10 Feb 2020 13:00:02 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/rails-hate-it-or-love-it-zPn5EJnH</link>
      <content:encoded><![CDATA[<p><strong>Welcome to Iteration, a weekly podcast about programming, development, and design.</strong></p><p>Ruby on Rails: 5 Things we hate 5 things we love. A quick overview of some of the key concepts, limitations, and strengths of the Ruby on Rails Framework.</p><h3>😍John - Convention over configuration</h3><p>There is a strong "Rails way" this lets you focus on product, higher level abstractions, and move quicker through your day to day. You have less decisions to make.</p><h3>🤮Convention over configuration</h3><p>The "Rails way" is stupid, puts you in a box. Sometimes my needs and problems don't fit into the rails conventions.</p><h3>😍Love: It's Stable and reliable.</h3><p>No "shiny object" syndrome that you get in the JavaScript community.</p><h3>🤮Hate: It's boring and doesn't keep up with modern trends. [jp]</h3><p>I never know the right balance of "React" sprinkles inside of my .erb files. Sometimes it feels like I should just do a full blown SPA? Plus, sometimes making a form in React is so much easier for me than remembering all of the weird Rails Form shit</p><h3>😍Love: It's server rendered.</h3><h3>🤮Hate: It's server rendered.</h3><h3>😍Love: It' just Ruby</h3><h3>🤮Hate: Forms</h3><p>Why are forms so damn complicated? Maybe I just don't have a good understanding of data modeling...</p><h3>😍Love: Old tutorials for things are mostly still relevant</h3><h3>🤮Hate: Rails devs are just "Script kiddies"</h3><h2>Picks</h2><p>JP: 🧦 <a href="https://bombas.com/">https://bombas.com/</a> </p><p>John: Abstract — Netfilx</p>
]]></content:encoded>
      <enclosure length="49391985" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/104cb777-7145-45d9-b8e3-eaea2ef8c00c/s08e04_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>🚂Rails: Hate it or Love it</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:50:53</itunes:duration>
      <itunes:summary>Ruby on Rails: 5 Things we hate 5 things we love. A quick overview of some of the key concepts, limitations and strengths of the Ruby on Rails Framework. </itunes:summary>
      <itunes:subtitle>Ruby on Rails: 5 Things we hate 5 things we love. A quick overview of some of the key concepts, limitations and strengths of the Ruby on Rails Framework. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cc2dfd6c-78e1-45ad-a6f9-b359b737cb38</guid>
      <title>✅ 2020 Developer Goals</title>
      <description><![CDATA[<h3>Welcome to Iteration, a weekly podcast about programming, development, and design.</h3><p>John: Hey I'm John I run a firm that builds web and mobile apps. </p><p>Happy new year — this week we're talking through resolutions and goals for 2020 as software developers: </p><h3>JP  — Goal #1: Build a full stack app with Elixir</h3><ul><li>really stretching myself here on this full stack node app</li></ul><h3>JP — Goal #2: System design</h3><ul><li>maybe even pick up UML?</li></ul><h3>JP — Goal #3: Algorithm fundamentals</h3><ul><li>Going through <a href="https://interviewcamp.io/">https://interviewcamp.io/</a></li></ul><h3>John — Goal #1 Blog</h3><ul><li><strong>Blog / Write / Document my work more</strong><ul><li>Motivation:</li><li>It helps ideas stick</li><li>Some of my best clients have been gained through my blog.</li><li>It's a good way to give back.</li><li>Become a better communicator.</li><li>Document for the team.</li></ul></li></ul><h3>John — Goal #2: System design</h3><ul><li>I'm copying JP Here — already been wanting to re-read through Domain Driven Design, (The lost season 1 LOLZ)</li><li><a href="https://www.amazon.com/dp/0071843655?tag=duckduckgo-exp-b-20&linkCode=osi&th=1&psc=1">Web Scaleabaility for Startup Engeneers</a></li></ul><h3>John — Goal #3 JavaScript</h3><ul><li>JavaScript Skillz Up.</li><li>I've made strides in 2019 but I want to take it to the next level.</li><li>I still find front end intimidating.</li><li>I limit myself in functionality to avoid complex UI.</li><li>It holds back product sometimes.</li></ul><h3>John — Goal #4 Focus</h3><ul><li>Focus more on my core.</li><li>I spend a lot of time on accounting, project management, issue triage and more.</li><li>I want to have better processes, tooling, automation and team support on the things I'm not good at.<ul><li>Processes — QA, Client Handoff, Documentation</li><li>Tooling — Project Management, Error Handling, Staging, Documentation</li><li>Automation — Weekly updates, Invoicing, Payroll</li></ul></li></ul><h3>Picks</h3><ul><li><a href="https://www.youtube.com/watch?v=y0CteQIYNOY&list=PLvpUgdsZnNk6gmPjabDPN70lnlfUke4d0">A Youtube Playlist of every office deleted scene</a></li><li><a href="https://www.apple.com/macos/catalina/docs/Sidecar_Tech_Brief_Oct_2019.pdf">MacOS — Sidecar</a></li><li><a href="https://www.princestreetpizzamenu.com/">https://www.princestreetpizzamenu.com/</a></li></ul>
]]></description>
      <pubDate>Mon, 3 Feb 2020 13:00:05 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/2020-developer-goals-2wa2rICe</link>
      <content:encoded><![CDATA[<h3>Welcome to Iteration, a weekly podcast about programming, development, and design.</h3><p>John: Hey I'm John I run a firm that builds web and mobile apps. </p><p>Happy new year — this week we're talking through resolutions and goals for 2020 as software developers: </p><h3>JP  — Goal #1: Build a full stack app with Elixir</h3><ul><li>really stretching myself here on this full stack node app</li></ul><h3>JP — Goal #2: System design</h3><ul><li>maybe even pick up UML?</li></ul><h3>JP — Goal #3: Algorithm fundamentals</h3><ul><li>Going through <a href="https://interviewcamp.io/">https://interviewcamp.io/</a></li></ul><h3>John — Goal #1 Blog</h3><ul><li><strong>Blog / Write / Document my work more</strong><ul><li>Motivation:</li><li>It helps ideas stick</li><li>Some of my best clients have been gained through my blog.</li><li>It's a good way to give back.</li><li>Become a better communicator.</li><li>Document for the team.</li></ul></li></ul><h3>John — Goal #2: System design</h3><ul><li>I'm copying JP Here — already been wanting to re-read through Domain Driven Design, (The lost season 1 LOLZ)</li><li><a href="https://www.amazon.com/dp/0071843655?tag=duckduckgo-exp-b-20&linkCode=osi&th=1&psc=1">Web Scaleabaility for Startup Engeneers</a></li></ul><h3>John — Goal #3 JavaScript</h3><ul><li>JavaScript Skillz Up.</li><li>I've made strides in 2019 but I want to take it to the next level.</li><li>I still find front end intimidating.</li><li>I limit myself in functionality to avoid complex UI.</li><li>It holds back product sometimes.</li></ul><h3>John — Goal #4 Focus</h3><ul><li>Focus more on my core.</li><li>I spend a lot of time on accounting, project management, issue triage and more.</li><li>I want to have better processes, tooling, automation and team support on the things I'm not good at.<ul><li>Processes — QA, Client Handoff, Documentation</li><li>Tooling — Project Management, Error Handling, Staging, Documentation</li><li>Automation — Weekly updates, Invoicing, Payroll</li></ul></li></ul><h3>Picks</h3><ul><li><a href="https://www.youtube.com/watch?v=y0CteQIYNOY&list=PLvpUgdsZnNk6gmPjabDPN70lnlfUke4d0">A Youtube Playlist of every office deleted scene</a></li><li><a href="https://www.apple.com/macos/catalina/docs/Sidecar_Tech_Brief_Oct_2019.pdf">MacOS — Sidecar</a></li><li><a href="https://www.princestreetpizzamenu.com/">https://www.princestreetpizzamenu.com/</a></li></ul>
]]></content:encoded>
      <enclosure length="38854560" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/426f6af1-a088-4366-a8e5-bc9e129dbdb4/s08e05_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>✅ 2020 Developer Goals</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:39:56</itunes:duration>
      <itunes:summary>New year new me! This week we&apos;re talking through resolutions and goals for 2020 as software developers: 
</itunes:summary>
      <itunes:subtitle>New year new me! This week we&apos;re talking through resolutions and goals for 2020 as software developers: 
</itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">69c29fd8-7712-4cf0-baa8-d9a9af5a1d3b</guid>
      <title>Joy of JavaScript 😍</title>
      <description><![CDATA[<p>Join us this week as we talk about JavaScript. So much to love. We go deep with Author Luis Atencio. We talk through JavaScript's future, keeping up, learning and walk through a lot of nitty-gritty technical parts.  </p><h3>Where to find Luis:</h3><ul><li>Twitter: <a href="https://twitter.com/luijar">@luijar</a></li><li>Blog: <a href="https://medium.com/@luijar">https://medium.com/@luijar</a></li></ul><p><i>Books by Luis</i></p><ul><li><a href="https://www.manning.com/books/the-joy-of-javascript">Joy of JavaScript</a></li><li><a href="https://www.manning.com/books/functional-programming-in-javascript">Functional Programming in JavaScript</a></li><li><a href="https://www.manning.com/books/rxjs-in-action">RxJS in Action</a></li></ul>
]]></description>
      <pubDate>Mon, 9 Dec 2019 13:00:17 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/joy-of-javascript-rA_K7Dlm</link>
      <content:encoded><![CDATA[<p>Join us this week as we talk about JavaScript. So much to love. We go deep with Author Luis Atencio. We talk through JavaScript's future, keeping up, learning and walk through a lot of nitty-gritty technical parts.  </p><h3>Where to find Luis:</h3><ul><li>Twitter: <a href="https://twitter.com/luijar">@luijar</a></li><li>Blog: <a href="https://medium.com/@luijar">https://medium.com/@luijar</a></li></ul><p><i>Books by Luis</i></p><ul><li><a href="https://www.manning.com/books/the-joy-of-javascript">Joy of JavaScript</a></li><li><a href="https://www.manning.com/books/functional-programming-in-javascript">Functional Programming in JavaScript</a></li><li><a href="https://www.manning.com/books/rxjs-in-action">RxJS in Action</a></li></ul>
]]></content:encoded>
      <enclosure length="38167063" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/9de97d14-3374-4f6d-83ca-559b6c0fd17b/s08e03_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Joy of JavaScript 😍</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:39:15</itunes:duration>
      <itunes:summary>Join us this week as we talk about JavaScript. So much to love. We go deep with Author Luis Atencio. We talk through JavaScript&apos;s future, keeping up, learning and walk through a lot of nitty-gritty technical parts.  </itunes:summary>
      <itunes:subtitle>Join us this week as we talk about JavaScript. So much to love. We go deep with Author Luis Atencio. We talk through JavaScript&apos;s future, keeping up, learning and walk through a lot of nitty-gritty technical parts.  </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f7a07833-fe38-4a0a-8685-51fe6bb94fc6</guid>
      <title>The Git Episode ⑂</title>
      <description><![CDATA[<h3>Git-ing things done.</h3><h3><strong>A weekly podcast about programming, development, and design.</strong></h3><p><strong>I'm John, I run a design and development firm that builds apps and websites.</strong> </p><p><strong>I'm joined by JP:</strong> </p><p><strong>Hi everyone! I'm a full stack software engineer at a real estate tech start up.</strong></p><p><i>Catch up / What's today's episode about?</i></p><ul><li><p><strong>John:</strong> California is on fire 🔥Making my job — complicated</p></li><li><p>Let's talk about git!</p></li><li><p>I recently watched this quick 4 hour course which is going to be my pick: <a href="https://frontendmasters.com/courses/git-in-depth/">https://frontendmasters.com/courses/git-in-depth/</a></p></li><li><p>Let's assume that listeners use git daily</p></li></ul><h1>Teaching / Learning section</h1><h2>Git at a very high level</h2><ul><li>Version Control</li><li>Major, major oversimplification: key value store<ul><li>key = hash of data</li><li>value = data</li></ul></li><li>You use the key to retrieve your data (i.e. <code>git checkout <some_branch></code>  is just moving the pointer to the particular commit hash)</li><li><strong>Three (4 if you count remote) areas</strong> where code lives<ul><li><strong>Working</strong>: "untracked" files - this is your playground or scratch pad, current "working area"</li><li><strong>Staging</strong>: files that will be part of your next commit. this is like saying, 'hey, I want to add these files and changes to my repo as they are no longer just scratchpad thoughts'<ul><li>this is how git knows what changed between last commit and your current commit</li></ul></li><li><strong>Repo</strong>: files that git knows about. the repo contains all of your commits</li><li><strong>Remote: Github, bitbucket, etc</strong></li></ul></li></ul><h2>What does your personal / work git workflow look like?</h2><p>i.e. walk me through how you might use git when you implement a new feature</p><p>this can be a longer section where we talk about git / github as it relates to working on a product</p><ul><li>How often you commit</li><li>What your commit messages look like</li><li>PR etiquette</li><li>Git Squash vs Leaving all the history</li></ul><h1>Goodies + TIL section</h1><h2>Git Goodie #1: <code>--no-pager</code></h2><ul><li>Have you ever done a <code>git diff</code> or a <code>git branch</code> and your terminal opens up a "new page"? You can throw in the <code>--no-pager</code> flag and it will display the contents in the same window instead</li></ul><h2>Git TIL: <code>git commit</code> without the <code>-m</code> flag</h2><ul><li>I learned that the <code>-m</code> flag is only for short commit messages</li></ul><h2>John: Git Goodie — <code>git stash</code></h2><ul><li>I only learned this one a year ago, incredibly useful.</li><li>you can name your stashes!</li><li>pop + apply</li><li>git <code>stash list</code></li></ul>
]]></description>
      <pubDate>Mon, 2 Dec 2019 13:00:26 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s08e02-oYlx6rnY</link>
      <content:encoded><![CDATA[<h3>Git-ing things done.</h3><h3><strong>A weekly podcast about programming, development, and design.</strong></h3><p><strong>I'm John, I run a design and development firm that builds apps and websites.</strong> </p><p><strong>I'm joined by JP:</strong> </p><p><strong>Hi everyone! I'm a full stack software engineer at a real estate tech start up.</strong></p><p><i>Catch up / What's today's episode about?</i></p><ul><li><p><strong>John:</strong> California is on fire 🔥Making my job — complicated</p></li><li><p>Let's talk about git!</p></li><li><p>I recently watched this quick 4 hour course which is going to be my pick: <a href="https://frontendmasters.com/courses/git-in-depth/">https://frontendmasters.com/courses/git-in-depth/</a></p></li><li><p>Let's assume that listeners use git daily</p></li></ul><h1>Teaching / Learning section</h1><h2>Git at a very high level</h2><ul><li>Version Control</li><li>Major, major oversimplification: key value store<ul><li>key = hash of data</li><li>value = data</li></ul></li><li>You use the key to retrieve your data (i.e. <code>git checkout <some_branch></code>  is just moving the pointer to the particular commit hash)</li><li><strong>Three (4 if you count remote) areas</strong> where code lives<ul><li><strong>Working</strong>: "untracked" files - this is your playground or scratch pad, current "working area"</li><li><strong>Staging</strong>: files that will be part of your next commit. this is like saying, 'hey, I want to add these files and changes to my repo as they are no longer just scratchpad thoughts'<ul><li>this is how git knows what changed between last commit and your current commit</li></ul></li><li><strong>Repo</strong>: files that git knows about. the repo contains all of your commits</li><li><strong>Remote: Github, bitbucket, etc</strong></li></ul></li></ul><h2>What does your personal / work git workflow look like?</h2><p>i.e. walk me through how you might use git when you implement a new feature</p><p>this can be a longer section where we talk about git / github as it relates to working on a product</p><ul><li>How often you commit</li><li>What your commit messages look like</li><li>PR etiquette</li><li>Git Squash vs Leaving all the history</li></ul><h1>Goodies + TIL section</h1><h2>Git Goodie #1: <code>--no-pager</code></h2><ul><li>Have you ever done a <code>git diff</code> or a <code>git branch</code> and your terminal opens up a "new page"? You can throw in the <code>--no-pager</code> flag and it will display the contents in the same window instead</li></ul><h2>Git TIL: <code>git commit</code> without the <code>-m</code> flag</h2><ul><li>I learned that the <code>-m</code> flag is only for short commit messages</li></ul><h2>John: Git Goodie — <code>git stash</code></h2><ul><li>I only learned this one a year ago, incredibly useful.</li><li>you can name your stashes!</li><li>pop + apply</li><li>git <code>stash list</code></li></ul>
]]></content:encoded>
      <enclosure length="43637337" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/e2c26758-2aae-4cfc-941c-3236ff472187/s08e02_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>The Git Episode ⑂</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:45:02</itunes:duration>
      <itunes:summary>This week we dive into Git, Github Git workflows, tips tricks and more. </itunes:summary>
      <itunes:subtitle>This week we dive into Git, Github Git workflows, tips tricks and more. </itunes:subtitle>
      <itunes:keywords>ruby on rails, software development, react native, programming, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b8c73cba-888a-4688-8ce3-35bc352a82bd</guid>
      <title>Beef 🥩 or Bust 💥 Learning from other platforms</title>
      <description><![CDATA[<p><strong>A weekly podcast about programming, development, and design.</strong></p><p><strong>I'm John, I run a design and development firm that builds apps and websites.</strong></p><p><strong>I'm joined by JP:</strong></p><p><strong>Hi, I'm a software engineer at a real estate tech start up</strong></p><p><i>Catch up / What's today's episode about?</i></p><p>This week Best and Worst Apps</p><ul><li>Design and development patterns we love and hate.</li></ul><h3>JP: Gripe 1: <strong>👎</strong> Page Reloads</h3><p>Web app: Iterable - every "save" reloads the page</p><p>Mobile app: Notion - every change to a kanban board reloads the page; every time you swipe back, the page reloads</p><p><strong>Takeaway:</strong> Optimistic rendering</p><h3>John: Password resets taking a thousand years</h3><ul><li><strong>Takeaway</strong>: Prioritize the background job, please.</li></ul><h3>JP: Gripe 2: Resetting my filter settings</h3><p>Mobile app: <a href="http://apartments.com">apartments.com</a>; I would need to register to save my settings. Maybe this is intended?</p><ul><li><strong>Takeaway:</strong> Don't be user-hostile, don't use negative incentives.</li><li><strong>Takeaway:</strong> Use local storage (Cookies) or local device when a user is not authenticated, redirect on account creation and save that data.</li></ul><h3><strong>John: Not thinking about the size of the device</strong></h3><ul><li>Putting things I care about at the tippy top of the app. Put it under my thumb!</li><li><strong>Takeaway:</strong> Test your apps in different contexts, huuuuge and tiny.</li><li>I've made this mistake - shipped apps that don't render properly on an iPhone 5s</li></ul><h3>JP: Gripe 3: Login button on marketing page opens new tab and authenticates me</h3><ul><li>Bad Web apps: Iterable, Lever</li><li>Good web apps: Amplitude</li><li>Weird in the middle apps: Coderpad</li><li><strong>Takeaway:</strong> Take the time to get auth right. Be careful how you handle oAuth</li></ul><h3>John: Facebook Logout Bullshit</h3><p>If you log out of the facebook app it doesn't actually log you out.</p><p>It goes to this screen with your profile photo and a password field, it's still collecting data on accounts associated with that phone.</p><ul><li><strong>Takeaway</strong>: Don't prioritize business needs over product simplicity and privacy.</li></ul><h3>Slack Gripes</h3><ul><li>JP: Slack turns apostrophes into curly apostrophes<ul><li><a href="https://practicaltypography.com/straight-and-curly-quotes.html">https://practicaltypography.com/straight-and-curly-quotes.html</a></li><li>“ - curly</li><li>" - straight</li></ul></li><li>John: Drafts jump up to the top of the screen and go missing from your threads</li><li>John: Global notification "Mute" switch outside of your system settings.</li><li>John: The account management strategy is bonkers — Why can't I have one login that gets me to all my workspaces?</li></ul><h3>John: Deranged Email Collection Pop Ups</h3><p>"Would you like to be rich and beautiful?"</p><ul><li>Yes! I'm awesome.</li><li>No thanks, I'll stay poor and ugly"</li><li>Takeaway: "Push back on stakeholders, suggest more thoughtful design solutions, if well executed "interstitial" email collection can be just as effective and way less user hostile.</li><li>Keep in mind: Google knocks down SEO significantly on email pop ups websites</li></ul><h3>JP: Cool feature 1: Power user shortcuts</h3><p>Desktop app: Slack has a cmd + k to search, cmd + r to refresh, etc</p><p>Desktop app: Youtube scroll on a full screen video</p><p>Chrome: youtube + tab to search | ebay + tab to search</p><ul><li><strong>Takeaway</strong>: Provide more than one way to access common functionality, this can be a keyboard shortcut, a gesture. Reward power users.</li></ul><h3><strong>John: In app pop up ads</strong></h3><ul><li>Spotify new album announcements</li><li>Netflix new shows</li><li>Youtube Premium ads</li><li>WORST: Apple "Have you tried the new maps?"</li><li>Fuuuuuuuuuuck that.</li><li><strong>Takeaway:</strong> Feature new features or content passively in context. Highlight new content etc. Don't interrupt users. We are better than that.</li></ul><h3>John: Multiple Accounts + Team Management</h3><ul><li>Stripe does this so so well. One login can get to multiple accounts, secure, simple.</li><li>Bank of America — basically just need to delete the app every time to switch between my company and personal accounts.</li><li>Pastel — You can't belong to more than one "Team"</li><li>Slack — Multiple "Workspaces" new phone sign into 4 different workspaces.<ul><li><strong>Takeaway:</strong><ul><li>Be really thoughtful about user account management, understand that more than one person need to use your app and access your data. Think about from day one tying data to an "Account", "company" or "Household" that includes the single user.</li><li>Example: App for dog trainers, every trainer belongs to a "School" even if it's just themselves, every dog and client belongs to a "Household" that way you can easily add and remove user's access to a "School" or "Hosuehold"</li><li>If you tie all the data to the individual user, it's really tough to share access.</li></ul></li></ul></li></ul><h3>John: Hitlist of Beautiful platforms that get most things mostly right</h3><ul><li><strong>Robinhood</strong></li><li>Reddit Mobile</li><li>Airbnb</li><li>Square</li><li>Twitter</li><li>Pinterest</li></ul><h3><strong>John: iOS "Smartlinks"</strong></h3><ul><li>Drive me bananans<ul><li>If you tap a phone number there is no way to "Copy" it. the only option is to "Call"</li><li>If you tap an address "Open in Maps" 🙄 🤮</li><li>If you tap an email "Apple Mail" 🙄 🤮</li><li>Lock-in BS</li></ul></li></ul><p><strong>Picks:</strong></p><ul><li>John: Blinkist - Book summaries</li><li>JP: Away</li></ul>
]]></description>
      <pubDate>Mon, 25 Nov 2019 13:00:04 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/se08e01-wZjHpuCK</link>
      <content:encoded><![CDATA[<p><strong>A weekly podcast about programming, development, and design.</strong></p><p><strong>I'm John, I run a design and development firm that builds apps and websites.</strong></p><p><strong>I'm joined by JP:</strong></p><p><strong>Hi, I'm a software engineer at a real estate tech start up</strong></p><p><i>Catch up / What's today's episode about?</i></p><p>This week Best and Worst Apps</p><ul><li>Design and development patterns we love and hate.</li></ul><h3>JP: Gripe 1: <strong>👎</strong> Page Reloads</h3><p>Web app: Iterable - every "save" reloads the page</p><p>Mobile app: Notion - every change to a kanban board reloads the page; every time you swipe back, the page reloads</p><p><strong>Takeaway:</strong> Optimistic rendering</p><h3>John: Password resets taking a thousand years</h3><ul><li><strong>Takeaway</strong>: Prioritize the background job, please.</li></ul><h3>JP: Gripe 2: Resetting my filter settings</h3><p>Mobile app: <a href="http://apartments.com">apartments.com</a>; I would need to register to save my settings. Maybe this is intended?</p><ul><li><strong>Takeaway:</strong> Don't be user-hostile, don't use negative incentives.</li><li><strong>Takeaway:</strong> Use local storage (Cookies) or local device when a user is not authenticated, redirect on account creation and save that data.</li></ul><h3><strong>John: Not thinking about the size of the device</strong></h3><ul><li>Putting things I care about at the tippy top of the app. Put it under my thumb!</li><li><strong>Takeaway:</strong> Test your apps in different contexts, huuuuge and tiny.</li><li>I've made this mistake - shipped apps that don't render properly on an iPhone 5s</li></ul><h3>JP: Gripe 3: Login button on marketing page opens new tab and authenticates me</h3><ul><li>Bad Web apps: Iterable, Lever</li><li>Good web apps: Amplitude</li><li>Weird in the middle apps: Coderpad</li><li><strong>Takeaway:</strong> Take the time to get auth right. Be careful how you handle oAuth</li></ul><h3>John: Facebook Logout Bullshit</h3><p>If you log out of the facebook app it doesn't actually log you out.</p><p>It goes to this screen with your profile photo and a password field, it's still collecting data on accounts associated with that phone.</p><ul><li><strong>Takeaway</strong>: Don't prioritize business needs over product simplicity and privacy.</li></ul><h3>Slack Gripes</h3><ul><li>JP: Slack turns apostrophes into curly apostrophes<ul><li><a href="https://practicaltypography.com/straight-and-curly-quotes.html">https://practicaltypography.com/straight-and-curly-quotes.html</a></li><li>“ - curly</li><li>" - straight</li></ul></li><li>John: Drafts jump up to the top of the screen and go missing from your threads</li><li>John: Global notification "Mute" switch outside of your system settings.</li><li>John: The account management strategy is bonkers — Why can't I have one login that gets me to all my workspaces?</li></ul><h3>John: Deranged Email Collection Pop Ups</h3><p>"Would you like to be rich and beautiful?"</p><ul><li>Yes! I'm awesome.</li><li>No thanks, I'll stay poor and ugly"</li><li>Takeaway: "Push back on stakeholders, suggest more thoughtful design solutions, if well executed "interstitial" email collection can be just as effective and way less user hostile.</li><li>Keep in mind: Google knocks down SEO significantly on email pop ups websites</li></ul><h3>JP: Cool feature 1: Power user shortcuts</h3><p>Desktop app: Slack has a cmd + k to search, cmd + r to refresh, etc</p><p>Desktop app: Youtube scroll on a full screen video</p><p>Chrome: youtube + tab to search | ebay + tab to search</p><ul><li><strong>Takeaway</strong>: Provide more than one way to access common functionality, this can be a keyboard shortcut, a gesture. Reward power users.</li></ul><h3><strong>John: In app pop up ads</strong></h3><ul><li>Spotify new album announcements</li><li>Netflix new shows</li><li>Youtube Premium ads</li><li>WORST: Apple "Have you tried the new maps?"</li><li>Fuuuuuuuuuuck that.</li><li><strong>Takeaway:</strong> Feature new features or content passively in context. Highlight new content etc. Don't interrupt users. We are better than that.</li></ul><h3>John: Multiple Accounts + Team Management</h3><ul><li>Stripe does this so so well. One login can get to multiple accounts, secure, simple.</li><li>Bank of America — basically just need to delete the app every time to switch between my company and personal accounts.</li><li>Pastel — You can't belong to more than one "Team"</li><li>Slack — Multiple "Workspaces" new phone sign into 4 different workspaces.<ul><li><strong>Takeaway:</strong><ul><li>Be really thoughtful about user account management, understand that more than one person need to use your app and access your data. Think about from day one tying data to an "Account", "company" or "Household" that includes the single user.</li><li>Example: App for dog trainers, every trainer belongs to a "School" even if it's just themselves, every dog and client belongs to a "Household" that way you can easily add and remove user's access to a "School" or "Hosuehold"</li><li>If you tie all the data to the individual user, it's really tough to share access.</li></ul></li></ul></li></ul><h3>John: Hitlist of Beautiful platforms that get most things mostly right</h3><ul><li><strong>Robinhood</strong></li><li>Reddit Mobile</li><li>Airbnb</li><li>Square</li><li>Twitter</li><li>Pinterest</li></ul><h3><strong>John: iOS "Smartlinks"</strong></h3><ul><li>Drive me bananans<ul><li>If you tap a phone number there is no way to "Copy" it. the only option is to "Call"</li><li>If you tap an address "Open in Maps" 🙄 🤮</li><li>If you tap an email "Apple Mail" 🙄 🤮</li><li>Lock-in BS</li></ul></li></ul><p><strong>Picks:</strong></p><ul><li>John: Blinkist - Book summaries</li><li>JP: Away</li></ul>
]]></content:encoded>
      <enclosure length="46353744" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/9928ea1c-f824-4728-9f4c-3ea97a5a25dc/s08e01_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Beef 🥩 or Bust 💥 Learning from other platforms</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:47:55</itunes:duration>
      <itunes:summary>This week JP and John dig into platforms we love and hate and what we can learn from them. </itunes:summary>
      <itunes:subtitle>This week JP and John dig into platforms we love and hate and what we can learn from them. </itunes:subtitle>
      <itunes:keywords>ruby on rails, software development, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">eb078893-7642-4dfb-b02c-edc65633b7d5</guid>
      <title>Roundtable: When Tech Meets Business  🤝</title>
      <description><![CDATA[<blockquote><p>A weekly podcast about programming, development, and design.</p></blockquote><ul><li>My name is John Jacob, I am a developer and designer.</li><li>I am joined by my co-host JP</li></ul><p><strong>Conversation — When Tech Meets Business</strong></p><h3><strong>Who is Jon? Tell us a bit about your educational background and how you eventually landed at Opendoor</strong></h3><h3>Jon, Briefly tell us why you're interested in Real Estate</h3><ul><li>potential to talk about the domains we are interested in as well<ul><li>education</li><li>health</li></ul></li></ul><h3><strong>As a software engineer, why is it important to understand the domain that you're building for?</strong></h3><ul><li>Understand customer pain points<ul><li>Example searching for a home: Zillow and more</li></ul></li><li>Understand the competition</li><li>User value directly — Redfin and Zillow — are just lead gen tools. Let's focus on lower level.</li></ul><ol><li>Build in domains you are excited about</li><li>Understand customer pain points</li><li>Check out the competitive landscape</li><li>Books books books</li></ol><h3>Do you think you need to be interested in the domain you're working in to do well?</h3><ul><li>Not necessarily, building tech can be an interesting exercise in itself</li><li>You have to be open minded, and empathetic</li><li>Obviously, when you are passionate about a product, there's magic in that.</li></ul><h3>What are some insights (perhaps specific to real estate) that came from someone who was non-technical?</h3><h3>How do you know when you should apply technology to solve a domain problem?</h3><ul><li>Think about it in terms of Pain</li><li>High transaction is the opportunity</li><li>Repetitive tasks is an opportunity</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://www.netlify.com/">Netlify</a></li><li>John: <a href="https://duckduckgo.com/">Duck Duck Go</a></li><li>Jon: Murphy bed</li></ul><p> </p><h2>Links</h2><ul><li><a href="https://twitter.com/johnjacobdev">John Jacob </a></li><li><a href="https://twitter.com/jeanpaulsio">JP</a></li><li>Guest: <a href="https://www.linkedin.com/in/jmasehilano/">Jon</a></li></ul>
]]></description>
      <pubDate>Mon, 21 Oct 2019 12:00:08 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/roundtable-when-tech-meets-business-D1RkdQ6M</link>
      <content:encoded><![CDATA[<blockquote><p>A weekly podcast about programming, development, and design.</p></blockquote><ul><li>My name is John Jacob, I am a developer and designer.</li><li>I am joined by my co-host JP</li></ul><p><strong>Conversation — When Tech Meets Business</strong></p><h3><strong>Who is Jon? Tell us a bit about your educational background and how you eventually landed at Opendoor</strong></h3><h3>Jon, Briefly tell us why you're interested in Real Estate</h3><ul><li>potential to talk about the domains we are interested in as well<ul><li>education</li><li>health</li></ul></li></ul><h3><strong>As a software engineer, why is it important to understand the domain that you're building for?</strong></h3><ul><li>Understand customer pain points<ul><li>Example searching for a home: Zillow and more</li></ul></li><li>Understand the competition</li><li>User value directly — Redfin and Zillow — are just lead gen tools. Let's focus on lower level.</li></ul><ol><li>Build in domains you are excited about</li><li>Understand customer pain points</li><li>Check out the competitive landscape</li><li>Books books books</li></ol><h3>Do you think you need to be interested in the domain you're working in to do well?</h3><ul><li>Not necessarily, building tech can be an interesting exercise in itself</li><li>You have to be open minded, and empathetic</li><li>Obviously, when you are passionate about a product, there's magic in that.</li></ul><h3>What are some insights (perhaps specific to real estate) that came from someone who was non-technical?</h3><h3>How do you know when you should apply technology to solve a domain problem?</h3><ul><li>Think about it in terms of Pain</li><li>High transaction is the opportunity</li><li>Repetitive tasks is an opportunity</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://www.netlify.com/">Netlify</a></li><li>John: <a href="https://duckduckgo.com/">Duck Duck Go</a></li><li>Jon: Murphy bed</li></ul><p> </p><h2>Links</h2><ul><li><a href="https://twitter.com/johnjacobdev">John Jacob </a></li><li><a href="https://twitter.com/jeanpaulsio">JP</a></li><li>Guest: <a href="https://www.linkedin.com/in/jmasehilano/">Jon</a></li></ul>
]]></content:encoded>
      <enclosure length="52229303" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/cc68f95d-45ef-49f5-8bc3-d6d78e4fbfe0/s07e08-1_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Roundtable: When Tech Meets Business  🤝</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:54:05</itunes:duration>
      <itunes:summary>This week we do a deep dive into applying tech to business. We are joined by a guest Jonathan Masehi-Lano a software engineer at Open Door. We use Real Estate as a jumping-off point for talking through how to apply software to tech. </itunes:summary>
      <itunes:subtitle>This week we do a deep dive into applying tech to business. We are joined by a guest Jonathan Masehi-Lano a software engineer at Open Door. We use Real Estate as a jumping-off point for talking through how to apply software to tech. </itunes:subtitle>
      <itunes:keywords>ruby on rails, software development, react native, startups, web development, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5ee2fa02-15de-47d3-887f-03faef71f11d</guid>
      <title>❌ Extreme Testing</title>
      <description><![CDATA[<p>Iteration — <strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p><p>This episode uses Chapter 13 of Extreme programing as a jumping off point</p><p><strong>Testing Early, Often, and Automated</strong></p><blockquote><p>Here is the dilemma in software development: defects are expensive, but eliminating defects is also expensive.</p></blockquote><ul><li>Instead of talking about having a kick-ass automated test suite, frequently testing code, and all of that good stuff, we should talk about something a little different.</li></ul><h3>Q: What was the last big bug you can think of? How did you handle it?</h3><ul><li>Health coaching group discussions, mobile users could not post into group discussions for 48 hours. It’s a core feature of the platform.</li><li>React Native Upgrade → Weird android bug where people could not take a photo to upload their proof of funds</li></ul><h3>Q: What was the reason for the latest big bug?</h3><ul><li>lack of automated integration tests in the Mobile app.</li><li>We have some unit testing we also have full API tests, but not enough coverage in the integration.</li><li>We made a small change to the group discussion model, the mobile app wasn’t updated to consider this change, timing the rollout.</li><li>Android Weirdness, lack of QA, rushing to get to the latest and greatest</li></ul><h3>Q: How do you handle bugs in general?</h3><ul><li>Testing is first line of defense.</li><li>QA is backup (One other dev)</li><li>App signal is the catch all (After deployment)</li><li>Users are the last line of defense <strong>RABBITHOLE</strong><ul><li>Give users a clear escape hatch / line of communication.</li><li>So many times we’ve caught flawed design assumptions from that feedback. Users love it too.</li><li>Superlative language "Thank you so much, you are the best, we really really appreciate you sending that in and I'm so sorry if you are having issues. "</li></ul></li></ul><h3>Q: John Ask: What’s the most common causes of bugs?</h3><ul><li><strong>Test data does not properly represent production data - phone formats / etc</strong></li><li>An Edge case that wasn’t considered</li><li>The feature functions properly but the functionality is wrong / not what the stakeholder intended.</li><li>Rollout was not planned, data transition or all platforms are not in sync.</li><li>Browser or context considerations. Mobile vs tablet / android device universe.</li><li>Lack of QA, lack of tests</li><li>Rushing things</li></ul><h3>John — Summary / Thoughts on book overall</h3><ul><li>Overall got the most out of this vs other books we've read</li></ul><h2>Picks</h2><ul><li>JP: Heroku! Review Apps (spins up a new app every time a PR is opened); Pipelines</li><li>John: Contentful + Rails to give clients ability to update copy and images on marketing pages.</li></ul>
]]></description>
      <pubDate>Mon, 30 Sep 2019 12:00:04 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e07-D08DgdH5</link>
      <content:encoded><![CDATA[<p>Iteration — <strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p><p>This episode uses Chapter 13 of Extreme programing as a jumping off point</p><p><strong>Testing Early, Often, and Automated</strong></p><blockquote><p>Here is the dilemma in software development: defects are expensive, but eliminating defects is also expensive.</p></blockquote><ul><li>Instead of talking about having a kick-ass automated test suite, frequently testing code, and all of that good stuff, we should talk about something a little different.</li></ul><h3>Q: What was the last big bug you can think of? How did you handle it?</h3><ul><li>Health coaching group discussions, mobile users could not post into group discussions for 48 hours. It’s a core feature of the platform.</li><li>React Native Upgrade → Weird android bug where people could not take a photo to upload their proof of funds</li></ul><h3>Q: What was the reason for the latest big bug?</h3><ul><li>lack of automated integration tests in the Mobile app.</li><li>We have some unit testing we also have full API tests, but not enough coverage in the integration.</li><li>We made a small change to the group discussion model, the mobile app wasn’t updated to consider this change, timing the rollout.</li><li>Android Weirdness, lack of QA, rushing to get to the latest and greatest</li></ul><h3>Q: How do you handle bugs in general?</h3><ul><li>Testing is first line of defense.</li><li>QA is backup (One other dev)</li><li>App signal is the catch all (After deployment)</li><li>Users are the last line of defense <strong>RABBITHOLE</strong><ul><li>Give users a clear escape hatch / line of communication.</li><li>So many times we’ve caught flawed design assumptions from that feedback. Users love it too.</li><li>Superlative language "Thank you so much, you are the best, we really really appreciate you sending that in and I'm so sorry if you are having issues. "</li></ul></li></ul><h3>Q: John Ask: What’s the most common causes of bugs?</h3><ul><li><strong>Test data does not properly represent production data - phone formats / etc</strong></li><li>An Edge case that wasn’t considered</li><li>The feature functions properly but the functionality is wrong / not what the stakeholder intended.</li><li>Rollout was not planned, data transition or all platforms are not in sync.</li><li>Browser or context considerations. Mobile vs tablet / android device universe.</li><li>Lack of QA, lack of tests</li><li>Rushing things</li></ul><h3>John — Summary / Thoughts on book overall</h3><ul><li>Overall got the most out of this vs other books we've read</li></ul><h2>Picks</h2><ul><li>JP: Heroku! Review Apps (spins up a new app every time a PR is opened); Pipelines</li><li>John: Contentful + Rails to give clients ability to update copy and images on marketing pages.</li></ul>
]]></content:encoded>
      <enclosure length="36123952" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/b993e870-06bc-40fd-b016-9d1ad5133ecf/s07e07_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>❌ Extreme Testing</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:37:19</itunes:duration>
      <itunes:summary>JP and John walk through preventing bugs with automated tests. The practical real world walk throughs of their approaches to testing and how to prevent shipping bugs out into the world. </itunes:summary>
      <itunes:subtitle>JP and John walk through preventing bugs with automated tests. The practical real world walk throughs of their approaches to testing and how to prevent shipping bugs out into the world. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ef7a1426-8d10-43a1-98e6-92c3f5260a4b</guid>
      <title>📦 Shipping Features — Planning, Estimates, Scopes and Shipping</title>
      <description><![CDATA[<p>Planning: Managing Scope</p><p>This episode jumps off Chapter 12 of Extreme programing by Kent Beck.</p><blockquote><p>Planning is an exercise in listening, speaking, and aligning goals for a specific time period. It is valuable input for each team member. Without planning, we are individuals with haphazard connections and effectiveness. We are a team when we plan and work in harmony.</p></blockquote><p>XP recommends planning at <i>any</i> timescale with these four steps.</p><p>1.) List the items of work that may need to be done.<br />2.) Estimate the items.<br />3.) Set a budget for the planning cycle.<br />4.) Agree on the work that needs to be done within the budget. As you negotiate, don't change the estimates or the budget.</p><h3>Questions for discussion</h3><h3><strong>Question 1: Walk us through how you plan a new feature. In other words, how do you bring a new idea from concept to reality?</strong></h3><h3>1. Pitch</h3><p>This usually comes from the client, sometimes myself or the team.</p><ul><li>Here's an example of a recent client pitch:</li></ul><blockquote><p>So here is our high level break down. 1st we add a new bottom tab that says students seeking this tab replaces the settings gear tab. The settings tab will be moved to the top right corner of the app. When a student clicks that tab the design attached (below) would show. * Design shows a list of students who have performed searches, with a "Message" button on each.</p></blockquote><blockquote><p>Rules A student should show up on a tutors seeking list if......A student search is <7 days oldThey have not been messaged by 3 different tutors initiallyThey are within a tutors travel radiusSearched subject is on Tutor's subject listNotifications FiredEvery-time a new students signs-up a tutor that meets the above criteria will receive a notification about a new student signing up that they can reach out to.Additions:Add a box on the tutor stats page that lets tutors see new students seeking help in their area.</p></blockquote><p>Whiz Tutor — an app where you can find a book nearby tutors for in-person tutoring.</p><p>Pitch was — when students search for but don't book a tutor, let relevant tutors message those students. This would happen through a "Students Seeking" tab that shows up in the tutors Mobile app.</p><h3>2. Design</h3><p>Hand off the pitch to a designer on the team to refine and recommend a scope.</p><p><strong>Question the work</strong></p><ul><li>Try to tease out the "Jobs to be done", "user stories" that exist in the pitch</li><li>Question if this needs to exist at all "Default to no"</li><li>Look for "Off the shelf" > Workarounds using the current system.<ul><li>Can we do this with Zapier or a spreadsheet?</li></ul></li><li>Features often die in this phase.</li></ul><p><strong>Define the work</strong></p><ul><li>Name the things. Attach nouns and verbs to the functionality.<ul><li>"Students Seeking" became > "Leads" ></li><li>"Message this student" became > "Reply to Lead" > <strong>Lead Replies</strong></li></ul></li><li>Figure out where this "lives" in the context of the existing feature set.</li><li>Figure out each entities lifecycle, how does it get created, updated viewed and destroyed?<ul><li><strong>A students search activity generates leads, a tutor can view relevant leads in their area, a tutor can reply to a lead, once three tutors reply to a lead that lead is no longer visible to other tutors.</strong></li></ul></li><li>Try to get ahead of pitfalls, ask a lot of questions.</li><li>Sometimes designer will talk with a developer just to make sure to identify and avoid any technical hotspots.</li><li><strong>Customer interviews if needed</strong></li></ul><p><strong>Handoff the design</strong></p><ul><li>Output — <strong>Low fidelity mockup</strong>, usually handed off with a screen recording, this is shared with client to capture any last pitfalls or miscommunication.</li><li>We try to time-box each design iteration to just a couple hours.</li></ul><h3>3. Initial Client Review</h3><ul><li>We shoot an email with the mockups and screen recording attached, just to be sure we are all on the same page.</li><li>If there's tweaks we make a new low-fidelity design where it's still cheap.</li><li>Client lays out "Must haves" and "nice to haves"</li></ul><h3>4. Estimate and Plan</h3><ul><li>Once we are in alignment on the overall trajectory of the feature, Mockups and client context is handed over to a developer.</li><li>Developer reviews the functionality, jobs to be done, user stories etc and attempts to estimate the work.</li><li>This is the point where we break the work down into quantifiable, assignable "user stories" related to the feature.</li><li>Plan the technical approach</li><li>Keys to estimating more accurately<ul><li>Look at history</li><li>Break things down smaller</li><li>Think about all "Contexts" and "States"</li></ul></li></ul><h3>5. Client Approval</h3><ul><li>We have designs, we have estimated user stories.</li><li>Here's the point where we can give ranges of hours and get a firmer list of "Must haves" and "nice to haves"</li><li>Client gives us a go / no go on user stories.</li><li>Again — Customer interviews if needed to be more confident in scope setting.</li></ul><h3><strong>Question 2:</strong> How do you decide when a feature is in scope vs. out of scope?</h3><ul><li>Each step chips away at the scope, Example: in design, if we can't name things, it goes back to a pitch. In the estimates if it's too expensive it goes back to design.</li></ul><h3><strong>Question 3:</strong> Talk about a time when planning failed and scope creep was real. How do you think this could have been prevented?</h3><p>So recent and painful.</p><ul><li>Client reached out wanting to build a huge WebApp.</li><li>I recommended we take a 3 weeks to refine the design, set a scope, basic feature list, basically this process. I gave very rough ballpark numbers of timelines and costs without having a feature list locked down.</li><li>Client pushed hard to just get started, not define any of the work upfront, preached "Agile" — We got started with essentially no plan.</li><li>Scope creep was massive, and scope within features. Example: Photo and file attachments in the messaging tool before a single use was using the messaging tool.</li><li>Spent way too much time on functionality that was thrown out the window.</li><li>Bottom line — client spent 4x my initial estimates, project went twice as long and they still don't have a working product.</li></ul><h3>Closing thoughts on planning</h3><ul><li>Planning is people, planning takes time and intention.</li><li>XP: Compromise Scope, not quality, time or cost. <strong>"Lowering the quality of your work doesn't eliminate the work, it just shifts it later... creates the illusion of progress... you pay in reduced satisfaction and damaged relationships"</strong></li><li>XP: Use past facts to guide estimates, not your gut.</li><li>XP: Don't try to over-optimize planning, "You can't automate relationships"</li><li>Our agency Project management overhead is about 15% of the project cost. Very real, very needed.</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://reactjs.org/docs/hooks-intro.html">React Hooks</a></li><li>John: <a href="https://localghost.dev/2019/09/everything-i-googled-in-a-week-as-a-professional-software-engineer/%5D(https://localghost.dev/2019/09/everything-i-googled-in-a-week-as-a-professional-software-engineer/)">Everything I googled for a week</a>- In an attempt to dispel the idea that if you have to google stuff you’re not a proper engineer, this is a list of nearly everything I googled in a week at work, where I’m a software engineer with several years’ experience. <a href="https://twitter.com/type__error">https://twitter.com/type__error</a></li></ul>
]]></description>
      <pubDate>Mon, 23 Sep 2019 12:00:44 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e6-rCANmbw5</link>
      <content:encoded><![CDATA[<p>Planning: Managing Scope</p><p>This episode jumps off Chapter 12 of Extreme programing by Kent Beck.</p><blockquote><p>Planning is an exercise in listening, speaking, and aligning goals for a specific time period. It is valuable input for each team member. Without planning, we are individuals with haphazard connections and effectiveness. We are a team when we plan and work in harmony.</p></blockquote><p>XP recommends planning at <i>any</i> timescale with these four steps.</p><p>1.) List the items of work that may need to be done.<br />2.) Estimate the items.<br />3.) Set a budget for the planning cycle.<br />4.) Agree on the work that needs to be done within the budget. As you negotiate, don't change the estimates or the budget.</p><h3>Questions for discussion</h3><h3><strong>Question 1: Walk us through how you plan a new feature. In other words, how do you bring a new idea from concept to reality?</strong></h3><h3>1. Pitch</h3><p>This usually comes from the client, sometimes myself or the team.</p><ul><li>Here's an example of a recent client pitch:</li></ul><blockquote><p>So here is our high level break down. 1st we add a new bottom tab that says students seeking this tab replaces the settings gear tab. The settings tab will be moved to the top right corner of the app. When a student clicks that tab the design attached (below) would show. * Design shows a list of students who have performed searches, with a "Message" button on each.</p></blockquote><blockquote><p>Rules A student should show up on a tutors seeking list if......A student search is <7 days oldThey have not been messaged by 3 different tutors initiallyThey are within a tutors travel radiusSearched subject is on Tutor's subject listNotifications FiredEvery-time a new students signs-up a tutor that meets the above criteria will receive a notification about a new student signing up that they can reach out to.Additions:Add a box on the tutor stats page that lets tutors see new students seeking help in their area.</p></blockquote><p>Whiz Tutor — an app where you can find a book nearby tutors for in-person tutoring.</p><p>Pitch was — when students search for but don't book a tutor, let relevant tutors message those students. This would happen through a "Students Seeking" tab that shows up in the tutors Mobile app.</p><h3>2. Design</h3><p>Hand off the pitch to a designer on the team to refine and recommend a scope.</p><p><strong>Question the work</strong></p><ul><li>Try to tease out the "Jobs to be done", "user stories" that exist in the pitch</li><li>Question if this needs to exist at all "Default to no"</li><li>Look for "Off the shelf" > Workarounds using the current system.<ul><li>Can we do this with Zapier or a spreadsheet?</li></ul></li><li>Features often die in this phase.</li></ul><p><strong>Define the work</strong></p><ul><li>Name the things. Attach nouns and verbs to the functionality.<ul><li>"Students Seeking" became > "Leads" ></li><li>"Message this student" became > "Reply to Lead" > <strong>Lead Replies</strong></li></ul></li><li>Figure out where this "lives" in the context of the existing feature set.</li><li>Figure out each entities lifecycle, how does it get created, updated viewed and destroyed?<ul><li><strong>A students search activity generates leads, a tutor can view relevant leads in their area, a tutor can reply to a lead, once three tutors reply to a lead that lead is no longer visible to other tutors.</strong></li></ul></li><li>Try to get ahead of pitfalls, ask a lot of questions.</li><li>Sometimes designer will talk with a developer just to make sure to identify and avoid any technical hotspots.</li><li><strong>Customer interviews if needed</strong></li></ul><p><strong>Handoff the design</strong></p><ul><li>Output — <strong>Low fidelity mockup</strong>, usually handed off with a screen recording, this is shared with client to capture any last pitfalls or miscommunication.</li><li>We try to time-box each design iteration to just a couple hours.</li></ul><h3>3. Initial Client Review</h3><ul><li>We shoot an email with the mockups and screen recording attached, just to be sure we are all on the same page.</li><li>If there's tweaks we make a new low-fidelity design where it's still cheap.</li><li>Client lays out "Must haves" and "nice to haves"</li></ul><h3>4. Estimate and Plan</h3><ul><li>Once we are in alignment on the overall trajectory of the feature, Mockups and client context is handed over to a developer.</li><li>Developer reviews the functionality, jobs to be done, user stories etc and attempts to estimate the work.</li><li>This is the point where we break the work down into quantifiable, assignable "user stories" related to the feature.</li><li>Plan the technical approach</li><li>Keys to estimating more accurately<ul><li>Look at history</li><li>Break things down smaller</li><li>Think about all "Contexts" and "States"</li></ul></li></ul><h3>5. Client Approval</h3><ul><li>We have designs, we have estimated user stories.</li><li>Here's the point where we can give ranges of hours and get a firmer list of "Must haves" and "nice to haves"</li><li>Client gives us a go / no go on user stories.</li><li>Again — Customer interviews if needed to be more confident in scope setting.</li></ul><h3><strong>Question 2:</strong> How do you decide when a feature is in scope vs. out of scope?</h3><ul><li>Each step chips away at the scope, Example: in design, if we can't name things, it goes back to a pitch. In the estimates if it's too expensive it goes back to design.</li></ul><h3><strong>Question 3:</strong> Talk about a time when planning failed and scope creep was real. How do you think this could have been prevented?</h3><p>So recent and painful.</p><ul><li>Client reached out wanting to build a huge WebApp.</li><li>I recommended we take a 3 weeks to refine the design, set a scope, basic feature list, basically this process. I gave very rough ballpark numbers of timelines and costs without having a feature list locked down.</li><li>Client pushed hard to just get started, not define any of the work upfront, preached "Agile" — We got started with essentially no plan.</li><li>Scope creep was massive, and scope within features. Example: Photo and file attachments in the messaging tool before a single use was using the messaging tool.</li><li>Spent way too much time on functionality that was thrown out the window.</li><li>Bottom line — client spent 4x my initial estimates, project went twice as long and they still don't have a working product.</li></ul><h3>Closing thoughts on planning</h3><ul><li>Planning is people, planning takes time and intention.</li><li>XP: Compromise Scope, not quality, time or cost. <strong>"Lowering the quality of your work doesn't eliminate the work, it just shifts it later... creates the illusion of progress... you pay in reduced satisfaction and damaged relationships"</strong></li><li>XP: Use past facts to guide estimates, not your gut.</li><li>XP: Don't try to over-optimize planning, "You can't automate relationships"</li><li>Our agency Project management overhead is about 15% of the project cost. Very real, very needed.</li></ul><h1>Picks</h1><ul><li>JP: <a href="https://reactjs.org/docs/hooks-intro.html">React Hooks</a></li><li>John: <a href="https://localghost.dev/2019/09/everything-i-googled-in-a-week-as-a-professional-software-engineer/%5D(https://localghost.dev/2019/09/everything-i-googled-in-a-week-as-a-professional-software-engineer/)">Everything I googled for a week</a>- In an attempt to dispel the idea that if you have to google stuff you’re not a proper engineer, this is a list of nearly everything I googled in a week at work, where I’m a software engineer with several years’ experience. <a href="https://twitter.com/type__error">https://twitter.com/type__error</a></li></ul>
]]></content:encoded>
      <enclosure length="50081805" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/f293acea-47fe-4eda-9146-87c99dd1c137/s07e06_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>📦 Shipping Features — Planning, Estimates, Scopes and Shipping</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:51:52</itunes:duration>
      <itunes:summary>In this episode we walk through start to finish how to plan, estimate set scope and shipping a new feature. A deep dive into how to execute software features. </itunes:summary>
      <itunes:subtitle>In this episode we walk through start to finish how to plan, estimate set scope and shipping a new feature. A deep dive into how to execute software features. </itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7ea804f6-0f37-49e2-a3c7-e72b0b7db5da</guid>
      <title>Deeper Into Extreme Programing</title>
      <description><![CDATA[<p>Welcome to Iteration: a weekly podcast about programming, development, and design through the lens of amazing books, chapter by chapter</p><h3>Corollary Practices of Extreme Programing</h3><blockquote><p>corollary: noun, a proposition that follows from one already proved. e.g. "The huge increases in unemployment were the corollary of expenditure cuts.</p></blockquote><p>TLDR: Walk before you run</p><h2>Real Customer Involvement</h2><blockquote><p>The point of customer involvement is to reduce wasted effort by putting the people with the needs in direct contact with the people who can fill those needs.</p></blockquote><ul><li>things I’ve missed from not including customers: block width buttons, “bookings” language, “clickable cards” SO much is missed without really involving customers.</li></ul><h2>Root Cause Analysis</h2><blockquote><p>(After you write tests and fix the bug...) Once the defect is resolved, figure out _why_ the defect was created and wasn't caught. Initiate the necessary changes to prevent this kind of defect in the future</p></blockquote><h3>Five Whys</h3><ul><li>hint: it's usually a people-problem</li></ul><h2>Incremental Development</h2><ul><li>"Slices" <a href="https://basecamp.com/shapeup/3.2-chapter-10#integrating-in-one-place">concept from Shape Up</a></li><li>Scoping the work into a very tiny working piece of functionality and incrementing work from there. - If you were to rebuild facebook, just create a "Wall" and a "newsfeed", leave "likes" or "comments" for a future iteration.</li></ul><h3>Negotiated scope contract</h3><p>Magic formula for success as an agency:</p><ul><li>It's taken me 4+ years of freelance software development to learn this lesson.</li><li>Scope is flexible, budget, time quality are not.</li><li>This is a game-changer, learn this as early as possible.</li></ul><h3>Other practices</h3><ul><li>shared code</li><li>single code base</li><li>daily deployment</li></ul><h2>The Whole XP Team</h2><blockquote><p>A variety of people must work together in interlinking ways to make a project more effective. They have to work together as a group for each to be successful.</p></blockquote><p>TLDR: what should each of these roles do on an XP team?</p><ul><li><p><strong>Tester</strong> - find the happy path; find ways to break it</p></li><li><p><strong>Interaction Designer</strong> - choose overall metaphors for the system; create personas and goals; help the team analyze and make sense of the world;</p></li><li><p><strong>Product Managers</strong> - write stories; pick themes and stories in quarterly cycles; prioritizes; encourage communication between customers and programmers</p></li><li><p><strong>Project Managers</strong> Facilitate communication, help identify priorities and consistent accountability.</p></li><li><p><strong>Executives</strong> Courage, confidence and accountability</p></li></ul><h1>Picks</h1><ul><li><strong>JP</strong>: <a href="https://www.gatsbyjs.org">GatsbyJS</a></li><li><strong>John</strong>: <a href="https://www.figma.com/">Figma</a></li></ul>
]]></description>
      <pubDate>Mon, 16 Sep 2019 12:00:16 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e05-pjBqNVw9</link>
      <content:encoded><![CDATA[<p>Welcome to Iteration: a weekly podcast about programming, development, and design through the lens of amazing books, chapter by chapter</p><h3>Corollary Practices of Extreme Programing</h3><blockquote><p>corollary: noun, a proposition that follows from one already proved. e.g. "The huge increases in unemployment were the corollary of expenditure cuts.</p></blockquote><p>TLDR: Walk before you run</p><h2>Real Customer Involvement</h2><blockquote><p>The point of customer involvement is to reduce wasted effort by putting the people with the needs in direct contact with the people who can fill those needs.</p></blockquote><ul><li>things I’ve missed from not including customers: block width buttons, “bookings” language, “clickable cards” SO much is missed without really involving customers.</li></ul><h2>Root Cause Analysis</h2><blockquote><p>(After you write tests and fix the bug...) Once the defect is resolved, figure out _why_ the defect was created and wasn't caught. Initiate the necessary changes to prevent this kind of defect in the future</p></blockquote><h3>Five Whys</h3><ul><li>hint: it's usually a people-problem</li></ul><h2>Incremental Development</h2><ul><li>"Slices" <a href="https://basecamp.com/shapeup/3.2-chapter-10#integrating-in-one-place">concept from Shape Up</a></li><li>Scoping the work into a very tiny working piece of functionality and incrementing work from there. - If you were to rebuild facebook, just create a "Wall" and a "newsfeed", leave "likes" or "comments" for a future iteration.</li></ul><h3>Negotiated scope contract</h3><p>Magic formula for success as an agency:</p><ul><li>It's taken me 4+ years of freelance software development to learn this lesson.</li><li>Scope is flexible, budget, time quality are not.</li><li>This is a game-changer, learn this as early as possible.</li></ul><h3>Other practices</h3><ul><li>shared code</li><li>single code base</li><li>daily deployment</li></ul><h2>The Whole XP Team</h2><blockquote><p>A variety of people must work together in interlinking ways to make a project more effective. They have to work together as a group for each to be successful.</p></blockquote><p>TLDR: what should each of these roles do on an XP team?</p><ul><li><p><strong>Tester</strong> - find the happy path; find ways to break it</p></li><li><p><strong>Interaction Designer</strong> - choose overall metaphors for the system; create personas and goals; help the team analyze and make sense of the world;</p></li><li><p><strong>Product Managers</strong> - write stories; pick themes and stories in quarterly cycles; prioritizes; encourage communication between customers and programmers</p></li><li><p><strong>Project Managers</strong> Facilitate communication, help identify priorities and consistent accountability.</p></li><li><p><strong>Executives</strong> Courage, confidence and accountability</p></li></ul><h1>Picks</h1><ul><li><strong>JP</strong>: <a href="https://www.gatsbyjs.org">GatsbyJS</a></li><li><strong>John</strong>: <a href="https://www.figma.com/">Figma</a></li></ul>
]]></content:encoded>
      <enclosure length="33721188" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/bce5afda-bcd1-4b6d-ac5a-801b4306eb39/s07e05_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Deeper Into Extreme Programing</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:34:49</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:keywords>soft skills, rails, software, web development, programing, javascript, ruby on rials</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">e614b0d7-fd4c-45bb-9f9e-020681d615e0</guid>
      <title>Essential Practices</title>
      <description><![CDATA[<blockquote>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter by chapter</p>
</blockquote>
<p>John: Hi, I'm John and I'm joined by JP.</p>
<p>JP: Today we will be going through chapters 6, 7, and 8 for those following alone - which are all about Extreme Programming practices. These are the things that XP teams are doing on a daily basis. Kent Beck defines two categories for practices: Primary Practices and Corollary Practices. You must first master the primary practices before considering corollary ones. This episode focuses on primary practices.</p>
<hr />
<p>Practices that do not serve a purpose or have values are empty. For example, pair programming for the sake of making your boss happy doesn't make much sense. However, pair programming to communicate, get feedback, simplify the system, catch errors, and bolster courage makes a lot of sense.</p>
<h2>Reminder - XP Principles</h2>
<ul>
<li>Humanity</li>
<li>Economics</li>
<li>Mutual benefit</li>
<li>Self-similarity</li>
<li>Improvement</li>
<li>Diversity</li>
<li>Reflection</li>
<li>Flow</li>
<li>Opportunity</li>
<li>Redundancy</li>
<li>Failure</li>
<li>Quality</li>
<li>Baby steps</li>
<li>Accepted responsibility</li>
</ul>
<h1>Primary Practices (Chapter 7)</h1>
<h2>Sit together</h2>
<blockquote>
<p>XP predicts that the more face time you have, the more humane and productive the project.</p>
</blockquote>
<p>👨‍🏫 humanity</p>
<p>👨‍🏫 improvement</p>
<p>👨‍🏫 quality</p>
<h2>Informative workspace</h2>
<blockquote>
<p>Make your workspace about work. An interested observer should be able to walk into the team space and get a general idea of how the project is going in 15 seconds.</p>
</blockquote>
<ul>
<li>🐶 Digital workspace counts for remote teams — hygiene on backlogs, clarity on where project status is.</li>
</ul>
<p>👨‍🏫 mutual benefit - doing stuff today that benefits me now and in the future</p>
<p>👨‍🏫 flow</p>
<h2>Energized work 🔥</h2>
<blockquote>
<p><strong>Work only as many hours as you can be productive and only as many hours as you can sustain.</strong> Burning yourself out unproductively today and spoiling the next two days' work isn't good for you or for the team.</p>
</blockquote>
<blockquote>
<p>Taking care of yourself is the quickest way back to energized work.</p>
</blockquote>
<blockquote>
<p>I turn to long work hours as a way of grabbing control in a situation in which I am otherwise out of control</p>
</blockquote>
<ul>
<li>🐶 Recommended reading - <a href="https://www.amazon.com/dp/B00X47ZVXM/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Deep Work</a> &amp; <a href="https://www.amazon.com/dp/B078QSCM3V/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Make Time</a></li>
</ul>
<p>👨‍🏫 flow</p>
<p>👨‍🏫 humanity</p>
<p>👨‍🏫 improvement</p>
<p>👨‍🏫 mutual benefit</p>
<p>Hot tips:</p>
<p>➡️ stay the same amount of time but manage time better</p>
<p>➡️️️️️ block off 2 hours at a time in your calendar just for coding</p>
<p>➡️ turn off phone, email, and slack notifications</p>
<h2>Pair programming</h2>
<ul>
<li>🐶 Nothing better for getting better and writing better code. Need to make a more regular practice of this.</li>
</ul>
<h2>Stories</h2>
<blockquote>
<p>Plan using customer-visible functionality. As soon as the story is written, try to estimate the development effort necessary to implement it.</p>
</blockquote>
<blockquote>
<p>Write stories on index cards and put them on a frequently passed wall. Every attempt I've seen to computerize stories has failed to provide a fraction of the value of having real cards on a real wall.</p>
</blockquote>
<ul>
<li>🐶 Small discrete shippable changes. Should fit on an index card.</li>
<li>🐶 I've written my share of stories that are 2.0 Messaging tool. That's waaaay too open ended.</li>
</ul>
<p>👨‍🏫 flow</p>
<p>👨‍🏫 reflection</p>
<p>👨‍🏫 quality</p>
<h2>Ten-minute build</h2>
<ul>
<li>🐶  Absolutely true, anything more than 10-15 mins you end up with a bunch of PR's with a broken build.</li>
</ul>
<h2>Continuous integration</h2>
<ul>
<li>🐶  If you don't have CI set up, even for a solo project. <strong>Do it.</strong></li>
</ul>
<h1>Getting Started (Chapter 8)</h1>
<p>REMEMBER! XP is a way to improve both your development process and your experience in it.</p>
<ul>
<li>adapt by adding practices that meet your goals and express your values</li>
<li>you don't have to implement all of the practices at once. pick one, see how they meet your goals and align with your values.</li>
<li>baby steps!</li>
<li>🐶 Even if you can't get your team to switch, adopt a practice on your own.</li>
<li>🐶 The only person you can actually change is yourself, even if you are the boss!</li>
</ul>
<blockquote>
<p>Change always starts at home. The only person you can actually change is yourself. [...] Dictating practices to a team destroys trust and creates resentment.</p>
</blockquote>
<ul>
<li>
<p>lead by example</p>
</li>
<li>
<p>🐶 <strong>Find a practice</strong> - List out Things that drain you, list out things that energize your work, adopt practices around these two things, preventing drain and supporting energizing!</p>
</li>
</ul>
<hr />
<h1>Picks</h1>
<ul>
<li>JP: http://www.pythontutor.com/visualize.html#mode=edit - so cool!</li>
<li>John: https://github.com/sirupsen/airrecord - Worked so well to hack to gather an MVP, incredible. No migrations and the rest of the team could read / write data to the database.</li>
</ul>
]]></description>
      <pubDate>Mon, 9 Sep 2019 07:00:03 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e04-sTjvNo1i</link>
      <content:encoded><![CDATA[<blockquote>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter by chapter</p>
</blockquote>
<p>John: Hi, I'm John and I'm joined by JP.</p>
<p>JP: Today we will be going through chapters 6, 7, and 8 for those following alone - which are all about Extreme Programming practices. These are the things that XP teams are doing on a daily basis. Kent Beck defines two categories for practices: Primary Practices and Corollary Practices. You must first master the primary practices before considering corollary ones. This episode focuses on primary practices.</p>
<hr />
<p>Practices that do not serve a purpose or have values are empty. For example, pair programming for the sake of making your boss happy doesn't make much sense. However, pair programming to communicate, get feedback, simplify the system, catch errors, and bolster courage makes a lot of sense.</p>
<h2>Reminder - XP Principles</h2>
<ul>
<li>Humanity</li>
<li>Economics</li>
<li>Mutual benefit</li>
<li>Self-similarity</li>
<li>Improvement</li>
<li>Diversity</li>
<li>Reflection</li>
<li>Flow</li>
<li>Opportunity</li>
<li>Redundancy</li>
<li>Failure</li>
<li>Quality</li>
<li>Baby steps</li>
<li>Accepted responsibility</li>
</ul>
<h1>Primary Practices (Chapter 7)</h1>
<h2>Sit together</h2>
<blockquote>
<p>XP predicts that the more face time you have, the more humane and productive the project.</p>
</blockquote>
<p>👨‍🏫 humanity</p>
<p>👨‍🏫 improvement</p>
<p>👨‍🏫 quality</p>
<h2>Informative workspace</h2>
<blockquote>
<p>Make your workspace about work. An interested observer should be able to walk into the team space and get a general idea of how the project is going in 15 seconds.</p>
</blockquote>
<ul>
<li>🐶 Digital workspace counts for remote teams — hygiene on backlogs, clarity on where project status is.</li>
</ul>
<p>👨‍🏫 mutual benefit - doing stuff today that benefits me now and in the future</p>
<p>👨‍🏫 flow</p>
<h2>Energized work 🔥</h2>
<blockquote>
<p><strong>Work only as many hours as you can be productive and only as many hours as you can sustain.</strong> Burning yourself out unproductively today and spoiling the next two days' work isn't good for you or for the team.</p>
</blockquote>
<blockquote>
<p>Taking care of yourself is the quickest way back to energized work.</p>
</blockquote>
<blockquote>
<p>I turn to long work hours as a way of grabbing control in a situation in which I am otherwise out of control</p>
</blockquote>
<ul>
<li>🐶 Recommended reading - <a href="https://www.amazon.com/dp/B00X47ZVXM/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Deep Work</a> &amp; <a href="https://www.amazon.com/dp/B078QSCM3V/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Make Time</a></li>
</ul>
<p>👨‍🏫 flow</p>
<p>👨‍🏫 humanity</p>
<p>👨‍🏫 improvement</p>
<p>👨‍🏫 mutual benefit</p>
<p>Hot tips:</p>
<p>➡️ stay the same amount of time but manage time better</p>
<p>➡️️️️️ block off 2 hours at a time in your calendar just for coding</p>
<p>➡️ turn off phone, email, and slack notifications</p>
<h2>Pair programming</h2>
<ul>
<li>🐶 Nothing better for getting better and writing better code. Need to make a more regular practice of this.</li>
</ul>
<h2>Stories</h2>
<blockquote>
<p>Plan using customer-visible functionality. As soon as the story is written, try to estimate the development effort necessary to implement it.</p>
</blockquote>
<blockquote>
<p>Write stories on index cards and put them on a frequently passed wall. Every attempt I've seen to computerize stories has failed to provide a fraction of the value of having real cards on a real wall.</p>
</blockquote>
<ul>
<li>🐶 Small discrete shippable changes. Should fit on an index card.</li>
<li>🐶 I've written my share of stories that are 2.0 Messaging tool. That's waaaay too open ended.</li>
</ul>
<p>👨‍🏫 flow</p>
<p>👨‍🏫 reflection</p>
<p>👨‍🏫 quality</p>
<h2>Ten-minute build</h2>
<ul>
<li>🐶  Absolutely true, anything more than 10-15 mins you end up with a bunch of PR's with a broken build.</li>
</ul>
<h2>Continuous integration</h2>
<ul>
<li>🐶  If you don't have CI set up, even for a solo project. <strong>Do it.</strong></li>
</ul>
<h1>Getting Started (Chapter 8)</h1>
<p>REMEMBER! XP is a way to improve both your development process and your experience in it.</p>
<ul>
<li>adapt by adding practices that meet your goals and express your values</li>
<li>you don't have to implement all of the practices at once. pick one, see how they meet your goals and align with your values.</li>
<li>baby steps!</li>
<li>🐶 Even if you can't get your team to switch, adopt a practice on your own.</li>
<li>🐶 The only person you can actually change is yourself, even if you are the boss!</li>
</ul>
<blockquote>
<p>Change always starts at home. The only person you can actually change is yourself. [...] Dictating practices to a team destroys trust and creates resentment.</p>
</blockquote>
<ul>
<li>
<p>lead by example</p>
</li>
<li>
<p>🐶 <strong>Find a practice</strong> - List out Things that drain you, list out things that energize your work, adopt practices around these two things, preventing drain and supporting energizing!</p>
</li>
</ul>
<hr />
<h1>Picks</h1>
<ul>
<li>JP: http://www.pythontutor.com/visualize.html#mode=edit - so cool!</li>
<li>John: https://github.com/sirupsen/airrecord - Worked so well to hack to gather an MVP, incredible. No migrations and the rest of the team could read / write data to the database.</li>
</ul>
]]></content:encoded>
      <enclosure length="43581430" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/306df4bf-ba84-4700-a526-f15d7b1c56e4/s07e04_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Essential Practices</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:45:06</itunes:duration>
      <itunes:summary>We dive further into Extreme programing and get hands on with practices.    Informative workspace, Energized Work, Pair Programing, Stories and more. </itunes:summary>
      <itunes:subtitle>We dive further into Extreme programing and get hands on with practices.    Informative workspace, Energized Work, Pair Programing, Stories and more. </itunes:subtitle>
      <itunes:keywords>software development, web development, progrmaing</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>4</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3593489a-3f16-47c4-89b4-ac271536e450</guid>
      <title>Principles in Extreme Programing</title>
      <description><![CDATA[<h1>Season 7 Episode 3</h1>
<blockquote>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<p>Hi, I'm John and I'm joined by JP.</p>
<p>Today we will be going through chapter 5 and continuing our discussion about the guiding principles of Extreme Programming.</p>
<ul>
<li>Intros</li>
<li>Chit Chat</li>
</ul>
<hr />
<h2>Recap:</h2>
<ul>
<li>values are the roots of things we like and don't like in a situation
<ul>
<li>communication, simplicity, feedback, courage, respect</li>
</ul>
</li>
<li>practices are evidence of values</li>
<li>principles bridge the gap between values and practices</li>
</ul>
<blockquote>
<p>Values are too abstract to directly guide behavior. (This is why we discuss things in the context of principles)</p>
</blockquote>
<p><strong>Other principles may guide your team, but these are the principles that guide XP:</strong></p>
<ul>
<li>Humanity</li>
<li>Economics</li>
<li>Mutual benefit</li>
<li>Self-similarity</li>
<li>Improvement</li>
<li>Diversity</li>
<li>Reflection</li>
<li>Flow</li>
<li>Opportunity</li>
<li>Redundancy</li>
<li>Failure</li>
<li>Quality</li>
<li>Baby steps</li>
<li>Accepted responsibility</li>
</ul>
<p>Now obviously we aren't going to bore you with discussion on all 14 of these principles, so today we'll only talk about a handful of them.</p>
<hr />
<h2>Humanity - noun, the characteristics that make us human 🐸</h2>
<p><strong>Copy and paste alert</strong></p>
<p>What do people need to be good developers? What are some basic human needs?</p>
<ul>
<li>Safety - freedom from hunger, physical harm and threats to loved ones. Fear of job loss threatens this</li>
<li>Accomplishment - opportunity to contribute to their society</li>
<li>Belonging - ability to identify with a group from which they receive validation</li>
<li>Growth - opportunity to expand their skills and perspective</li>
<li>Intimacy - ability to understand and be understood by others</li>
</ul>
<p>Interestingly, satisfying these requisites meets both business and human needs.</p>
<h2>Self-Similarity 👻</h2>
<p>&quot;Fractal Nature of geology&quot; When nature finds a shape that works, she uses it wherever she can.<br />
A crystal is a material whose constituents, such as atoms, molecules or ions, are arranged in a highly ordered microscopic structure — the same arrangment all the way to an atomic level. The same shape, makes up arrangments that make the same shape, that makes up arrangements that make the same shape.</p>
<p>All's to say - I've found that many things that prove useful at a small scale, work at larger scales</p>
<p>Concepts like</p>
<ul>
<li><strong>Good names</strong> work for functions, methods, models, controllers, variables and namespaces<br />
— <strong>breaking things up</strong> into smaller peices, methods, functions, models controllers, etc</li>
<li><strong>process</strong> If it works to break up a method, it will probably work to break up a controler</li>
<li><strong>extraction</strong> Definining data in one organized place (switch statment Javascript example?)</li>
<li><strong>Simplicity</strong></li>
</ul>
<h2>Diversity 🐸</h2>
<blockquote>
<p>Software development teams where everyone is alike, while comfotable, are not effective. Teams need to bring together a variety of skills, attitudes, and perspectives to see problems and pitfalls, to think of multiple ways to solve problems, and to implement the solutions. Teams need diversity</p>
</blockquote>
<blockquote>
<p>The principle of diversity suggets that the programmers should work together on the problem and both opinions should be valued.</p>
</blockquote>
<h2>Oppourtunity 👻</h2>
<p>&quot;Learn to see problems as opportunities for change.&quot;</p>
<p>To reach exellence, problems need to turn into opportunities for learning and improvment, not just survival.</p>
<p>Conciously choose to transform each problem into an opportunity. Good book on this <a href="https://www.amazon.com/Obstacle-Way-Timeless-Turning-Triumph/dp/1591846358">the obsticle is the way</a></p>
<p>Example: <code>.env</code> files for all of our projects got posted to a public repo. We migrated toward a better more secure system, credentials that would be harder to leak and are easier to rotate. We used the problem as an oppourtunity to improve our architecture.</p>
<h2>Quality 👻</h2>
<p>Sacrificing quality is not effective as a means of control... Quality should not be a control variable.</p>
<ul>
<li>These are the variables you should change: Time, Cost, Money and Scope. <strong>Never quality</strong></li>
</ul>
<p>This is really extreme.</p>
<p>Author makes the aurgument that when you skimp on quality you end up spending even more time or money. This rings true, I have often taken the wrong approach in projects of skipming on design, testing or refacting and it doesn't really help in the long run.</p>
<p>We'd all like to get more features out the door for less money, it's just not doable. Less is less.</p>
<h2>Failure 🐸</h2>
<blockquote>
<p>If you're having trouble succeeding, fail. Don't know which of the three ways to implement a story? Try it all three ways.</p>
</blockquote>
<blockquote>
<p>When you don't know what to do, risking failure can be the shortest, surest road to success</p>
</blockquote>
<hr />
<p>Conclusion:</p>
<ul>
<li>Principles give you a better idea of what the practice is intended to accomplish</li>
<li>Understanding the principles gives you the opportunity to create practices that work in harmony with your existing practices and your overall goals</li>
</ul>
<hr />
<h1>Picks</h1>
<ul>
<li>JP: Burke Williams deep tissue massage. I'm all about the self-care</li>
<li>John: App called &quot;Mood&quot; free app that helped me be more mindful of my emotions. It's been really insightful and helpful. I've moved from an average of 44% negative emotions to 55% positive emotions in just about 2 weeks. Just stoping and noticing my humanity, how some things make me feel has made a big impact in my overall mental wellness. I'm finding really interesting corollaries between my activities and diet and my overall happiness.</li>
</ul>
]]></description>
      <pubDate>Mon, 26 Aug 2019 12:00:16 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e03-vdh7m_EC</link>
      <content:encoded><![CDATA[<h1>Season 7 Episode 3</h1>
<blockquote>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<p>Hi, I'm John and I'm joined by JP.</p>
<p>Today we will be going through chapter 5 and continuing our discussion about the guiding principles of Extreme Programming.</p>
<ul>
<li>Intros</li>
<li>Chit Chat</li>
</ul>
<hr />
<h2>Recap:</h2>
<ul>
<li>values are the roots of things we like and don't like in a situation
<ul>
<li>communication, simplicity, feedback, courage, respect</li>
</ul>
</li>
<li>practices are evidence of values</li>
<li>principles bridge the gap between values and practices</li>
</ul>
<blockquote>
<p>Values are too abstract to directly guide behavior. (This is why we discuss things in the context of principles)</p>
</blockquote>
<p><strong>Other principles may guide your team, but these are the principles that guide XP:</strong></p>
<ul>
<li>Humanity</li>
<li>Economics</li>
<li>Mutual benefit</li>
<li>Self-similarity</li>
<li>Improvement</li>
<li>Diversity</li>
<li>Reflection</li>
<li>Flow</li>
<li>Opportunity</li>
<li>Redundancy</li>
<li>Failure</li>
<li>Quality</li>
<li>Baby steps</li>
<li>Accepted responsibility</li>
</ul>
<p>Now obviously we aren't going to bore you with discussion on all 14 of these principles, so today we'll only talk about a handful of them.</p>
<hr />
<h2>Humanity - noun, the characteristics that make us human 🐸</h2>
<p><strong>Copy and paste alert</strong></p>
<p>What do people need to be good developers? What are some basic human needs?</p>
<ul>
<li>Safety - freedom from hunger, physical harm and threats to loved ones. Fear of job loss threatens this</li>
<li>Accomplishment - opportunity to contribute to their society</li>
<li>Belonging - ability to identify with a group from which they receive validation</li>
<li>Growth - opportunity to expand their skills and perspective</li>
<li>Intimacy - ability to understand and be understood by others</li>
</ul>
<p>Interestingly, satisfying these requisites meets both business and human needs.</p>
<h2>Self-Similarity 👻</h2>
<p>&quot;Fractal Nature of geology&quot; When nature finds a shape that works, she uses it wherever she can.<br />
A crystal is a material whose constituents, such as atoms, molecules or ions, are arranged in a highly ordered microscopic structure — the same arrangment all the way to an atomic level. The same shape, makes up arrangments that make the same shape, that makes up arrangements that make the same shape.</p>
<p>All's to say - I've found that many things that prove useful at a small scale, work at larger scales</p>
<p>Concepts like</p>
<ul>
<li><strong>Good names</strong> work for functions, methods, models, controllers, variables and namespaces<br />
— <strong>breaking things up</strong> into smaller peices, methods, functions, models controllers, etc</li>
<li><strong>process</strong> If it works to break up a method, it will probably work to break up a controler</li>
<li><strong>extraction</strong> Definining data in one organized place (switch statment Javascript example?)</li>
<li><strong>Simplicity</strong></li>
</ul>
<h2>Diversity 🐸</h2>
<blockquote>
<p>Software development teams where everyone is alike, while comfotable, are not effective. Teams need to bring together a variety of skills, attitudes, and perspectives to see problems and pitfalls, to think of multiple ways to solve problems, and to implement the solutions. Teams need diversity</p>
</blockquote>
<blockquote>
<p>The principle of diversity suggets that the programmers should work together on the problem and both opinions should be valued.</p>
</blockquote>
<h2>Oppourtunity 👻</h2>
<p>&quot;Learn to see problems as opportunities for change.&quot;</p>
<p>To reach exellence, problems need to turn into opportunities for learning and improvment, not just survival.</p>
<p>Conciously choose to transform each problem into an opportunity. Good book on this <a href="https://www.amazon.com/Obstacle-Way-Timeless-Turning-Triumph/dp/1591846358">the obsticle is the way</a></p>
<p>Example: <code>.env</code> files for all of our projects got posted to a public repo. We migrated toward a better more secure system, credentials that would be harder to leak and are easier to rotate. We used the problem as an oppourtunity to improve our architecture.</p>
<h2>Quality 👻</h2>
<p>Sacrificing quality is not effective as a means of control... Quality should not be a control variable.</p>
<ul>
<li>These are the variables you should change: Time, Cost, Money and Scope. <strong>Never quality</strong></li>
</ul>
<p>This is really extreme.</p>
<p>Author makes the aurgument that when you skimp on quality you end up spending even more time or money. This rings true, I have often taken the wrong approach in projects of skipming on design, testing or refacting and it doesn't really help in the long run.</p>
<p>We'd all like to get more features out the door for less money, it's just not doable. Less is less.</p>
<h2>Failure 🐸</h2>
<blockquote>
<p>If you're having trouble succeeding, fail. Don't know which of the three ways to implement a story? Try it all three ways.</p>
</blockquote>
<blockquote>
<p>When you don't know what to do, risking failure can be the shortest, surest road to success</p>
</blockquote>
<hr />
<p>Conclusion:</p>
<ul>
<li>Principles give you a better idea of what the practice is intended to accomplish</li>
<li>Understanding the principles gives you the opportunity to create practices that work in harmony with your existing practices and your overall goals</li>
</ul>
<hr />
<h1>Picks</h1>
<ul>
<li>JP: Burke Williams deep tissue massage. I'm all about the self-care</li>
<li>John: App called &quot;Mood&quot; free app that helped me be more mindful of my emotions. It's been really insightful and helpful. I've moved from an average of 44% negative emotions to 55% positive emotions in just about 2 weeks. Just stoping and noticing my humanity, how some things make me feel has made a big impact in my overall mental wellness. I'm finding really interesting corollaries between my activities and diet and my overall happiness.</li>
</ul>
]]></content:encoded>
      <enclosure length="22502472" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/bca7489f-e1fc-453c-b192-663d6b556bba/s07e03_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Principles in Extreme Programing</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:45:33</itunes:duration>
      <itunes:summary>This week we talk through principles in Extreme Programming, humanity, mutual benefit, improvement, diversity, failure and more. </itunes:summary>
      <itunes:subtitle>This week we talk through principles in Extreme Programming, humanity, mutual benefit, improvement, diversity, failure and more. </itunes:subtitle>
      <itunes:keywords>extreme programing, soft skills, software develeopment, web development, programing</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6c158639-cf25-4426-bebb-7880e49c54af</guid>
      <title>5 Essential Values in Extreme Programming</title>
      <description><![CDATA[<p>Season 7 Epsiode 2<br />
A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
<p>5 Essential Values in Extreme Programing<br />
Extreme Programing By Kent Beck - Chapters 2,3 and 4</p>
<p>Chapter 2 - Learning to Drive<br />
frequent, small corrections<br />
don't wait to find out if you are going in the wrong direction<br />
Chapter 3 - Values, Principles, and Practices<br />
values are the roots of things we like and don't like in a situation.<br />
Making values explicit is important because without values, practices quickly become rote (habitual repetition), activities performed for their own sake buck lacking any purpose or direction.</p>
<p>practices are evidence of values<br />
Practices are clear. Everyone knows if I've attended the morning standup meetings. Whether I really valuecommunication is fuzzy. Whether I maintain practices that enhance communication is concrete.</p>
<p>principles bridge the gap between values and practices<br />
START HERE<br />
Chapter 4 - Values<br />
Chapters 2 and 3 are small introductory sections, here is the TLDR:</p>
<p>Software, teams, and requirements change. We need to be able to adapt<br />
to such change. The next 3 sections will be about values, practices,<br />
and principles of Extreme Programming<br />
Chapter 4 is about values</p>
<p>Everyone who touches software has a sense of what matters. One person might think what really matters is carefully thinking through all conceivable design decisions before implementing. Another might think what really matters is not having any restrictions on his own personal freedom.</p>
<p>What actually matters is not how any given person behaves as much as how the individuals behave as part of a team and as part of an organization.</p>
<p>Sometimes it's easy to bikeshed over things like code style. Arrow functions vs function declaration, inline functions vs methods, etc<br />
XP embraces 5 values to guide development</p>
<ol>
<li>Communication</li>
<li>Simplicity</li>
<li>Feedback</li>
<li>Courage</li>
<li>Respect</li>
<li>Communication<br />
When you encounter a problem, ask yourselves if the problem was caused by a lack of communication. What communication do you need now to address the problem? What communication do you need to keep yourself out of this trouble in the future?</li>
</ol>
<p>JP: Retro feedback and postmortem feedback often includes communication - both good and bad<br />
2. Simplicity<br />
To make a system simple enough to gracefully solve only today's problems is hard work.</p>
<p>&quot;What is the simplest thing that could possible work?&quot;</p>
<p>JP: Emphasis on &quot;today's problems&quot; - how can we provide value to the customer without compromising on theirexperience and without overengineering a solution?</p>
<p>JS: Stakeholder communicatinon, actively work to include everyone in at the key touchpoints, initial concept, mokcup, prototype, final review.</p>
<p>JS: Have something to look at / talk about. Somebody make a mockup, somebody write some pseudocode</p>
<ol start="3">
<li>Feedback<br />
Being satisfied with improvement rather than expecting instant perfection, we use feedback to get closer and closer to our goals. Feedback comes in many forms.</li>
</ol>
<p>opinions about an idea, yours or your teammates</p>
<p>how the code looks when you implement the idea</p>
<p>whether the tests were easy to write</p>
<p>whether the tests run</p>
<p>how the idea works once it has been deployed</p>
<p>JP: Be agile! Look to build an MVP. Get analytics on things and make decisions from there. It's hard to invest in an idea entirely and then end up ditching the whole thing. Everyone feels burned.</p>
<p>JS: Again, think through key touchpoints, (99%, 50%, 1%)[https://medium.com/the-mission/how-to-scale-yourself-the-99-50-1-framework-7798518f36e1]</p>
<ol start="4">
<li>Courage<br />
Courage as a primary value without counterbalancing values is dangerous. Doing something without regard for the consequences is not effective teamwork. [...] The courage to speak truths, pleasant or unpleasant, fosters communication and trust. The courage to discard failing solutions and seek new ones encourages simplicity. The courage to seak real, concrete answers creates feedback.</li>
</ol>
<p>JP: Being able to speak up when you disagree with people's ideas and being able to listen and exercising patience.<br />
JS: Being honest with yourslef and stakeholders about timelines, replytimes, scope.<br />
JS: Having the courage to set boundries. - &quot;I need this by tomorrow&quot; - I'm sorry, I can't make that happen for you.<br />
5. Respect<br />
If members of a team don't care about each other and what they're doing, XP won't work. If members of a team don't care about a project, nothing can save it. Every person whose life is touched by software development has equal value as a human being. No one is intrinsically worth more than anyone else.</p>
<p>JP: It's much easier when everyone respects each other.<br />
JS: Reconize there's rarely a &quot;wrong&quot; approach, avoid letting pesonal preference becoming the &quot;right&quot; way.<br />
JS: Reconize positives, &quot;what I like about this is... however&quot; Try to keep things in a positive context.<br />
6. Other<br />
This list isn't exhaustive. The important thing is that your team should align on core values.<br />
Other Values: safety, security, predictability, and quality-of-life &lt;- I feel like these need an episode!<br />
Chapter conclusion:<br />
Values don't provide concrete advice about what to do in software development. Because of the distance between values and practices, we need a way to bridge the gap between them. Principles are the tool we need.</p>
<p>Picks<br />
JP: Pair code review sessions<br />
JS: the (99/50/1 framework)[https://medium.com/the-mission/how-to-scale-yourself-the-99-50-1-framework-7798518f36e1]<br />
JS: Basecamp's new book - (Shape Up)[https://basecamp.com/shapeup]</p>
]]></description>
      <pubDate>Mon, 12 Aug 2019 12:00:12 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/5-essential-values-in-extreme-programming-Qucsdj5p</link>
      <content:encoded><![CDATA[<p>Season 7 Epsiode 2<br />
A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
<p>5 Essential Values in Extreme Programing<br />
Extreme Programing By Kent Beck - Chapters 2,3 and 4</p>
<p>Chapter 2 - Learning to Drive<br />
frequent, small corrections<br />
don't wait to find out if you are going in the wrong direction<br />
Chapter 3 - Values, Principles, and Practices<br />
values are the roots of things we like and don't like in a situation.<br />
Making values explicit is important because without values, practices quickly become rote (habitual repetition), activities performed for their own sake buck lacking any purpose or direction.</p>
<p>practices are evidence of values<br />
Practices are clear. Everyone knows if I've attended the morning standup meetings. Whether I really valuecommunication is fuzzy. Whether I maintain practices that enhance communication is concrete.</p>
<p>principles bridge the gap between values and practices<br />
START HERE<br />
Chapter 4 - Values<br />
Chapters 2 and 3 are small introductory sections, here is the TLDR:</p>
<p>Software, teams, and requirements change. We need to be able to adapt<br />
to such change. The next 3 sections will be about values, practices,<br />
and principles of Extreme Programming<br />
Chapter 4 is about values</p>
<p>Everyone who touches software has a sense of what matters. One person might think what really matters is carefully thinking through all conceivable design decisions before implementing. Another might think what really matters is not having any restrictions on his own personal freedom.</p>
<p>What actually matters is not how any given person behaves as much as how the individuals behave as part of a team and as part of an organization.</p>
<p>Sometimes it's easy to bikeshed over things like code style. Arrow functions vs function declaration, inline functions vs methods, etc<br />
XP embraces 5 values to guide development</p>
<ol>
<li>Communication</li>
<li>Simplicity</li>
<li>Feedback</li>
<li>Courage</li>
<li>Respect</li>
<li>Communication<br />
When you encounter a problem, ask yourselves if the problem was caused by a lack of communication. What communication do you need now to address the problem? What communication do you need to keep yourself out of this trouble in the future?</li>
</ol>
<p>JP: Retro feedback and postmortem feedback often includes communication - both good and bad<br />
2. Simplicity<br />
To make a system simple enough to gracefully solve only today's problems is hard work.</p>
<p>&quot;What is the simplest thing that could possible work?&quot;</p>
<p>JP: Emphasis on &quot;today's problems&quot; - how can we provide value to the customer without compromising on theirexperience and without overengineering a solution?</p>
<p>JS: Stakeholder communicatinon, actively work to include everyone in at the key touchpoints, initial concept, mokcup, prototype, final review.</p>
<p>JS: Have something to look at / talk about. Somebody make a mockup, somebody write some pseudocode</p>
<ol start="3">
<li>Feedback<br />
Being satisfied with improvement rather than expecting instant perfection, we use feedback to get closer and closer to our goals. Feedback comes in many forms.</li>
</ol>
<p>opinions about an idea, yours or your teammates</p>
<p>how the code looks when you implement the idea</p>
<p>whether the tests were easy to write</p>
<p>whether the tests run</p>
<p>how the idea works once it has been deployed</p>
<p>JP: Be agile! Look to build an MVP. Get analytics on things and make decisions from there. It's hard to invest in an idea entirely and then end up ditching the whole thing. Everyone feels burned.</p>
<p>JS: Again, think through key touchpoints, (99%, 50%, 1%)[https://medium.com/the-mission/how-to-scale-yourself-the-99-50-1-framework-7798518f36e1]</p>
<ol start="4">
<li>Courage<br />
Courage as a primary value without counterbalancing values is dangerous. Doing something without regard for the consequences is not effective teamwork. [...] The courage to speak truths, pleasant or unpleasant, fosters communication and trust. The courage to discard failing solutions and seek new ones encourages simplicity. The courage to seak real, concrete answers creates feedback.</li>
</ol>
<p>JP: Being able to speak up when you disagree with people's ideas and being able to listen and exercising patience.<br />
JS: Being honest with yourslef and stakeholders about timelines, replytimes, scope.<br />
JS: Having the courage to set boundries. - &quot;I need this by tomorrow&quot; - I'm sorry, I can't make that happen for you.<br />
5. Respect<br />
If members of a team don't care about each other and what they're doing, XP won't work. If members of a team don't care about a project, nothing can save it. Every person whose life is touched by software development has equal value as a human being. No one is intrinsically worth more than anyone else.</p>
<p>JP: It's much easier when everyone respects each other.<br />
JS: Reconize there's rarely a &quot;wrong&quot; approach, avoid letting pesonal preference becoming the &quot;right&quot; way.<br />
JS: Reconize positives, &quot;what I like about this is... however&quot; Try to keep things in a positive context.<br />
6. Other<br />
This list isn't exhaustive. The important thing is that your team should align on core values.<br />
Other Values: safety, security, predictability, and quality-of-life &lt;- I feel like these need an episode!<br />
Chapter conclusion:<br />
Values don't provide concrete advice about what to do in software development. Because of the distance between values and practices, we need a way to bridge the gap between them. Principles are the tool we need.</p>
<p>Picks<br />
JP: Pair code review sessions<br />
JS: the (99/50/1 framework)[https://medium.com/the-mission/how-to-scale-yourself-the-99-50-1-framework-7798518f36e1]<br />
JS: Basecamp's new book - (Shape Up)[https://basecamp.com/shapeup]</p>
]]></content:encoded>
      <enclosure length="48507352" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/79af0f84-afde-40f0-80e5-96706fd27971/s07e02_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>5 Essential Values in Extreme Programming</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:50:15</itunes:duration>
      <itunes:summary>The week we talk about learning to drive, values, principles, and practices.</itunes:summary>
      <itunes:subtitle>The week we talk about learning to drive, values, principles, and practices.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, software development, book study, computer programming, startups, react, web development, programming, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">572d5f0b-2447-4f59-8e5e-2b81925e1c80</guid>
      <title>New Book: Extreme Programming</title>
      <description><![CDATA[<p>Iteration — A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h3>Extreme Programing Explained <em>Embrace change</em></h3>
<p>By Kent Beck</p>
<h3>Chapter 1 - What is XP?</h3>
<blockquote>
<p>&quot;Extreme Programing is about social change. It's about letting go of habits and patterns that were adaptive in the past, but now in the way of us doing out best work. It's about giving up the defenses that protect us but interfere with our productivity. It may leave us feeing exposed.</p>
<p>It's about being open about what we are capable of doing and then doing it. And, allowing and expecting others to do the same...</p>
<p>...It's about the process of becoming more of our best selves and in the process our best as developers. And, it's about writing great code...</p>
</blockquote>
<blockquote>
<p>&quot;Philosophy of software based on... communication, feedback, simplicity, courage and respect.</p>
</blockquote>
<blockquote>
<p>&quot;XP is my attempt to reconcile humanity and productivity in my own practice of software development...&quot;</p>
</blockquote>
<ul>
<li>John — Humanity and productivity. Pomodoro timers, too much coffee, pushing weekends.</li>
</ul>
<blockquote>
<p>&quot;How would you do it if you had enough time? — Fussing about the constraints distracts you from your goals. Your clear self does the best work no matter what the constraints are&quot;</p>
</blockquote>
<ul>
<li>John — Riff on Time Constraints — Time is always my blocker. Is that a good one?</li>
</ul>
<p><strong>Final Summary — What is XP?</strong></p>
<ul>
<li>Giving up old habits</li>
<li>Fully appreciating yourself for total effort today</li>
<li>Striving to do better tomorrow</li>
<li>Consistently Evaluating yourself</li>
<li>Meeting your Human needs</li>
</ul>
]]></description>
      <pubDate>Mon, 29 Jul 2019 12:33:18 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s07e01-FzMvv4a5</link>
      <content:encoded><![CDATA[<p>Iteration — A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h3>Extreme Programing Explained <em>Embrace change</em></h3>
<p>By Kent Beck</p>
<h3>Chapter 1 - What is XP?</h3>
<blockquote>
<p>&quot;Extreme Programing is about social change. It's about letting go of habits and patterns that were adaptive in the past, but now in the way of us doing out best work. It's about giving up the defenses that protect us but interfere with our productivity. It may leave us feeing exposed.</p>
<p>It's about being open about what we are capable of doing and then doing it. And, allowing and expecting others to do the same...</p>
<p>...It's about the process of becoming more of our best selves and in the process our best as developers. And, it's about writing great code...</p>
</blockquote>
<blockquote>
<p>&quot;Philosophy of software based on... communication, feedback, simplicity, courage and respect.</p>
</blockquote>
<blockquote>
<p>&quot;XP is my attempt to reconcile humanity and productivity in my own practice of software development...&quot;</p>
</blockquote>
<ul>
<li>John — Humanity and productivity. Pomodoro timers, too much coffee, pushing weekends.</li>
</ul>
<blockquote>
<p>&quot;How would you do it if you had enough time? — Fussing about the constraints distracts you from your goals. Your clear self does the best work no matter what the constraints are&quot;</p>
</blockquote>
<ul>
<li>John — Riff on Time Constraints — Time is always my blocker. Is that a good one?</li>
</ul>
<p><strong>Final Summary — What is XP?</strong></p>
<ul>
<li>Giving up old habits</li>
<li>Fully appreciating yourself for total effort today</li>
<li>Striving to do better tomorrow</li>
<li>Consistently Evaluating yourself</li>
<li>Meeting your Human needs</li>
</ul>
]]></content:encoded>
      <enclosure length="38886364" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/8131b433-b53d-4215-b370-f25280a4be07/s07e01_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>New Book: Extreme Programming</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:40:14</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0c91ea22-845e-46d8-a22c-bb47f00acd67</guid>
      <title>Career Development Roundtable: Getting Great Work in Tech</title>
      <description><![CDATA[<p>Iteration Season 06E09 - Release July 22nd 2019</p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.<br />
Roundtable: Getting a Job in Tech</p>
<p>Between books - Discussion about career development in tech</p>
<p>Guest: John Rivera - Link?</p>
<p>John S to lead discussion -<br />
Where do you work now? What do you do?<br />
John S: Run an agency, we are a small team of remote developers, we do mobile apps and web apps.<br />
John R: Just started working on Amazon photos mobile app for the prints feature team, I do cross-platform mobile development primarily using React Native. But I’ve also gotten to do my fair share of project management with ChefSteps, and am seeking to pursue that at Amazon<br />
JP: Opendoor<br />
Where did you start? Where were you before tech?<br />
5mins each on origin story<br />
John S: Dabbled in design + web for ever — I was working in the corporate world a job I didn’t love but I was successful. Stepped back and switched careers at November 2015 - switched career at 25<br />
John R: I worked at uhaul and albertsons as a meat clerk. Started things off by saving up for a bootcamp. Did freelance.<br />
JP: MySpace layouts in 9th grade, 13-14 years ago. Then web design until about 2015<br />
What’s been a key practice or tool in moving your career forward?<br />
John R: Networking, Diving deep, embracing things that aren’t in my domain<br />
John S: Consistency, Keeping up with friendships (networking), Blogging, pushing outside comfort zone.<br />
How do you balance getting work done now vs ongoing learning?<br />
John S: Use new tools and techniques in the day to day<br />
John R:<br />
JP: Being proactive with code review and looking to senior engineers<br />
How do you get a good Job in tech?<br />
John S: Network, publishing, making your work visible, random blog post from 2016<br />
John R:<br />
JP: I got my job from meetups</p>
<p>What would you have told yourself 3 years ago?<br />
John S: Consistency, life is a marathon not a sprint. Keep stretching yourself outside comfort zone. Focus on less, go deeper on less things.<br />
John R:<br />
JP: Take breaks, you won’t forget how to code if you take a day off</p>
<p>CLOSE - no picks</p>
<p>John R - Where can people find you?</p>
]]></description>
      <pubDate>Mon, 22 Jul 2019 12:00:06 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s06e09-ozhjXLSL</link>
      <content:encoded><![CDATA[<p>Iteration Season 06E09 - Release July 22nd 2019</p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.<br />
Roundtable: Getting a Job in Tech</p>
<p>Between books - Discussion about career development in tech</p>
<p>Guest: John Rivera - Link?</p>
<p>John S to lead discussion -<br />
Where do you work now? What do you do?<br />
John S: Run an agency, we are a small team of remote developers, we do mobile apps and web apps.<br />
John R: Just started working on Amazon photos mobile app for the prints feature team, I do cross-platform mobile development primarily using React Native. But I’ve also gotten to do my fair share of project management with ChefSteps, and am seeking to pursue that at Amazon<br />
JP: Opendoor<br />
Where did you start? Where were you before tech?<br />
5mins each on origin story<br />
John S: Dabbled in design + web for ever — I was working in the corporate world a job I didn’t love but I was successful. Stepped back and switched careers at November 2015 - switched career at 25<br />
John R: I worked at uhaul and albertsons as a meat clerk. Started things off by saving up for a bootcamp. Did freelance.<br />
JP: MySpace layouts in 9th grade, 13-14 years ago. Then web design until about 2015<br />
What’s been a key practice or tool in moving your career forward?<br />
John R: Networking, Diving deep, embracing things that aren’t in my domain<br />
John S: Consistency, Keeping up with friendships (networking), Blogging, pushing outside comfort zone.<br />
How do you balance getting work done now vs ongoing learning?<br />
John S: Use new tools and techniques in the day to day<br />
John R:<br />
JP: Being proactive with code review and looking to senior engineers<br />
How do you get a good Job in tech?<br />
John S: Network, publishing, making your work visible, random blog post from 2016<br />
John R:<br />
JP: I got my job from meetups</p>
<p>What would you have told yourself 3 years ago?<br />
John S: Consistency, life is a marathon not a sprint. Keep stretching yourself outside comfort zone. Focus on less, go deeper on less things.<br />
John R:<br />
JP: Take breaks, you won’t forget how to code if you take a day off</p>
<p>CLOSE - no picks</p>
<p>John R - Where can people find you?</p>
]]></content:encoded>
      <enclosure length="52242501" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/3f376e6b-a7ac-438e-bc85-b348a70f00f3/s06e09_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Career Development Roundtable: Getting Great Work in Tech</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:54:09</itunes:duration>
      <itunes:summary>This week we talk about career development in the technology career field.</itunes:summary>
      <itunes:subtitle>This week we talk about career development in the technology career field.</itunes:subtitle>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>9</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f65fe614-c534-4518-9aae-549d152b59c4</guid>
      <title>Refactoring Wrap Up &amp; Summary</title>
      <description><![CDATA[<h3>Iteration Podcast  S06E08</h3>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Work Stuff</strong></p>
<ul>
<li><strong>Work / Life separation</strong></li>
<li>Playing a lot with Vue JS - did an implementation on top of rails and loved it.</li>
<li>Rivets JS</li>
<li>Pre-built Sketch UI components (https://craftwork.design/)</li>
<li>Refactoring UI (https://refactoringui.com/)</li>
<li>Breaking things up! Learning more about technical design patterns.</li>
</ul>
<p>Summary of &quot;Refactoring&quot;</p>
<ul>
<li><strong>The Two Hats</strong> - Divide time between adding functionality and refactoring.</li>
<li><strong>Lots of Nested Functions read like a story</strong></li>
<li><strong>Refactoring and performance</strong></li>
<li>Bad Smells</li>
<li>Catalog of refactors / Catalog of patterns
<ul>
<li>Patterns of Enterprise Application Architecture</li>
<li>Decorator / Presenters  (Displays Stuff)</li>
<li>Query Objects (Looks for stuff)</li>
<li>Service Objects (Does stuff)</li>
<li>Gateway Object (Defines access)</li>
<li>Mapper Object (Pricing Package) that associates customer lease and asset</li>
</ul>
</li>
</ul>
<p>Picks:</p>
<ul>
<li>Send later in Gmail</li>
<li>Time Timer</li>
<li>Angeles Crest Highway</li>
</ul>
<p><strong>Things mentioned</strong><br />
Craftwork design https://craftwork.design/</p>
<ul>
<li>Rivests JS</li>
<li>Vue JS</li>
</ul>
]]></description>
      <pubDate>Mon, 15 Jul 2019 12:00:13 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (iteration podcast)</author>
      <link>https://iteration.simplecast.com/episodes/s06e08-ks2jne6I</link>
      <content:encoded><![CDATA[<h3>Iteration Podcast  S06E08</h3>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Work Stuff</strong></p>
<ul>
<li><strong>Work / Life separation</strong></li>
<li>Playing a lot with Vue JS - did an implementation on top of rails and loved it.</li>
<li>Rivets JS</li>
<li>Pre-built Sketch UI components (https://craftwork.design/)</li>
<li>Refactoring UI (https://refactoringui.com/)</li>
<li>Breaking things up! Learning more about technical design patterns.</li>
</ul>
<p>Summary of &quot;Refactoring&quot;</p>
<ul>
<li><strong>The Two Hats</strong> - Divide time between adding functionality and refactoring.</li>
<li><strong>Lots of Nested Functions read like a story</strong></li>
<li><strong>Refactoring and performance</strong></li>
<li>Bad Smells</li>
<li>Catalog of refactors / Catalog of patterns
<ul>
<li>Patterns of Enterprise Application Architecture</li>
<li>Decorator / Presenters  (Displays Stuff)</li>
<li>Query Objects (Looks for stuff)</li>
<li>Service Objects (Does stuff)</li>
<li>Gateway Object (Defines access)</li>
<li>Mapper Object (Pricing Package) that associates customer lease and asset</li>
</ul>
</li>
</ul>
<p>Picks:</p>
<ul>
<li>Send later in Gmail</li>
<li>Time Timer</li>
<li>Angeles Crest Highway</li>
</ul>
<p><strong>Things mentioned</strong><br />
Craftwork design https://craftwork.design/</p>
<ul>
<li>Rivests JS</li>
<li>Vue JS</li>
</ul>
]]></content:encoded>
      <enclosure length="34244380" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/2a580c5d-39d1-4a01-89a4-165dac209713/s06e08_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Refactoring Wrap Up &amp; Summary</itunes:title>
      <itunes:author>iteration podcast</itunes:author>
      <itunes:duration>00:35:24</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:keywords>software development, refactoting, web development, javascript</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f45fdc23-5a8d-479a-9e76-4a61d72062f3</guid>
      <title>Building Tests</title>
      <description><![CDATA[<h1>Chapter 4 - Building Tests</h1>
<blockquote>
<p>To do refactoring properly, I need a solid suite of tests to spot my inevitable mistakes.</p>
</blockquote>
<h2>The Value of Self-Testing Code</h2>
<ul>
<li>make sure all tests are fully automatic and that they check their own results</li>
<li>a suite of tests is a powerful bug detector that decapitates the time it takes to find bugs</li>
</ul>
<blockquote>
<p>If you want to refactor, you have to write tests</p>
</blockquote>
<h2>A First Test</h2>
<ul>
<li>simplicity of feedback from tests. just dots</li>
<li>personally like verbose test output</li>
</ul>
<h2>Add Another Test</h2>
<blockquote>
<p>Testing should be risk driven; remember, I'm trying to find bugs, now or in the future. Therefore I don't test accessor methods that just read and write a field. They are so simple that I'm not likely to find a bug there.</p>
</blockquote>
<blockquote>
<p>My focus is to test areas that I'm most worried about going wrong.</p>
</blockquote>
<h2>Probing the Boundaries</h2>
<ul>
<li>Seeing what happens when things go wrong</li>
</ul>
<blockquote>
<p>Whenever I have a collection of something, ... I like to see what happens when it's empty</p>
</blockquote>
<ul>
<li>What happens when negative numbers are passed to a function that expects positive numbers? Division by zero?<br />
How do you probe boundaries?</li>
</ul>
<h2>Much More Than This</h2>
<blockquote>
<p>When you get a bug report, start by writing a unit test that exposes the bug</p>
</blockquote>
<hr />
<h2>Picks</h2>
<ul>
<li>JP: Taking time off</li>
</ul>
]]></description>
      <pubDate>Mon, 1 Jul 2019 09:00:05 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/building-tests-3BCQOcH5</link>
      <content:encoded><![CDATA[<h1>Chapter 4 - Building Tests</h1>
<blockquote>
<p>To do refactoring properly, I need a solid suite of tests to spot my inevitable mistakes.</p>
</blockquote>
<h2>The Value of Self-Testing Code</h2>
<ul>
<li>make sure all tests are fully automatic and that they check their own results</li>
<li>a suite of tests is a powerful bug detector that decapitates the time it takes to find bugs</li>
</ul>
<blockquote>
<p>If you want to refactor, you have to write tests</p>
</blockquote>
<h2>A First Test</h2>
<ul>
<li>simplicity of feedback from tests. just dots</li>
<li>personally like verbose test output</li>
</ul>
<h2>Add Another Test</h2>
<blockquote>
<p>Testing should be risk driven; remember, I'm trying to find bugs, now or in the future. Therefore I don't test accessor methods that just read and write a field. They are so simple that I'm not likely to find a bug there.</p>
</blockquote>
<blockquote>
<p>My focus is to test areas that I'm most worried about going wrong.</p>
</blockquote>
<h2>Probing the Boundaries</h2>
<ul>
<li>Seeing what happens when things go wrong</li>
</ul>
<blockquote>
<p>Whenever I have a collection of something, ... I like to see what happens when it's empty</p>
</blockquote>
<ul>
<li>What happens when negative numbers are passed to a function that expects positive numbers? Division by zero?<br />
How do you probe boundaries?</li>
</ul>
<h2>Much More Than This</h2>
<blockquote>
<p>When you get a bug report, start by writing a unit test that exposes the bug</p>
</blockquote>
<hr />
<h2>Picks</h2>
<ul>
<li>JP: Taking time off</li>
</ul>
]]></content:encoded>
      <enclosure length="37313744" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/538245b6-77ce-4deb-8493-ac8974f6be15/S06E07_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Building Tests</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:duration>00:38:37</itunes:duration>
      <itunes:summary>This week we talk about the value of self-testing code and probing the boundaries.</itunes:summary>
      <itunes:subtitle>This week we talk about the value of self-testing code and probing the boundaries.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, software development, book study, computer programming, startups, react, web development, programming, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">17343e41-b1a9-4fb8-b559-c568f526eec2</guid>
      <title>Encapsulation</title>
      <description><![CDATA[<h1>Episode 6 - More Code Examples</h1>
<ul>
<li>Drawing from Chapter 7 - Encapsulation</li>
</ul>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h2>Encapsulate Record (162)</h2>
<pre><code class="language-javascript">var organization = { name: &quot;JP Sio&quot;, country: &quot;USA&quot; };
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">class Organization {
  constructor(data) {
    this._name = data.name;
    this._country = data.country;
  }

  get name() {
    return this._name;
  }
  set name(arg) {
    this._name = arg;
  }

  get country() {
    return this._country;
  }
  set country(arg) {
    this._country = arg;
  }
}
</code></pre>
<ul>
<li>you can hide what is stored and provide methods</li>
<li>consumer of <code>class Organization</code> doesn't need to know / care which is stored and which is calculated</li>
<li>nice getter and setter methods</li>
<li>makes it easier to refactor -&gt; can hide implementation of internals and update the internals while keeping the same external interface</li>
</ul>
<h2>Encapsulate Collection (170)</h2>
<pre><code class="language-javascript">class Person {
  get courses() {
    return this._courses;
  }
  set courses(aList) {
    this._courses = aList;
  }
}
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">class Person {
  get courses() {
    return this._courses.slice();
  }
  addCourse(aCourse) {
    /*...*/
  }
}
</code></pre>
<ul>
<li><code>slice()</code> is key here, does not modify the original array - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice</li>
<li>common approach is to provide a getting method for the collection to return a copy</li>
<li>basically, never mutate the original</li>
</ul>
<h2>Replace Primative with Object (174)</h2>
<pre><code class="language-javascript">orders.filter(0 =&gt; &quot;high&quot; === o.priority || &quot;rush&quot; === o.priority)
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">orders.filter(o =&gt; o.priority.higherThan(new Priority(&quot;normal&quot;)));
</code></pre>
<ul>
<li>this goes back to &quot;Primitive Obsession&quot;</li>
</ul>
<blockquote>
<ul>
<li>programmers are often hesitant to create their own types and rely only on primitives. i.e. representing a phone number as a string instead of as it's own type</li>
</ul>
</blockquote>
<blockquote>
<p>A telephone number may be represented as a string for a while, but later it will need special behavior for formatting, extracting the area code, and the like</p>
</blockquote>
<ul>
<li>create a new class for that bit of data</li>
<li>at first, the class does very little. in fact it probably only wraps a primitive</li>
<li>but now you have a place to put behavior specific to its needs</li>
</ul>
<h3>Inline Function (115) 🥴</h3>
<p>Sometimes it's better to not try to split things apart, sometimes it just complicates things.</p>
<pre><code class="language-javascript">// before refactor: 

function getItemPrice(item) {
  if (itemOnSale(item) == true) {
    return item.price - 5
  } else {
    return item.price
  }
};

function itemOnSale(product) {
  if (product.onSale == true) {
    return true;
  } else {
    return false;
  }
};

let original = getItemPrice(sweatshirt);

// after refactor: 

function newGetItemPrice(item) {
  if (item.onSale == true) {
    return item.price - 5
  } else {
    return item.price
  }
};

</code></pre>
<h3>Extract Class (182) 🥴</h3>
<ul>
<li>Talk through HUGE applicant model (in Ruby)</li>
<li>Broke this into child objects
<ul>
<li>Applicant Health History</li>
<li>Applicant Habits</li>
<li>Applicant Lifestyle</li>
<li>Applicant Method</li>
<li>Applicant Legal Release</li>
</ul>
</li>
</ul>
<hr />
<h2>Picks</h2>
<ul>
<li>JP: None :(</li>
<li>John: Quad Lock phone mount - bikes</li>
</ul>
]]></description>
      <pubDate>Mon, 24 Jun 2019 09:00:23 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/encapsulation-i6JKoQyo</link>
      <content:encoded><![CDATA[<h1>Episode 6 - More Code Examples</h1>
<ul>
<li>Drawing from Chapter 7 - Encapsulation</li>
</ul>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h2>Encapsulate Record (162)</h2>
<pre><code class="language-javascript">var organization = { name: &quot;JP Sio&quot;, country: &quot;USA&quot; };
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">class Organization {
  constructor(data) {
    this._name = data.name;
    this._country = data.country;
  }

  get name() {
    return this._name;
  }
  set name(arg) {
    this._name = arg;
  }

  get country() {
    return this._country;
  }
  set country(arg) {
    this._country = arg;
  }
}
</code></pre>
<ul>
<li>you can hide what is stored and provide methods</li>
<li>consumer of <code>class Organization</code> doesn't need to know / care which is stored and which is calculated</li>
<li>nice getter and setter methods</li>
<li>makes it easier to refactor -&gt; can hide implementation of internals and update the internals while keeping the same external interface</li>
</ul>
<h2>Encapsulate Collection (170)</h2>
<pre><code class="language-javascript">class Person {
  get courses() {
    return this._courses;
  }
  set courses(aList) {
    this._courses = aList;
  }
}
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">class Person {
  get courses() {
    return this._courses.slice();
  }
  addCourse(aCourse) {
    /*...*/
  }
}
</code></pre>
<ul>
<li><code>slice()</code> is key here, does not modify the original array - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice</li>
<li>common approach is to provide a getting method for the collection to return a copy</li>
<li>basically, never mutate the original</li>
</ul>
<h2>Replace Primative with Object (174)</h2>
<pre><code class="language-javascript">orders.filter(0 =&gt; &quot;high&quot; === o.priority || &quot;rush&quot; === o.priority)
</code></pre>
<p>becomes ⬇️</p>
<pre><code class="language-javascript">orders.filter(o =&gt; o.priority.higherThan(new Priority(&quot;normal&quot;)));
</code></pre>
<ul>
<li>this goes back to &quot;Primitive Obsession&quot;</li>
</ul>
<blockquote>
<ul>
<li>programmers are often hesitant to create their own types and rely only on primitives. i.e. representing a phone number as a string instead of as it's own type</li>
</ul>
</blockquote>
<blockquote>
<p>A telephone number may be represented as a string for a while, but later it will need special behavior for formatting, extracting the area code, and the like</p>
</blockquote>
<ul>
<li>create a new class for that bit of data</li>
<li>at first, the class does very little. in fact it probably only wraps a primitive</li>
<li>but now you have a place to put behavior specific to its needs</li>
</ul>
<h3>Inline Function (115) 🥴</h3>
<p>Sometimes it's better to not try to split things apart, sometimes it just complicates things.</p>
<pre><code class="language-javascript">// before refactor: 

function getItemPrice(item) {
  if (itemOnSale(item) == true) {
    return item.price - 5
  } else {
    return item.price
  }
};

function itemOnSale(product) {
  if (product.onSale == true) {
    return true;
  } else {
    return false;
  }
};

let original = getItemPrice(sweatshirt);

// after refactor: 

function newGetItemPrice(item) {
  if (item.onSale == true) {
    return item.price - 5
  } else {
    return item.price
  }
};

</code></pre>
<h3>Extract Class (182) 🥴</h3>
<ul>
<li>Talk through HUGE applicant model (in Ruby)</li>
<li>Broke this into child objects
<ul>
<li>Applicant Health History</li>
<li>Applicant Habits</li>
<li>Applicant Lifestyle</li>
<li>Applicant Method</li>
<li>Applicant Legal Release</li>
</ul>
</li>
</ul>
<hr />
<h2>Picks</h2>
<ul>
<li>JP: None :(</li>
<li>John: Quad Lock phone mount - bikes</li>
</ul>
]]></content:encoded>
      <enclosure length="38551471" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/568ae1be-971c-4f20-bb50-0dc69482fecf/S06E06_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Encapsulation</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:duration>00:39:54</itunes:duration>
      <itunes:summary>This week we talk about encapsulated records, collections and replacing primitive objects.</itunes:summary>
      <itunes:subtitle>This week we talk about encapsulated records, collections and replacing primitive objects.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, software development, book study, computer programming, startups, react, web development, programming, technology</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">35888765-09d9-4b8c-90c8-bad2d31b8ddb</guid>
      <title>Bad Smells in Code</title>
      <description><![CDATA[<h1>Chapter 3 - Bad Smells in Code</h1>
<p>The theme of this chapter: just because you know <strong>how</strong> to refactor, doesn't mean you know <strong>when</strong>. This chapter talks about the <strong>when</strong>.</p>
<blockquote>
<p>One thing we won't try to give you is precise criteria for when a refactoring is overdue. In our experience, no set of metrics rivals informed human intuition. What we will do is give you indications that there is trouble that can be solved by a refactoring.</p>
</blockquote>
<h2>Mysterious Name</h2>
<ul>
<li>there can be ambiguity in your naming in many places: variable, class, function, method, database field, etc</li>
</ul>
<h2>Duplicated Code 🔥</h2>
<ul>
<li>keep it dry</li>
</ul>
<h2>Long Functions 🔥</h2>
<ul>
<li>Since the early days of programming, people have realized that the longer a function is, the more difficult it is to understand</li>
</ul>
<h2>Long Parameter List 🔥</h2>
<ul>
<li>long parameter lists can be confusing</li>
</ul>
<h2>Global Data 🔥</h2>
<ul>
<li>the problem with global data is that it can be modified from anywhere in the codebase, making it harder to figure out which code touched it should you need to debug it</li>
</ul>
<h2>Mutable Data</h2>
<ul>
<li>changes to data often lead to unexpected consequences and tricky bugs</li>
<li>mutable data that can be calculated elsewhere is particularly pungent</li>
</ul>
<h2>Divergent Change ✅</h2>
<ul>
<li>if you look at a module and say, &quot;well, I will have to change these three functions every time -------- happens&quot; - this is an indication of divergent change</li>
<li>divergent change occurs when one module is often changed in different ways for different reasons</li>
<li>can be solved with split phase, extract function, extract class, move function</li>
</ul>
<h2>Shotgun Surgery ✅</h2>
<ul>
<li>similar to divergent change.</li>
<li>every you make a change, you need to make a ton of little edits to a lot of <em>different</em> classes</li>
</ul>
<h2>Feature Envy</h2>
<ul>
<li>occurs when a function in one module spends more time communicating with functions or data inside another module than it does within its own.</li>
</ul>
<h2>Data Clumps</h2>
<ul>
<li>grouping data together when it really should be it's own object</li>
</ul>
<h2>Primitive Obsession ✅</h2>
<ul>
<li>programmers are often hesitant to create their own types and rely only on primitives. i.e. representing a phone number as a string instead of as it's own type</li>
</ul>
<h2>Repeated Switches</h2>
<ul>
<li>alleviated with polymorphism</li>
</ul>
<h2>Loops</h2>
<ul>
<li>use pipelines instead, i.e. filter, map, each, reduce</li>
</ul>
<h2>Speculative Generality ✅</h2>
<p><em>editor choice</em></p>
<ul>
<li>can be spotted when the only users of a function or class are a test case. this is a classic case of premature optimization. &quot;we'll eventually want to add <em>this</em> feature...&quot;</li>
</ul>
<h2>Message Chains</h2>
<ul>
<li>when a client asks one object for another object, which the client then asks for yet another object, and so on.</li>
</ul>
<h2>Middle Man</h2>
<ul>
<li>when you have too much delegation (due to all of your great encapsulating of implementation details)</li>
<li>the solution is to delegate directly, cut the middle man</li>
</ul>
<h2>Insider Trading</h2>
<h2>Large Class ✅</h2>
<ul>
<li>class is doing too much</li>
</ul>
<h2>Alternative Classes with Different Interfaces</h2>
<h2>Data Class</h2>
<h2>Refused Bequest</h2>
<hr />
<h1>Picks:</h1>
<ul>
<li>JP: https://classicleatherfobs.co.uk/product-category/porsche/</li>
<li>John: https://c-command.com/toothfairy/</li>
</ul>
]]></description>
      <pubDate>Mon, 17 Jun 2019 09:00:08 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/bad-smells-in-code-HSLxEbGp</link>
      <content:encoded><![CDATA[<h1>Chapter 3 - Bad Smells in Code</h1>
<p>The theme of this chapter: just because you know <strong>how</strong> to refactor, doesn't mean you know <strong>when</strong>. This chapter talks about the <strong>when</strong>.</p>
<blockquote>
<p>One thing we won't try to give you is precise criteria for when a refactoring is overdue. In our experience, no set of metrics rivals informed human intuition. What we will do is give you indications that there is trouble that can be solved by a refactoring.</p>
</blockquote>
<h2>Mysterious Name</h2>
<ul>
<li>there can be ambiguity in your naming in many places: variable, class, function, method, database field, etc</li>
</ul>
<h2>Duplicated Code 🔥</h2>
<ul>
<li>keep it dry</li>
</ul>
<h2>Long Functions 🔥</h2>
<ul>
<li>Since the early days of programming, people have realized that the longer a function is, the more difficult it is to understand</li>
</ul>
<h2>Long Parameter List 🔥</h2>
<ul>
<li>long parameter lists can be confusing</li>
</ul>
<h2>Global Data 🔥</h2>
<ul>
<li>the problem with global data is that it can be modified from anywhere in the codebase, making it harder to figure out which code touched it should you need to debug it</li>
</ul>
<h2>Mutable Data</h2>
<ul>
<li>changes to data often lead to unexpected consequences and tricky bugs</li>
<li>mutable data that can be calculated elsewhere is particularly pungent</li>
</ul>
<h2>Divergent Change ✅</h2>
<ul>
<li>if you look at a module and say, &quot;well, I will have to change these three functions every time -------- happens&quot; - this is an indication of divergent change</li>
<li>divergent change occurs when one module is often changed in different ways for different reasons</li>
<li>can be solved with split phase, extract function, extract class, move function</li>
</ul>
<h2>Shotgun Surgery ✅</h2>
<ul>
<li>similar to divergent change.</li>
<li>every you make a change, you need to make a ton of little edits to a lot of <em>different</em> classes</li>
</ul>
<h2>Feature Envy</h2>
<ul>
<li>occurs when a function in one module spends more time communicating with functions or data inside another module than it does within its own.</li>
</ul>
<h2>Data Clumps</h2>
<ul>
<li>grouping data together when it really should be it's own object</li>
</ul>
<h2>Primitive Obsession ✅</h2>
<ul>
<li>programmers are often hesitant to create their own types and rely only on primitives. i.e. representing a phone number as a string instead of as it's own type</li>
</ul>
<h2>Repeated Switches</h2>
<ul>
<li>alleviated with polymorphism</li>
</ul>
<h2>Loops</h2>
<ul>
<li>use pipelines instead, i.e. filter, map, each, reduce</li>
</ul>
<h2>Speculative Generality ✅</h2>
<p><em>editor choice</em></p>
<ul>
<li>can be spotted when the only users of a function or class are a test case. this is a classic case of premature optimization. &quot;we'll eventually want to add <em>this</em> feature...&quot;</li>
</ul>
<h2>Message Chains</h2>
<ul>
<li>when a client asks one object for another object, which the client then asks for yet another object, and so on.</li>
</ul>
<h2>Middle Man</h2>
<ul>
<li>when you have too much delegation (due to all of your great encapsulating of implementation details)</li>
<li>the solution is to delegate directly, cut the middle man</li>
</ul>
<h2>Insider Trading</h2>
<h2>Large Class ✅</h2>
<ul>
<li>class is doing too much</li>
</ul>
<h2>Alternative Classes with Different Interfaces</h2>
<h2>Data Class</h2>
<h2>Refused Bequest</h2>
<hr />
<h1>Picks:</h1>
<ul>
<li>JP: https://classicleatherfobs.co.uk/product-category/porsche/</li>
<li>John: https://c-command.com/toothfairy/</li>
</ul>
]]></content:encoded>
      <enclosure length="42080406" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/02fa298a-b72d-4c1e-868c-e7f2ffd97e7b/S06E05_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Bad Smells in Code</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:duration>00:43:35</itunes:duration>
      <itunes:summary>This week we talk about long functions, long parameter list, global and mutable data.</itunes:summary>
      <itunes:subtitle>This week we talk about long functions, long parameter list, global and mutable data.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, software development, book study, computer programming, startups, react, web development, programming, technology</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f82b5ff4-b08a-48a5-8470-b8773cffbf74</guid>
      <title>Refactoring 🛠Getting Into The Weeds</title>
      <description><![CDATA[<p>S06E04 - Iteration<br />
A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter<br />
Refactors Before -</p>
<ul>
<li>Extract Function</li>
<li>Change Function Decleration</li>
<li>Replace Temp with query</li>
<li>Replace conditional with polymorphism<br />
Refactoring in Practice<br />
Introduce Parameter Object - 140</li>
<li>Structure your parameters</li>
<li>This way order doesn’t matter</li>
<li>You can set default values</li>
<li>Grouping data is more clear in the relationship<br />
Replace Constructor with Factory Function 334 -</li>
<li>Encapsulating the creation of objects (the initialize) into a factory Function<br />
In Ruby: Creating a new User and Organization within a UserOrganizationFactory call / Tangent / Related to FormObjects.<br />
In JavaScript: availableVariants  - big array with Item, Colors, Sizes - replaced with variantFactory(34,2345,2345,) just passing ID’s<br />
Extract Function into class - 182</li>
<li>Consolidate up a bunch of related functions into a parent class<br />
Split Phase 154 - Variant of Extract Function</li>
<li>When a function is dealing with two different things - look for a way to split it out - was cleaner approach.<br />
JavaScript</li>
<li>Cart.js - logic of API calls associated with the user input</li>
<li>Split this into discrete functions<br />
Ruby</li>
<li>Notification logic was calling Twilio</li>
<li>Encapsulate this into it’s own method</li>
<li>Later then it was a service object to itself<br />
My Cart.js Story - (Refactoring in Vue / JavaScript)</li>
</ul>
<ul>
<li>addItem - for adding item to cart</li>
<li>removeItem - for removing item from cart</li>
<li>increaseItemCount - for adjusting line item</li>
<li>decreaseItemCount - for adjusting line item</li>
<li>setLineItemCount - for adding to cart an initial value<br />
First - Rename Methods (Change Function Declaration) 124</li>
<li>addItem - became - addItemToCart</li>
<li>removeItem - became - removeItemFromCart</li>
<li>increaseItem - became - increaseLineItemCount</li>
<li>decreaseItem - became - decreaseLineItemCount<br />
Second - Extract Function 106</li>
<li>Both increaseLineItemCount and decreaseLineItemCount were doing something very similar.</li>
<li>So I created a new function of setLineItemQty</li>
<li>Both my methods of increaseLineItemCount and decreaseLineItemCount were then calling this setLineItemQty that accepted a qty parameter - function.<br />
Second - parameterize Function 310</li>
<li>This did take a refactor of my vue listeners.</li>
<li>Since I had this new setLineItemQty that accepted a qty parameter</li>
<li>I replaced increaseLineItemCount and decreaseLineItemCount a single function of setLineItemQty</li>
<li>Deleted a lot of code<br />
Third - Used inline function 106 to simply alias another function.</li>
<li>Through the above refactors I realized that addItemToCart was doing the same transactional work as setLineItemQty to 1</li>
<li>I removed the body of addItemToCart and replaced it with setLineItemQty with the default params accordingly.<br />
Fourth - Again used inline function 106 to alias another function</li>
<li>Through the above refactors I realized that removeItemFromCart was doing the same transactional work as setLineItemQty to 0</li>
<li>I removed the body of removeItemFromCart and replaced it with setLineItemQty with the default params accordingly<br />
Fifth - I used<br />
I realized that all these functions were just doing the same thing. Adjusting CartLineItemCount.</li>
</ul>
<ul>
<li>The final refactor simply deleted removeItemFromCart and addItemToCart<br />
In closing:</li>
</ul>
<ul>
<li>Code went from 160 lines to around 60</li>
<li>It’s way DRY</li>
<li>It’s way more reusable</li>
<li>The interface to my cart.js is now just a single function of setLineItemQty<br />
Updated my vue listeners - Every interaction within this front end is just calling setLineItemQty</li>
</ul>
<hr />
<p>Picks:</p>
<ul>
<li>vue.js - https://vuejs.org/ -</li>
<li>Burnout Reddit thrread: https://www.reddit.com/r/cscareerquestions/comments/b6xzr0/how_do_you_keep_from_burning_out_at_your_job/</li>
</ul>
]]></description>
      <pubDate>Mon, 10 Jun 2019 09:00:04 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/refactoring-before-HkIq4TJV</link>
      <content:encoded><![CDATA[<p>S06E04 - Iteration<br />
A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter<br />
Refactors Before -</p>
<ul>
<li>Extract Function</li>
<li>Change Function Decleration</li>
<li>Replace Temp with query</li>
<li>Replace conditional with polymorphism<br />
Refactoring in Practice<br />
Introduce Parameter Object - 140</li>
<li>Structure your parameters</li>
<li>This way order doesn’t matter</li>
<li>You can set default values</li>
<li>Grouping data is more clear in the relationship<br />
Replace Constructor with Factory Function 334 -</li>
<li>Encapsulating the creation of objects (the initialize) into a factory Function<br />
In Ruby: Creating a new User and Organization within a UserOrganizationFactory call / Tangent / Related to FormObjects.<br />
In JavaScript: availableVariants  - big array with Item, Colors, Sizes - replaced with variantFactory(34,2345,2345,) just passing ID’s<br />
Extract Function into class - 182</li>
<li>Consolidate up a bunch of related functions into a parent class<br />
Split Phase 154 - Variant of Extract Function</li>
<li>When a function is dealing with two different things - look for a way to split it out - was cleaner approach.<br />
JavaScript</li>
<li>Cart.js - logic of API calls associated with the user input</li>
<li>Split this into discrete functions<br />
Ruby</li>
<li>Notification logic was calling Twilio</li>
<li>Encapsulate this into it’s own method</li>
<li>Later then it was a service object to itself<br />
My Cart.js Story - (Refactoring in Vue / JavaScript)</li>
</ul>
<ul>
<li>addItem - for adding item to cart</li>
<li>removeItem - for removing item from cart</li>
<li>increaseItemCount - for adjusting line item</li>
<li>decreaseItemCount - for adjusting line item</li>
<li>setLineItemCount - for adding to cart an initial value<br />
First - Rename Methods (Change Function Declaration) 124</li>
<li>addItem - became - addItemToCart</li>
<li>removeItem - became - removeItemFromCart</li>
<li>increaseItem - became - increaseLineItemCount</li>
<li>decreaseItem - became - decreaseLineItemCount<br />
Second - Extract Function 106</li>
<li>Both increaseLineItemCount and decreaseLineItemCount were doing something very similar.</li>
<li>So I created a new function of setLineItemQty</li>
<li>Both my methods of increaseLineItemCount and decreaseLineItemCount were then calling this setLineItemQty that accepted a qty parameter - function.<br />
Second - parameterize Function 310</li>
<li>This did take a refactor of my vue listeners.</li>
<li>Since I had this new setLineItemQty that accepted a qty parameter</li>
<li>I replaced increaseLineItemCount and decreaseLineItemCount a single function of setLineItemQty</li>
<li>Deleted a lot of code<br />
Third - Used inline function 106 to simply alias another function.</li>
<li>Through the above refactors I realized that addItemToCart was doing the same transactional work as setLineItemQty to 1</li>
<li>I removed the body of addItemToCart and replaced it with setLineItemQty with the default params accordingly.<br />
Fourth - Again used inline function 106 to alias another function</li>
<li>Through the above refactors I realized that removeItemFromCart was doing the same transactional work as setLineItemQty to 0</li>
<li>I removed the body of removeItemFromCart and replaced it with setLineItemQty with the default params accordingly<br />
Fifth - I used<br />
I realized that all these functions were just doing the same thing. Adjusting CartLineItemCount.</li>
</ul>
<ul>
<li>The final refactor simply deleted removeItemFromCart and addItemToCart<br />
In closing:</li>
</ul>
<ul>
<li>Code went from 160 lines to around 60</li>
<li>It’s way DRY</li>
<li>It’s way more reusable</li>
<li>The interface to my cart.js is now just a single function of setLineItemQty<br />
Updated my vue listeners - Every interaction within this front end is just calling setLineItemQty</li>
</ul>
<hr />
<p>Picks:</p>
<ul>
<li>vue.js - https://vuejs.org/ -</li>
<li>Burnout Reddit thrread: https://www.reddit.com/r/cscareerquestions/comments/b6xzr0/how_do_you_keep_from_burning_out_at_your_job/</li>
</ul>
]]></content:encoded>
      <enclosure length="40171665" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/348ccf30-d833-4320-a3d9-882a963ca829/S06E04_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Refactoring 🛠Getting Into The Weeds</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:duration>00:41:35</itunes:duration>
      <itunes:summary>This week we talk about introducing parameter object, replacing constructor with factory function, and extracting function into class.</itunes:summary>
      <itunes:subtitle>This week we talk about introducing parameter object, replacing constructor with factory function, and extracting function into class.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, software development, book study, computer programming, startups, react, web development, programming, technology</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>4</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">afc1e246-6490-4033-83bf-39d75f1733ef</guid>
      <title>Principles in Refactoring</title>
      <description><![CDATA[<h3>Chapter 2 Principles in Refactoring</h3>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<ul>
<li>Define Refactoring</li>
<li>“If someone says their code is broken for a couple days while they are refactoring =, you can be pretty sure they aren’t refactoring.</li>
<li>Adding Features Vs Refactoring</li>
</ul>
<p>Why should we refactor?</p>
<ul>
<li>Code rot - overtime the code decays - rushed or poorly executed changes</li>
<li>Regular refactoring helps keep things in shape</li>
<li>Makes things easier to understand</li>
<li>(Delegating issues in clean codebase vs rough)</li>
<li>Refactoring helps find bugs</li>
<li>Refactoring helps us work faster long term - cleaning your workspace</li>
<li>Over time adding new features is easier</li>
</ul>
<p>Getting buy in for refactors:</p>
<ul>
<li>Don’t tell your manager / client</li>
<li>Build it into your estimates</li>
<li>You are being paid for your expertise</li>
<li>be confident in somewhat hiding the implementation. (Depends on your role)</li>
</ul>
<p>When to refactor:</p>
<ul>
<li>Prepatory Refactoring</li>
<li>Comprehension refactoring</li>
<li>Long term refactor - Ech small change leaves everything is a still working state, not just “up to date”</li>
<li>In code reviews</li>
</ul>
<p>When to not refactor:</p>
<ul>
<li>If the code is working fine and it doesn’t need to be changed</li>
<li>If it works like an API</li>
<li>When it will slow down an essential new feature.</li>
</ul>
<p>Legacy Code</p>
<hr />
<p>Refactoring Tools for future episodes?</p>
<ul>
<li>Writing Ruby Gems</li>
<li>Renovate Bot</li>
</ul>
<p>Picks</p>
<ul>
<li>JP: Free Event Tickets</li>
<li>John: Eero wifi router</li>
</ul>
]]></description>
      <pubDate>Mon, 1 Apr 2019 04:49:34 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/s06e03-Bg23fzXO</link>
      <content:encoded><![CDATA[<h3>Chapter 2 Principles in Refactoring</h3>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<ul>
<li>Define Refactoring</li>
<li>“If someone says their code is broken for a couple days while they are refactoring =, you can be pretty sure they aren’t refactoring.</li>
<li>Adding Features Vs Refactoring</li>
</ul>
<p>Why should we refactor?</p>
<ul>
<li>Code rot - overtime the code decays - rushed or poorly executed changes</li>
<li>Regular refactoring helps keep things in shape</li>
<li>Makes things easier to understand</li>
<li>(Delegating issues in clean codebase vs rough)</li>
<li>Refactoring helps find bugs</li>
<li>Refactoring helps us work faster long term - cleaning your workspace</li>
<li>Over time adding new features is easier</li>
</ul>
<p>Getting buy in for refactors:</p>
<ul>
<li>Don’t tell your manager / client</li>
<li>Build it into your estimates</li>
<li>You are being paid for your expertise</li>
<li>be confident in somewhat hiding the implementation. (Depends on your role)</li>
</ul>
<p>When to refactor:</p>
<ul>
<li>Prepatory Refactoring</li>
<li>Comprehension refactoring</li>
<li>Long term refactor - Ech small change leaves everything is a still working state, not just “up to date”</li>
<li>In code reviews</li>
</ul>
<p>When to not refactor:</p>
<ul>
<li>If the code is working fine and it doesn’t need to be changed</li>
<li>If it works like an API</li>
<li>When it will slow down an essential new feature.</li>
</ul>
<p>Legacy Code</p>
<hr />
<p>Refactoring Tools for future episodes?</p>
<ul>
<li>Writing Ruby Gems</li>
<li>Renovate Bot</li>
</ul>
<p>Picks</p>
<ul>
<li>JP: Free Event Tickets</li>
<li>John: Eero wifi router</li>
</ul>
]]></content:encoded>
      <enclosure length="62316013" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/ba3f3690-8f4a-4252-9e30-aada5c90ad32/S06E03_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Principles in Refactoring</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:duration>00:42:51</itunes:duration>
      <itunes:summary>This week we cover Chapter 2 of Refactoring by Martin Fowler. Some awesome high level stuff including Why should we refactor? Getting clients to go along with refactors, and when not to refactor. </itunes:summary>
      <itunes:subtitle>This week we cover Chapter 2 of Refactoring by Martin Fowler. Some awesome high level stuff including Why should we refactor? Getting clients to go along with refactors, and when not to refactor. </itunes:subtitle>
      <itunes:keywords>software, web development, javascript, programming, webdev</itunes:keywords>
      <itunes:explicit>yes</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">903e8475-d2c8-4530-81b7-5dd6608017dc</guid>
      <title>Refactoring - In Practice</title>
      <description><![CDATA[<p>In this episode we dive deep into some specific refactors from Refactoring 's Chapter 1. We talk  about renaming things, extracting functions, functions, replacing a temp with query and some other hot tips and tricks you can put into your code today.</p>
<p>This episode walks through specific code examples from Chapter 1 of Martin Fowler's Refactoring...</p>
<h3>Some of the refactors</h3>
<p>Change Function Declaration</p>
<ul>
<li>Rename things</li>
<li>Names are hard</li>
<li>A few general categories of things you can name
<ul>
<li>predicate? -  Should only return true / false - Javascript start with is - ruby question mark - so isValidPhone(number)</li>
<li>In Ruby - ! For destructive / dangerous actions - update_recent_activity!  - name destructive actions or actions with side effects really well.</li>
<li>Formatting? - use - as - number_as_phone(number) or to to_bmi(user.weight, user.height)</li>
</ul>
</li>
</ul>
<p>Extract Function</p>
<p>Replace temp w/ query</p>
<ul>
<li>Extending this example:</li>
</ul>
<p>Instead of:</p>
<p>accounts =  get_accounts(user)<br />
transactions = get_transactions(accounts)</p>
<p>we can just do:</p>
<p>transactions = get_transactions(get_accounts(user))</p>
<p>Replace conditional with polymorphism</p>
<p><code>Notification.deliver!</code> example</p>
<h3>Picks</h3>
<ul>
<li>JP: Thanos JS - https://thanosjs.org/</li>
<li>John: Loom https://www.loom.com/ - and http://www.telestream.net/screenflow/overview.htm</li>
</ul>
]]></description>
      <pubDate>Mon, 25 Mar 2019 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/refactoring-in-practice-d6a0319b</link>
      <content:encoded><![CDATA[<p>In this episode we dive deep into some specific refactors from Refactoring 's Chapter 1. We talk  about renaming things, extracting functions, functions, replacing a temp with query and some other hot tips and tricks you can put into your code today.</p>
<p>This episode walks through specific code examples from Chapter 1 of Martin Fowler's Refactoring...</p>
<h3>Some of the refactors</h3>
<p>Change Function Declaration</p>
<ul>
<li>Rename things</li>
<li>Names are hard</li>
<li>A few general categories of things you can name
<ul>
<li>predicate? -  Should only return true / false - Javascript start with is - ruby question mark - so isValidPhone(number)</li>
<li>In Ruby - ! For destructive / dangerous actions - update_recent_activity!  - name destructive actions or actions with side effects really well.</li>
<li>Formatting? - use - as - number_as_phone(number) or to to_bmi(user.weight, user.height)</li>
</ul>
</li>
</ul>
<p>Extract Function</p>
<p>Replace temp w/ query</p>
<ul>
<li>Extending this example:</li>
</ul>
<p>Instead of:</p>
<p>accounts =  get_accounts(user)<br />
transactions = get_transactions(accounts)</p>
<p>we can just do:</p>
<p>transactions = get_transactions(get_accounts(user))</p>
<p>Replace conditional with polymorphism</p>
<p><code>Notification.deliver!</code> example</p>
<h3>Picks</h3>
<ul>
<li>JP: Thanos JS - https://thanosjs.org/</li>
<li>John: Loom https://www.loom.com/ - and http://www.telestream.net/screenflow/overview.htm</li>
</ul>
]]></content:encoded>
      <enclosure length="33715260" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/7866970d-39e9-4d1e-9af8-f28dbaa2dc12/d6a0319b_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Refactoring - In Practice</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/7866970d-39e9-4d1e-9af8-f28dbaa2dc12/3000x3000/1553477667artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:34:53</itunes:duration>
      <itunes:summary>In this episode we dive deep into some specific refactors from Refactoring &apos;s Chapter 1. We talk  about renaming things, extracting functions, functions, replacing a temp with query and some other hot tips and tricks you can put into your code today. </itunes:summary>
      <itunes:subtitle>In this episode we dive deep into some specific refactors from Refactoring &apos;s Chapter 1. We talk  about renaming things, extracting functions, functions, replacing a temp with query and some other hot tips and tricks you can put into your code today. </itunes:subtitle>
      <itunes:keywords>programming, refactoring, web development, javascript, webdev</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f548e282-ab23-46dc-9edc-2f45e9846b67</guid>
      <title>New Book - Refactoring</title>
      <description><![CDATA[<p>Welcome to iteration. A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Refactoring</strong></p>
<p><strong>Improving the Design of Existing Code</strong></p>
<p>by Martin Fowler (with Kent Beck)</p>
<p>Introduction</p>
<ul>
<li>What’s in the book?</li>
<li>Who’s it for?</li>
<li>What’s refactoring?</li>
</ul>
<p>Refactoring process:</p>
<ul>
<li>Identify a pain, smell a smell, we’ll talk more about when to refactor in later episodes.</li>
<li>Separate feature additions from refactors</li>
<li>Refactorings are like diets - a lifestyle vs an intensive</li>
<li>Test coverage first</li>
<li>Small changes continually running tests</li>
<li>End goal: lots of small well-named functions that tells a clear story.</li>
</ul>
<p>Considerations + Thoughts</p>
<ul>
<li>Tests let JP in react native move faster</li>
<li>Refactoring lets you get things out of your head and into the code. Do this continuously.</li>
<li>Performance and refactoring</li>
</ul>
<p><strong>My Pick:</strong></p>
<ul>
<li><strong>How To Code Well - <a href="http://howtocodewell.net/">howtocodewell.net</a></strong></li>
<li><strong>Dark Net Diaries <a href="https://darknetdiaries.com/">https://darknetdiaries.com/</a></strong></li>
<li><strong>Selection - Apple's Design Process</strong></li>
</ul>
]]></description>
      <pubDate>Mon, 18 Mar 2019 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/new-book-refactoring-7ee436ec</link>
      <content:encoded><![CDATA[<p>Welcome to iteration. A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Refactoring</strong></p>
<p><strong>Improving the Design of Existing Code</strong></p>
<p>by Martin Fowler (with Kent Beck)</p>
<p>Introduction</p>
<ul>
<li>What’s in the book?</li>
<li>Who’s it for?</li>
<li>What’s refactoring?</li>
</ul>
<p>Refactoring process:</p>
<ul>
<li>Identify a pain, smell a smell, we’ll talk more about when to refactor in later episodes.</li>
<li>Separate feature additions from refactors</li>
<li>Refactorings are like diets - a lifestyle vs an intensive</li>
<li>Test coverage first</li>
<li>Small changes continually running tests</li>
<li>End goal: lots of small well-named functions that tells a clear story.</li>
</ul>
<p>Considerations + Thoughts</p>
<ul>
<li>Tests let JP in react native move faster</li>
<li>Refactoring lets you get things out of your head and into the code. Do this continuously.</li>
<li>Performance and refactoring</li>
</ul>
<p><strong>My Pick:</strong></p>
<ul>
<li><strong>How To Code Well - <a href="http://howtocodewell.net/">howtocodewell.net</a></strong></li>
<li><strong>Dark Net Diaries <a href="https://darknetdiaries.com/">https://darknetdiaries.com/</a></strong></li>
<li><strong>Selection - Apple's Design Process</strong></li>
</ul>
]]></content:encoded>
      <enclosure length="38189093" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/4aeeb078-978a-4453-8a25-034048287c69/7ee436ec_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>New Book - Refactoring</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/4aeeb078-978a-4453-8a25-034048287c69/3000x3000/1552804562artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:39:33</itunes:duration>
      <itunes:summary>This week we talk about improving the design of existing code, the refactoring process and the end goal.</itunes:summary>
      <itunes:subtitle>This week we talk about improving the design of existing code, the refactoring process and the end goal.</itunes:subtitle>
      <itunes:keywords>technology, inheritance, web development, composition, webdev, software development, refactoring, ruby on rails, startups, computer programming, book study, software development, react, design, programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0d31cc57-56d8-43cb-b3d9-c140bd2df9d7</guid>
      <title>In Between Books</title>
      <description><![CDATA[<p><strong>S06E01 - DO IT LIVE!</strong></p>
<p>This week is a more casual episode where we talk about recent struggles findings and some of our favorite parts of our most recent book. Practical Object-Oriented Programming in Ruby</p>
<p>We'll be back episode covering a new book - Refactoring by Martin Fowler</p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p><strong>CH2 - Designing Classes with a single responsibility</strong></p>
<p>Chapter 7 - Favorite Takeaways/Examples From POODR</p>
<ul>
<li>Duck Typing -</li>
<li>Modules -</li>
</ul>
<p><strong>My Team Came up with:</strong></p>
<p>include Listable</p>
<p>include Lister</p>
<p>Any user type can act as a “Lister” and add things to the list</p>
<p>Any object can be “Listable” or “added to a list”</p>
<p><strong>Recent Lessons - Always have a staging environment</strong></p>
<p>Picks:</p>
<p>https://thispersondoesnotexist.com/</p>
]]></description>
      <pubDate>Mon, 4 Mar 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/in-between-books-1113a385</link>
      <content:encoded><![CDATA[<p><strong>S06E01 - DO IT LIVE!</strong></p>
<p>This week is a more casual episode where we talk about recent struggles findings and some of our favorite parts of our most recent book. Practical Object-Oriented Programming in Ruby</p>
<p>We'll be back episode covering a new book - Refactoring by Martin Fowler</p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p><strong>CH2 - Designing Classes with a single responsibility</strong></p>
<p>Chapter 7 - Favorite Takeaways/Examples From POODR</p>
<ul>
<li>Duck Typing -</li>
<li>Modules -</li>
</ul>
<p><strong>My Team Came up with:</strong></p>
<p>include Listable</p>
<p>include Lister</p>
<p>Any user type can act as a “Lister” and add things to the list</p>
<p>Any object can be “Listable” or “added to a list”</p>
<p><strong>Recent Lessons - Always have a staging environment</strong></p>
<p>Picks:</p>
<p>https://thispersondoesnotexist.com/</p>
]]></content:encoded>
      <enclosure length="44870591" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/1df354e2-12be-4f55-94e8-3a0c94bcd2da/1113a385_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>In Between Books</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/1df354e2-12be-4f55-94e8-3a0c94bcd2da/3000x3000/1551624819artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:46:30</itunes:duration>
      <itunes:summary>This week we talk about Javascript, Ruby, and some of our favorite parts from Practical Objected Oriented Programming.</itunes:summary>
      <itunes:subtitle>This week we talk about Javascript, Ruby, and some of our favorite parts from Practical Objected Oriented Programming.</itunes:subtitle>
      <itunes:keywords>book study, software development, design, computer programming, inheritance, composition, technology, web development, ruby on rails, programming, react, startups</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>0</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8a7f9b49-5ff7-4c1a-9cc4-30ac45971e61</guid>
      <title>Testing... Testing... 123...</title>
      <description><![CDATA[<p>Iteration S05E09</p>
<p>Testing… Testing… 123</p>
<p><strong>Publishing February 18th - Hope everyone had a good Valentine’s Day weekend!</strong></p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Introduction</strong></p>
<ul>
<li>Writing changeable code is an art on which practice relies on three different skills. First, you must understand object-oriented design. Poorly designed code is naturally difficult to change.</li>
<li>First, you must understand object-oriented design. A poorly designed code is naturally difficult to change.</li>
<li>Second, you must be skilled at refactoring code.</li>
<li>Finally, the art of writing a changeable code requires the ability to write high-value tests. Tests give you the confidence to refactor constantly.</li>
</ul>
<p><strong>Reasons to test:</strong></p>
<ul>
<li>Finding Bugs</li>
<li><strong>Supplying Documentation</strong></li>
<li>Deferring Design Decisions</li>
<li>Supporting Abstractions</li>
<li>Exposing Design Flaws</li>
</ul>
<p>Knowing What to test:</p>
<ul>
<li>“Most developers write too many tests” - OR NONE! hahaha</li>
<li>Tests should concentrate on the incoming or outgoing messages that cross an object’s boundaries.</li>
<li>Back to the Kitchen Metaphor - Test that ordering a hamburger, returns a hamburger as expected, not that the kitchen staff turns on the grill or slices tomatoes.</li>
<li><strong>Incoming messages should be tested for the state they return.</strong></li>
<li><strong>Outgoing command messages should be tested to ensure they get sent.</strong></li>
<li><strong>Outgoing query messages should not be tested.</strong></li>
</ul>
<p>Knowing When to Test</p>
<ul>
<li><strong>Write tests first, whenever it makes sense to do so</strong></li>
</ul>
<p><strong>Knowing How to test:</strong></p>
<ul>
<li>Testing Styles: Test Driven Development (TDD) and Behavior Driven Development (BDD).</li>
<li><strong>Proving the Public Interface</strong></li>
<li>Injecting Dependencies as Roles</li>
<li>Testing Inheritance - Test your base class - then include the module to test each of the responses that are in the base class.</li>
<li><strong>Creating Test Doubles - DiameterDouble - A test double is a stylized instance of a role player that is used exclusively for testing - tend to override the base class in my test helper - I’ve run into silent errors this way.</strong></li>
<li>Testing Private Methods - interface. These private messages are like proverbial trees falling in empty forests; they do not exist, in a perfect world they do not need to be tested - testing them is a code smell.</li>
<li><strong>Testing Ducks - create a preferred test interface - mechanic and a guide can both prepare - you can establish a single interface and simply pass the different objects into it.</strong></li>
<li>Testing Inherited Code</li>
<li><strong>Testing Models + Objects Vs interface - where’s the balance?</strong></li>
</ul>
<p>Tests are indispensable. Well-designed applications are highly abstract and under constant pressure to evolve; without tests these applications can neither be understood nor safely changed. The best tests are loosely coupled to the underlying code and test everything once and in the proper place. They add value without increasing costs.</p>
<p>Next Episode - Recap of Practical Object-Oriented Design and New book announcement!</p>
<p>Picks:</p>
<p><strong>NOUN PROJECT - <a href="https://thenounproject.com/">https://thenounproject.com/</a></strong></p>
<p>**Super Smash Bros Ultimate **</p>
<p><strong><a href="https://twitter.com/Nei1dor">Neil Davis - @Nei1dor</a></strong></p>
<p><strong><a href="https://twitter.com/AaronKelton">Aaron Kelton</a></strong></p>
]]></description>
      <pubDate>Mon, 18 Feb 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/testing-testing-123-852d9c36</link>
      <content:encoded><![CDATA[<p>Iteration S05E09</p>
<p>Testing… Testing… 123</p>
<p><strong>Publishing February 18th - Hope everyone had a good Valentine’s Day weekend!</strong></p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Introduction</strong></p>
<ul>
<li>Writing changeable code is an art on which practice relies on three different skills. First, you must understand object-oriented design. Poorly designed code is naturally difficult to change.</li>
<li>First, you must understand object-oriented design. A poorly designed code is naturally difficult to change.</li>
<li>Second, you must be skilled at refactoring code.</li>
<li>Finally, the art of writing a changeable code requires the ability to write high-value tests. Tests give you the confidence to refactor constantly.</li>
</ul>
<p><strong>Reasons to test:</strong></p>
<ul>
<li>Finding Bugs</li>
<li><strong>Supplying Documentation</strong></li>
<li>Deferring Design Decisions</li>
<li>Supporting Abstractions</li>
<li>Exposing Design Flaws</li>
</ul>
<p>Knowing What to test:</p>
<ul>
<li>“Most developers write too many tests” - OR NONE! hahaha</li>
<li>Tests should concentrate on the incoming or outgoing messages that cross an object’s boundaries.</li>
<li>Back to the Kitchen Metaphor - Test that ordering a hamburger, returns a hamburger as expected, not that the kitchen staff turns on the grill or slices tomatoes.</li>
<li><strong>Incoming messages should be tested for the state they return.</strong></li>
<li><strong>Outgoing command messages should be tested to ensure they get sent.</strong></li>
<li><strong>Outgoing query messages should not be tested.</strong></li>
</ul>
<p>Knowing When to Test</p>
<ul>
<li><strong>Write tests first, whenever it makes sense to do so</strong></li>
</ul>
<p><strong>Knowing How to test:</strong></p>
<ul>
<li>Testing Styles: Test Driven Development (TDD) and Behavior Driven Development (BDD).</li>
<li><strong>Proving the Public Interface</strong></li>
<li>Injecting Dependencies as Roles</li>
<li>Testing Inheritance - Test your base class - then include the module to test each of the responses that are in the base class.</li>
<li><strong>Creating Test Doubles - DiameterDouble - A test double is a stylized instance of a role player that is used exclusively for testing - tend to override the base class in my test helper - I’ve run into silent errors this way.</strong></li>
<li>Testing Private Methods - interface. These private messages are like proverbial trees falling in empty forests; they do not exist, in a perfect world they do not need to be tested - testing them is a code smell.</li>
<li><strong>Testing Ducks - create a preferred test interface - mechanic and a guide can both prepare - you can establish a single interface and simply pass the different objects into it.</strong></li>
<li>Testing Inherited Code</li>
<li><strong>Testing Models + Objects Vs interface - where’s the balance?</strong></li>
</ul>
<p>Tests are indispensable. Well-designed applications are highly abstract and under constant pressure to evolve; without tests these applications can neither be understood nor safely changed. The best tests are loosely coupled to the underlying code and test everything once and in the proper place. They add value without increasing costs.</p>
<p>Next Episode - Recap of Practical Object-Oriented Design and New book announcement!</p>
<p>Picks:</p>
<p><strong>NOUN PROJECT - <a href="https://thenounproject.com/">https://thenounproject.com/</a></strong></p>
<p>**Super Smash Bros Ultimate **</p>
<p><strong><a href="https://twitter.com/Nei1dor">Neil Davis - @Nei1dor</a></strong></p>
<p><strong><a href="https://twitter.com/AaronKelton">Aaron Kelton</a></strong></p>
]]></content:encoded>
      <enclosure length="31382630" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/a0c9bf59-4634-4a8c-b0e0-b348cf662685/852d9c36_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Testing... Testing... 123...</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/a0c9bf59-4634-4a8c-b0e0-b348cf662685/3000x3000/1550437666artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:32:27</itunes:duration>
      <itunes:summary>This week we talk about writing changeable code, knowing what to test, when to test, and how to test.</itunes:summary>
      <itunes:subtitle>This week we talk about writing changeable code, knowing what to test, when to test, and how to test.</itunes:subtitle>
      <itunes:keywords>computer programming, software development, programming, technology, web development, dependency, ruby on rails, react, book study, startups, testing, design</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>9</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b875e7e2-3b8b-4e15-887b-602579abd054</guid>
      <title>Composition Imposition</title>
      <description><![CDATA[<p><strong>Combining Objects with Composition</strong></p>
<p><strong>Metz, Sandi. Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p>“Combining the qualities of two existing subclasses, something that inheritance cannot readily accommodate.”</p>
<p>We talked about inheritance, then modules, now this builds on top of the idea of modules and pushes it further.</p>
<p>Composing a bicycle of parts...</p>
<p>Bicycle &gt; has A parts</p>
<p>Parts has subclasses of - RoadBikeParts and MountainBikeParts</p>
<p>Making the Parts Object More Like an Array - This part was freaky</p>
<p>Parts Factory</p>
<p>Different Configs within the parts factory &gt; an array of all the keys and attributes - road_config - mountain_config</p>
<p>Using all this to make a recumbent bike:</p>
<p>Once this is all set up you have this incredibly powerful interface of a bicycle composed of parts:</p>
<p><strong>Bicycle.new(</strong></p>
<p><strong>size: 'L',</strong></p>
<p><strong>parts: PartsFactory.build(recumbent_config))</strong></p>
<p>Composition VS Aggregation</p>
<p>A Meal is composed of an appetizer - An appetizer does not survive outside of the meal. When the meal is gone by definition the appetizer is gone. A meal is composed of an appetizer.</p>
<p>A band is an aggregate of musicians - when the band breaks up the musicians don’t die.</p>
<p>“Composition” encompasses both aggregation and composition -</p>
<p>“This distinction between composition and aggregation may have a little practical effect on your code.”</p>
<p><strong>Deciding Between Inheritance and Composition</strong></p>
<p>“Think of it this way: For the cost of arranging objects in a hierarchy, you get message delegation for free.”</p>
<p>When in doubt use Composition over inheritance</p>
<p>“The general rule is that faced with a problem that composition can solve, you should be biased towards doing so. If you cannot explicitly defend inheritance as a better solution, use composition.”</p>
<p>John’s Pick: Book: &quot;It Doesn’t Have To Be Crazy At Work&quot; -&gt; David Heinemeier Hansen and Jason Fried</p>
<p>JP: <a href="https://www.khanacademy.org/math">Kahn Academy</a> - digging into math again</p>
<p>Next Week: Final Chapter - Designing Cost-Effective Tests</p>
]]></description>
      <pubDate>Mon, 11 Feb 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/composition-imposition-1b67e93d</link>
      <content:encoded><![CDATA[<p><strong>Combining Objects with Composition</strong></p>
<p><strong>Metz, Sandi. Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p>“Combining the qualities of two existing subclasses, something that inheritance cannot readily accommodate.”</p>
<p>We talked about inheritance, then modules, now this builds on top of the idea of modules and pushes it further.</p>
<p>Composing a bicycle of parts...</p>
<p>Bicycle &gt; has A parts</p>
<p>Parts has subclasses of - RoadBikeParts and MountainBikeParts</p>
<p>Making the Parts Object More Like an Array - This part was freaky</p>
<p>Parts Factory</p>
<p>Different Configs within the parts factory &gt; an array of all the keys and attributes - road_config - mountain_config</p>
<p>Using all this to make a recumbent bike:</p>
<p>Once this is all set up you have this incredibly powerful interface of a bicycle composed of parts:</p>
<p><strong>Bicycle.new(</strong></p>
<p><strong>size: 'L',</strong></p>
<p><strong>parts: PartsFactory.build(recumbent_config))</strong></p>
<p>Composition VS Aggregation</p>
<p>A Meal is composed of an appetizer - An appetizer does not survive outside of the meal. When the meal is gone by definition the appetizer is gone. A meal is composed of an appetizer.</p>
<p>A band is an aggregate of musicians - when the band breaks up the musicians don’t die.</p>
<p>“Composition” encompasses both aggregation and composition -</p>
<p>“This distinction between composition and aggregation may have a little practical effect on your code.”</p>
<p><strong>Deciding Between Inheritance and Composition</strong></p>
<p>“Think of it this way: For the cost of arranging objects in a hierarchy, you get message delegation for free.”</p>
<p>When in doubt use Composition over inheritance</p>
<p>“The general rule is that faced with a problem that composition can solve, you should be biased towards doing so. If you cannot explicitly defend inheritance as a better solution, use composition.”</p>
<p>John’s Pick: Book: &quot;It Doesn’t Have To Be Crazy At Work&quot; -&gt; David Heinemeier Hansen and Jason Fried</p>
<p>JP: <a href="https://www.khanacademy.org/math">Kahn Academy</a> - digging into math again</p>
<p>Next Week: Final Chapter - Designing Cost-Effective Tests</p>
]]></content:encoded>
      <enclosure length="40476168" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/d99677c0-02bd-40c3-9d48-cdd45e92217f/1b67e93d_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Composition Imposition</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/d99677c0-02bd-40c3-9d48-cdd45e92217f/3000x3000/1549726722artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:41:56</itunes:duration>
      <itunes:summary>This week we talk about combining objects with composition and deciding between inheritance and composition.</itunes:summary>
      <itunes:subtitle>This week we talk about combining objects with composition and deciding between inheritance and composition.</itunes:subtitle>
      <itunes:keywords>web development, react, design, startups, inheritance, computer programming, composition, software development, programming, book study, technology, ruby on rails</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">38a24344-75b9-42c9-9d11-9c07147ab8d2</guid>
      <title>Modules! Modules! Modules!</title>
      <description><![CDATA[<p><strong>Metz, Sandi. Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>Chapter 7. Sharing Role Behavior with Modules</strong></p>
<p><strong>Welcome to iteration</strong></p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<h1><strong>Modules! Modules! Modules!</strong></h1>
<p><strong>Last episode we talked about inheritance which was kind of an extension of duck typing… but sometimes we need to combine the qualities of two existing subclasses, something that inheritance cannot readily accommodate.</strong></p>
<p>Many object-oriented languages provide a way to define a named group of methods that are independent of class and can be mixed in to any object. In Ruby, these mix-ins are called modules.</p>
<p><strong>Discovering the Schedulable Duck Type</strong></p>
<p><strong>The Schedule expects its target to behave like something that understands lead_days, that is, like something that is “schedulable.” You have discovered a duck type.</strong></p>
<p><strong>This specific example illustrates the general idea that objects should manage themselves; they should contain their own behavior.</strong></p>
<p><strong>Mountain Bike? Mechanic?</strong></p>
<p><strong>Now, in the code above, the dependency on Schedule has been removed from Bicycle and moved into the Schedulable module, isolating it even further.</strong></p>
<p><strong>Like Using Inheritance</strong></p>
<p><strong>COMES BACK TO AUTOMATIC MESSAGE DELEGATION</strong></p>
<p><strong>Loggable Example</strong></p>
<p><strong>When Bicycle includes Schedulable, all of the methods defined in the module become part of Bicycle’s response set.</strong></p>
<p><strong>When a single class includes several different modules, the modules are placed in the method lookup path in reverse order of module inclusion. Thus, the methods of the last included module are encountered first in the lookup path.</strong></p>
<p><strong>When a single class includes several different modules, the modules are placed in the method lookup path in reverse order of module inclusion. Thus, the methods of the last included module are encountered first in the lookup path.</strong></p>
<p><strong>Picks:</strong></p>
<p>John: Type to Siri - Accessibility &gt; Siri &gt; Type to Siri</p>
<p>JP: Scrimba - <a href="https://scrimba.com/playlist/pKwrCg">https://scrimba.com/playlist/pKwrCg</a></p>
]]></description>
      <pubDate>Mon, 4 Feb 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/modules-modules-modules-818316bd</link>
      <content:encoded><![CDATA[<p><strong>Metz, Sandi. Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>Chapter 7. Sharing Role Behavior with Modules</strong></p>
<p><strong>Welcome to iteration</strong></p>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<h1><strong>Modules! Modules! Modules!</strong></h1>
<p><strong>Last episode we talked about inheritance which was kind of an extension of duck typing… but sometimes we need to combine the qualities of two existing subclasses, something that inheritance cannot readily accommodate.</strong></p>
<p>Many object-oriented languages provide a way to define a named group of methods that are independent of class and can be mixed in to any object. In Ruby, these mix-ins are called modules.</p>
<p><strong>Discovering the Schedulable Duck Type</strong></p>
<p><strong>The Schedule expects its target to behave like something that understands lead_days, that is, like something that is “schedulable.” You have discovered a duck type.</strong></p>
<p><strong>This specific example illustrates the general idea that objects should manage themselves; they should contain their own behavior.</strong></p>
<p><strong>Mountain Bike? Mechanic?</strong></p>
<p><strong>Now, in the code above, the dependency on Schedule has been removed from Bicycle and moved into the Schedulable module, isolating it even further.</strong></p>
<p><strong>Like Using Inheritance</strong></p>
<p><strong>COMES BACK TO AUTOMATIC MESSAGE DELEGATION</strong></p>
<p><strong>Loggable Example</strong></p>
<p><strong>When Bicycle includes Schedulable, all of the methods defined in the module become part of Bicycle’s response set.</strong></p>
<p><strong>When a single class includes several different modules, the modules are placed in the method lookup path in reverse order of module inclusion. Thus, the methods of the last included module are encountered first in the lookup path.</strong></p>
<p><strong>When a single class includes several different modules, the modules are placed in the method lookup path in reverse order of module inclusion. Thus, the methods of the last included module are encountered first in the lookup path.</strong></p>
<p><strong>Picks:</strong></p>
<p>John: Type to Siri - Accessibility &gt; Siri &gt; Type to Siri</p>
<p>JP: Scrimba - <a href="https://scrimba.com/playlist/pKwrCg">https://scrimba.com/playlist/pKwrCg</a></p>
]]></content:encoded>
      <enclosure length="36240987" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5f78c7a9-8348-4353-9d15-c520547ac4bf/818316bd_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Modules! Modules! Modules!</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5f78c7a9-8348-4353-9d15-c520547ac4bf/3000x3000/1548635048artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:31</itunes:duration>
      <itunes:summary>This week we talk about modules, breaking your code into re-useable chunks. </itunes:summary>
      <itunes:subtitle>This week we talk about modules, breaking your code into re-useable chunks. </itunes:subtitle>
      <itunes:keywords>startups, programming, ruby on rails, computer programming, modules, react, software development, design, technology, book study, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">e54b3fd7-6ad3-4736-a3ec-7b6286e56442</guid>
      <title>Inheritance At Its Core</title>
      <description><![CDATA[<p>Acquiring Behavior Through Inheritance</p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Sani Metz - Object-Oriented Design in Ruby</strong></p>
<p>“Inheritance is, at its core, a mechanism for automatic message delegation. It defines a forwarding path for not-understood messages.”</p>
<p>Where to Use Inheritance</p>
<p>Objects that share a common parent -</p>
<p><strong>The objects that you are modeling must truly have a generalization-specialization relationship.</strong></p>
<p>Bicycle Touring Company - FastFeet</p>
<p>Bikes - Mountain and Road Bikes</p>
<p>Bikes have an overall size, a handlebar tape color, a tire size, and a chain type.</p>
<ul>
<li>Only mountain bikes have shocks</li>
<li>Only Road bikes have handlebar tape</li>
</ul>
<p>Create a new empty Bicycle Class</p>
<p>Let RoadBike &gt; Bicycle</p>
<p>And MountainBike &gt; Bicycle</p>
<p>When in doubt put less code in the parent, it’s easier to promote code later when you need a shared code.</p>
<p>“The general rule for refactoring into a new inheritance hierarchy is to arrange code so that you can promote abstractions rather than demote concretions.”</p>
<p>A superclass may have many subclasses, but each subclass is permitted only one superclass.</p>
<p>This family tree image is, however, a bit misleading. In many parts of the biological world, it’s common for descendants to have two ancestors.</p>
<p>It’s really useful to rails a <code>NotImplementedError</code> in the parent class in the methods that are required from their children, for example, default tire_size -</p>
<p>“Creating code that fails with reasonable error messages takes minor effort in the present but provides value forever.”</p>
<p>Initialize &gt; Post Initialize to append any or overrode attributes from the parent initialize method.</p>
<p>Initialize + post_initialize</p>
<p>Closes with a mic drop - Initializing a new RecumbentBike is so DRY and painless!</p>
<p>“Inheritance solves the problem of related types that share a great deal of common behavior but differ across some dimension.”</p>
<p>“The best way to create an abstract superclass is by pushing code up from concrete subclasses.”</p>
<p>“When your problem is one of needing numerous specializations of a stable, common abstraction, inheritance can be an extremely low-cost solution.”</p>
<p>PICKS</p>
<ul>
<li>JP: Machine Learning with JavaScript</li>
<li>John: Refactoring UI by Adam Wathan and Steve Schoger -</li>
<li>Hard Wired Internet - Ran a Cat 5 Cable from my router - SO WORTH IT.</li>
</ul>
]]></description>
      <pubDate>Mon, 28 Jan 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/inheritance-at-its-core-036cc1c7</link>
      <content:encoded><![CDATA[<p>Acquiring Behavior Through Inheritance</p>
<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Sani Metz - Object-Oriented Design in Ruby</strong></p>
<p>“Inheritance is, at its core, a mechanism for automatic message delegation. It defines a forwarding path for not-understood messages.”</p>
<p>Where to Use Inheritance</p>
<p>Objects that share a common parent -</p>
<p><strong>The objects that you are modeling must truly have a generalization-specialization relationship.</strong></p>
<p>Bicycle Touring Company - FastFeet</p>
<p>Bikes - Mountain and Road Bikes</p>
<p>Bikes have an overall size, a handlebar tape color, a tire size, and a chain type.</p>
<ul>
<li>Only mountain bikes have shocks</li>
<li>Only Road bikes have handlebar tape</li>
</ul>
<p>Create a new empty Bicycle Class</p>
<p>Let RoadBike &gt; Bicycle</p>
<p>And MountainBike &gt; Bicycle</p>
<p>When in doubt put less code in the parent, it’s easier to promote code later when you need a shared code.</p>
<p>“The general rule for refactoring into a new inheritance hierarchy is to arrange code so that you can promote abstractions rather than demote concretions.”</p>
<p>A superclass may have many subclasses, but each subclass is permitted only one superclass.</p>
<p>This family tree image is, however, a bit misleading. In many parts of the biological world, it’s common for descendants to have two ancestors.</p>
<p>It’s really useful to rails a <code>NotImplementedError</code> in the parent class in the methods that are required from their children, for example, default tire_size -</p>
<p>“Creating code that fails with reasonable error messages takes minor effort in the present but provides value forever.”</p>
<p>Initialize &gt; Post Initialize to append any or overrode attributes from the parent initialize method.</p>
<p>Initialize + post_initialize</p>
<p>Closes with a mic drop - Initializing a new RecumbentBike is so DRY and painless!</p>
<p>“Inheritance solves the problem of related types that share a great deal of common behavior but differ across some dimension.”</p>
<p>“The best way to create an abstract superclass is by pushing code up from concrete subclasses.”</p>
<p>“When your problem is one of needing numerous specializations of a stable, common abstraction, inheritance can be an extremely low-cost solution.”</p>
<p>PICKS</p>
<ul>
<li>JP: Machine Learning with JavaScript</li>
<li>John: Refactoring UI by Adam Wathan and Steve Schoger -</li>
<li>Hard Wired Internet - Ran a Cat 5 Cable from my router - SO WORTH IT.</li>
</ul>
]]></content:encoded>
      <enclosure length="42452279" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/8fb5a809-92ed-49d0-a9ff-994ac9e29a3d/036cc1c7_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Inheritance At Its Core</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/8fb5a809-92ed-49d0-a9ff-994ac9e29a3d/3000x3000/1548634443artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:43:59</itunes:duration>
      <itunes:summary>This week we talk about behavior through inheritance and where to use inheritance.</itunes:summary>
      <itunes:subtitle>This week we talk about behavior through inheritance and where to use inheritance.</itunes:subtitle>
      <itunes:keywords>technology, inheritance, programming, computer programming, react, software development, startups, ruby on rails, web development, design, book study</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c34fbb05-f0f8-4cb0-9f27-8deb605fa259</guid>
      <title>Ducks! Ducks! Ducks!</title>
      <description><![CDATA[<p><strong>Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p>Duck types are public interfaces that are not tied to any specific class.</p>
<p>Objects that are defined by their behavior than by their class name.</p>
<p>if an object quacks like a duck and walks like a duck, then its class is immaterial, it’s a duck.</p>
<p>In a way, the “+” operator is a “duck type” - because it responds differently to a different type of objects.</p>
<p>Preparer</p>
<p>TripCoordinator, Mechanic, Driver can all be a preparer - they all respond to the prepare method in their own ways.</p>
<p>At a higher level, what are these all doing? They are preparing something - we can trust within this shared interface.</p>
<p>Within mechanic - we only call <code>prepare_trip</code> vs <code>gas_up</code> or <code>full_water_tank</code>-</p>
<p>Instead of switching on type</p>
<p>You</p>
<p>Talk through this Object:</p>
<p>Notification Object?</p>
<p><a href="https://github.com/withbetterco/wellstart/blob/master/app/models/notification.rb#L156">https://github.com/withbetterco/wellstart/blob/master/app/models/notification.rb#L156</a></p>
<p>It has this insane method checking to see if the user’s notification settings match the notification that’s trying to send</p>
<p>We are wanting to extend the notification object, for another type - Push Notifications</p>
<p>Object (message, comment, like)</p>
<p>User</p>
<p>NotificationSettings</p>
<p>Notifier</p>
<p>Notification Policy</p>
<p>“The ability to tolerate ambiguity about the class of an object is the hallmark of a confident designer.”</p>
<p><strong>Recognizing a duck:</strong></p>
<p>“You can replace the following with ducks: • Case statements that switch on class • kind_of? and is_a? • responds_to?”</p>
<p><strong>Polymorphic Objects</strong></p>
<p>Went from a ParticipantNote, and ProgramNote, and ApplicantNote, to one single Note object through a Notable Module. They all have “ has _many: notes, as:: notable” instead of each having “program_notes”, applicant_notes, etc.</p>
<p>“you are missing an object, one whose public interface you have not yet discovered.”</p>
<p>Dot files - .zshrc - Custom prompt - with my git status -</p>
<p>Slippers from JP - Quadie</p>
]]></description>
      <pubDate>Mon, 21 Jan 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/ducks-ducks-ducks-183f70e3</link>
      <content:encoded><![CDATA[<p><strong>Practical Object-Oriented Design in Ruby</strong></p>
<p><strong>A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p>Duck types are public interfaces that are not tied to any specific class.</p>
<p>Objects that are defined by their behavior than by their class name.</p>
<p>if an object quacks like a duck and walks like a duck, then its class is immaterial, it’s a duck.</p>
<p>In a way, the “+” operator is a “duck type” - because it responds differently to a different type of objects.</p>
<p>Preparer</p>
<p>TripCoordinator, Mechanic, Driver can all be a preparer - they all respond to the prepare method in their own ways.</p>
<p>At a higher level, what are these all doing? They are preparing something - we can trust within this shared interface.</p>
<p>Within mechanic - we only call <code>prepare_trip</code> vs <code>gas_up</code> or <code>full_water_tank</code>-</p>
<p>Instead of switching on type</p>
<p>You</p>
<p>Talk through this Object:</p>
<p>Notification Object?</p>
<p><a href="https://github.com/withbetterco/wellstart/blob/master/app/models/notification.rb#L156">https://github.com/withbetterco/wellstart/blob/master/app/models/notification.rb#L156</a></p>
<p>It has this insane method checking to see if the user’s notification settings match the notification that’s trying to send</p>
<p>We are wanting to extend the notification object, for another type - Push Notifications</p>
<p>Object (message, comment, like)</p>
<p>User</p>
<p>NotificationSettings</p>
<p>Notifier</p>
<p>Notification Policy</p>
<p>“The ability to tolerate ambiguity about the class of an object is the hallmark of a confident designer.”</p>
<p><strong>Recognizing a duck:</strong></p>
<p>“You can replace the following with ducks: • Case statements that switch on class • kind_of? and is_a? • responds_to?”</p>
<p><strong>Polymorphic Objects</strong></p>
<p>Went from a ParticipantNote, and ProgramNote, and ApplicantNote, to one single Note object through a Notable Module. They all have “ has _many: notes, as:: notable” instead of each having “program_notes”, applicant_notes, etc.</p>
<p>“you are missing an object, one whose public interface you have not yet discovered.”</p>
<p>Dot files - .zshrc - Custom prompt - with my git status -</p>
<p>Slippers from JP - Quadie</p>
]]></content:encoded>
      <enclosure length="33034404" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5460547c-b73e-462d-84e5-e86aceb46615/183f70e3_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Ducks! Ducks! Ducks!</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5460547c-b73e-462d-84e5-e86aceb46615/3000x3000/1546622354artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:34:11</itunes:duration>
      <itunes:summary>This week we talk about duck types and polymorphic objects.</itunes:summary>
      <itunes:subtitle>This week we talk about duck types and polymorphic objects.</itunes:subtitle>
      <itunes:keywords>design, ruby on rails, programming, computer programming, technology, startups, react, duck types, software development, book study, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6d8923b1-ff79-439d-8f36-a6d14033a8c6</guid>
      <title>Get Flexible</title>
      <description><![CDATA[<h1>Chapter 4: Creating Flexible Interfaces</h1>
<p>At an object-oriented level, applications are made up of classes <strong>but defined by messages</strong></p>
<ul>
<li>The design is concerned with messages that pass between objects</li>
<li>This conversation between objects takes places using interfaces</li>
</ul>
<h1>Defining Interfaces</h1>
<p>Imagine a restaurant kitchen. Customers order food off a menu. The menu is a kind of <em>public</em> interface. Within the kitchen, messages get passed and the way a meal is prepared (implementation details) are <em>private</em> to the customer.</p>
<ul>
<li>Classes are like kitchens. The class exists to fulfill a single responsibility but implements many methods</li>
</ul>
<p><strong>Public Interfaces</strong></p>
<ul>
<li>reveal primary responsibility</li>
<li>expected to be invoked by others</li>
<li>will not change on a whim</li>
<li>safe for other to depend on</li>
<li>thoroughly documented in the tests</li>
</ul>
<p><strong>Private Interfaces</strong></p>
<ul>
<li>handle implementation details</li>
<li>not expected to be sent by other objects</li>
<li>can change for any reason whatsoever</li>
<li>unsafe for others to depend on</li>
<li>may not even be referenced in tests</li>
</ul>
<blockquote>
<p>The public interface is a contract that articulates the responsibilities of your class</p>
</blockquote>
<h1>Example App: Bicycle Touring Company</h1>
<ul>
<li>FastFeet Inc. is a company that offers road and mountain bike trips</li>
<li>They use a paper system</li>
<li>Routes that are offered may occur several times during the year</li>
<li>Each Route has limitations on the number of customers who may go and requires a specific number of guides who double as mechanics</li>
<li>Each Route is rated according to its aerobic difficulty.</li>
<li>Mountain bike trips have an additional rating that reflects technical difficulty.</li>
<li>Customers have an aerobic fitness level and a mountain bike technical skill level to determine if a trip is right for them</li>
<li>Customers may rent bikes or they can bring their own</li>
<li>FastFeet Inc has a few bikes available and also shares in a pool of bike rentals from local shops</li>
<li>Rental bikes come in various sizes and are suitable for either road or mountain bike trips</li>
</ul>
<p><strong>Use case</strong></p>
<ul>
<li>A customer, in order to choose a trip, would like to see a list of available trips of appropriate difficulty, on a specific date, where rental bikes are available</li>
</ul>
<h2>Constructing an Intention</h2>
<ul>
<li>WHEW - where do we even start with this brand new application? A lot of requirements here.</li>
<li>It's important to start <strong>DESIGNING</strong> your application. Don't just dive in and start writing code! PLAN</li>
<li>The first thing you should do is <strong>form an intention about the objects and messages needed to satisfy the use case</strong></li>
</ul>
<hr />
<ul>
<li>Sequence diagrams can be helpful for planning because the design conversation has shifted</li>
<li>Instead of thinking about what classes should exist and what responsibilities they should have, we are <strong>NOW</strong> deciding what messages should be sent, where to send them, and who should receive them</li>
<li>You don't send messages because you have objects, you have objects because you send messages</li>
</ul>
<h2>Asking for &quot;What&quot; Instead of Telling &quot;How&quot;</h2>
<blockquote>
<p>The distinction between a message that asks for what a sender wants and a message that tells the receiver how to behave may seem subtle but the consequences are significant</p>
</blockquote>
<ul>
<li>Let's say we have two objects that need to communicate: <code>trip</code> and <code>mechanic</code></li>
<li>We <em>could</em> have the trip send messages to the mechanic in order to prepare a bicycle:
<ul>
<li>clean bicycle</li>
<li>pump tires</li>
<li>lube chain</li>
<li>check breaks</li>
</ul>
</li>
<li>The problem with this is that we're telling the <code>mechanic</code> <strong>HOW</strong> to prepare the bike.</li>
<li>We should be telling the <code>mechanic</code> <strong>WHAT</strong> to do and leave the implementation details up to the mechanic.</li>
<li>Instead, the trip should just send the message:
<ul>
<li>prepare bicycle</li>
</ul>
</li>
<li>Doing this gives the responsibility of preparing a bicycle to the mechanic entirely. We trust the mechanic to accomplish this task. We tell <em>what</em> and not <em>how</em></li>
</ul>
<h2>Seeking Context Independence</h2>
<blockquote>
<p>The best possible situation is for an object to be completely independent of its context. An object that could collaborate with others without knowing who they are or what they do could be reused in unanticipated and novel ways</p>
</blockquote>
<ul>
<li>We could do this with dependency injection</li>
</ul>
<h2>Using Messages to Discover Objects</h2>
<p>Recall the use case: A customer, in order to choose a trip, would like to see a list of available trips of appropriate difficulty, on a specific date, where rental bicycles are available</p>
<ul>
<li>This application needs an object to embody the rules at the intersection of <code>Customer</code>, <code>Trip</code>, and <code>Bicycle</code></li>
<li>We have an unknown object; we just know we need some object to receive our message</li>
<li>What if we defined a <code>TripFinder</code> class that is responsible for finding suitable trips
<ul>
<li>It contains all the knowledge of what makes a trip suitable</li>
<li>it knows the roles</li>
<li>its job is to do whatever is necessary to respond to this message</li>
</ul>
</li>
</ul>
<h1>Writing Code That Puts Its Best (Inter)Face Forward</h1>
<p><strong>Methods in the public interface should:</strong></p>
<ul>
<li>be explicitly defined as such</li>
<li>be more about <em>what</em> than <em>how</em></li>
<li>have names that will not change</li>
<li>take a hash as an options parameter</li>
</ul>
<hr />
<ul>
<li>Ruby provides three relevant keywords: <code>public</code>, <code>protected</code>, and <code>private</code></li>
<li>These keywords indicate which methods are stable and unstable. It also indicates how visible a method is to other parts of your application</li>
</ul>
<p>JP’s: <a href="https://www.hackingwithswift.com/">HackingWithSwift</a></p>
<p>John’s Pick: <strong><a href="http://macstadium.com/">MacStadium.com</a> -</strong></p>
]]></description>
      <pubDate>Mon, 14 Jan 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/get-flexible-263c6e43</link>
      <content:encoded><![CDATA[<h1>Chapter 4: Creating Flexible Interfaces</h1>
<p>At an object-oriented level, applications are made up of classes <strong>but defined by messages</strong></p>
<ul>
<li>The design is concerned with messages that pass between objects</li>
<li>This conversation between objects takes places using interfaces</li>
</ul>
<h1>Defining Interfaces</h1>
<p>Imagine a restaurant kitchen. Customers order food off a menu. The menu is a kind of <em>public</em> interface. Within the kitchen, messages get passed and the way a meal is prepared (implementation details) are <em>private</em> to the customer.</p>
<ul>
<li>Classes are like kitchens. The class exists to fulfill a single responsibility but implements many methods</li>
</ul>
<p><strong>Public Interfaces</strong></p>
<ul>
<li>reveal primary responsibility</li>
<li>expected to be invoked by others</li>
<li>will not change on a whim</li>
<li>safe for other to depend on</li>
<li>thoroughly documented in the tests</li>
</ul>
<p><strong>Private Interfaces</strong></p>
<ul>
<li>handle implementation details</li>
<li>not expected to be sent by other objects</li>
<li>can change for any reason whatsoever</li>
<li>unsafe for others to depend on</li>
<li>may not even be referenced in tests</li>
</ul>
<blockquote>
<p>The public interface is a contract that articulates the responsibilities of your class</p>
</blockquote>
<h1>Example App: Bicycle Touring Company</h1>
<ul>
<li>FastFeet Inc. is a company that offers road and mountain bike trips</li>
<li>They use a paper system</li>
<li>Routes that are offered may occur several times during the year</li>
<li>Each Route has limitations on the number of customers who may go and requires a specific number of guides who double as mechanics</li>
<li>Each Route is rated according to its aerobic difficulty.</li>
<li>Mountain bike trips have an additional rating that reflects technical difficulty.</li>
<li>Customers have an aerobic fitness level and a mountain bike technical skill level to determine if a trip is right for them</li>
<li>Customers may rent bikes or they can bring their own</li>
<li>FastFeet Inc has a few bikes available and also shares in a pool of bike rentals from local shops</li>
<li>Rental bikes come in various sizes and are suitable for either road or mountain bike trips</li>
</ul>
<p><strong>Use case</strong></p>
<ul>
<li>A customer, in order to choose a trip, would like to see a list of available trips of appropriate difficulty, on a specific date, where rental bikes are available</li>
</ul>
<h2>Constructing an Intention</h2>
<ul>
<li>WHEW - where do we even start with this brand new application? A lot of requirements here.</li>
<li>It's important to start <strong>DESIGNING</strong> your application. Don't just dive in and start writing code! PLAN</li>
<li>The first thing you should do is <strong>form an intention about the objects and messages needed to satisfy the use case</strong></li>
</ul>
<hr />
<ul>
<li>Sequence diagrams can be helpful for planning because the design conversation has shifted</li>
<li>Instead of thinking about what classes should exist and what responsibilities they should have, we are <strong>NOW</strong> deciding what messages should be sent, where to send them, and who should receive them</li>
<li>You don't send messages because you have objects, you have objects because you send messages</li>
</ul>
<h2>Asking for &quot;What&quot; Instead of Telling &quot;How&quot;</h2>
<blockquote>
<p>The distinction between a message that asks for what a sender wants and a message that tells the receiver how to behave may seem subtle but the consequences are significant</p>
</blockquote>
<ul>
<li>Let's say we have two objects that need to communicate: <code>trip</code> and <code>mechanic</code></li>
<li>We <em>could</em> have the trip send messages to the mechanic in order to prepare a bicycle:
<ul>
<li>clean bicycle</li>
<li>pump tires</li>
<li>lube chain</li>
<li>check breaks</li>
</ul>
</li>
<li>The problem with this is that we're telling the <code>mechanic</code> <strong>HOW</strong> to prepare the bike.</li>
<li>We should be telling the <code>mechanic</code> <strong>WHAT</strong> to do and leave the implementation details up to the mechanic.</li>
<li>Instead, the trip should just send the message:
<ul>
<li>prepare bicycle</li>
</ul>
</li>
<li>Doing this gives the responsibility of preparing a bicycle to the mechanic entirely. We trust the mechanic to accomplish this task. We tell <em>what</em> and not <em>how</em></li>
</ul>
<h2>Seeking Context Independence</h2>
<blockquote>
<p>The best possible situation is for an object to be completely independent of its context. An object that could collaborate with others without knowing who they are or what they do could be reused in unanticipated and novel ways</p>
</blockquote>
<ul>
<li>We could do this with dependency injection</li>
</ul>
<h2>Using Messages to Discover Objects</h2>
<p>Recall the use case: A customer, in order to choose a trip, would like to see a list of available trips of appropriate difficulty, on a specific date, where rental bicycles are available</p>
<ul>
<li>This application needs an object to embody the rules at the intersection of <code>Customer</code>, <code>Trip</code>, and <code>Bicycle</code></li>
<li>We have an unknown object; we just know we need some object to receive our message</li>
<li>What if we defined a <code>TripFinder</code> class that is responsible for finding suitable trips
<ul>
<li>It contains all the knowledge of what makes a trip suitable</li>
<li>it knows the roles</li>
<li>its job is to do whatever is necessary to respond to this message</li>
</ul>
</li>
</ul>
<h1>Writing Code That Puts Its Best (Inter)Face Forward</h1>
<p><strong>Methods in the public interface should:</strong></p>
<ul>
<li>be explicitly defined as such</li>
<li>be more about <em>what</em> than <em>how</em></li>
<li>have names that will not change</li>
<li>take a hash as an options parameter</li>
</ul>
<hr />
<ul>
<li>Ruby provides three relevant keywords: <code>public</code>, <code>protected</code>, and <code>private</code></li>
<li>These keywords indicate which methods are stable and unstable. It also indicates how visible a method is to other parts of your application</li>
</ul>
<p>JP’s: <a href="https://www.hackingwithswift.com/">HackingWithSwift</a></p>
<p>John’s Pick: <strong><a href="http://macstadium.com/">MacStadium.com</a> -</strong></p>
]]></content:encoded>
      <enclosure length="37017555" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/1843f132-0c95-475d-96d6-98f76fc323a9/263c6e43_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Get Flexible</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/1843f132-0c95-475d-96d6-98f76fc323a9/3000x3000/1546621059artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:38:20</itunes:duration>
      <itunes:summary>This week we talk about defining interfaces, constructing an intention, and using messages to discover objects.</itunes:summary>
      <itunes:subtitle>This week we talk about defining interfaces, constructing an intention, and using messages to discover objects.</itunes:subtitle>
      <itunes:keywords>software development, startups, programming, computer programming, interfaces, technology, design, book study, web development, react, ruby on rails</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>4</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">77812317-1845-4377-ba09-460cdd3272ab</guid>
      <title>Managing Dependencies</title>
      <description><![CDATA[<h1>Chapter 3: Managing Dependencies</h1>
<blockquote>
<p>To collaborate, an object must know something about others. Knowing creates a dependency. If not managed carefully, these dependencies will strangle your application</p>
</blockquote>
<h1>Recognizing Dependencies</h1>
<p>An object has a dependency when it knows:</p>
<ul>
<li>The name of another class.
<ul>
<li><code>Gear</code> expects a class named <code>Wheel</code> to exist</li>
</ul>
</li>
<li>The name of a message that it intends to send to someone other than <code>self</code>.
<ul>
<li><code>Gear</code> expects a <code>Wheel</code> instance to respond to <code>diameter</code></li>
</ul>
</li>
<li>The arguments that a message requires.
<ul>
<li><code>Gear</code> knows that <code>Wheel.new</code> requires a <code>rim</code> and a <code>tire</code></li>
</ul>
</li>
<li>The order of those arguments.
<ul>
<li><code>Gear</code> knows the first argument to <code>Wheel.new</code> should be <code>rim</code> and the second should be <code>tire</code></li>
</ul>
</li>
</ul>
<h1>Writing Loosely Coupled Code</h1>
<h2>Inject Dependencies</h2>
<p><em>see <code>1_inject_dependencies.rb</code></em></p>
<ul>
<li>Referring to a class by its name inside of another class is bad.</li>
<li>If the name of <code>Wheel</code> class changes, the <code>gear_inches</code> method must also change</li>
<li>The bigger problem is that <code>gear_inches</code> is explicitly saying that it is only willing to calculate gear inches for instances of <code>Wheel</code></li>
<li><code>Gear</code> will only collaborate with any other kind of object even if that object has a diameter and uses gears!</li>
</ul>
<blockquote>
<p>It's is not the class of the object that's important, it's the message you plan to send to it.</p>
</blockquote>
<ul>
<li><code>Gear</code> needs access to an object that can respond to <code>diameter</code> - a duck type</li>
<li>We can use a technique called <strong>dependency injection</strong> to move the creation of a new <code>Wheel</code> instance outside of the class</li>
</ul>
<h2>Isolate Dependencies</h2>
<p><em>see <code>2_isolate_dependencies.rb</code></em></p>
<p><strong>Isolate Instance Creation</strong></p>
<ul>
<li>Sometimes you can't break all unnecessary dependencies, but you can isolate them</li>
<li>The first technique moves <code>Wheel.new</code> from <code>gear_inches</code> and into <code>Gear</code>'s <code>initialize</code> method</li>
<li>The next alternative isolates the creation of a <code>Wheel</code> into its own <code>wheel</code> method</li>
</ul>
<p><strong>Isolate Vulnerable External Messages</strong></p>
<ul>
<li><code>gear_inches</code> depends on <code>Gear</code> responding to <code>wheel</code> and <code>wheel</code> responding to <code>diameter</code></li>
<li>by creating a different <code>diameter</code> method to hold <code>wheel.diameter</code>, we remove the dependency within <code>gear_inches</code></li>
</ul>
<h2>Remove Argument-Order Dependencies</h2>
<p><em>see <code>3_remove_arg_orer_dependencies.rb</code></em></p>
<p><strong>Use Hashes for Initialization Arguments</strong></p>
<ul>
<li>arguments of our <code>initialize</code> method must be passed in the correct order. we can pass an object instead to remove this dependency</li>
</ul>
<p><strong>Explicitly Define Defaults</strong></p>
<ul>
<li>we can use the <code>fetch</code> method to set defaults when using hashes in our <code>initialize</code> method</li>
<li><code>fetch</code> expects the key you're fetching to be in the hash and supplies several options for handling missing keys</li>
<li><code>fetch</code> will only set the default if the key is not found in the hash</li>
</ul>
<hr />
<h1>Managing Dependency Direction</h1>
<ul>
<li>All examples thus far have shown <code>Gear</code> depending on <code>Wheel</code> or <code>diameter</code> - but the code could have easily been written so that <code>Wheel</code> depends on <code>Gear</code> or <code>ratio</code></li>
</ul>
<h2>Choosing Dependency Direction</h2>
<blockquote>
<p>Depend on things that change less often</p>
</blockquote>
<p>John’s pick - Pick Krisp -<a href="https://krisp.ai/">https://krisp.ai</a></p>
]]></description>
      <pubDate>Mon, 7 Jan 2019 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/managing-dependencies-ce16ec66</link>
      <content:encoded><![CDATA[<h1>Chapter 3: Managing Dependencies</h1>
<blockquote>
<p>To collaborate, an object must know something about others. Knowing creates a dependency. If not managed carefully, these dependencies will strangle your application</p>
</blockquote>
<h1>Recognizing Dependencies</h1>
<p>An object has a dependency when it knows:</p>
<ul>
<li>The name of another class.
<ul>
<li><code>Gear</code> expects a class named <code>Wheel</code> to exist</li>
</ul>
</li>
<li>The name of a message that it intends to send to someone other than <code>self</code>.
<ul>
<li><code>Gear</code> expects a <code>Wheel</code> instance to respond to <code>diameter</code></li>
</ul>
</li>
<li>The arguments that a message requires.
<ul>
<li><code>Gear</code> knows that <code>Wheel.new</code> requires a <code>rim</code> and a <code>tire</code></li>
</ul>
</li>
<li>The order of those arguments.
<ul>
<li><code>Gear</code> knows the first argument to <code>Wheel.new</code> should be <code>rim</code> and the second should be <code>tire</code></li>
</ul>
</li>
</ul>
<h1>Writing Loosely Coupled Code</h1>
<h2>Inject Dependencies</h2>
<p><em>see <code>1_inject_dependencies.rb</code></em></p>
<ul>
<li>Referring to a class by its name inside of another class is bad.</li>
<li>If the name of <code>Wheel</code> class changes, the <code>gear_inches</code> method must also change</li>
<li>The bigger problem is that <code>gear_inches</code> is explicitly saying that it is only willing to calculate gear inches for instances of <code>Wheel</code></li>
<li><code>Gear</code> will only collaborate with any other kind of object even if that object has a diameter and uses gears!</li>
</ul>
<blockquote>
<p>It's is not the class of the object that's important, it's the message you plan to send to it.</p>
</blockquote>
<ul>
<li><code>Gear</code> needs access to an object that can respond to <code>diameter</code> - a duck type</li>
<li>We can use a technique called <strong>dependency injection</strong> to move the creation of a new <code>Wheel</code> instance outside of the class</li>
</ul>
<h2>Isolate Dependencies</h2>
<p><em>see <code>2_isolate_dependencies.rb</code></em></p>
<p><strong>Isolate Instance Creation</strong></p>
<ul>
<li>Sometimes you can't break all unnecessary dependencies, but you can isolate them</li>
<li>The first technique moves <code>Wheel.new</code> from <code>gear_inches</code> and into <code>Gear</code>'s <code>initialize</code> method</li>
<li>The next alternative isolates the creation of a <code>Wheel</code> into its own <code>wheel</code> method</li>
</ul>
<p><strong>Isolate Vulnerable External Messages</strong></p>
<ul>
<li><code>gear_inches</code> depends on <code>Gear</code> responding to <code>wheel</code> and <code>wheel</code> responding to <code>diameter</code></li>
<li>by creating a different <code>diameter</code> method to hold <code>wheel.diameter</code>, we remove the dependency within <code>gear_inches</code></li>
</ul>
<h2>Remove Argument-Order Dependencies</h2>
<p><em>see <code>3_remove_arg_orer_dependencies.rb</code></em></p>
<p><strong>Use Hashes for Initialization Arguments</strong></p>
<ul>
<li>arguments of our <code>initialize</code> method must be passed in the correct order. we can pass an object instead to remove this dependency</li>
</ul>
<p><strong>Explicitly Define Defaults</strong></p>
<ul>
<li>we can use the <code>fetch</code> method to set defaults when using hashes in our <code>initialize</code> method</li>
<li><code>fetch</code> expects the key you're fetching to be in the hash and supplies several options for handling missing keys</li>
<li><code>fetch</code> will only set the default if the key is not found in the hash</li>
</ul>
<hr />
<h1>Managing Dependency Direction</h1>
<ul>
<li>All examples thus far have shown <code>Gear</code> depending on <code>Wheel</code> or <code>diameter</code> - but the code could have easily been written so that <code>Wheel</code> depends on <code>Gear</code> or <code>ratio</code></li>
</ul>
<h2>Choosing Dependency Direction</h2>
<blockquote>
<p>Depend on things that change less often</p>
</blockquote>
<p>John’s pick - Pick Krisp -<a href="https://krisp.ai/">https://krisp.ai</a></p>
]]></content:encoded>
      <enclosure length="45246754" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/c55d7425-0100-458b-8fc2-d323ba28e6b8/ce16ec66_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Managing Dependencies</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/c55d7425-0100-458b-8fc2-d323ba28e6b8/3000x3000/1546619457artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:46:54</itunes:duration>
      <itunes:summary>This week we talk about recognizing dependencies,  isolating dependencies, and managing dependency direction.</itunes:summary>
      <itunes:subtitle>This week we talk about recognizing dependencies,  isolating dependencies, and managing dependency direction.</itunes:subtitle>
      <itunes:keywords>dependency, web development, book study, computer programming, technology, startups, design, software development, react, programming, ruby on rails</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">70c2077c-33f9-4dbe-a091-df16da2092a1</guid>
      <title>Single Responsibility</title>
      <description><![CDATA[<h1>Chapter 2: Designing Classes with a Single Responsibility</h1>
<blockquote>
<p>The foundation of an object-oriented system is the message, but the most visible organizational structure is the class</p>
</blockquote>
<p><strong>Questions to ask yourself:</strong></p>
<ul>
<li>What are your classes?</li>
<li>How many should you have?</li>
<li>What behavior will they implement?</li>
<li>How much do they know about other classes?</li>
<li>How much of themselves should they expose?</li>
</ul>
<h1>Creating Classes That Have a Single Responsibility</h1>
<blockquote>
<p>A class should do the smallest possible useful thing; that is, it should have a single responsibility</p>
</blockquote>
<h2>An Example Application: Bicycles and Gears</h2>
<ul>
<li>Let's take a look at bikes. Consider the types of gears that bikes use</li>
</ul>
<p><strong>Small Gears</strong></p>
<ul>
<li>easy to pedal, not as fast</li>
<li>takes many pedals just to make the tires rotate once</li>
<li>can help you creep along steep hills</li>
</ul>
<p><strong>Large Gears</strong></p>
<ul>
<li>
<p>harder to pedal, fast</p>
</li>
<li>
<p>sends you flying down those steep hills</p>
</li>
<li>
<p>one pedal rotation with your foot might cause the tires to rotate multiple times</p>
</li>
<li>
<p>Let's start with a small script and then extrapolate classes out of it:</p>
<h1>Large Gear</h1>
<p>chainring = 52<br />
cog       = 11<br />
ratio     = chainring / cog.to_f</p>
<p>puts 'Large Gear:'\<br />
&quot;\n#{chainring}-tooth chainring&quot;\<br />
&quot;\n#{cog}-tooth cog&quot;\<br />
&quot;\n#{ratio.round(2)} rotations&quot;</p>
<h1>Small Gear</h1>
<p>chainring = 30<br />
cog       = 27<br />
ratio     = chainring / cog.to_f</p>
<p>puts &quot;\nSmall Gear:&quot;\<br />
&quot;\n#{chainring}-tooth chainring&quot;\<br />
&quot;\n#{cog}-tooth cog&quot;\<br />
&quot;\n#{ratio.round(2)} rotations&quot;</p>
</li>
<li>
<p>Since we're talking about <em>gears</em>, it only makes sense that we start by creating a <code>Gear</code> class based on the behavior above</p>
</li>
</ul>
<p><em>see <code>1_gear.rb</code></em></p>
<ul>
<li>
<p>Our <code>Gear</code> class has three methods: <code>chainring</code>, <code>cog</code>, and <code>ratio</code></p>
</li>
<li>
<p><code>Gear</code> is a subclass of <code>Object</code> and thus inherits many other methods besides the three that we defined</p>
</li>
<li>
<p>What I'm trying to say is that <strong>the complete set of behavior / the total set of messages to which it can respond</strong> is fairly large</p>
</li>
<li>
<p>This is great and all - but what if we want to extend the functionality by taking into account the <em>effect of the difference in wheels</em></p>
<ul>
<li>Bigger wheels travel much farther during each wheel rotation versus smaller wheels</li>
</ul>
</li>
<li>
<p>Consider this formula</p>
<p>gear inches = wheel diameter × gear ratio</p>
<p>(where)</p>
<p>wheel diameter = rim diameter + (2 × tire diameter)</p>
</li>
</ul>
<p><em>see <code>2_gear.rb</code></em></p>
<ul>
<li>This new code is great except our old call to <code>Gear.new(52, 11)</code> no longer works because we added 2 more arguments to our <code>initialize</code> method</li>
</ul>
<h2>Why Single Responsibility matters</h2>
<ul>
<li>Applications that are easy to change consist of classes that are easy to reuse. [...] A class that has more than one responsibility are difficult to reuse</li>
</ul>
<h2>Determining If a Class Has a Single Responsibility</h2>
<ul>
<li>How can you tell if your class is only doing a single thing? Try describing what it does in a single sentence. You'll find out very quickly</li>
<li>Remember that <strong>a class should do the smallest possible useful thing</strong></li>
<li>When we look at our <code>Gear</code> class - perhaps it is doing <em>too much</em></li>
<li>We are calculating <code>gear_inches</code>, which is fine - but calculating the <code>tire</code> size seems a little weird</li>
</ul>
<h2>When to Make Design Decisions</h2>
<ul>
<li>When we look at the <code>Gear</code> class, there's something off about having <code>rim</code> and <code>tire</code> in there.</li>
<li>Right now the code in <code>Gear</code> is transparent and reasonable - this doesn't mean that we have great design. All it means is that we have no dependencies</li>
<li>Right now, <code>Gear</code> lies about its responsibilities as it has <strong>multiple</strong> responsibilities in that it has to do &quot;wheel&quot; calculations in our <code>gear_inches</code> message</li>
</ul>
<h1>Write Code That Embraces Change</h1>
<p>Here are some techniques that help you write code that embraces change</p>
<h2>Depend on Behavior, Not Data</h2>
<ul>
<li>Behavior is captured in methods and invoked by sending messages</li>
<li>Objects <strong>also</strong> contain data (not just behavior)</li>
</ul>
<p><strong>Hide Instance Variables</strong></p>
<ul>
<li>
<p>Always wrap instance variables in accessor methods instead of directly referring to variables, like the <code>ratio</code> method does.</p>
</li>
<li>
<p>We can do this by using an <code>attr_reader</code></p>
<h1>BAD</h1>
<p>def ratio<br />
@chainring / @cog.to_f<br />
end</p>
<h1>GOOD</h1>
<p>def ratio<br />
chainring / cog.to_f<br />
end</p>
</li>
<li>
<p>If your instance variable is referred to multiple times and it suddenly needs to change, you're in for a world of hurt.</p>
</li>
<li>
<p>Your method that wraps your instance variable becomes the single source of truth</p>
</li>
<li>
<p>One drawback is that because you can wrap any instance variables in methods, its possible to obfuscate the distinction between <em>data</em> and <em>objects</em></p>
</li>
<li>
<p>But the point is that you should be hiding data from yourself.</p>
</li>
<li>
<p>Hiding data from yourself protects code from unexpected changes</p>
</li>
</ul>
<p><strong>Hide Data Structures</strong></p>
<ul>
<li>Depending on a complicated data structure can also <em>lead to a world of hurt</em></li>
<li>For instance, if you create a method that expects the data structure is being passed to it to be an <em>array of arrays with two items in each array</em> - you create a dependency</li>
</ul>
<p><em>see <code>3_obscuring_references.rb</code></em></p>
<ul>
<li>Ruby makes it easy to separate structure from meaning</li>
<li>You can use a Ruby <code>Struct</code> class to wrap a structure</li>
</ul>
<p><em>see <code>4_revealing_references.rb</code></em></p>
<ul>
<li>the <code>diameters</code> method <strong>now has no knowledge of the internal structure of the array</strong></li>
<li><code>diameters</code> just know that it has to respond to <code>rim</code> and <code>tire</code> and nothing about the data structure</li>
<li>Knowledge of the incoming array is encapsulated in our <code>wheelify</code> method</li>
</ul>
<h2>Enforce Single Responsibility Everywhere</h2>
<p><strong>Extra Extra Responsibilities from Methods</strong></p>
<pre><code>def diameters
  wheels.collect { |wheel| wheel.rim + (wheel.tire * 2) }
end
</code></pre>
<ul>
<li>
<p>this method clearly has two responsibilities</p>
<ul>
<li>iterate over wheels</li>
<li>calculate the diameter of each wheel</li>
</ul>
</li>
<li>
<p>we can separate these into two methods that each have their own responsibility</p>
<p>def diameters<br />
wheels.collect { |wheel| diameter(wheel) }<br />
end</p>
<p>def diameter(wheel)<br />
wheel.rim + (wheel.tire * 2)<br />
end</p>
</li>
<li>
<p>separating iteration from the action that's being performed on each element is a common case of multiple responsibilities</p>
</li>
</ul>
<h1>Finally, the Real Wheel</h1>
<ul>
<li>New feature request: program should calculate bicycle wheel circumference</li>
<li>Now we can separate a <code>Wheel</code> class from our <code>Gear</code> class</li>
</ul>
<p><em>see <code>5_gear_and_wheel.rb</code></em></p>
]]></description>
      <pubDate>Mon, 10 Dec 2018 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/single-responsibility-c9fd7a80</link>
      <content:encoded><![CDATA[<h1>Chapter 2: Designing Classes with a Single Responsibility</h1>
<blockquote>
<p>The foundation of an object-oriented system is the message, but the most visible organizational structure is the class</p>
</blockquote>
<p><strong>Questions to ask yourself:</strong></p>
<ul>
<li>What are your classes?</li>
<li>How many should you have?</li>
<li>What behavior will they implement?</li>
<li>How much do they know about other classes?</li>
<li>How much of themselves should they expose?</li>
</ul>
<h1>Creating Classes That Have a Single Responsibility</h1>
<blockquote>
<p>A class should do the smallest possible useful thing; that is, it should have a single responsibility</p>
</blockquote>
<h2>An Example Application: Bicycles and Gears</h2>
<ul>
<li>Let's take a look at bikes. Consider the types of gears that bikes use</li>
</ul>
<p><strong>Small Gears</strong></p>
<ul>
<li>easy to pedal, not as fast</li>
<li>takes many pedals just to make the tires rotate once</li>
<li>can help you creep along steep hills</li>
</ul>
<p><strong>Large Gears</strong></p>
<ul>
<li>
<p>harder to pedal, fast</p>
</li>
<li>
<p>sends you flying down those steep hills</p>
</li>
<li>
<p>one pedal rotation with your foot might cause the tires to rotate multiple times</p>
</li>
<li>
<p>Let's start with a small script and then extrapolate classes out of it:</p>
<h1>Large Gear</h1>
<p>chainring = 52<br />
cog       = 11<br />
ratio     = chainring / cog.to_f</p>
<p>puts 'Large Gear:'\<br />
&quot;\n#{chainring}-tooth chainring&quot;\<br />
&quot;\n#{cog}-tooth cog&quot;\<br />
&quot;\n#{ratio.round(2)} rotations&quot;</p>
<h1>Small Gear</h1>
<p>chainring = 30<br />
cog       = 27<br />
ratio     = chainring / cog.to_f</p>
<p>puts &quot;\nSmall Gear:&quot;\<br />
&quot;\n#{chainring}-tooth chainring&quot;\<br />
&quot;\n#{cog}-tooth cog&quot;\<br />
&quot;\n#{ratio.round(2)} rotations&quot;</p>
</li>
<li>
<p>Since we're talking about <em>gears</em>, it only makes sense that we start by creating a <code>Gear</code> class based on the behavior above</p>
</li>
</ul>
<p><em>see <code>1_gear.rb</code></em></p>
<ul>
<li>
<p>Our <code>Gear</code> class has three methods: <code>chainring</code>, <code>cog</code>, and <code>ratio</code></p>
</li>
<li>
<p><code>Gear</code> is a subclass of <code>Object</code> and thus inherits many other methods besides the three that we defined</p>
</li>
<li>
<p>What I'm trying to say is that <strong>the complete set of behavior / the total set of messages to which it can respond</strong> is fairly large</p>
</li>
<li>
<p>This is great and all - but what if we want to extend the functionality by taking into account the <em>effect of the difference in wheels</em></p>
<ul>
<li>Bigger wheels travel much farther during each wheel rotation versus smaller wheels</li>
</ul>
</li>
<li>
<p>Consider this formula</p>
<p>gear inches = wheel diameter × gear ratio</p>
<p>(where)</p>
<p>wheel diameter = rim diameter + (2 × tire diameter)</p>
</li>
</ul>
<p><em>see <code>2_gear.rb</code></em></p>
<ul>
<li>This new code is great except our old call to <code>Gear.new(52, 11)</code> no longer works because we added 2 more arguments to our <code>initialize</code> method</li>
</ul>
<h2>Why Single Responsibility matters</h2>
<ul>
<li>Applications that are easy to change consist of classes that are easy to reuse. [...] A class that has more than one responsibility are difficult to reuse</li>
</ul>
<h2>Determining If a Class Has a Single Responsibility</h2>
<ul>
<li>How can you tell if your class is only doing a single thing? Try describing what it does in a single sentence. You'll find out very quickly</li>
<li>Remember that <strong>a class should do the smallest possible useful thing</strong></li>
<li>When we look at our <code>Gear</code> class - perhaps it is doing <em>too much</em></li>
<li>We are calculating <code>gear_inches</code>, which is fine - but calculating the <code>tire</code> size seems a little weird</li>
</ul>
<h2>When to Make Design Decisions</h2>
<ul>
<li>When we look at the <code>Gear</code> class, there's something off about having <code>rim</code> and <code>tire</code> in there.</li>
<li>Right now the code in <code>Gear</code> is transparent and reasonable - this doesn't mean that we have great design. All it means is that we have no dependencies</li>
<li>Right now, <code>Gear</code> lies about its responsibilities as it has <strong>multiple</strong> responsibilities in that it has to do &quot;wheel&quot; calculations in our <code>gear_inches</code> message</li>
</ul>
<h1>Write Code That Embraces Change</h1>
<p>Here are some techniques that help you write code that embraces change</p>
<h2>Depend on Behavior, Not Data</h2>
<ul>
<li>Behavior is captured in methods and invoked by sending messages</li>
<li>Objects <strong>also</strong> contain data (not just behavior)</li>
</ul>
<p><strong>Hide Instance Variables</strong></p>
<ul>
<li>
<p>Always wrap instance variables in accessor methods instead of directly referring to variables, like the <code>ratio</code> method does.</p>
</li>
<li>
<p>We can do this by using an <code>attr_reader</code></p>
<h1>BAD</h1>
<p>def ratio<br />
@chainring / @cog.to_f<br />
end</p>
<h1>GOOD</h1>
<p>def ratio<br />
chainring / cog.to_f<br />
end</p>
</li>
<li>
<p>If your instance variable is referred to multiple times and it suddenly needs to change, you're in for a world of hurt.</p>
</li>
<li>
<p>Your method that wraps your instance variable becomes the single source of truth</p>
</li>
<li>
<p>One drawback is that because you can wrap any instance variables in methods, its possible to obfuscate the distinction between <em>data</em> and <em>objects</em></p>
</li>
<li>
<p>But the point is that you should be hiding data from yourself.</p>
</li>
<li>
<p>Hiding data from yourself protects code from unexpected changes</p>
</li>
</ul>
<p><strong>Hide Data Structures</strong></p>
<ul>
<li>Depending on a complicated data structure can also <em>lead to a world of hurt</em></li>
<li>For instance, if you create a method that expects the data structure is being passed to it to be an <em>array of arrays with two items in each array</em> - you create a dependency</li>
</ul>
<p><em>see <code>3_obscuring_references.rb</code></em></p>
<ul>
<li>Ruby makes it easy to separate structure from meaning</li>
<li>You can use a Ruby <code>Struct</code> class to wrap a structure</li>
</ul>
<p><em>see <code>4_revealing_references.rb</code></em></p>
<ul>
<li>the <code>diameters</code> method <strong>now has no knowledge of the internal structure of the array</strong></li>
<li><code>diameters</code> just know that it has to respond to <code>rim</code> and <code>tire</code> and nothing about the data structure</li>
<li>Knowledge of the incoming array is encapsulated in our <code>wheelify</code> method</li>
</ul>
<h2>Enforce Single Responsibility Everywhere</h2>
<p><strong>Extra Extra Responsibilities from Methods</strong></p>
<pre><code>def diameters
  wheels.collect { |wheel| wheel.rim + (wheel.tire * 2) }
end
</code></pre>
<ul>
<li>
<p>this method clearly has two responsibilities</p>
<ul>
<li>iterate over wheels</li>
<li>calculate the diameter of each wheel</li>
</ul>
</li>
<li>
<p>we can separate these into two methods that each have their own responsibility</p>
<p>def diameters<br />
wheels.collect { |wheel| diameter(wheel) }<br />
end</p>
<p>def diameter(wheel)<br />
wheel.rim + (wheel.tire * 2)<br />
end</p>
</li>
<li>
<p>separating iteration from the action that's being performed on each element is a common case of multiple responsibilities</p>
</li>
</ul>
<h1>Finally, the Real Wheel</h1>
<ul>
<li>New feature request: program should calculate bicycle wheel circumference</li>
<li>Now we can separate a <code>Wheel</code> class from our <code>Gear</code> class</li>
</ul>
<p><em>see <code>5_gear_and_wheel.rb</code></em></p>
]]></content:encoded>
      <enclosure length="37884403" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/25fc72ab-2814-4dcc-86d9-b954c149633d/c9fd7a80_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Single Responsibility</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/25fc72ab-2814-4dcc-86d9-b954c149633d/3000x3000/1544328349artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:39:14</itunes:duration>
      <itunes:summary>This week we talk about creating classes, why single responsibility matters, and writing code that embraces change.</itunes:summary>
      <itunes:subtitle>This week we talk about creating classes, why single responsibility matters, and writing code that embraces change.</itunes:subtitle>
      <itunes:keywords>design, technology, software development, programming, book study, ruby on rails, computer programming, react, web development, startups</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1b99b987-8b4f-4dcd-8e08-58969c8d0321</guid>
      <title>New Book: Practical Object Oriented Design</title>
      <description><![CDATA[<p><strong>A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p><strong>Pivot a bit: Less agnostic, more useful to just lean into the technologies we use every day for a while.</strong></p>
<p><strong>We’ll do our best to keep the information generally useful to all software developers.</strong></p>
<p><strong>Moving forward this is a Web Development Podcast covering Ruby on Rails, Javascript and React.</strong></p>
<p><strong>New book:</strong></p>
<p><strong>Practical Object-Oriented Design in Ruby by Sandi Metz</strong></p>
<p><strong>Also known as POODR</strong></p>
<p><strong>About the Author:</strong></p>
<p><strong>Sandi Metz: She is one of the foremost thought leaders in clean code.</strong></p>
<p><strong>If you want some amazing programming talks just look up Sandi Metz on YouTube.</strong></p>
<p><strong>About the book:</strong></p>
<p><strong>“The Complete Guide to Writing Maintainable, Manageable, Pleasing, and Powerful Object-Oriented Applications”</strong></p>
<p><strong>About Object-Oriented Design:</strong></p>
<p><strong>Object-oriented applications are made up of objects and the messages that pass between them. Messages will turn out to be the more important of the two, but in this brief introduction (and in the first few chapters of the book) the concepts will get equal weight.</strong></p>
<p><strong>“In a world of objects, new arrangements of behavior emerge naturally. You don’t have to explicitly write code for the spouse_steps_on_cat procedure, all you need is a spouse object that takes steps and a cat object that does not like being stepped on. Put these two objects into a room together and unanticipated combinations of behavior will appear.”</strong></p>
<p><strong>“Unfortunately, something will change. It always does. The customers didn’t know what they wanted, they didn’t say what they meant…. Even applications that are perfect in every way… change is ubiquitous and omnipresent”</strong></p>
<p>WHY IS CHANGE SO HARD!?</p>
<p><strong>Dependencies stand in the way of change</strong></p>
<p><strong>Object Oriented Design is about Managing Dependencies</strong></p>
<p><strong>“In the absence of design, unmanaged dependencies wreak havoc because objects know too much about one another.”</strong></p>
<p><strong>“Part of the difficulty of design is that every problem has two components. You must not only write code for the feature you plan to deliver today, you must also create code that is amenable to being changed later.”</strong></p>
<p>Design Principles</p>
<ul>
<li><strong>SOLID - design:</strong>
<ul>
<li><strong>Single Responsibility - Do one thing well.</strong></li>
<li><strong>Open-Closed - You should be able to extend without modifying. Consistent interface.</strong></li>
<li><strong>Liskov Substitution (Swap out code underneath methods) - squares and rectangles</strong></li>
<li><strong>Interface Segregation - specific interfaces</strong></li>
<li><strong>Dependency Inversion - High-level modules should not depend upon low-level modules. Both should depend upon abstractions.</strong></li>
</ul>
</li>
<li><strong>DRY - Don’t Repeat Yourself</strong></li>
<li><strong>LoD - Law of Demeter - Talk only to closely related objects- the principle of least knowledge</strong></li>
</ul>
<p>Design Patterns</p>
<p><strong>Service Objects, Factory, Adapter, Decorator - This book doesn’t cover these.</strong></p>
<p><strong>Big Up Front Design Pitfalls</strong></p>
<p><strong>Design takes time</strong></p>
<p><strong>Next Chapter - we really get our hands dirty</strong></p>
<p><strong>Sandi Metz Links:</strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=npOGOmkxuio&amp;t=1841s">https://www.youtube.com/watch?v=npOGOmkxuio&amp;t=1841s</a></strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=29MAL8pJImQ">https://www.youtube.com/watch?v=29MAL8pJImQ</a></strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=8bZh5LMaSmE&amp;t=1s">https://www.youtube.com/watch?v=8bZh5LMaSmE&amp;t=1s</a></strong></p>
<p><strong>Pick:</strong></p>
<p><strong>JP: <a href="https://testingjavascript.com/">https://testingjavascript.com/</a></strong> </p>
<p><strong>John: SOLID Design Patterns in Javascript</strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=GtZtQ2VFweA&amp;feature=share">https://www.youtube.com/watch?v=GtZtQ2VFweA&amp;feature=share</a></strong></p>
<p><strong>- - - - -</strong></p>
<p>New Book: Practical Object-Oriented Design</p>
]]></description>
      <pubDate>Mon, 3 Dec 2018 13:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/new-book-practical-object-oriented-dc1428fb</link>
      <content:encoded><![CDATA[<p><strong>A weekly podcast about development and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<p><strong>Pivot a bit: Less agnostic, more useful to just lean into the technologies we use every day for a while.</strong></p>
<p><strong>We’ll do our best to keep the information generally useful to all software developers.</strong></p>
<p><strong>Moving forward this is a Web Development Podcast covering Ruby on Rails, Javascript and React.</strong></p>
<p><strong>New book:</strong></p>
<p><strong>Practical Object-Oriented Design in Ruby by Sandi Metz</strong></p>
<p><strong>Also known as POODR</strong></p>
<p><strong>About the Author:</strong></p>
<p><strong>Sandi Metz: She is one of the foremost thought leaders in clean code.</strong></p>
<p><strong>If you want some amazing programming talks just look up Sandi Metz on YouTube.</strong></p>
<p><strong>About the book:</strong></p>
<p><strong>“The Complete Guide to Writing Maintainable, Manageable, Pleasing, and Powerful Object-Oriented Applications”</strong></p>
<p><strong>About Object-Oriented Design:</strong></p>
<p><strong>Object-oriented applications are made up of objects and the messages that pass between them. Messages will turn out to be the more important of the two, but in this brief introduction (and in the first few chapters of the book) the concepts will get equal weight.</strong></p>
<p><strong>“In a world of objects, new arrangements of behavior emerge naturally. You don’t have to explicitly write code for the spouse_steps_on_cat procedure, all you need is a spouse object that takes steps and a cat object that does not like being stepped on. Put these two objects into a room together and unanticipated combinations of behavior will appear.”</strong></p>
<p><strong>“Unfortunately, something will change. It always does. The customers didn’t know what they wanted, they didn’t say what they meant…. Even applications that are perfect in every way… change is ubiquitous and omnipresent”</strong></p>
<p>WHY IS CHANGE SO HARD!?</p>
<p><strong>Dependencies stand in the way of change</strong></p>
<p><strong>Object Oriented Design is about Managing Dependencies</strong></p>
<p><strong>“In the absence of design, unmanaged dependencies wreak havoc because objects know too much about one another.”</strong></p>
<p><strong>“Part of the difficulty of design is that every problem has two components. You must not only write code for the feature you plan to deliver today, you must also create code that is amenable to being changed later.”</strong></p>
<p>Design Principles</p>
<ul>
<li><strong>SOLID - design:</strong>
<ul>
<li><strong>Single Responsibility - Do one thing well.</strong></li>
<li><strong>Open-Closed - You should be able to extend without modifying. Consistent interface.</strong></li>
<li><strong>Liskov Substitution (Swap out code underneath methods) - squares and rectangles</strong></li>
<li><strong>Interface Segregation - specific interfaces</strong></li>
<li><strong>Dependency Inversion - High-level modules should not depend upon low-level modules. Both should depend upon abstractions.</strong></li>
</ul>
</li>
<li><strong>DRY - Don’t Repeat Yourself</strong></li>
<li><strong>LoD - Law of Demeter - Talk only to closely related objects- the principle of least knowledge</strong></li>
</ul>
<p>Design Patterns</p>
<p><strong>Service Objects, Factory, Adapter, Decorator - This book doesn’t cover these.</strong></p>
<p><strong>Big Up Front Design Pitfalls</strong></p>
<p><strong>Design takes time</strong></p>
<p><strong>Next Chapter - we really get our hands dirty</strong></p>
<p><strong>Sandi Metz Links:</strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=npOGOmkxuio&amp;t=1841s">https://www.youtube.com/watch?v=npOGOmkxuio&amp;t=1841s</a></strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=29MAL8pJImQ">https://www.youtube.com/watch?v=29MAL8pJImQ</a></strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=8bZh5LMaSmE&amp;t=1s">https://www.youtube.com/watch?v=8bZh5LMaSmE&amp;t=1s</a></strong></p>
<p><strong>Pick:</strong></p>
<p><strong>JP: <a href="https://testingjavascript.com/">https://testingjavascript.com/</a></strong> </p>
<p><strong>John: SOLID Design Patterns in Javascript</strong></p>
<p><strong><a href="https://www.youtube.com/watch?v=GtZtQ2VFweA&amp;feature=share">https://www.youtube.com/watch?v=GtZtQ2VFweA&amp;feature=share</a></strong></p>
<p><strong>- - - - -</strong></p>
<p>New Book: Practical Object-Oriented Design</p>
]]></content:encoded>
      <enclosure length="36221343" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/c9679b1f-01a5-493c-86fd-e0ee93c0dfef/dc1428fb_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>New Book: Practical Object Oriented Design</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/c9679b1f-01a5-493c-86fd-e0ee93c0dfef/3000x3000/1543844032artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:30</itunes:duration>
      <itunes:summary>This week we talk about object-oriented design and design principles.</itunes:summary>
      <itunes:subtitle>This week we talk about object-oriented design and design principles.</itunes:subtitle>
      <itunes:keywords>react, computer programming, book study, technology, web development, software development, design, startups, ruby on rails, programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">693b0b70-6c83-493f-bc8b-d6e5219839d5</guid>
      <title>Alternatives to Exceptions</title>
      <description><![CDATA[<h1>Alternatives to Exceptions</h1>
<hr />
<ul>
<li>Multiple return values in failures can be helpful -</li>
<li>Represent a process as an object “Download Provisionment” - This is a really interesting idea…. “MessageSend.new” - would actually handle a lot of the issues in the SMS interface concept we’ve been talking through.</li>
<li>“It’s tempting to raise an exception every time you get an answer you don’t like. But exception handling interrupts and obscures the flow of your business logic. Consider carefully whether a situation is truly unusual before raising an Exception.”</li>
<li>Diagnostics- don’t fail SO aggressively early that you don’t capture the diagnostics.</li>
</ul>
<hr />
<p>Examples of when to not &quot;fail fast&quot;:</p>
<ol>
<li>test suites</li>
</ol>
<p>Sometimes you just need a way to proceed through steps and have the system tell you what parts succeeded and what parts failed</p>
<p><strong>Sideband data</strong></p>
<p>When communication failures without resorting to exceptions, we need a sideband: a secondary channel of communication for reporting meta-information about the status and disposition of a process.</p>
<p><strong>Multiple return values</strong></p>
<p>hehe, this reminds me of stuff I do in javascript</p>
<ul>
<li>
<p>ruby supports multiple return values in the form of array splatting. in JS, you could do this with destructuring</p>
<p>def foo<br />
result = 42<br />
success = true<br />
[result, success]<br />
end</p>
<p>result, success = foo<br />
puts &quot;#{success ? 'succeeded' : 'failed'}; result #{result}&quot;</p>
</li>
</ul>
<p>Or you can use an open struct</p>
<pre><code>def foo
  OpenStruct.new(:result =&gt; 42, :status =&gt; :success)
end
</code></pre>
<p><strong>Output parameters</strong></p>
<p><strong>Caller-supplied fallback strategy</strong></p>
<ul>
<li>
<p>if we're not sure we want to terminate the execution of a long process by raising an exception, we can inject a failure policy into the process</p>
<p>def make_user_accounts(host, failure_policy=method(:raise))<br />
# ...<br />
rescue =&gt; error<br />
failure_policy.call(error)<br />
end</p>
<p>def provision_host(host, failure_policy)<br />
make_user_accounts(host, failure_policy)<br />
end</p>
<p>policy = lambda { |e| puts e.message }<br />
provision_host(&quot;192.168.1.123&quot;, policy)</p>
</li>
</ul>
<h2>Picks</h2>
<p>JP:</p>
<ul>
<li><a href="https://github.com/xotahal/react-native-motion">https://github.com/xotahal/react-native-motion</a></li>
<li><a href="https://github.com/fram-x/FluidTransitions">https://github.com/fram-x/FluidTransitions</a></li>
<li><a href="https://github.com/callstack/react-native-testing-library">https://github.com/callstack/react-native-testing-library</a></li>
</ul>
<p>John:</p>
<p><a href="https://slack.com/">Slack Video Calling + Collaboration</a></p>
]]></description>
      <pubDate>Fri, 2 Nov 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/alternatives-to-exceptions-e20c0a46</link>
      <content:encoded><![CDATA[<h1>Alternatives to Exceptions</h1>
<hr />
<ul>
<li>Multiple return values in failures can be helpful -</li>
<li>Represent a process as an object “Download Provisionment” - This is a really interesting idea…. “MessageSend.new” - would actually handle a lot of the issues in the SMS interface concept we’ve been talking through.</li>
<li>“It’s tempting to raise an exception every time you get an answer you don’t like. But exception handling interrupts and obscures the flow of your business logic. Consider carefully whether a situation is truly unusual before raising an Exception.”</li>
<li>Diagnostics- don’t fail SO aggressively early that you don’t capture the diagnostics.</li>
</ul>
<hr />
<p>Examples of when to not &quot;fail fast&quot;:</p>
<ol>
<li>test suites</li>
</ol>
<p>Sometimes you just need a way to proceed through steps and have the system tell you what parts succeeded and what parts failed</p>
<p><strong>Sideband data</strong></p>
<p>When communication failures without resorting to exceptions, we need a sideband: a secondary channel of communication for reporting meta-information about the status and disposition of a process.</p>
<p><strong>Multiple return values</strong></p>
<p>hehe, this reminds me of stuff I do in javascript</p>
<ul>
<li>
<p>ruby supports multiple return values in the form of array splatting. in JS, you could do this with destructuring</p>
<p>def foo<br />
result = 42<br />
success = true<br />
[result, success]<br />
end</p>
<p>result, success = foo<br />
puts &quot;#{success ? 'succeeded' : 'failed'}; result #{result}&quot;</p>
</li>
</ul>
<p>Or you can use an open struct</p>
<pre><code>def foo
  OpenStruct.new(:result =&gt; 42, :status =&gt; :success)
end
</code></pre>
<p><strong>Output parameters</strong></p>
<p><strong>Caller-supplied fallback strategy</strong></p>
<ul>
<li>
<p>if we're not sure we want to terminate the execution of a long process by raising an exception, we can inject a failure policy into the process</p>
<p>def make_user_accounts(host, failure_policy=method(:raise))<br />
# ...<br />
rescue =&gt; error<br />
failure_policy.call(error)<br />
end</p>
<p>def provision_host(host, failure_policy)<br />
make_user_accounts(host, failure_policy)<br />
end</p>
<p>policy = lambda { |e| puts e.message }<br />
provision_host(&quot;192.168.1.123&quot;, policy)</p>
</li>
</ul>
<h2>Picks</h2>
<p>JP:</p>
<ul>
<li><a href="https://github.com/xotahal/react-native-motion">https://github.com/xotahal/react-native-motion</a></li>
<li><a href="https://github.com/fram-x/FluidTransitions">https://github.com/fram-x/FluidTransitions</a></li>
<li><a href="https://github.com/callstack/react-native-testing-library">https://github.com/callstack/react-native-testing-library</a></li>
</ul>
<p>John:</p>
<p><a href="https://slack.com/">Slack Video Calling + Collaboration</a></p>
]]></content:encoded>
      <enclosure length="38609749" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/b1327547-4488-4fec-8aac-4648a355609f/e20c0a46_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Alternatives to Exceptions</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/b1327547-4488-4fec-8aac-4648a355609f/3000x3000/1541094132artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:10</itunes:duration>
      <itunes:summary>This week we talk about sideband data, multiple return values, and output parameters.</itunes:summary>
      <itunes:subtitle>This week we talk about sideband data, multiple return values, and output parameters.</itunes:subtitle>
      <itunes:keywords>programming, sideband, ruby on rails, software development, book study, computer programming, design, web development, startups, technology, react</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c768d83f-1ed7-44f9-ba68-381255db315c</guid>
      <title>Designing for Failures</title>
      <description><![CDATA[<h1>Designing for Failures</h1>
<p><strong>Failure flags and benign values</strong></p>
<ul>
<li>
<p>Sometimes responding with a <code>nil</code> is good enough, i.e.</p>
<p>def save<br />
# some failing code<br />
rescue<br />
nil<br />
end</p>
</li>
<li>
<p>Related to this is the concept of &quot;benign values&quot;</p>
</li>
</ul>
<blockquote>
<p>The system might replace the erroneous value with a phony value that it knows to have a benign effect on the rest of the system</p>
</blockquote>
<blockquote>
<p>When the system's success doesn't depend on the outcome of the method in question, using a benign value may be the right choice. Benign values are also helpful in making the code more testable.</p>
</blockquote>
<p>Example:</p>
<pre><code>begin
  response = HTTP.get_response(url)
  JSON.parse(response.body)
rescue Net::HTTPError
  { 'stock_quote' =&gt; '' }
end
</code></pre>
<ul>
<li>Instead of 'puts<code>'ing, we can use</code>warn`</li>
</ul>
<p><strong>Warning as errors</strong></p>
<p>Check out this hack:</p>
<pre><code>module Kernel
  def warn(message)
    raise message
  end
end

warn 'uh oh'
</code></pre>
<p><strong>Remote failure reporting</strong></p>
<ul>
<li>At OL we use Bugsnag</li>
<li>Idea of <strong>bulkheads</strong> -&gt; a wall beyond which failures cannot have an effect on other parts of the system</li>
<li>you should put bulkheads between external services and processes</li>
</ul>
<p><strong>Circuit breaker pattern</strong></p>
<p><strong>Ending the program</strong></p>
<ul>
<li>Calling <code>exit</code> ends the whole program</li>
<li>Remember that time I used <code>exit</code> in the Whiz Tutor codebase?</li>
</ul>
<h3>Picks</h3>
<p>John: <strong>User Onboard - <a href="https://www.useronboard.com/">https://www.useronboard.com/</a> by <a href="https://twitter.com/samuelhulick">https://twitter.com/samuelhulick</a></strong> </p>
<p><strong>JP: <a href="http://singlediv.com/">singlediv.com</a> - https://twitter.com/samuelhulick</strong></p>
]]></description>
      <pubDate>Fri, 26 Oct 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/designing-for-failures-7d72f45d</link>
      <content:encoded><![CDATA[<h1>Designing for Failures</h1>
<p><strong>Failure flags and benign values</strong></p>
<ul>
<li>
<p>Sometimes responding with a <code>nil</code> is good enough, i.e.</p>
<p>def save<br />
# some failing code<br />
rescue<br />
nil<br />
end</p>
</li>
<li>
<p>Related to this is the concept of &quot;benign values&quot;</p>
</li>
</ul>
<blockquote>
<p>The system might replace the erroneous value with a phony value that it knows to have a benign effect on the rest of the system</p>
</blockquote>
<blockquote>
<p>When the system's success doesn't depend on the outcome of the method in question, using a benign value may be the right choice. Benign values are also helpful in making the code more testable.</p>
</blockquote>
<p>Example:</p>
<pre><code>begin
  response = HTTP.get_response(url)
  JSON.parse(response.body)
rescue Net::HTTPError
  { 'stock_quote' =&gt; '' }
end
</code></pre>
<ul>
<li>Instead of 'puts<code>'ing, we can use</code>warn`</li>
</ul>
<p><strong>Warning as errors</strong></p>
<p>Check out this hack:</p>
<pre><code>module Kernel
  def warn(message)
    raise message
  end
end

warn 'uh oh'
</code></pre>
<p><strong>Remote failure reporting</strong></p>
<ul>
<li>At OL we use Bugsnag</li>
<li>Idea of <strong>bulkheads</strong> -&gt; a wall beyond which failures cannot have an effect on other parts of the system</li>
<li>you should put bulkheads between external services and processes</li>
</ul>
<p><strong>Circuit breaker pattern</strong></p>
<p><strong>Ending the program</strong></p>
<ul>
<li>Calling <code>exit</code> ends the whole program</li>
<li>Remember that time I used <code>exit</code> in the Whiz Tutor codebase?</li>
</ul>
<h3>Picks</h3>
<p>John: <strong>User Onboard - <a href="https://www.useronboard.com/">https://www.useronboard.com/</a> by <a href="https://twitter.com/samuelhulick">https://twitter.com/samuelhulick</a></strong> </p>
<p><strong>JP: <a href="http://singlediv.com/">singlediv.com</a> - https://twitter.com/samuelhulick</strong></p>
]]></content:encoded>
      <enclosure length="45888427" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/a8c41d85-a312-4844-b52f-c173944c096e/7d72f45d_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Designing for Failures</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/a8c41d85-a312-4844-b52f-c173944c096e/3000x3000/1539791810artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:47:34</itunes:duration>
      <itunes:summary>This week we talk about failure flags and benign values, report failure reporting, and warning as errors.</itunes:summary>
      <itunes:subtitle>This week we talk about failure flags and benign values, report failure reporting, and warning as errors.</itunes:subtitle>
      <itunes:keywords>ruby on rails, technology, startups, web development, react, computer programming, book study, design, failures, software development, programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">154791fc-c233-4aa9-bf1d-11c06b455798</guid>
      <title>Exceptional Failure</title>
      <description><![CDATA[<h1>Exceptional Failure</h1>
<p>In this short season, we are going through <a href="http://exceptionalruby.com/">EXceptional Ruby</a> by Advi Grimm</p>
<h2>What is a failure?</h2>
<p>Let's talk about some definitions first:</p>
<ol>
<li>Exception - <strong>the occurrence of an abnormal condition during the execution of a software element</strong>.</li>
<li>Failure - the inability of a software element to satisfy its purpose</li>
<li>Error - the presence in the software of some element not satisfying its specification</li>
</ol>
<p>&quot;Failures cause exceptions which are due to errors&quot;</p>
<ul>
<li>Failures - methods are thought to be designed to fulfill a contract. when they don't fulfill the contract, they fail</li>
</ul>
<h1>The life-cycle of an exception</h1>
<ul>
<li>Exceptions are raised with either the <code>raise</code> or <code>fail</code> methods</li>
<li>In Ruby, we signal failures with exceptions</li>
</ul>
<hr />
<p>🗣 <strong>Discussion: When do you find yourself using <code>raise</code>?</strong></p>
<p>🗣 <strong>Discussion: When do you find yourself using <code>rescue</code>?</strong></p>
<ul>
<li>The <code>rescue</code> clause should be a short sequence of simple instructions designed to bring the object back to a stable state and to either retry the operation or terminate with a failure</li>
</ul>
<p><strong>syntax</strong></p>
<ul>
<li>
<p>Starts with the <code>rescue</code> keyword, followed by one or more classes or modules to match, then a hash rocket and the variable name to which the matching exception will be assigned</p>
</li>
<li>
<p>Subsequent lines of code up to an <code>end</code> keyword will be executed if the <code>rescue</code> is matched</p>
<p>rescue IOError =&gt; e<br />
puts &quot;Error while writing to file: #{e.message}&quot;<br />
end</p>
</li>
</ul>
<p>Moar Code</p>
<pre><code>begin
  raise RuntimeError, 'specific error'
rescue StandardError =&gt; error
  puts &quot;Generic error handler: #{error.inspect}&quot;
rescue RuntimeError =&gt; error
  puts &quot;runtime error handler: #{error.inspect}&quot;
end
</code></pre>
<ul>
<li>Order matters when stacking multiple rescue clauses. the RuntimeError rescue block will never execute!</li>
</ul>
<p>🗣 <strong>Discussion: Have you ever used <code>retry</code>?</strong></p>
<pre><code>tries = 0

begin
  tries += 1
  puts &quot;trying #{tries}&quot;
  raise
rescue
  retry if tries &lt; 3
  puts 'I give up'
end
</code></pre>
<ul>
<li>Ruby gives you the power to retry</li>
<li>I can see how this might be useful for making API calls</li>
<li>Be super careful that your 'giving up' criteria will eventually be met</li>
<li>Retry is nice for things that are unreliable</li>
</ul>
<p>Picks:</p>
<p>JP: Overcast <a href="https://overcast.fm/">https://overcast.fm/</a></p>
<p>John: <a href="https://www.apple.com/shop/browse/home/specialdeals/mac">Apple Refurbished</a></p>
]]></description>
      <pubDate>Fri, 19 Oct 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/exceptional-failure-6a43ce04</link>
      <content:encoded><![CDATA[<h1>Exceptional Failure</h1>
<p>In this short season, we are going through <a href="http://exceptionalruby.com/">EXceptional Ruby</a> by Advi Grimm</p>
<h2>What is a failure?</h2>
<p>Let's talk about some definitions first:</p>
<ol>
<li>Exception - <strong>the occurrence of an abnormal condition during the execution of a software element</strong>.</li>
<li>Failure - the inability of a software element to satisfy its purpose</li>
<li>Error - the presence in the software of some element not satisfying its specification</li>
</ol>
<p>&quot;Failures cause exceptions which are due to errors&quot;</p>
<ul>
<li>Failures - methods are thought to be designed to fulfill a contract. when they don't fulfill the contract, they fail</li>
</ul>
<h1>The life-cycle of an exception</h1>
<ul>
<li>Exceptions are raised with either the <code>raise</code> or <code>fail</code> methods</li>
<li>In Ruby, we signal failures with exceptions</li>
</ul>
<hr />
<p>🗣 <strong>Discussion: When do you find yourself using <code>raise</code>?</strong></p>
<p>🗣 <strong>Discussion: When do you find yourself using <code>rescue</code>?</strong></p>
<ul>
<li>The <code>rescue</code> clause should be a short sequence of simple instructions designed to bring the object back to a stable state and to either retry the operation or terminate with a failure</li>
</ul>
<p><strong>syntax</strong></p>
<ul>
<li>
<p>Starts with the <code>rescue</code> keyword, followed by one or more classes or modules to match, then a hash rocket and the variable name to which the matching exception will be assigned</p>
</li>
<li>
<p>Subsequent lines of code up to an <code>end</code> keyword will be executed if the <code>rescue</code> is matched</p>
<p>rescue IOError =&gt; e<br />
puts &quot;Error while writing to file: #{e.message}&quot;<br />
end</p>
</li>
</ul>
<p>Moar Code</p>
<pre><code>begin
  raise RuntimeError, 'specific error'
rescue StandardError =&gt; error
  puts &quot;Generic error handler: #{error.inspect}&quot;
rescue RuntimeError =&gt; error
  puts &quot;runtime error handler: #{error.inspect}&quot;
end
</code></pre>
<ul>
<li>Order matters when stacking multiple rescue clauses. the RuntimeError rescue block will never execute!</li>
</ul>
<p>🗣 <strong>Discussion: Have you ever used <code>retry</code>?</strong></p>
<pre><code>tries = 0

begin
  tries += 1
  puts &quot;trying #{tries}&quot;
  raise
rescue
  retry if tries &lt; 3
  puts 'I give up'
end
</code></pre>
<ul>
<li>Ruby gives you the power to retry</li>
<li>I can see how this might be useful for making API calls</li>
<li>Be super careful that your 'giving up' criteria will eventually be met</li>
<li>Retry is nice for things that are unreliable</li>
</ul>
<p>Picks:</p>
<p>JP: Overcast <a href="https://overcast.fm/">https://overcast.fm/</a></p>
<p>John: <a href="https://www.apple.com/shop/browse/home/specialdeals/mac">Apple Refurbished</a></p>
]]></content:encoded>
      <enclosure length="48124091" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/384da5dd-5dcb-4ef8-999d-fbba77c32251/6a43ce04_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Exceptional Failure</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/384da5dd-5dcb-4ef8-999d-fbba77c32251/3000x3000/1539791238artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:49:54</itunes:duration>
      <itunes:summary>This week we talk about what is a failure, and the life-cycle of an exception.</itunes:summary>
      <itunes:subtitle>This week we talk about what is a failure, and the life-cycle of an exception.</itunes:subtitle>
      <itunes:keywords>react, software development, exceptions, programming, web development, ruby on rails, technology, startups, design, book study, computer programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2e600f8b-d864-4ee1-935a-3318b062bfa2</guid>
      <title>Building to Last</title>
      <description><![CDATA[<h1>Building to Last</h1>
<blockquote>
<p>Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<h2>On following fashions</h2>
<ul>
<li>What are short-lived trends? What will stand the test of time? How to approach hot new techniques:</li>
</ul>
<p>Ask yourself:</p>
<ol>
<li>Does the code feel easier to read and change after refactoring?</li>
<li>How did the complexity increase or decrease</li>
<li>Did you run into any new issues?</li>
</ol>
<ul>
<li>John: If you keep changing with the trends “your codebase will be a patchwork of different styles making it very hard to understand or change”</li>
</ul>
<p><strong>there are no silver bullets</strong></p>
<h2>Surviving the upgrade pace of Rails</h2>
<ul>
<li>Gems increase the cost of upgrades (so do NPM modules)</li>
<li>👀 react navigation</li>
<li>Don't live on the bleeding edge</li>
</ul>
<h2>Owning your stack</h2>
<ul>
<li>Own the gems you put in.</li>
<li>How do you decide on if a gem is worth including in your library? should you just write some small helpers yourself to accomplish it?</li>
<li>Idea of maxing out your current toolbox <em>first</em></li>
<li>Should you use redis? or can you just use another sql table?</li>
<li>John: When you pull in dependencies - YOU OWN IT. IT’S YOUR CODE NOW.</li>
</ul>
<h2>The value of tests</h2>
<ul>
<li>We're a broken record here. one thing to point out is that this lets you release often!</li>
<li>You can also work on one part of the app in isolation without having to worry about the rest</li>
<li>John: Test suite is like a light in a dark house - give you enough coverage so you know there isn’t a monster lurking</li>
</ul>
<p>Picks:</p>
<p><a href="https://www.notion.so/">https://www.notion.so/</a> - How meta - we use Notion to manage this podcast.</p>
]]></description>
      <pubDate>Fri, 28 Sep 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/building-to-last-5f44a4bc</link>
      <content:encoded><![CDATA[<h1>Building to Last</h1>
<blockquote>
<p>Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<h2>On following fashions</h2>
<ul>
<li>What are short-lived trends? What will stand the test of time? How to approach hot new techniques:</li>
</ul>
<p>Ask yourself:</p>
<ol>
<li>Does the code feel easier to read and change after refactoring?</li>
<li>How did the complexity increase or decrease</li>
<li>Did you run into any new issues?</li>
</ol>
<ul>
<li>John: If you keep changing with the trends “your codebase will be a patchwork of different styles making it very hard to understand or change”</li>
</ul>
<p><strong>there are no silver bullets</strong></p>
<h2>Surviving the upgrade pace of Rails</h2>
<ul>
<li>Gems increase the cost of upgrades (so do NPM modules)</li>
<li>👀 react navigation</li>
<li>Don't live on the bleeding edge</li>
</ul>
<h2>Owning your stack</h2>
<ul>
<li>Own the gems you put in.</li>
<li>How do you decide on if a gem is worth including in your library? should you just write some small helpers yourself to accomplish it?</li>
<li>Idea of maxing out your current toolbox <em>first</em></li>
<li>Should you use redis? or can you just use another sql table?</li>
<li>John: When you pull in dependencies - YOU OWN IT. IT’S YOUR CODE NOW.</li>
</ul>
<h2>The value of tests</h2>
<ul>
<li>We're a broken record here. one thing to point out is that this lets you release often!</li>
<li>You can also work on one part of the app in isolation without having to worry about the rest</li>
<li>John: Test suite is like a light in a dark house - give you enough coverage so you know there isn’t a monster lurking</li>
</ul>
<p>Picks:</p>
<p><a href="https://www.notion.so/">https://www.notion.so/</a> - How meta - we use Notion to manage this podcast.</p>
]]></content:encoded>
      <enclosure length="33938138" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/e1976958-cb1e-4786-9361-c5172e3d8cb8/5f44a4bc_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Building to Last</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/e1976958-cb1e-4786-9361-c5172e3d8cb8/3000x3000/1537288969artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:35:07</itunes:duration>
      <itunes:summary>This week we talk about trends in the industry, NPMs, owning your stack and the value of tests.</itunes:summary>
      <itunes:subtitle>This week we talk about trends in the industry, NPMs, owning your stack and the value of tests.</itunes:subtitle>
      <itunes:keywords>ruby on rails, technology, software development, react, book study, web development, design, startups, programming, computer programming, npm</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">15171931-66a1-4a0c-90be-9305a0cc622f</guid>
      <title>A System for Growth</title>
      <description><![CDATA[<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h1>A System for Growth</h1>
<h2>Dealing with complicated models</h2>
<ul>
<li>
<p>John: How / Why do they grow? Needs change:</p>
</li>
<li>
<p>John: All the different use cases for a user</p>
<p><img src="https://withbetter.s3-us-west-1.amazonaws.com/uploads/files/000/000/130/original/Screen_Shot_2018-09-03_at_3.05.23_PM.png?1536016482" alt="" /></p>
</li>
</ul>
<p>John:</p>
<blockquote>
<p>&quot;When you need to implement password recovery, and do not have a clear, single place to put the logic, it will still find its way into your code. It will spread itself across existing classes, usually making those classes harder to read and use.”</p>
</blockquote>
<p>Example problem: Want to send a welcome email when a user is created via a public form but not when an admin creates a user via a backend interface</p>
<ul>
<li>Fat models == missing classes</li>
<li>don't actively look for an AR class, look for new classes to contain new logic</li>
</ul>
<h2>A home for interaction specific code</h2>
<p>Core models should only have the absolute minimum to exist:</p>
<ul>
<li>set of validations to enforce data integrity</li>
<li>definitions for associations (belongs_to, has_many)</li>
<li>universally useful convenience methods to find or manipulate records (scopes)</li>
</ul>
<p>Core models should NOT have these things: (these things belong in multiple, interaction-specific form models)</p>
<ul>
<li>
<p>virtual attributes that don't map 1:1 with db</p>
</li>
<li>
<p>callbacks to fire for a particular screen or use case (i.e. form signup)</p>
</li>
<li>
<p>we want the perks of AR models with AR. solution: inheritance</p>
<p>class User::AsSignUp &lt; User<br />
validates :password, presence: true, confirmation: true<br />
after_create :send_welcome_email</p>
<pre><code>private

def send_welcome_email; end
</code></pre>
<p>end</p>
</li>
<li>
<p>John: Note the &quot;AsSignup&quot; pattern - &quot;AsFacebookAuth&quot;</p>
</li>
</ul>
<h2>Extracting service objects (lol)</h2>
<ul>
<li>probably a good indicator of a service object is when you find yourself using class methods. i.e. <code>def self.something</code></li>
<li>John: Didn’t we just move code around? - &quot;what used to be a monolithic blob of intertwined logic is now separated into multiple, loosely coupled components.” Better maintainability, testing, and reuse.</li>
</ul>
<h2>Organizing large codebases with namespaces</h2>
<pre><code>class Invoice &lt; ActiveRecord::Base
  has_many :items
end

class Item &lt; ActiveRecord::Base
  belongs_to:invoice
end
</code></pre>
<p>Why not just:</p>
<pre><code>class Invoice::Item &lt; ActiveRecord::Base
  belongs_to:invoice
end
</code></pre>
<p>and move the file to: <code>app/models/invoice/item.rb</code></p>
<ul>
<li>core domain at a glance</li>
<li>John: Pros- Namespaces have an inherent hierarchy - Encourages more objects, clear path for them.</li>
</ul>
<h2>Taming Stylesheets</h2>
<p>The recommendations are a lot like BEM - A front-end development methodology - learn more at: <a href="http://getbem.com/">http://getbem.com/</a></p>
<ul>
<li>John - Recommend a <a href="http://readme.md/">Readme.md</a> for front-end specific code, or having front end specific guides in the readme.</li>
<li>John - Have a process, and document your process. Have a system.</li>
<li>John - Contractor (Frank Hock) - Recommended a very specific folder structure:</li>
</ul>
<blockquote>
<p>Abstracts (Sizing, Boarders, Spacing)Base (Grid, Colors, images, Typography)Components (Buttons, Cards, Alerts)Page Specific CSS</p>
</blockquote>
<p>Picks:</p>
<ul>
<li>John: <a href="https://bonsai.io/">Elasticsearch with Bonsai</a> - Such a great experience and amazing performance so far.</li>
<li>JP: <a href="https://github.com/kelseyhightower/nocode">https://github.com/kelseyhightower/nocode</a></li>
</ul>
]]></description>
      <pubDate>Fri, 21 Sep 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/a-system-for-growth-4872125d</link>
      <content:encoded><![CDATA[<p>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h1>A System for Growth</h1>
<h2>Dealing with complicated models</h2>
<ul>
<li>
<p>John: How / Why do they grow? Needs change:</p>
</li>
<li>
<p>John: All the different use cases for a user</p>
<p><img src="https://withbetter.s3-us-west-1.amazonaws.com/uploads/files/000/000/130/original/Screen_Shot_2018-09-03_at_3.05.23_PM.png?1536016482" alt="" /></p>
</li>
</ul>
<p>John:</p>
<blockquote>
<p>&quot;When you need to implement password recovery, and do not have a clear, single place to put the logic, it will still find its way into your code. It will spread itself across existing classes, usually making those classes harder to read and use.”</p>
</blockquote>
<p>Example problem: Want to send a welcome email when a user is created via a public form but not when an admin creates a user via a backend interface</p>
<ul>
<li>Fat models == missing classes</li>
<li>don't actively look for an AR class, look for new classes to contain new logic</li>
</ul>
<h2>A home for interaction specific code</h2>
<p>Core models should only have the absolute minimum to exist:</p>
<ul>
<li>set of validations to enforce data integrity</li>
<li>definitions for associations (belongs_to, has_many)</li>
<li>universally useful convenience methods to find or manipulate records (scopes)</li>
</ul>
<p>Core models should NOT have these things: (these things belong in multiple, interaction-specific form models)</p>
<ul>
<li>
<p>virtual attributes that don't map 1:1 with db</p>
</li>
<li>
<p>callbacks to fire for a particular screen or use case (i.e. form signup)</p>
</li>
<li>
<p>we want the perks of AR models with AR. solution: inheritance</p>
<p>class User::AsSignUp &lt; User<br />
validates :password, presence: true, confirmation: true<br />
after_create :send_welcome_email</p>
<pre><code>private

def send_welcome_email; end
</code></pre>
<p>end</p>
</li>
<li>
<p>John: Note the &quot;AsSignup&quot; pattern - &quot;AsFacebookAuth&quot;</p>
</li>
</ul>
<h2>Extracting service objects (lol)</h2>
<ul>
<li>probably a good indicator of a service object is when you find yourself using class methods. i.e. <code>def self.something</code></li>
<li>John: Didn’t we just move code around? - &quot;what used to be a monolithic blob of intertwined logic is now separated into multiple, loosely coupled components.” Better maintainability, testing, and reuse.</li>
</ul>
<h2>Organizing large codebases with namespaces</h2>
<pre><code>class Invoice &lt; ActiveRecord::Base
  has_many :items
end

class Item &lt; ActiveRecord::Base
  belongs_to:invoice
end
</code></pre>
<p>Why not just:</p>
<pre><code>class Invoice::Item &lt; ActiveRecord::Base
  belongs_to:invoice
end
</code></pre>
<p>and move the file to: <code>app/models/invoice/item.rb</code></p>
<ul>
<li>core domain at a glance</li>
<li>John: Pros- Namespaces have an inherent hierarchy - Encourages more objects, clear path for them.</li>
</ul>
<h2>Taming Stylesheets</h2>
<p>The recommendations are a lot like BEM - A front-end development methodology - learn more at: <a href="http://getbem.com/">http://getbem.com/</a></p>
<ul>
<li>John - Recommend a <a href="http://readme.md/">Readme.md</a> for front-end specific code, or having front end specific guides in the readme.</li>
<li>John - Have a process, and document your process. Have a system.</li>
<li>John - Contractor (Frank Hock) - Recommended a very specific folder structure:</li>
</ul>
<blockquote>
<p>Abstracts (Sizing, Boarders, Spacing)Base (Grid, Colors, images, Typography)Components (Buttons, Cards, Alerts)Page Specific CSS</p>
</blockquote>
<p>Picks:</p>
<ul>
<li>John: <a href="https://bonsai.io/">Elasticsearch with Bonsai</a> - Such a great experience and amazing performance so far.</li>
<li>JP: <a href="https://github.com/kelseyhightower/nocode">https://github.com/kelseyhightower/nocode</a></li>
</ul>
]]></content:encoded>
      <enclosure length="44855153" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/346ed0ea-2bc0-4b52-8c0d-18f44c742168/4872125d_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>A System for Growth</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/346ed0ea-2bc0-4b52-8c0d-18f44c742168/3000x3000/1537287729artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:46:29</itunes:duration>
      <itunes:summary>This week we talk about dealing with complicated models, organizing large codebases, and taming stylesheets.</itunes:summary>
      <itunes:subtitle>This week we talk about dealing with complicated models, organizing large codebases, and taming stylesheets.</itunes:subtitle>
      <itunes:keywords>startups, ruby on rails, book study, web development, computer programming, technology, programming, react, software development. bem, stylesheets, design</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">59a852d7-159e-4416-995a-db7729840195</guid>
      <title>Growing  Applications</title>
      <description><![CDATA[<p>Growing Rails Applications in Practice: Part 1/3: New Rules For Rails</p>
<p>Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter<br />
An Inconvenient Secret: Large applications are large</p>
<p>This book is about scaling your codebase. The amount of pain you feel should be logarithmic, not exponential.</p>
<p>This is not about revolutionary design patterns or magic gems that make all your problems go away. Instead, we will show you how to use discipline, consistency, and organization to make your application grow more gently.<br />
Beautiful Controllers</p>
<p>Should functionality go into the model or the controller?!<br />
&quot;Less business logic in our controllers, the better&quot;<br />
The authors argue for a standard controller design for every single user interaction. that is to say, it should only handle HTTP requests<br />
EVERYTHING is CRUD<br />
example of a stripped-down controller where Note controller never talks to the model directly.<br />
&quot;Every controller action reads or changes a single model. even if an update involves multiple models, the job of finding and changing the involved records should be pushed to an orchestrating model&quot;<br />
controllers should contain the minimum amount of glue to translate between the request, your model, and the response</p>
<p>Relearning Active Record</p>
<p>Data integrity with callbacks -&gt; later in the book, we'll talk about how to not use so many callbacks<br />
bad:</p>
<p>class Invite &lt; ActiveRecord::Base<br />
def accept! (user)<br />
accepted = true<br />
Membership.create!(user: user)<br />
end<br />
end</p>
<p>invite.update(accepted: true) # =&gt; circumventing the accept! method<br />
better:</p>
<p>after_save :create_membership_on_accept</p>
<p>private</p>
<p>def create_membership_on_accept<br />
if accepted &amp;&amp; accepted_changed?<br />
Membership.create!(user: user)<br />
end<br />
end<br />
User interactions without a database</p>
<p>Not all user interactions need an active record model.<br />
Example: sign in form that uses sessions. when the form is submitted, you don't end up inserting a row in a table in your db<br />
start taking your controllers from hell -&gt; putting that logic in your model (models from hell?)<br />
you know things are a pain when you have to use form_tag and can't use form_for<br />
one thing to note is that the example sends notifications (i.e. SMS, email) in their model and not their controller</p>
]]></description>
      <pubDate>Fri, 14 Sep 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/growing-applications-4864bbdc</link>
      <content:encoded><![CDATA[<p>Growing Rails Applications in Practice: Part 1/3: New Rules For Rails</p>
<p>Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter<br />
An Inconvenient Secret: Large applications are large</p>
<p>This book is about scaling your codebase. The amount of pain you feel should be logarithmic, not exponential.</p>
<p>This is not about revolutionary design patterns or magic gems that make all your problems go away. Instead, we will show you how to use discipline, consistency, and organization to make your application grow more gently.<br />
Beautiful Controllers</p>
<p>Should functionality go into the model or the controller?!<br />
&quot;Less business logic in our controllers, the better&quot;<br />
The authors argue for a standard controller design for every single user interaction. that is to say, it should only handle HTTP requests<br />
EVERYTHING is CRUD<br />
example of a stripped-down controller where Note controller never talks to the model directly.<br />
&quot;Every controller action reads or changes a single model. even if an update involves multiple models, the job of finding and changing the involved records should be pushed to an orchestrating model&quot;<br />
controllers should contain the minimum amount of glue to translate between the request, your model, and the response</p>
<p>Relearning Active Record</p>
<p>Data integrity with callbacks -&gt; later in the book, we'll talk about how to not use so many callbacks<br />
bad:</p>
<p>class Invite &lt; ActiveRecord::Base<br />
def accept! (user)<br />
accepted = true<br />
Membership.create!(user: user)<br />
end<br />
end</p>
<p>invite.update(accepted: true) # =&gt; circumventing the accept! method<br />
better:</p>
<p>after_save :create_membership_on_accept</p>
<p>private</p>
<p>def create_membership_on_accept<br />
if accepted &amp;&amp; accepted_changed?<br />
Membership.create!(user: user)<br />
end<br />
end<br />
User interactions without a database</p>
<p>Not all user interactions need an active record model.<br />
Example: sign in form that uses sessions. when the form is submitted, you don't end up inserting a row in a table in your db<br />
start taking your controllers from hell -&gt; putting that logic in your model (models from hell?)<br />
you know things are a pain when you have to use form_tag and can't use form_for<br />
one thing to note is that the example sends notifications (i.e. SMS, email) in their model and not their controller</p>
]]></content:encoded>
      <enclosure length="37867293" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/b1458ead-c766-4b1e-8d52-e86d295def81/4864bbdc_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Growing  Applications</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/b1458ead-c766-4b1e-8d52-e86d295def81/3000x3000/1536888757artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:39:13</itunes:duration>
      <itunes:summary>This week we talk about beautiful controllers. relearning active record, and user interactions without a database.</itunes:summary>
      <itunes:subtitle>This week we talk about beautiful controllers. relearning active record, and user interactions without a database.</itunes:subtitle>
      <itunes:keywords>react, technology, rails, ruby on rails, computer programming, programming, software development, web development, design, startups, book study</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">821a9b9c-134b-4227-a013-d216fdc12fa6</guid>
      <title>Recap of Pragmatic Programmer</title>
      <description><![CDATA[<h1>Pragmatic Programmer in Practice</h1>
<p>Welcome to Iteration - A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p>In this more casual episode, we recap some of our favorite tips from the Pragmatic Programmer in the context of our recent projects and lessons. We talk though caring about your craft, not leaving any broken windows and more.</p>
<p>Picks:</p>
<p>John - <a href="http://www.hemingwayapp.com/">http://www.hemingwayapp.com/</a></p>
<p>JP - <a href="https://folivora.ai/">better touch tool</a></p>
]]></description>
      <pubDate>Fri, 24 Aug 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/recap-of-pragmatic-programmer-4386f126</link>
      <content:encoded><![CDATA[<h1>Pragmatic Programmer in Practice</h1>
<p>Welcome to Iteration - A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p>In this more casual episode, we recap some of our favorite tips from the Pragmatic Programmer in the context of our recent projects and lessons. We talk though caring about your craft, not leaving any broken windows and more.</p>
<p>Picks:</p>
<p>John - <a href="http://www.hemingwayapp.com/">http://www.hemingwayapp.com/</a></p>
<p>JP - <a href="https://folivora.ai/">better touch tool</a></p>
]]></content:encoded>
      <enclosure length="38899793" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/acd3febe-746f-4a96-b653-8ac923d1ab93/4386f126_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Recap of Pragmatic Programmer</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/acd3febe-746f-4a96-b653-8ac923d1ab93/3000x3000/1535047859artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:28</itunes:duration>
      <itunes:summary>This week we talk about some of our favorite tips, caring about your craft, and not leaving any broken windows and more.</itunes:summary>
      <itunes:subtitle>This week we talk about some of our favorite tips, caring about your craft, and not leaving any broken windows and more.</itunes:subtitle>
      <itunes:keywords>computer programming, steve jobs, book study, design, software development, react, startups, programming, starting a project, technology, ruby on rails, recap, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>15</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a7ba83f3-83af-453c-b698-2829832dc3d3</guid>
      <title>Sign Your Work</title>
      <description><![CDATA[<h1>Chapter 8 - Pragmatic Projects</h1>
<h2>Season 2 - Episode 14 - Chapter 8 Part 2</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: This is part 2 of Chapter 8 - THE FINAL CHAPTER!</p>
<h1>65 - Test state coverage, not code coverage</h1>
<blockquote>
<p>Identify and test significant program states. Just testing lines of code isn't enough</p>
</blockquote>
<p>JP: Even if you test every single line of code - that's not what matters. What matters is how many different permutations of your app's state you have covered. <em>drops mic</em></p>
<p>John: Coverage tools are nice - but they only give you a window into the state passed into it. If you can extract state out into separate objects or methods to be able to test them decoupled from time.</p>
<h1>66 - Find bugs once</h1>
<blockquote>
<p>Once a human tester finds a bug, it should be the last time a human tester finds that bug. Automatic tests should check for it from then on.</p>
</blockquote>
<p>JP: We don't have time to find a bug more than once... &quot;We have to spend our time writing new code - and new bugs&quot;</p>
<p>John: Step one of debugging - write a test that's failing. I broke this pattern this weekend. :(</p>
<h1>67 - English is just a programming language</h1>
<blockquote>
<p>Write docs as you would write code: honor the DRY principle, use metadata, MVC, auto-generation and so on</p>
</blockquote>
<p>JP: don't dread writing docs. it's part of your application. I think this tip is phrased in such a way to appeal to engineers. think of documentation writing as writing code, not writing literature</p>
<p>John: I like this in theory - I'm having trouble getting tooling in place for this that makes sense. I really want to dynamically generate, external API docs, internal docs and user guides totally automatically. Super struggling to get anything moving in rails.</p>
<h1>68 - Build documentation in, don't bolt it on</h1>
<blockquote>
<p>Documentation created separately from code is less likely to be correct and up to date</p>
</blockquote>
<p>JP: sometimes you need documentation. obviously, name your variables well, but sometimes explain what a function does or why it does it. at OL we'll sometimes write include the GitHub issue number for a weird quirk or to explain why a test is testing for certain functionality. treat docs like code. part of the code, not separate from it</p>
<p>John: I feel like this is a bit outdated. If written well modern languages really can be self-documenting. Basecamp really doesn't &quot;do&quot; code comments or internal docs - Per DHH - If there is a comment explaining a method or model I break it up further until it doesn't need explaining. I worship in the church of Henninger-Hansen.</p>
<h1>69 - Gently exceed your users' expectations</h1>
<blockquote>
<p>Come to understand your users' expectations, then deliver just that little bit more.</p>
</blockquote>
<p>JP: &quot;Never lose sight of the business problems your application is intended to solve&quot;.</p>
<p>John: One of my favorite parts of the job is delivering features users get super jazzed about.</p>
<h1>7- - Sign your work</h1>
<blockquote>
<p>Craftspeople of an earlier age were proud to sign their work. You should be, too</p>
</blockquote>
<p>&quot;Anonymity, especially on large projects, can provide a breeding ground for sloppiness, mistakes, sloth, and bad code. [...] We want to see a pride of ownership. Your signature should come to be recognized as an indicator of quality. A really professional job. Written by a real programmer. A Pragmatic Programmer&quot;</p>
<p>JP: lol, git blame</p>
<p>John: Take pride in what you do.</p>
<hr />
<p>Picks</p>
<p>JP: <a href="https://github.com/sindresorhus/refined-github">https://github.com/sindresorhus/refined-github</a><br />
John: <a href="https://www.lg.com/us/monitors/lg-22MD4KA-B-4k-uhd-led-monitor">LG 22MD4KA-B UltraFine 4K Display 21.5&quot; UHD 4096x2304 4xUSB-C</a></p>
<p>Next week: Pragmatic Programmer in Practice - Book recap in the context of our real-life development work.</p>
]]></description>
      <pubDate>Fri, 17 Aug 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/sign-your-work-7844c3c2</link>
      <content:encoded><![CDATA[<h1>Chapter 8 - Pragmatic Projects</h1>
<h2>Season 2 - Episode 14 - Chapter 8 Part 2</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: This is part 2 of Chapter 8 - THE FINAL CHAPTER!</p>
<h1>65 - Test state coverage, not code coverage</h1>
<blockquote>
<p>Identify and test significant program states. Just testing lines of code isn't enough</p>
</blockquote>
<p>JP: Even if you test every single line of code - that's not what matters. What matters is how many different permutations of your app's state you have covered. <em>drops mic</em></p>
<p>John: Coverage tools are nice - but they only give you a window into the state passed into it. If you can extract state out into separate objects or methods to be able to test them decoupled from time.</p>
<h1>66 - Find bugs once</h1>
<blockquote>
<p>Once a human tester finds a bug, it should be the last time a human tester finds that bug. Automatic tests should check for it from then on.</p>
</blockquote>
<p>JP: We don't have time to find a bug more than once... &quot;We have to spend our time writing new code - and new bugs&quot;</p>
<p>John: Step one of debugging - write a test that's failing. I broke this pattern this weekend. :(</p>
<h1>67 - English is just a programming language</h1>
<blockquote>
<p>Write docs as you would write code: honor the DRY principle, use metadata, MVC, auto-generation and so on</p>
</blockquote>
<p>JP: don't dread writing docs. it's part of your application. I think this tip is phrased in such a way to appeal to engineers. think of documentation writing as writing code, not writing literature</p>
<p>John: I like this in theory - I'm having trouble getting tooling in place for this that makes sense. I really want to dynamically generate, external API docs, internal docs and user guides totally automatically. Super struggling to get anything moving in rails.</p>
<h1>68 - Build documentation in, don't bolt it on</h1>
<blockquote>
<p>Documentation created separately from code is less likely to be correct and up to date</p>
</blockquote>
<p>JP: sometimes you need documentation. obviously, name your variables well, but sometimes explain what a function does or why it does it. at OL we'll sometimes write include the GitHub issue number for a weird quirk or to explain why a test is testing for certain functionality. treat docs like code. part of the code, not separate from it</p>
<p>John: I feel like this is a bit outdated. If written well modern languages really can be self-documenting. Basecamp really doesn't &quot;do&quot; code comments or internal docs - Per DHH - If there is a comment explaining a method or model I break it up further until it doesn't need explaining. I worship in the church of Henninger-Hansen.</p>
<h1>69 - Gently exceed your users' expectations</h1>
<blockquote>
<p>Come to understand your users' expectations, then deliver just that little bit more.</p>
</blockquote>
<p>JP: &quot;Never lose sight of the business problems your application is intended to solve&quot;.</p>
<p>John: One of my favorite parts of the job is delivering features users get super jazzed about.</p>
<h1>7- - Sign your work</h1>
<blockquote>
<p>Craftspeople of an earlier age were proud to sign their work. You should be, too</p>
</blockquote>
<p>&quot;Anonymity, especially on large projects, can provide a breeding ground for sloppiness, mistakes, sloth, and bad code. [...] We want to see a pride of ownership. Your signature should come to be recognized as an indicator of quality. A really professional job. Written by a real programmer. A Pragmatic Programmer&quot;</p>
<p>JP: lol, git blame</p>
<p>John: Take pride in what you do.</p>
<hr />
<p>Picks</p>
<p>JP: <a href="https://github.com/sindresorhus/refined-github">https://github.com/sindresorhus/refined-github</a><br />
John: <a href="https://www.lg.com/us/monitors/lg-22MD4KA-B-4k-uhd-led-monitor">LG 22MD4KA-B UltraFine 4K Display 21.5&quot; UHD 4096x2304 4xUSB-C</a></p>
<p>Next week: Pragmatic Programmer in Practice - Book recap in the context of our real-life development work.</p>
]]></content:encoded>
      <enclosure length="36143630" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/fa17c0dd-640c-42ee-8783-73ca6306c216/7844c3c2_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Sign Your Work</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/fa17c0dd-640c-42ee-8783-73ca6306c216/3000x3000/1533839694artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:25</itunes:duration>
      <itunes:summary>This week we talk about testing state coverage, not code coverage, finding bugs once, building documentation in, and signing your work.
</itunes:summary>
      <itunes:subtitle>This week we talk about testing state coverage, not code coverage, finding bugs once, building documentation in, and signing your work.
</itunes:subtitle>
      <itunes:keywords>ruby on rails, react, startups, pragmatic projects, computer programming, programming, technology, book study, software development, design, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>14</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">87c677e6-2609-49f4-82bc-fe4c0a55c008</guid>
      <title>Pragmatic Projects</title>
      <description><![CDATA[<h1>Chapter 8 - Pragmatic Projects</h1>
<h2>Season 2 - Episode 13 - Chapter 8 Part 1</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: This is part 1 of Chapter 8</p>
<p>John: This chapter is all about &quot;Pragmatic Projects&quot; - Teams, Automation, Testing, Documentation Code quality and more.</p>
<h1>60 - Organize teams around functionality</h1>
<blockquote>
<p>Don't separate designers from coders, testers from data modelers. Build teams the way you would build code.</p>
</blockquote>
<p>JP: It's a mistake to think that the activities of a project - analysis, design, coding, and testing - can happen in isolation. i.e. Offers V2 at OL. Leaders of a team: needs at least 1 technical and 1 administrative personnel. Always think of the business goals</p>
<p>John: It's nice to have lots of full stack devs - They can focus more on a &quot;Module&quot; than a specific tech or &quot;side&quot; of the project.</p>
<h1>61 - Don't use manual procedures</h1>
<blockquote>
<p>At the dawn of the age of automobiles, the instructions for starting a Model-T Ford were more than two pages long. With modern cars, you just turn the key—the starting procedure is automatic and foolproof.</p>
</blockquote>
<p>John: We are developers! Why would we do ANY tedious work? Example: Github's API pulls in PR's and notes.</p>
<blockquote>
<p>A shell script or batch file will execute the same instructions, in the same order, time after time</p>
</blockquote>
<p>JP: &quot;We may have to build the starter and fuel injector from scratch, but once it's done, we can just turn the key from then on&quot; i.e. deploys</p>
<blockquote>
<p>Let the computer do the repetitious, the mundane—it will do a better job of it than we would.</p>
</blockquote>
<h1>62 - Test early. Test often. Test automatically</h1>
<blockquote>
<p>Tests that run with every build are much more effective than test plans that sit on the shelf.</p>
</blockquote>
<p>JP: In the Smalltalk world, they say, &quot;Code a little, test a little&quot; -&gt; Get those small wins and make incremental changes</p>
<p>John: Write tests to help guide design.</p>
<h1>63 - Coding ain't done till all the tests run</h1>
<blockquote>
<p>'Nuff said</p>
</blockquote>
<p>JP: Keeping your feature branch green!</p>
<p>John: <strong>ALL</strong> the tests - unit, integration, performance, staging, usability, QA</p>
<h1>64 - Use saboteurs to test your testing</h1>
<blockquote>
<p>Introduce bugs on purpose in a separate copy of the source to verify that testing will catch them.</p>
</blockquote>
<p>JP: After you have written a test to find a particular bug, cause the bug on purpose to make sure the test complains<br />
John: Code coverage analysis tools are very helpful</p>
<hr />
<p>Picks</p>
<p>JP: <a href="https://www.npmjs.com/package/husky">Husky</a> on NPM<br />
John: <a href="https://houndci.com/">Hound</a> - It's a service</p>
]]></description>
      <pubDate>Fri, 10 Aug 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/pragmatic-projects-10e463ff</link>
      <content:encoded><![CDATA[<h1>Chapter 8 - Pragmatic Projects</h1>
<h2>Season 2 - Episode 13 - Chapter 8 Part 1</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: This is part 1 of Chapter 8</p>
<p>John: This chapter is all about &quot;Pragmatic Projects&quot; - Teams, Automation, Testing, Documentation Code quality and more.</p>
<h1>60 - Organize teams around functionality</h1>
<blockquote>
<p>Don't separate designers from coders, testers from data modelers. Build teams the way you would build code.</p>
</blockquote>
<p>JP: It's a mistake to think that the activities of a project - analysis, design, coding, and testing - can happen in isolation. i.e. Offers V2 at OL. Leaders of a team: needs at least 1 technical and 1 administrative personnel. Always think of the business goals</p>
<p>John: It's nice to have lots of full stack devs - They can focus more on a &quot;Module&quot; than a specific tech or &quot;side&quot; of the project.</p>
<h1>61 - Don't use manual procedures</h1>
<blockquote>
<p>At the dawn of the age of automobiles, the instructions for starting a Model-T Ford were more than two pages long. With modern cars, you just turn the key—the starting procedure is automatic and foolproof.</p>
</blockquote>
<p>John: We are developers! Why would we do ANY tedious work? Example: Github's API pulls in PR's and notes.</p>
<blockquote>
<p>A shell script or batch file will execute the same instructions, in the same order, time after time</p>
</blockquote>
<p>JP: &quot;We may have to build the starter and fuel injector from scratch, but once it's done, we can just turn the key from then on&quot; i.e. deploys</p>
<blockquote>
<p>Let the computer do the repetitious, the mundane—it will do a better job of it than we would.</p>
</blockquote>
<h1>62 - Test early. Test often. Test automatically</h1>
<blockquote>
<p>Tests that run with every build are much more effective than test plans that sit on the shelf.</p>
</blockquote>
<p>JP: In the Smalltalk world, they say, &quot;Code a little, test a little&quot; -&gt; Get those small wins and make incremental changes</p>
<p>John: Write tests to help guide design.</p>
<h1>63 - Coding ain't done till all the tests run</h1>
<blockquote>
<p>'Nuff said</p>
</blockquote>
<p>JP: Keeping your feature branch green!</p>
<p>John: <strong>ALL</strong> the tests - unit, integration, performance, staging, usability, QA</p>
<h1>64 - Use saboteurs to test your testing</h1>
<blockquote>
<p>Introduce bugs on purpose in a separate copy of the source to verify that testing will catch them.</p>
</blockquote>
<p>JP: After you have written a test to find a particular bug, cause the bug on purpose to make sure the test complains<br />
John: Code coverage analysis tools are very helpful</p>
<hr />
<p>Picks</p>
<p>JP: <a href="https://www.npmjs.com/package/husky">Husky</a> on NPM<br />
John: <a href="https://houndci.com/">Hound</a> - It's a service</p>
]]></content:encoded>
      <enclosure length="36307610" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/73671846-e735-4e60-b22e-7f5400b6853d/10e463ff_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Pragmatic Projects</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/73671846-e735-4e60-b22e-7f5400b6853d/3000x3000/1533833206artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:46</itunes:duration>
      <itunes:summary>This week we talk about organizing teams around functionality, why you shouldn&apos;t use manual procedures,  why you should test early, test often, test automatically and using saboteurs to test your testing.</itunes:summary>
      <itunes:subtitle>This week we talk about organizing teams around functionality, why you shouldn&apos;t use manual procedures,  why you should test early, test often, test automatically and using saboteurs to test your testing.</itunes:subtitle>
      <itunes:keywords>ruby on rails, design, documentation code, startups, web development, react, book study, programming, automation, software development, computer programming, technology</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>13</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">436e94ae-11c8-43e4-b394-0db4dfb246fc</guid>
      <title>Steve Jobs teaches us how to wash clothes</title>
      <description><![CDATA[<h1>Chapter 7 (pt. 2) - Steve Jobs teaches us how to wash clothes</h1>
<h2>Season 2 Episode 12</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Welcome to <strong>PART 2</strong> of Chapter 7: &quot;Before The Project&quot;</p>
<h1>56 - Start When You're Ready</h1>
<blockquote>
<p>You've been building experience all your life. Don't ignore<br />
nagging doubts.</p>
</blockquote>
<p>JP: Follow your instincts when starting a project - <strong>but don't<br />
procrastinate</strong> - you can do this by prototyping. Proof of concepts are nice<br />
when you tackle the &quot;hard&quot; thing first. <em>Prototype to discover</em></p>
<p>John: Prototype, prototype!</p>
<blockquote>
<p>&quot;as the prototype progresses you may have one of those moments of revelation when you suddenly realize that some basic premise was wrong.&quot;</p>
</blockquote>
<h1>57 - Some Things Are Better Done than Described</h1>
<blockquote>
<p>Don't fall into the specification spiral - at some point you need to start<br />
coding.</p>
</blockquote>
<p>JP: &quot;Program specification is the process of taking a requirement and reducing<br />
it down to the point where a programmer's skill can take over.&quot; -</p>
<p>John:</p>
<blockquote>
<p>&quot;natural language is really not up to the job.&quot;</p>
</blockquote>
<ul>
<li>John: Even if it's just a screen recording and an ugly sketch prototype - manually scrolling around - WAAAY better than a written requriment doc. I rarely define work through written requirments.</li>
</ul>
<p><strong>more than 1 bullet point alert</strong></p>
<ul>
<li>specs will <em>never</em> capture every detail and nuance of the system and it's<br />
important to recognize this</li>
<li>&quot;A design that leaves the coder no room for interpretation robs the<br />
programming effort of any skill and art&quot; - you may unearth some insights by<br />
beginning to code</li>
<li>&quot;Distrust environments where requirements are gathered, specifications are<br />
written, and then coding starts, <strong>all in isolation</strong>.&quot;
<ul>
<li>there should be no artificial boundaries</li>
<li>a healthy dev process encourages feedback from implementation and testing<br />
into the spec process</li>
</ul>
</li>
<li>there is a <strong>point of diminishing returns when specs get too details</strong></li>
<li>this reminds me of the early days of Whiz when I was a designer. everything<br />
was terribly isolated</li>
</ul>
<h1>58 - Don't Be a Slave to Formal Methods</h1>
<blockquote>
<p>Don't blindly adopt any technique without putting it into the context of your<br />
development practices and capabilities</p>
</blockquote>
<p>This shows how dated the book is. examples of formal methods: CASE tools,<br />
waterfall development, &quot;the spiral model&quot;, <strong>to today's UML diagrams</strong>.</p>
<p>If this were written today, we'd talk about lean methodology, agile development,<br />
SCRUM</p>
<ul>
<li>don't get caught up in methodology. this is bad because it encourages<br />
isolation. &quot;us vs. them&quot; mentality between designers and programmers. the<br />
process should be more collaborative</li>
<li>that's not to say you SHOULDN'T use formal methods. just remember that they're<br />
another tool</li>
</ul>
<blockquote>
<p>You should work constantly to refine and improve your process</p>
</blockquote>
<h1>59 - Costly Tools Don't Produce Better Designs</h1>
<blockquote>
<p>Beware of vendor hype, industry dogma, and the aura of the price tag. Judge<br />
tools on their merits.</p>
</blockquote>
<ul>
<li>There are a lot of expensive project management tools. Are they worth it?</li>
</ul>
<p>John:</p>
<blockquote>
<p>Try not to think about how much a tool cost when you look at its output.</p>
</blockquote>
<hr />
<h2>Picks</h2>
<p>JP:</p>
<p>If you're an Apple fan boy/girl, you might be interested in what Steve Jobs had<br />
to say about Object-Oriented Programming. This is an excerpt from a 1994 Rolling<br />
Stone interview where Steve (not a programmer) explains OOP in simple terms.</p>
<p>Jeff Goodell: Would you explain, in simple terms, exactly what object-oriented<br />
software is?</p>
<p>Steve Jobs: Objects are like people. They’re living, breathing things that have<br />
knowledge inside them about how to do things and have memory inside them so they<br />
can remember things. And rather than interacting with them at a very low level,<br />
you interact with them at a very high level of abstraction, like we’re doing<br />
right here.</p>
<p>Here’s an example: If I’m your laundry object, you can give me your dirty<br />
clothes and send me a message that says, “Can you get my clothes laundered,<br />
please.” I happen to know where the best laundry place in San Francisco is. And<br />
I speak English, and I have dollars in my pockets. So I go out and hail a<br />
taxicab and tell the driver to take me to this place in San Francisco. I go get<br />
your clothes laundered, I jump back in the cab, I get back here. I give you your<br />
clean clothes and say, “Here are your clean clothes.”</p>
<p>You have no idea how I did that. You have no knowledge of the laundry place.<br />
Maybe you speak French, and you can’t even hail a taxi. You can’t pay for one,<br />
you don’t have dollars in your pocket. Yet, I knew how to do all of that. And<br />
you didn’t have to know any of it. All that complexity was hidden inside of me,<br />
and we were able to interact at a very high level of abstraction. That’s what<br />
objects are. They encapsulate complexity, and the interfaces to that complexity<br />
are high level.</p>
<p>John: Time Timer - <a href="https://www.timetimer.com/">https://www.timetimer.com/</a> - Pomodoro - Physical Device</p>
]]></description>
      <pubDate>Fri, 3 Aug 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/steve-jobs-teaches-us-how-to-wash-5d4c1bdb</link>
      <content:encoded><![CDATA[<h1>Chapter 7 (pt. 2) - Steve Jobs teaches us how to wash clothes</h1>
<h2>Season 2 Episode 12</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Welcome to <strong>PART 2</strong> of Chapter 7: &quot;Before The Project&quot;</p>
<h1>56 - Start When You're Ready</h1>
<blockquote>
<p>You've been building experience all your life. Don't ignore<br />
nagging doubts.</p>
</blockquote>
<p>JP: Follow your instincts when starting a project - <strong>but don't<br />
procrastinate</strong> - you can do this by prototyping. Proof of concepts are nice<br />
when you tackle the &quot;hard&quot; thing first. <em>Prototype to discover</em></p>
<p>John: Prototype, prototype!</p>
<blockquote>
<p>&quot;as the prototype progresses you may have one of those moments of revelation when you suddenly realize that some basic premise was wrong.&quot;</p>
</blockquote>
<h1>57 - Some Things Are Better Done than Described</h1>
<blockquote>
<p>Don't fall into the specification spiral - at some point you need to start<br />
coding.</p>
</blockquote>
<p>JP: &quot;Program specification is the process of taking a requirement and reducing<br />
it down to the point where a programmer's skill can take over.&quot; -</p>
<p>John:</p>
<blockquote>
<p>&quot;natural language is really not up to the job.&quot;</p>
</blockquote>
<ul>
<li>John: Even if it's just a screen recording and an ugly sketch prototype - manually scrolling around - WAAAY better than a written requriment doc. I rarely define work through written requirments.</li>
</ul>
<p><strong>more than 1 bullet point alert</strong></p>
<ul>
<li>specs will <em>never</em> capture every detail and nuance of the system and it's<br />
important to recognize this</li>
<li>&quot;A design that leaves the coder no room for interpretation robs the<br />
programming effort of any skill and art&quot; - you may unearth some insights by<br />
beginning to code</li>
<li>&quot;Distrust environments where requirements are gathered, specifications are<br />
written, and then coding starts, <strong>all in isolation</strong>.&quot;
<ul>
<li>there should be no artificial boundaries</li>
<li>a healthy dev process encourages feedback from implementation and testing<br />
into the spec process</li>
</ul>
</li>
<li>there is a <strong>point of diminishing returns when specs get too details</strong></li>
<li>this reminds me of the early days of Whiz when I was a designer. everything<br />
was terribly isolated</li>
</ul>
<h1>58 - Don't Be a Slave to Formal Methods</h1>
<blockquote>
<p>Don't blindly adopt any technique without putting it into the context of your<br />
development practices and capabilities</p>
</blockquote>
<p>This shows how dated the book is. examples of formal methods: CASE tools,<br />
waterfall development, &quot;the spiral model&quot;, <strong>to today's UML diagrams</strong>.</p>
<p>If this were written today, we'd talk about lean methodology, agile development,<br />
SCRUM</p>
<ul>
<li>don't get caught up in methodology. this is bad because it encourages<br />
isolation. &quot;us vs. them&quot; mentality between designers and programmers. the<br />
process should be more collaborative</li>
<li>that's not to say you SHOULDN'T use formal methods. just remember that they're<br />
another tool</li>
</ul>
<blockquote>
<p>You should work constantly to refine and improve your process</p>
</blockquote>
<h1>59 - Costly Tools Don't Produce Better Designs</h1>
<blockquote>
<p>Beware of vendor hype, industry dogma, and the aura of the price tag. Judge<br />
tools on their merits.</p>
</blockquote>
<ul>
<li>There are a lot of expensive project management tools. Are they worth it?</li>
</ul>
<p>John:</p>
<blockquote>
<p>Try not to think about how much a tool cost when you look at its output.</p>
</blockquote>
<hr />
<h2>Picks</h2>
<p>JP:</p>
<p>If you're an Apple fan boy/girl, you might be interested in what Steve Jobs had<br />
to say about Object-Oriented Programming. This is an excerpt from a 1994 Rolling<br />
Stone interview where Steve (not a programmer) explains OOP in simple terms.</p>
<p>Jeff Goodell: Would you explain, in simple terms, exactly what object-oriented<br />
software is?</p>
<p>Steve Jobs: Objects are like people. They’re living, breathing things that have<br />
knowledge inside them about how to do things and have memory inside them so they<br />
can remember things. And rather than interacting with them at a very low level,<br />
you interact with them at a very high level of abstraction, like we’re doing<br />
right here.</p>
<p>Here’s an example: If I’m your laundry object, you can give me your dirty<br />
clothes and send me a message that says, “Can you get my clothes laundered,<br />
please.” I happen to know where the best laundry place in San Francisco is. And<br />
I speak English, and I have dollars in my pockets. So I go out and hail a<br />
taxicab and tell the driver to take me to this place in San Francisco. I go get<br />
your clothes laundered, I jump back in the cab, I get back here. I give you your<br />
clean clothes and say, “Here are your clean clothes.”</p>
<p>You have no idea how I did that. You have no knowledge of the laundry place.<br />
Maybe you speak French, and you can’t even hail a taxi. You can’t pay for one,<br />
you don’t have dollars in your pocket. Yet, I knew how to do all of that. And<br />
you didn’t have to know any of it. All that complexity was hidden inside of me,<br />
and we were able to interact at a very high level of abstraction. That’s what<br />
objects are. They encapsulate complexity, and the interfaces to that complexity<br />
are high level.</p>
<p>John: Time Timer - <a href="https://www.timetimer.com/">https://www.timetimer.com/</a> - Pomodoro - Physical Device</p>
]]></content:encoded>
      <enclosure length="43542761" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/4a1a6d5f-a23f-4760-a751-72a75d9eb8d7/5d4c1bdb_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Steve Jobs teaches us how to wash clothes</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/4a1a6d5f-a23f-4760-a751-72a75d9eb8d7/3000x3000/1533040615artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:45:07</itunes:duration>
      <itunes:summary>This week we finish up Chapter 7- All About Starting Projects.  Start when you&apos;re ready, somethings are better done than described, don&apos;t be a slave to formal methods,  costly tools don&apos;t produce better designs and a special excerpt from Steve Jobs. </itunes:summary>
      <itunes:subtitle>This week we finish up Chapter 7- All About Starting Projects.  Start when you&apos;re ready, somethings are better done than described, don&apos;t be a slave to formal methods,  costly tools don&apos;t produce better designs and a special excerpt from Steve Jobs. </itunes:subtitle>
      <itunes:keywords>steve jobs, design, starting a project, book study, computer programming, technology, ruby on rails, react, programming, software development, startups, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>12</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a56a80c5-cabb-4a73-b249-6b1878675a36</guid>
      <title>Before The Project</title>
      <description><![CDATA[<h1>Chapter 7 - Before The Project</h1>
<h2>Season 2 Episode 10</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Welcome to <strong>PART 1</strong> of Chapter 7: &quot;Before The Project.&quot;</p>
<p>Starting a project can be a daunting task. There are a lot of unknowns and you<br />
might not know <em>when</em> you should start. We're going to talk about some of the<br />
things that will guide you when starting a project from scratch. Our focus will<br />
be <strong>gathering and understanding requirements</strong></p>
<p>For me, this is great because though I work at OL, I might be taking on a<br />
freelance client soon!</p>
<h1>51 - Don't Gather Requirements - Dig For Them</h1>
<p>John:</p>
<blockquote>
<p>&quot;Perfection is achieved, not when there is nothing left to add, but when there is nothing left to take away....&quot;</p>
</blockquote>
<blockquote>
<p>Requirements rarely lie on the surface. They're buried deep beneath the layers<br />
of assumptions, misconceptions, and politics</p>
</blockquote>
<p>JP: You can't just &quot;gather&quot; requirements as if they exist. You must do RESEARCH.<br />
Remember that <strong>you're solving business problems</strong></p>
<h1>52 - Work with a User to Think like a user</h1>
<blockquote>
<p>It's the best way to gain insight into how the system will really be used</p>
</blockquote>
<p>JP: <strong>OBSERVE</strong> users for a week - this is much different than &quot;thinking&quot; like a<br />
user. I think that if you do the latter, you end up with preconceived notions<br />
based on your own assumptions.</p>
<p>John:</p>
<blockquote>
<p>&quot;It's important to discover the underlying reason why users do a particular thing, rather than just the way they currently do it.&quot;</p>
</blockquote>
<ul>
<li>Learn understand business processes development</li>
<li>Consider the politics (You write code + people get fired)</li>
</ul>
<h1>53 - Abstractions Live Longer than Details</h1>
<p>John:</p>
<blockquote>
<p>&quot;...the simplest statement that accurately reflects the business need is best.&quot;</p>
</blockquote>
<ul>
<li>John: Distilling real-world processes and people down into the most elegant and concise definition</li>
</ul>
<blockquote>
<p>Invest in the abstraction, not the implementation. Abstractions can survive<br />
the barrage of changes from different implementations and new technologies</p>
</blockquote>
<blockquote>
<p>Requirements are not architecture. Requirements are not design, nor are they<br />
the user interface. Requirements are need</p>
</blockquote>
<p>JP: Don't sweat implementation details. Requirements should be abstract</p>
<h1>54 - Use a Project Glossary</h1>
<blockquote>
<p>Create and maintain a single source of all the specific terms and vocabulary<br />
for a project</p>
</blockquote>
<p>JP: Create a literal glossary so that you and stakeholders can have a<br />
<strong>UBIQUITOUS LANGUAGE</strong> <code>#domaindrivendesign</code> - i.e. &quot;client&quot; and &quot;customer&quot;<br />
might be the same - they might be different.</p>
<p>Also - you want this to live in a document that's shared. Don't know how serious<br />
that is but this is what the author's recommend for serious projects</p>
<h1>55 - Don't think outside the box - find the box</h1>
<p>John:</p>
<blockquote>
<p>Gordius, the King of Phrygia, once tied a knot that no one could untie. It was said that he who solved the riddle of the Gordian Knot would rule all of Asia. So along comes Alexander the Great, who chops the knot to bits with his sword. Just a little different interpretation of the requirements, that's all... and he did end up ruling most of Asia.</p>
</blockquote>
<blockquote>
<p>When faced with an impossible problem, identify the real constraints. Ask<br />
yourself: &quot;Does it have to be done this way? Does it have to be done at all?&quot;</p>
</blockquote>
<p>JP: Find the constraints of the box so that you can solve the problem at hand.<br />
You have to think of every possible avenue so that you don't dismiss potential<br />
solutions. I really like this:</p>
<blockquote>
<p>Consider the Trojan horse - a novel solution to an intractable problem. How do<br />
you get troops into a walled city without being discovered? You can be that<br />
&quot;through the front door&quot; was initially dismissed as suicide.</p>
</blockquote>
<ul>
<li>Think of the most restrictive constraints first, and fit the remaining<br />
constraints within them.</li>
</ul>
<p><strong>Too many quotes alert</strong></p>
<blockquote>
<p>Many times a reinterpretation of the requirements can make a whole set of<br />
problems go away [...]. All you need are the real constraints, the misleading<br />
constraints, and the wisdom to know the difference.</p>
</blockquote>
<hr />
<h2>Picks</h2>
<p>JP: <a href="https://www.bignerdranch.com/documents/Swift2Day-prereading-2016.10.28.pdf">Swift - The Big Nerd Ranch Guide.</a> Plenty of reasons why I want to learn<br />
Swift.</p>
<p>John: <a href="https://pusher.com/">Pusher - Websockets as a service.</a></p>
]]></description>
      <pubDate>Fri, 27 Jul 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/before-the-project-0132d500</link>
      <content:encoded><![CDATA[<h1>Chapter 7 - Before The Project</h1>
<h2>Season 2 Episode 10</h2>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and<br />
design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Welcome to <strong>PART 1</strong> of Chapter 7: &quot;Before The Project.&quot;</p>
<p>Starting a project can be a daunting task. There are a lot of unknowns and you<br />
might not know <em>when</em> you should start. We're going to talk about some of the<br />
things that will guide you when starting a project from scratch. Our focus will<br />
be <strong>gathering and understanding requirements</strong></p>
<p>For me, this is great because though I work at OL, I might be taking on a<br />
freelance client soon!</p>
<h1>51 - Don't Gather Requirements - Dig For Them</h1>
<p>John:</p>
<blockquote>
<p>&quot;Perfection is achieved, not when there is nothing left to add, but when there is nothing left to take away....&quot;</p>
</blockquote>
<blockquote>
<p>Requirements rarely lie on the surface. They're buried deep beneath the layers<br />
of assumptions, misconceptions, and politics</p>
</blockquote>
<p>JP: You can't just &quot;gather&quot; requirements as if they exist. You must do RESEARCH.<br />
Remember that <strong>you're solving business problems</strong></p>
<h1>52 - Work with a User to Think like a user</h1>
<blockquote>
<p>It's the best way to gain insight into how the system will really be used</p>
</blockquote>
<p>JP: <strong>OBSERVE</strong> users for a week - this is much different than &quot;thinking&quot; like a<br />
user. I think that if you do the latter, you end up with preconceived notions<br />
based on your own assumptions.</p>
<p>John:</p>
<blockquote>
<p>&quot;It's important to discover the underlying reason why users do a particular thing, rather than just the way they currently do it.&quot;</p>
</blockquote>
<ul>
<li>Learn understand business processes development</li>
<li>Consider the politics (You write code + people get fired)</li>
</ul>
<h1>53 - Abstractions Live Longer than Details</h1>
<p>John:</p>
<blockquote>
<p>&quot;...the simplest statement that accurately reflects the business need is best.&quot;</p>
</blockquote>
<ul>
<li>John: Distilling real-world processes and people down into the most elegant and concise definition</li>
</ul>
<blockquote>
<p>Invest in the abstraction, not the implementation. Abstractions can survive<br />
the barrage of changes from different implementations and new technologies</p>
</blockquote>
<blockquote>
<p>Requirements are not architecture. Requirements are not design, nor are they<br />
the user interface. Requirements are need</p>
</blockquote>
<p>JP: Don't sweat implementation details. Requirements should be abstract</p>
<h1>54 - Use a Project Glossary</h1>
<blockquote>
<p>Create and maintain a single source of all the specific terms and vocabulary<br />
for a project</p>
</blockquote>
<p>JP: Create a literal glossary so that you and stakeholders can have a<br />
<strong>UBIQUITOUS LANGUAGE</strong> <code>#domaindrivendesign</code> - i.e. &quot;client&quot; and &quot;customer&quot;<br />
might be the same - they might be different.</p>
<p>Also - you want this to live in a document that's shared. Don't know how serious<br />
that is but this is what the author's recommend for serious projects</p>
<h1>55 - Don't think outside the box - find the box</h1>
<p>John:</p>
<blockquote>
<p>Gordius, the King of Phrygia, once tied a knot that no one could untie. It was said that he who solved the riddle of the Gordian Knot would rule all of Asia. So along comes Alexander the Great, who chops the knot to bits with his sword. Just a little different interpretation of the requirements, that's all... and he did end up ruling most of Asia.</p>
</blockquote>
<blockquote>
<p>When faced with an impossible problem, identify the real constraints. Ask<br />
yourself: &quot;Does it have to be done this way? Does it have to be done at all?&quot;</p>
</blockquote>
<p>JP: Find the constraints of the box so that you can solve the problem at hand.<br />
You have to think of every possible avenue so that you don't dismiss potential<br />
solutions. I really like this:</p>
<blockquote>
<p>Consider the Trojan horse - a novel solution to an intractable problem. How do<br />
you get troops into a walled city without being discovered? You can be that<br />
&quot;through the front door&quot; was initially dismissed as suicide.</p>
</blockquote>
<ul>
<li>Think of the most restrictive constraints first, and fit the remaining<br />
constraints within them.</li>
</ul>
<p><strong>Too many quotes alert</strong></p>
<blockquote>
<p>Many times a reinterpretation of the requirements can make a whole set of<br />
problems go away [...]. All you need are the real constraints, the misleading<br />
constraints, and the wisdom to know the difference.</p>
</blockquote>
<hr />
<h2>Picks</h2>
<p>JP: <a href="https://www.bignerdranch.com/documents/Swift2Day-prereading-2016.10.28.pdf">Swift - The Big Nerd Ranch Guide.</a> Plenty of reasons why I want to learn<br />
Swift.</p>
<p>John: <a href="https://pusher.com/">Pusher - Websockets as a service.</a></p>
]]></content:encoded>
      <enclosure length="41891405" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/94658a90-6057-44fb-a7aa-49e0effa9b4b/0132d500_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Before The Project</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/94658a90-6057-44fb-a7aa-49e0effa9b4b/3000x3000/1532416559artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:43:24</itunes:duration>
      <itunes:summary>This week we talk through Chapter 7 all about starting projects. Gathering requirements, working with users, project glossaries and more to help get projects off the ground. </itunes:summary>
      <itunes:subtitle>This week we talk through Chapter 7 all about starting projects. Gathering requirements, working with users, project glossaries and more to help get projects off the ground. </itunes:subtitle>
      <itunes:keywords>startups, book study, starting a project, computer programming, web development, react, software development, design, programming, ruby on rails, technology</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>11</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">28b56c49-bfa0-4f33-bc12-4cd2a2f54175</guid>
      <title>Refactoring, Testing and Wizard Wizardry</title>
      <description><![CDATA[<h1>Chapter 6 - Pragmatic Programer:</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h3>Small talk - We were off for the 4th - yada yada yada</h3>
<p>JP: This is part 2 of chapter 6, &quot;While you are coding&quot;. Last week we talked about pragmatic practices while you are coding.</p>
<h2>Part 2</h2>
<h3>Tip 47 Refactor Early, Refactor Often</h3>
<blockquote>
<p>Just as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem</p>
</blockquote>
<ul>
<li>Construction vs. Gardening</li>
<li>Gardening is less repeatable, less formulaic</li>
</ul>
<blockquote>
<p>Time pressure is often used as an excuse for not refactoring. But his excuse just doesn't hold up: fail to refactor now, and there'll be far greater time investment to fix the problem down the road - when there are more dependencies to reckon with. Will there be more time available then? Not in our experience</p>
</blockquote>
<p>Advice:</p>
<blockquote>
<p>Keep track of the things that need to be refactored. If you cna't refactor something immediately, make sure that it gets placed on the schedule. Make sure that users of the affected code know that it is scheduled to be refactored and how it might affect them.</p>
</blockquote>
<p>Martin Fowler's tips for refactoring</p>
<p>1.) don't try to refactor and add functionality at the same time<br />
2.) make sure you have good tests in place before you begin refactoring<br />
3.) take short, deliberate steps</p>
<p>What's your tolerance for pain?</p>
<ul>
<li>John: <strong>Real-World Complications</strong> You go to your boss or client and say, &quot;This code works, but I need another week to refactor it.&quot; We can't print their reply.</li>
</ul>
<h3>Tip 48 Design to Test</h3>
<blockquote>
<p>Start thinking about testing before you write a line of code</p>
</blockquote>
<ul>
<li>unit testing: testing a module in isolation to verify its behavior</li>
<li>designing against a contract - code should fulfill its contract</li>
<li>where do we place our tests? Rails proj. vs React Proj</li>
</ul>
<blockquote>
<p>John: If your tests are hard to write - the design of your system is probably inelegant. It's a &quot;design smell&quot; if you are thinking - how the hell am I going to test this?</p>
</blockquote>
<h3>Tip 49 Test Your Software, or Your Users Will</h3>
<blockquote>
<p>Test ruthlessly. Don't make your users find bugs for you.</p>
</blockquote>
<ul>
<li>writing tests isn't enough, you should be running your tests frequently. i.e. CirlceCi</li>
<li>idea of &quot;Test harnesses&quot;:
<ul>
<li>should have a standard way of specifying setup and cleanup</li>
<li>should have a method for selecting individual or all tests</li>
<li>should have a means for analyzing output for expected results</li>
<li>should have a standardized form of failure reporting</li>
</ul>
</li>
<li>today we have things like minitest and jest!</li>
<li>it's amazing what tools we have in 2018. different test runners, continuous integration tools, things like Rollbar and bugsnag</li>
<li>there's really no excuse not to be using these tools</li>
</ul>
<p><strong>HOT QUOTE ALERT</strong></p>
<blockquote>
<p>Testing is more cultural than technical: we can instill this testing culture in a project regardless of the language being used.</p>
</blockquote>
<blockquote>
<p>John: Related: Re-create bugs in tests when debugging. <strong>every. time.</strong></p>
</blockquote>
<h3>Tip 50 Don't Use Wizard Code You Don't Understand</h3>
<blockquote>
<p>Wizards can generate reams of code. Make sure you understand all of it before you incorporate it into your project</p>
</blockquote>
<ul>
<li>Rails and its scaffold are &quot;wizards&quot;</li>
</ul>
<blockquote>
<p>We are not against wizards [...] But if you do use a wizard, and you don't understand all the code that it produces, you won't be in control of your own application. You won't be able to maintain it, and you'll be struggling when it comes time to debug</p>
</blockquote>
<ul>
<li>Rails generators vs. Create-react-app</li>
<li>don't let it get to the point where it's the wizard's code and not your own</li>
</ul>
<p>PICKS</p>
<p>JP: https://www.howtographql.com/<br />
John: <a href="https://www.youtube.com/user/matuXIV">Jesus Castello - Ruby Guides on YouTube</a></p>
]]></description>
      <pubDate>Fri, 20 Jul 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/refactoring-testing-and-wizard-wizardry-e42065b9</link>
      <content:encoded><![CDATA[<h1>Chapter 6 - Pragmatic Programer:</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<h3>Small talk - We were off for the 4th - yada yada yada</h3>
<p>JP: This is part 2 of chapter 6, &quot;While you are coding&quot;. Last week we talked about pragmatic practices while you are coding.</p>
<h2>Part 2</h2>
<h3>Tip 47 Refactor Early, Refactor Often</h3>
<blockquote>
<p>Just as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem</p>
</blockquote>
<ul>
<li>Construction vs. Gardening</li>
<li>Gardening is less repeatable, less formulaic</li>
</ul>
<blockquote>
<p>Time pressure is often used as an excuse for not refactoring. But his excuse just doesn't hold up: fail to refactor now, and there'll be far greater time investment to fix the problem down the road - when there are more dependencies to reckon with. Will there be more time available then? Not in our experience</p>
</blockquote>
<p>Advice:</p>
<blockquote>
<p>Keep track of the things that need to be refactored. If you cna't refactor something immediately, make sure that it gets placed on the schedule. Make sure that users of the affected code know that it is scheduled to be refactored and how it might affect them.</p>
</blockquote>
<p>Martin Fowler's tips for refactoring</p>
<p>1.) don't try to refactor and add functionality at the same time<br />
2.) make sure you have good tests in place before you begin refactoring<br />
3.) take short, deliberate steps</p>
<p>What's your tolerance for pain?</p>
<ul>
<li>John: <strong>Real-World Complications</strong> You go to your boss or client and say, &quot;This code works, but I need another week to refactor it.&quot; We can't print their reply.</li>
</ul>
<h3>Tip 48 Design to Test</h3>
<blockquote>
<p>Start thinking about testing before you write a line of code</p>
</blockquote>
<ul>
<li>unit testing: testing a module in isolation to verify its behavior</li>
<li>designing against a contract - code should fulfill its contract</li>
<li>where do we place our tests? Rails proj. vs React Proj</li>
</ul>
<blockquote>
<p>John: If your tests are hard to write - the design of your system is probably inelegant. It's a &quot;design smell&quot; if you are thinking - how the hell am I going to test this?</p>
</blockquote>
<h3>Tip 49 Test Your Software, or Your Users Will</h3>
<blockquote>
<p>Test ruthlessly. Don't make your users find bugs for you.</p>
</blockquote>
<ul>
<li>writing tests isn't enough, you should be running your tests frequently. i.e. CirlceCi</li>
<li>idea of &quot;Test harnesses&quot;:
<ul>
<li>should have a standard way of specifying setup and cleanup</li>
<li>should have a method for selecting individual or all tests</li>
<li>should have a means for analyzing output for expected results</li>
<li>should have a standardized form of failure reporting</li>
</ul>
</li>
<li>today we have things like minitest and jest!</li>
<li>it's amazing what tools we have in 2018. different test runners, continuous integration tools, things like Rollbar and bugsnag</li>
<li>there's really no excuse not to be using these tools</li>
</ul>
<p><strong>HOT QUOTE ALERT</strong></p>
<blockquote>
<p>Testing is more cultural than technical: we can instill this testing culture in a project regardless of the language being used.</p>
</blockquote>
<blockquote>
<p>John: Related: Re-create bugs in tests when debugging. <strong>every. time.</strong></p>
</blockquote>
<h3>Tip 50 Don't Use Wizard Code You Don't Understand</h3>
<blockquote>
<p>Wizards can generate reams of code. Make sure you understand all of it before you incorporate it into your project</p>
</blockquote>
<ul>
<li>Rails and its scaffold are &quot;wizards&quot;</li>
</ul>
<blockquote>
<p>We are not against wizards [...] But if you do use a wizard, and you don't understand all the code that it produces, you won't be in control of your own application. You won't be able to maintain it, and you'll be struggling when it comes time to debug</p>
</blockquote>
<ul>
<li>Rails generators vs. Create-react-app</li>
<li>don't let it get to the point where it's the wizard's code and not your own</li>
</ul>
<p>PICKS</p>
<p>JP: https://www.howtographql.com/<br />
John: <a href="https://www.youtube.com/user/matuXIV">Jesus Castello - Ruby Guides on YouTube</a></p>
]]></content:encoded>
      <enclosure length="36500707" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/fa223bfd-6261-46af-9946-b90e79286c93/e42065b9_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Refactoring, Testing and Wizard Wizardry</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/fa223bfd-6261-46af-9946-b90e79286c93/3000x3000/1532018519artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:58</itunes:duration>
      <itunes:summary>This week we continue our series on the Pragmatic Programmer covering Chapter 6 (part 2) About refactoring, designing to test, and the pitfalls of using wizards if you don&apos;t understand all of the code they produce. </itunes:summary>
      <itunes:subtitle>This week we continue our series on the Pragmatic Programmer covering Chapter 6 (part 2) About refactoring, designing to test, and the pitfalls of using wizards if you don&apos;t understand all of the code they produce. </itunes:subtitle>
      <itunes:keywords>startups, design, web development, react, ruby on rails, book study, computer programming, software development, technology, programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>10</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7a83112b-c6d9-4f74-bd0f-c7a466da2676</guid>
      <title>While you were coding...</title>
      <description><![CDATA[<h1>Chapter 6 - Pragmatic Programmer:</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Chapter 6 &quot;While you are coding&quot; Summary / Introduction - In this section, we will be discussing the things a programmer thinks about during the process of coding.</p>
<p>The section kicks off by talking about how coding is <strong>not</strong> a mechanical process. Adjustments must be made while we code. It's largely driving a car. Our brain goes into auto-pilot - however, an attentive driver is always assessing the current situation. Is someone about to cross the street? Etc.</p>
<h2>Part 1</h2>
<h2>Tip 44 Don't Program by Coincidence</h2>
<blockquote>
<p>Rely only on reliable things. Beware of accidental complexity, and don't confuse a happy coincidence with a purposeful plan</p>
</blockquote>
<p>JP: really funny metaphor about a solider coming to a false conclusion in a minefield. &quot;As developers, we also work in minefields.&quot;</p>
<p>You can't know why something is broken if you didn't know why it worked in the first place</p>
<p>John: It's easy to assume that X causes Y, but as we've said - don't assume it, prove it.</p>
<p>John: Be deliberate.</p>
<h2>Tip 45 Estimate the Order of Your Algorithms</h2>
<blockquote>
<p>Get a feel for how long things are likely to take before you write code</p>
</blockquote>
<p>JP: Basically, big O stuff: constant, logarithmic, linear, exponential. Use a greedy approach when you can. Try to think about how you can do something in a single pass. But always remember the context. Maybe your data isn't so large that an exponential algorithm is just fine for the sake of readability.</p>
<p>&quot;Pragmatic programmers try to cover both the theoretical and practical bases. After all this estimating, the only timing that counts is the speed of your code, running in the prod env. with real data.&quot;</p>
<p><strong>John:</strong> If I have a super slow method or view it’s usually because I need a new object or attribute.</p>
<ul>
<li>Example: Last activity- all these different actions to find out the most recent. Added a last activity column. - Other approach would be a “log” item. Both approaches moved my page load from seconds to miliseconds.</li>
</ul>
<h2>Tip 46 Test Your Estimates</h2>
<blockquote>
<p>Mathematical analysis of algorithms doesn't tell you everything. Try timing your code in its target environment</p>
</blockquote>
<p>JP: &quot;Be wary of premature optimization. It's always a good idea to make sure an alg really is a bottleneck before investing your precious time trying to improve it&quot;</p>
<p>John: In general: Tests pass - I ship. I'd rather just throw more Dyno's at my methods than too much time optimizing.</p>
<ul>
<li>Then - I track what's not performing in <strong>appsignal</strong> or <strong>scout</strong> and refactor.</li>
<li>I care about performance but local &quot;benchmarks&quot; can be useless.</li>
<li>The server can be much faster or slower than your local machine.</li>
<li>Tests with massive amounts of data take forever to write</li>
</ul>
<p>PICKS</p>
<p>JP: <a href="http://browserstack.com/">browserstack.com</a><br />
John: Postman - specifcally SET UP ENVIROMENTS</p>
<p>John: Greedy Algorithms</p>
]]></description>
      <pubDate>Fri, 29 Jun 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/while-you-were-coding-3127dab0</link>
      <content:encoded><![CDATA[<h1>Chapter 6 - Pragmatic Programmer:</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p>JP: Chapter 6 &quot;While you are coding&quot; Summary / Introduction - In this section, we will be discussing the things a programmer thinks about during the process of coding.</p>
<p>The section kicks off by talking about how coding is <strong>not</strong> a mechanical process. Adjustments must be made while we code. It's largely driving a car. Our brain goes into auto-pilot - however, an attentive driver is always assessing the current situation. Is someone about to cross the street? Etc.</p>
<h2>Part 1</h2>
<h2>Tip 44 Don't Program by Coincidence</h2>
<blockquote>
<p>Rely only on reliable things. Beware of accidental complexity, and don't confuse a happy coincidence with a purposeful plan</p>
</blockquote>
<p>JP: really funny metaphor about a solider coming to a false conclusion in a minefield. &quot;As developers, we also work in minefields.&quot;</p>
<p>You can't know why something is broken if you didn't know why it worked in the first place</p>
<p>John: It's easy to assume that X causes Y, but as we've said - don't assume it, prove it.</p>
<p>John: Be deliberate.</p>
<h2>Tip 45 Estimate the Order of Your Algorithms</h2>
<blockquote>
<p>Get a feel for how long things are likely to take before you write code</p>
</blockquote>
<p>JP: Basically, big O stuff: constant, logarithmic, linear, exponential. Use a greedy approach when you can. Try to think about how you can do something in a single pass. But always remember the context. Maybe your data isn't so large that an exponential algorithm is just fine for the sake of readability.</p>
<p>&quot;Pragmatic programmers try to cover both the theoretical and practical bases. After all this estimating, the only timing that counts is the speed of your code, running in the prod env. with real data.&quot;</p>
<p><strong>John:</strong> If I have a super slow method or view it’s usually because I need a new object or attribute.</p>
<ul>
<li>Example: Last activity- all these different actions to find out the most recent. Added a last activity column. - Other approach would be a “log” item. Both approaches moved my page load from seconds to miliseconds.</li>
</ul>
<h2>Tip 46 Test Your Estimates</h2>
<blockquote>
<p>Mathematical analysis of algorithms doesn't tell you everything. Try timing your code in its target environment</p>
</blockquote>
<p>JP: &quot;Be wary of premature optimization. It's always a good idea to make sure an alg really is a bottleneck before investing your precious time trying to improve it&quot;</p>
<p>John: In general: Tests pass - I ship. I'd rather just throw more Dyno's at my methods than too much time optimizing.</p>
<ul>
<li>Then - I track what's not performing in <strong>appsignal</strong> or <strong>scout</strong> and refactor.</li>
<li>I care about performance but local &quot;benchmarks&quot; can be useless.</li>
<li>The server can be much faster or slower than your local machine.</li>
<li>Tests with massive amounts of data take forever to write</li>
</ul>
<p>PICKS</p>
<p>JP: <a href="http://browserstack.com/">browserstack.com</a><br />
John: Postman - specifcally SET UP ENVIROMENTS</p>
<p>John: Greedy Algorithms</p>
]]></content:encoded>
      <enclosure length="31293631" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5418e689-abf8-4d84-917e-dc96575e9553/3127dab0_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>While you were coding...</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5418e689-abf8-4d84-917e-dc96575e9553/3000x3000/1530108404artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:32:22</itunes:duration>
      <itunes:summary>This week we continue our series on the Pragmatic Programmer covering Chapter 6 (part 1) About coincidence, algorithms and testing your assumptions. </itunes:summary>
      <itunes:subtitle>This week we continue our series on the Pragmatic Programmer covering Chapter 6 (part 1) About coincidence, algorithms and testing your assumptions. </itunes:subtitle>
      <itunes:keywords>ruby on rails, web development, book study, computer programming, technology, software development, programming, startups, design, react</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>9</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cccbf5e1-ddfc-418d-9d4b-16a0432ac707</guid>
      <title>Time and Simplicity</title>
      <description><![CDATA[<h1>Chapter 5 (Part 2) - Bend Or Break</h1>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<h2>Tip 40: Design Using Services</h2>
<ul>
<li>JP: This is spoken in the context of concurrency (going back to temporal coupling); These service objects are behind well defined interfaces</li>
<li>John: &quot;services—independent, concurrent objects behind well-defined, consistent interfaces.&quot;</li>
</ul>
<h2>Tip 41: Always Design for Concurrency</h2>
<ul>
<li>JP: Thinking linear-ly leads to assumptions and sloppy code and mysterious bugs. Concurrency gives you flexibility</li>
<li>John: concurrency forces you to think through things a bit more carefully—you're not alone at the party anymore.</li>
</ul>
<h2>Tip 42: Separate Views from Models</h2>
<ul>
<li>JP: Separate your data from your view logic. This buys you a lot of flexibility. You can use common viewers on many different data models. You can support multiple controllers to provide nontraditional input. Your model encapsulates your data and all the common operations with manipulating it.</li>
</ul>
<blockquote>
<p>The view is an interpretation of the model. It doesn't need to be graphical. The controller is more of a coordination mechanism, and doesn't have to be related to any sort of input device.</p>
</blockquote>
<ul>
<li>John: Each view should have its own controller.</li>
<li>John: Debugging View - interesting concept.</li>
</ul>
<h2>Tip 43: Use Blackboards to Coordinate Workflow</h2>
<p>JP: Use blackboards to coordinate disparate facts and agents, while maintaining independence and isolation among participants<br />
John: The blackboard style of programming removes the need for so many interfaces, making for a more elegant and consistent system.<br />
John: &quot;Feed&quot; concept</p>
<h2>Picks</h2>
<ul>
<li>JP: Programming Elixir by Dave Thomas</li>
</ul>
<p>Seriously... just look how cool this is.</p>
<pre><code>defmodule MyList do
  def flatten([ [sub_head | sub_tail] | tail]) do
    flatten(sub_head) ++ flatten(sub_tail) ++ flatten(tail)
  end

  def flatten([ head | tail]) do
    flatten(head) ++ flatten(tail)
  end

  def flatten([]), do: []

  def flatten(head), do: [head]
end


IO.inspect MyList.flatten [ 1, [ 2, 3, [ 4 ] ], 5, [ [ [ [ 6 ] ] ] ] ]
# [1, 2, 3, 4, 5, 6]
</code></pre>
<ul>
<li>John: Sketch Mirror + Sketch Prototyping</li>
</ul>
]]></description>
      <pubDate>Fri, 22 Jun 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/time-and-simplicity-eb9e6150</link>
      <content:encoded><![CDATA[<h1>Chapter 5 (Part 2) - Bend Or Break</h1>
<p><strong>A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</strong></p>
<h2>Tip 40: Design Using Services</h2>
<ul>
<li>JP: This is spoken in the context of concurrency (going back to temporal coupling); These service objects are behind well defined interfaces</li>
<li>John: &quot;services—independent, concurrent objects behind well-defined, consistent interfaces.&quot;</li>
</ul>
<h2>Tip 41: Always Design for Concurrency</h2>
<ul>
<li>JP: Thinking linear-ly leads to assumptions and sloppy code and mysterious bugs. Concurrency gives you flexibility</li>
<li>John: concurrency forces you to think through things a bit more carefully—you're not alone at the party anymore.</li>
</ul>
<h2>Tip 42: Separate Views from Models</h2>
<ul>
<li>JP: Separate your data from your view logic. This buys you a lot of flexibility. You can use common viewers on many different data models. You can support multiple controllers to provide nontraditional input. Your model encapsulates your data and all the common operations with manipulating it.</li>
</ul>
<blockquote>
<p>The view is an interpretation of the model. It doesn't need to be graphical. The controller is more of a coordination mechanism, and doesn't have to be related to any sort of input device.</p>
</blockquote>
<ul>
<li>John: Each view should have its own controller.</li>
<li>John: Debugging View - interesting concept.</li>
</ul>
<h2>Tip 43: Use Blackboards to Coordinate Workflow</h2>
<p>JP: Use blackboards to coordinate disparate facts and agents, while maintaining independence and isolation among participants<br />
John: The blackboard style of programming removes the need for so many interfaces, making for a more elegant and consistent system.<br />
John: &quot;Feed&quot; concept</p>
<h2>Picks</h2>
<ul>
<li>JP: Programming Elixir by Dave Thomas</li>
</ul>
<p>Seriously... just look how cool this is.</p>
<pre><code>defmodule MyList do
  def flatten([ [sub_head | sub_tail] | tail]) do
    flatten(sub_head) ++ flatten(sub_tail) ++ flatten(tail)
  end

  def flatten([ head | tail]) do
    flatten(head) ++ flatten(tail)
  end

  def flatten([]), do: []

  def flatten(head), do: [head]
end


IO.inspect MyList.flatten [ 1, [ 2, 3, [ 4 ] ], 5, [ [ [ [ 6 ] ] ] ] ]
# [1, 2, 3, 4, 5, 6]
</code></pre>
<ul>
<li>John: Sketch Mirror + Sketch Prototyping</li>
</ul>
]]></content:encoded>
      <enclosure length="42434333" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/ab8107cd-d956-4f23-96e6-288df5d0c94d/eb9e6150_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Time and Simplicity</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/ab8107cd-d956-4f23-96e6-288df5d0c94d/3000x3000/1528724121artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:43:58</itunes:duration>
      <itunes:summary>This week we talk through simplicity in controllers and models and time as a design consideration. 

Tip 40: Design Using Services
Tip 41: Always Design for Concurrency
Tip 42: Separate Views from Models
Tip 43: Use Blackboards to Coordinate Workflow</itunes:summary>
      <itunes:subtitle>This week we talk through simplicity in controllers and models and time as a design consideration. 

Tip 40: Design Using Services
Tip 41: Always Design for Concurrency
Tip 42: Separate Views from Models
Tip 43: Use Blackboards to Coordinate Workflow</itunes:subtitle>
      <itunes:keywords>software development, technology, react, design, book study, ruby on rails, programming, web development, startups, computer programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d35bc17f-fe93-45ec-b643-502192f533dd</guid>
      <title>Bend or Break</title>
      <description><![CDATA[<h1>Chapter 5 - Bend Or Break</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Quick update: Sketch Color Spaces</strong></p>
<p>Today we'll be going through Chapter 5, &quot;Bend or Break&quot; - where we talk about writing flexible code. This is especially important for software engineers in a profession where things are constantly changing. (insert joke about JavaScript frameworks). We will largely focus on different ways we can decouple our code!</p>
<blockquote>
<p>Life doesn't stand still. Neither can the code that we write. In order to keep up with today's near-frantic pace of change, we need to make every effort to write code that's as loose—as flexible—as possible.</p>
</blockquote>
<h2>Part 1</h2>
<h2>Tip 36: Minimize Coupling Between Modules</h2>
<blockquote>
<p>Organize code into modules and limit interaction between them. If one module gets compromised and has to be replaced, the other modules should be able to carry on.</p>
</blockquote>
<p>Avoid coupling by writing shy code and applying the law of Demeter</p>
<p>What is shy?</p>
<ul>
<li>JP: shy doesn't reveal itself to others and doesn't interact with too many people. <strong>write shy code</strong>. you don't want this: <code>selection.getRecorder().getLocation().getTimeZone()</code></li>
<li>John: What does this loo lie practically? Short methods? How do I avoid &quot;coupling?&quot;</li>
</ul>
<h2>Tip 37: Configure, Don't Integrate</h2>
<p>Implement technology choices for an application as configuration options, not through integration or engineering</p>
<ul>
<li>JP: algo choices, database products, middleware -&gt; these should be configuration options. doing so makes our code more flexible. this is described as &quot;soft&quot; - aka easy to change</li>
<li>John: Example: Platform fee, or simple basic shared defaults.</li>
</ul>
<h2>Tip 38: Put Abstractions in Code, Details in Metadata</h2>
<p>Program for the general case, and put the specifics outside the compiled code base</p>
<ul>
<li>JP: think declaratively - not imperatively. specify <strong>what</strong>, not <em>how</em>. Think about how you write your business logic and business critical things. Think about where you would call these functions or methods. it should be declarative</li>
<li>John: leave the details as soft—as easy to change—as we can. - &quot;Weekend&quot; automated emails example - <code>valid_send_days</code></li>
<li>John: Challenge from book: For your current project, consider how much of the application might be moved out of the program itself to metadata.</li>
</ul>
<h2>Tip 39: Analyze Workflow to Improve Concurrency</h2>
<p>Exploit the concurrency in your user's workflow</p>
<ul>
<li>JP: temporal coupling - aka coupling in time - aka thinking linear-ly. Decouple your time / order dependencies. ask yourself: <em>what can happen at the same time?</em>. This is a good thought experiment</li>
</ul>
<p>This example was really good so I'm copying it from the book:</p>
<p><strong>making a pina colada</strong></p>
<p>1 open blender<br />
2 open pina colada mix<br />
3 put mix in blender<br />
4 measure 1/2 cup white rum<br />
5 pour in rum<br />
6 add 2 cups of ice<br />
7 close blender<br />
8 liquefy for 2 mins<br />
9 open blender<br />
10 get glasses<br />
11 get pink umbrellas<br />
12 serve pina coladas</p>
<p>Think about how imperative this is. First do this... then do this...</p>
<p>BUT, think about what you can do concurrently: 1, 2, 4, 10, 11. These can happen all at the same time and up front. Next, 3, 5, and 6 can happen concurrently afterwards. These would be big optimizations</p>
<h2>Picks</h2>
<ul>
<li>JP: <a href="https://pretendstore.co/products/pocket-developer">Pocket Developer Die</a></li>
<li>John: <a href="https://appsignal.com/">AppSignal</a> - Dropped Rollbar + Scout for this one service.</li>
</ul>
]]></description>
      <pubDate>Fri, 15 Jun 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/bend-or-break-819a3da9</link>
      <content:encoded><![CDATA[<h1>Chapter 5 - Bend Or Break</h1>
<p>John: Welcome to Iteration: A weekly podcast about programming, development, and design through the lens of amazing books, chapter-by-chapter.</p>
<p><strong>Quick update: Sketch Color Spaces</strong></p>
<p>Today we'll be going through Chapter 5, &quot;Bend or Break&quot; - where we talk about writing flexible code. This is especially important for software engineers in a profession where things are constantly changing. (insert joke about JavaScript frameworks). We will largely focus on different ways we can decouple our code!</p>
<blockquote>
<p>Life doesn't stand still. Neither can the code that we write. In order to keep up with today's near-frantic pace of change, we need to make every effort to write code that's as loose—as flexible—as possible.</p>
</blockquote>
<h2>Part 1</h2>
<h2>Tip 36: Minimize Coupling Between Modules</h2>
<blockquote>
<p>Organize code into modules and limit interaction between them. If one module gets compromised and has to be replaced, the other modules should be able to carry on.</p>
</blockquote>
<p>Avoid coupling by writing shy code and applying the law of Demeter</p>
<p>What is shy?</p>
<ul>
<li>JP: shy doesn't reveal itself to others and doesn't interact with too many people. <strong>write shy code</strong>. you don't want this: <code>selection.getRecorder().getLocation().getTimeZone()</code></li>
<li>John: What does this loo lie practically? Short methods? How do I avoid &quot;coupling?&quot;</li>
</ul>
<h2>Tip 37: Configure, Don't Integrate</h2>
<p>Implement technology choices for an application as configuration options, not through integration or engineering</p>
<ul>
<li>JP: algo choices, database products, middleware -&gt; these should be configuration options. doing so makes our code more flexible. this is described as &quot;soft&quot; - aka easy to change</li>
<li>John: Example: Platform fee, or simple basic shared defaults.</li>
</ul>
<h2>Tip 38: Put Abstractions in Code, Details in Metadata</h2>
<p>Program for the general case, and put the specifics outside the compiled code base</p>
<ul>
<li>JP: think declaratively - not imperatively. specify <strong>what</strong>, not <em>how</em>. Think about how you write your business logic and business critical things. Think about where you would call these functions or methods. it should be declarative</li>
<li>John: leave the details as soft—as easy to change—as we can. - &quot;Weekend&quot; automated emails example - <code>valid_send_days</code></li>
<li>John: Challenge from book: For your current project, consider how much of the application might be moved out of the program itself to metadata.</li>
</ul>
<h2>Tip 39: Analyze Workflow to Improve Concurrency</h2>
<p>Exploit the concurrency in your user's workflow</p>
<ul>
<li>JP: temporal coupling - aka coupling in time - aka thinking linear-ly. Decouple your time / order dependencies. ask yourself: <em>what can happen at the same time?</em>. This is a good thought experiment</li>
</ul>
<p>This example was really good so I'm copying it from the book:</p>
<p><strong>making a pina colada</strong></p>
<p>1 open blender<br />
2 open pina colada mix<br />
3 put mix in blender<br />
4 measure 1/2 cup white rum<br />
5 pour in rum<br />
6 add 2 cups of ice<br />
7 close blender<br />
8 liquefy for 2 mins<br />
9 open blender<br />
10 get glasses<br />
11 get pink umbrellas<br />
12 serve pina coladas</p>
<p>Think about how imperative this is. First do this... then do this...</p>
<p>BUT, think about what you can do concurrently: 1, 2, 4, 10, 11. These can happen all at the same time and up front. Next, 3, 5, and 6 can happen concurrently afterwards. These would be big optimizations</p>
<h2>Picks</h2>
<ul>
<li>JP: <a href="https://pretendstore.co/products/pocket-developer">Pocket Developer Die</a></li>
<li>John: <a href="https://appsignal.com/">AppSignal</a> - Dropped Rollbar + Scout for this one service.</li>
</ul>
]]></content:encoded>
      <enclosure length="38905504" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/674a46ff-7778-48eb-89b9-12d1fb2383fe/819a3da9_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Bend or Break</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/674a46ff-7778-48eb-89b9-12d1fb2383fe/3000x3000/1527859014artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:18</itunes:duration>
      <itunes:summary>This week we are talking through chapter 5 of Pragmatic Programmer - In a nutshell we talk through what it takes to make code that is flexible and can take the cold realities of the real world. 

Tip 36: Minimize Coupling Between Modules
Tip 37: Configure, Don&apos;t Integrate
Tip 38: Put Abstractions in Code, Details in Metadata
Tip 39: Analyze Workflow to Improve Concurrency
</itunes:summary>
      <itunes:subtitle>This week we are talking through chapter 5 of Pragmatic Programmer - In a nutshell we talk through what it takes to make code that is flexible and can take the cold realities of the real world. 

Tip 36: Minimize Coupling Between Modules
Tip 37: Configure, Don&apos;t Integrate
Tip 38: Put Abstractions in Code, Details in Metadata
Tip 39: Analyze Workflow to Improve Concurrency
</itunes:subtitle>
      <itunes:keywords>react, computer programming, startups, technology, programming, design, ruby on rails, book study, software development, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8e5cc7af-0f5c-45c7-b98d-388d25aeb4a6</guid>
      <title>Pragmatic Paranoia</title>
      <description><![CDATA[<h1>Chapter 4 - Pragmatic Paranoia</h1>
<h2>Tip 30: You Can't Write Perfect Software</h2>
<ul>
<li>perfect software doesn't exist</li>
<li>&quot;defensive driving&quot; analogy</li>
<li>for a programmer, you shouldn't trust YOURSELF either, haha</li>
</ul>
<p>“Pragmatic Programmers code in defenses against their own mistakes.”</p>
<p>John: To me this means testing and never assuming the user is wrong.</p>
<hr />
<h1>Tip 31: Design with Contracts (long section alert)</h1>
<p><a href="https://github.com/egonSchiele/contracts.ruby">https://github.com/egonSchiele/contracts.ruby</a></p>
<p>&quot;You can think of contracts as <code>assert</code> on steroids&quot;</p>
<p>This says that double expects a number and returns a number. Here's the full code:</p>
<pre><code>require 'contracts'

class Example
  include Contracts::Core
  include Contracts::Builtin

  Contract Num =&gt; Num
  def double(x)
    x * 2
  end
end

puts Example.new.double(&quot;oops&quot;)
</code></pre>
<blockquote>
<p>be strict in what you will accept before you begin, and promise as little as possible in return. Remember, if your contract indicates that you'll accept anything and promise the world in return, then you've got a lot of code to write!</p>
</blockquote>
<p>What is a &quot;correct&quot; program?</p>
<p>“What is a correct program? One that does no more and no less than it claims to do. Documenting and verifying that claim is the heart of Design by Contract”</p>
<ul>
<li>idea of &quot;designing by contract&quot; - a program should do more and no less than promised</li>
<li>this is kind of like testing. Ruby doesn't have a &quot;contract&quot; system built into its design</li>
<li>obviously, we have a Ruby gem for it! hah</li>
<li>the reason this is supposedly more powerful than plain ol assertions is that contracts can propagate down the inheritance hierarchy</li>
<li>given some <strong>precondition</strong> that must be true (i.e. must be a positive integer) -&gt; the <strong>postcondition</strong> will be satisifed</li>
</ul>
<hr />
<h1>Tip 32: Crash Early</h1>
<ul>
<li>don't have, &quot;it can't happen mentality&quot;</li>
<li>code defensively</li>
<li>a pragmatic progammer tells themself that if there is an error, something very bad has happened</li>
<li>err on the side of crashing earlier! - when you don't, your program may continue with corrupted data</li>
</ul>
<p>“It's much easier to find and diagnose the problem by crashing early, at the site of the problem.”</p>
<p>John: In ruby using rescue to aggressively just pushes the problem up. Not crashing but not working properly.</p>
<blockquote>
<p>When your code discovers that something that was something to be impossible just happened, your program is no longer viable</p>
</blockquote>
<blockquote>
<p>A dead program normally does a lot less damage than a crippled one</p>
</blockquote>
<ul>
<li>this brings into discussion being able to handle errors gracefully - this is very much a UX question as well</li>
</ul>
<hr />
<h1>Tip 33: If it can't happen, use assertions to ensure that it won't</h1>
<p>&quot;This application will never be used abroad, so why internationalize it?&quot;</p>
<p><strong>Let's not practice this kind of self-deception, particularly when coding</strong></p>
<ul>
<li>this cuts me deep</li>
<li>when you're this confident, you should write tests to <em>absolutely</em> ensure that you're right</li>
</ul>
<p>John: Write tests prove it won’t be used in a certain way.</p>
<ul>
<li>I assumed there would always be money in the stripe account.</li>
<li>Think through how the world will screw things up. Write tests against it.</li>
</ul>
<h1>Tip 34: Use exceptions for exceptional problems</h1>
<ul>
<li>our good friend, the javascript <code>try...catch</code> - ask yourself: &quot;will this code still run if I remove all of the exception handlers&quot;. if the answer is, &quot;no&quot; then maybe exceptions are being used in nonexceptional circumstances</li>
</ul>
<p>John: Error and an exception are two different things. Very loosely: one is based on incorrect inputs the other is an error in a process.</p>
<blockquote>
<p>Programs that use exceptions as part of their normal processing suffer from all the readability and maintainability problems of classic spaghetti code. These programs break encapsulation routines and their callers are more tighlting coupled via exception handling</p>
</blockquote>
<h1>Tip 35: Finish what you start</h1>
<p>John: Garbage collection. We are lucky as most major frameworks do garbage collection for us.</p>
<ul>
<li>resources that devs manage: memory, transactions, threads, files, timers</li>
<li>these resources need memory allocated, THEN deallocated</li>
<li>the problem is that devs don't have a plan for dealing with allocation AND deallocation</li>
<li>basically, <strong>don't forget to garbage collect</strong></li>
<li>not doing so may lead to memory leaks</li>
<li>don't forget to do things like close files</li>
</ul>
<p>John: I currently have this problem with action-cable web-socket connections. I am opening them and not managing the closing of these connections well. So it’s leading to performance issues.</p>
<p>Email sending: make sure it delivered. Handle the exception, finish what you started!</p>
<h1>Picks</h1>
<ul>
<li>John: <a href="http://confreaks.tv/events/railsconf2018">Rails Conf Talks are live</a> I will update with my blogpost of top picks here. <a href="http://confreaks.tv/videos/railsconf2018-candy-on-rails-a-study-of-polymorphism-and-rails-5">Polymorphism</a></li>
</ul>
]]></description>
      <pubDate>Fri, 8 Jun 2018 12:50:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/pragmatic-paranoia-6384bcc3</link>
      <content:encoded><![CDATA[<h1>Chapter 4 - Pragmatic Paranoia</h1>
<h2>Tip 30: You Can't Write Perfect Software</h2>
<ul>
<li>perfect software doesn't exist</li>
<li>&quot;defensive driving&quot; analogy</li>
<li>for a programmer, you shouldn't trust YOURSELF either, haha</li>
</ul>
<p>“Pragmatic Programmers code in defenses against their own mistakes.”</p>
<p>John: To me this means testing and never assuming the user is wrong.</p>
<hr />
<h1>Tip 31: Design with Contracts (long section alert)</h1>
<p><a href="https://github.com/egonSchiele/contracts.ruby">https://github.com/egonSchiele/contracts.ruby</a></p>
<p>&quot;You can think of contracts as <code>assert</code> on steroids&quot;</p>
<p>This says that double expects a number and returns a number. Here's the full code:</p>
<pre><code>require 'contracts'

class Example
  include Contracts::Core
  include Contracts::Builtin

  Contract Num =&gt; Num
  def double(x)
    x * 2
  end
end

puts Example.new.double(&quot;oops&quot;)
</code></pre>
<blockquote>
<p>be strict in what you will accept before you begin, and promise as little as possible in return. Remember, if your contract indicates that you'll accept anything and promise the world in return, then you've got a lot of code to write!</p>
</blockquote>
<p>What is a &quot;correct&quot; program?</p>
<p>“What is a correct program? One that does no more and no less than it claims to do. Documenting and verifying that claim is the heart of Design by Contract”</p>
<ul>
<li>idea of &quot;designing by contract&quot; - a program should do more and no less than promised</li>
<li>this is kind of like testing. Ruby doesn't have a &quot;contract&quot; system built into its design</li>
<li>obviously, we have a Ruby gem for it! hah</li>
<li>the reason this is supposedly more powerful than plain ol assertions is that contracts can propagate down the inheritance hierarchy</li>
<li>given some <strong>precondition</strong> that must be true (i.e. must be a positive integer) -&gt; the <strong>postcondition</strong> will be satisifed</li>
</ul>
<hr />
<h1>Tip 32: Crash Early</h1>
<ul>
<li>don't have, &quot;it can't happen mentality&quot;</li>
<li>code defensively</li>
<li>a pragmatic progammer tells themself that if there is an error, something very bad has happened</li>
<li>err on the side of crashing earlier! - when you don't, your program may continue with corrupted data</li>
</ul>
<p>“It's much easier to find and diagnose the problem by crashing early, at the site of the problem.”</p>
<p>John: In ruby using rescue to aggressively just pushes the problem up. Not crashing but not working properly.</p>
<blockquote>
<p>When your code discovers that something that was something to be impossible just happened, your program is no longer viable</p>
</blockquote>
<blockquote>
<p>A dead program normally does a lot less damage than a crippled one</p>
</blockquote>
<ul>
<li>this brings into discussion being able to handle errors gracefully - this is very much a UX question as well</li>
</ul>
<hr />
<h1>Tip 33: If it can't happen, use assertions to ensure that it won't</h1>
<p>&quot;This application will never be used abroad, so why internationalize it?&quot;</p>
<p><strong>Let's not practice this kind of self-deception, particularly when coding</strong></p>
<ul>
<li>this cuts me deep</li>
<li>when you're this confident, you should write tests to <em>absolutely</em> ensure that you're right</li>
</ul>
<p>John: Write tests prove it won’t be used in a certain way.</p>
<ul>
<li>I assumed there would always be money in the stripe account.</li>
<li>Think through how the world will screw things up. Write tests against it.</li>
</ul>
<h1>Tip 34: Use exceptions for exceptional problems</h1>
<ul>
<li>our good friend, the javascript <code>try...catch</code> - ask yourself: &quot;will this code still run if I remove all of the exception handlers&quot;. if the answer is, &quot;no&quot; then maybe exceptions are being used in nonexceptional circumstances</li>
</ul>
<p>John: Error and an exception are two different things. Very loosely: one is based on incorrect inputs the other is an error in a process.</p>
<blockquote>
<p>Programs that use exceptions as part of their normal processing suffer from all the readability and maintainability problems of classic spaghetti code. These programs break encapsulation routines and their callers are more tighlting coupled via exception handling</p>
</blockquote>
<h1>Tip 35: Finish what you start</h1>
<p>John: Garbage collection. We are lucky as most major frameworks do garbage collection for us.</p>
<ul>
<li>resources that devs manage: memory, transactions, threads, files, timers</li>
<li>these resources need memory allocated, THEN deallocated</li>
<li>the problem is that devs don't have a plan for dealing with allocation AND deallocation</li>
<li>basically, <strong>don't forget to garbage collect</strong></li>
<li>not doing so may lead to memory leaks</li>
<li>don't forget to do things like close files</li>
</ul>
<p>John: I currently have this problem with action-cable web-socket connections. I am opening them and not managing the closing of these connections well. So it’s leading to performance issues.</p>
<p>Email sending: make sure it delivered. Handle the exception, finish what you started!</p>
<h1>Picks</h1>
<ul>
<li>John: <a href="http://confreaks.tv/events/railsconf2018">Rails Conf Talks are live</a> I will update with my blogpost of top picks here. <a href="http://confreaks.tv/videos/railsconf2018-candy-on-rails-a-study-of-polymorphism-and-rails-5">Polymorphism</a></li>
</ul>
]]></content:encoded>
      <enclosure length="31685677" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/6e763259-3714-4bfe-ade5-cbd753bd07ba/6384bcc3_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Pragmatic Paranoia</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/6e763259-3714-4bfe-ade5-cbd753bd07ba/3000x3000/1527855561artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:32:46</itunes:duration>
      <itunes:summary>Chapter 4: Pragmatic Paranoia

Tip 30: You Can&apos;t Write Perfect Software
Tip 31: Design with Contracts 
Tip 32: Crash Early
Tip 33: If it can&apos;t happen, use assertions that ensure that it won&apos;t
Tip 34: Use exceptions for exceptional problems
Tip 35: Finish what you start

</itunes:summary>
      <itunes:subtitle>Chapter 4: Pragmatic Paranoia

Tip 30: You Can&apos;t Write Perfect Software
Tip 31: Design with Contracts 
Tip 32: Crash Early
Tip 33: If it can&apos;t happen, use assertions that ensure that it won&apos;t
Tip 34: Use exceptions for exceptional problems
Tip 35: Finish what you start

</itunes:subtitle>
      <itunes:keywords>software development, design, web development, programming, book study, technology, react, ruby on rails, startups, computer programming</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">158d2a4a-0e55-479f-9abe-1e38de0d1c6c</guid>
      <title>Prove It.</title>
      <description><![CDATA[<p>Stubs/doubles vs mocks</p>
<p>Stub is simple fake object. It just makes sure test runs smoothly.<br />
Mock is smarter stub. You verify Your test passes through it.</p>
<p><a href="https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub">Good stack exchange link on this</a></p>
<h2>Tip 26: &quot;select&quot; isn't broken (debugging strategies)</h2>
<ul>
<li>tracing</li>
<li>rubber ducking</li>
</ul>
<p>JP: &quot;what does your program think is going on&quot;: DON'T BLAME EXTERNAL FACTORS FIRST. It's probably <em>your</em> code haha!</p>
<p>John: why, when faced with a &quot;surprising&quot; failure, you must realize that one or more of your assumptions is wrong.</p>
<h2>Tip 27: Don't assume it - prove it</h2>
<p>JP: &quot;routine&quot; code isn't infallible! did you test all of the edge cases?</p>
<p>I really like the debugging checklist so here it is:</p>
<ol>
<li>Is the problem being reported a direct result of the underlying bug, or merely a symptom?</li>
<li>Is the bug really in the compiler? Is it in the OS? Is it in your code?</li>
<li>If you explained this problem in detail to a coworker, what would you say?</li>
<li>If the suspect code passes its unit tests, are the tests complete enough?</li>
<li>Do the conditions that caused this bug exist anywhere else in the system?</li>
</ol>
<p>John: Duplicate the problem in tests.</p>
<h2>Tip 28: learn a text manipulation language</h2>
<p>examples of text manipulation:</p>
<ul>
<li>generating web docs</li>
<li>test data generation</li>
<li>book writing</li>
<li>etc</li>
</ul>
<p>JP: Funny enough, Hunt and Thomas like using Ruby (and Perl) to quickly hack short scripts</p>
<p>John: I want to push more into this - Just barely experimenting with self-creating API docs. Even just things like in ruby: writing a rake task to pull out all your custom objects and methods to start docs and get a clear picture has been helpful for me.</p>
<h2>Tip 29: Write code that writes code</h2>
<p>passive vs active code generators</p>
<p>passive = run once to produce a result<br />
active = run every time you need a result. results are then thrown away</p>
<p>JP: meta programming? code gen doesnt have to be meta</p>
<p>John: Refactoring methods to &quot;Find common resources&quot; based on &quot;Model&quot; name - Reducess code significantly.</p>
<h3>Picks</h3>
<ul>
<li>JP: Sergei Rachmaninoff: Piano Concertos Nos. 2 &amp; 3. Good classic music</li>
<li>John: iOS Keyboard push down trick</li>
</ul>
<h3>RANDOM LINKS MENTIONED!  🎉</h3>
<ul>
<li><a href="https://twitter.com/johnsalzarulo/status/995401501169217536">Color Insanity</a></li>
<li><a href="https://www.facebook.com/TheScienceScoop/posts/1959743480725582">More on color insanity</a></li>
<li><a href="https://makefrontendshitagain.party/">MAKE FRONT END SHIT AGAIN</a></li>
</ul>
]]></description>
      <pubDate>Fri, 1 Jun 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/prove-it-20d1e48e</link>
      <content:encoded><![CDATA[<p>Stubs/doubles vs mocks</p>
<p>Stub is simple fake object. It just makes sure test runs smoothly.<br />
Mock is smarter stub. You verify Your test passes through it.</p>
<p><a href="https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub">Good stack exchange link on this</a></p>
<h2>Tip 26: &quot;select&quot; isn't broken (debugging strategies)</h2>
<ul>
<li>tracing</li>
<li>rubber ducking</li>
</ul>
<p>JP: &quot;what does your program think is going on&quot;: DON'T BLAME EXTERNAL FACTORS FIRST. It's probably <em>your</em> code haha!</p>
<p>John: why, when faced with a &quot;surprising&quot; failure, you must realize that one or more of your assumptions is wrong.</p>
<h2>Tip 27: Don't assume it - prove it</h2>
<p>JP: &quot;routine&quot; code isn't infallible! did you test all of the edge cases?</p>
<p>I really like the debugging checklist so here it is:</p>
<ol>
<li>Is the problem being reported a direct result of the underlying bug, or merely a symptom?</li>
<li>Is the bug really in the compiler? Is it in the OS? Is it in your code?</li>
<li>If you explained this problem in detail to a coworker, what would you say?</li>
<li>If the suspect code passes its unit tests, are the tests complete enough?</li>
<li>Do the conditions that caused this bug exist anywhere else in the system?</li>
</ol>
<p>John: Duplicate the problem in tests.</p>
<h2>Tip 28: learn a text manipulation language</h2>
<p>examples of text manipulation:</p>
<ul>
<li>generating web docs</li>
<li>test data generation</li>
<li>book writing</li>
<li>etc</li>
</ul>
<p>JP: Funny enough, Hunt and Thomas like using Ruby (and Perl) to quickly hack short scripts</p>
<p>John: I want to push more into this - Just barely experimenting with self-creating API docs. Even just things like in ruby: writing a rake task to pull out all your custom objects and methods to start docs and get a clear picture has been helpful for me.</p>
<h2>Tip 29: Write code that writes code</h2>
<p>passive vs active code generators</p>
<p>passive = run once to produce a result<br />
active = run every time you need a result. results are then thrown away</p>
<p>JP: meta programming? code gen doesnt have to be meta</p>
<p>John: Refactoring methods to &quot;Find common resources&quot; based on &quot;Model&quot; name - Reducess code significantly.</p>
<h3>Picks</h3>
<ul>
<li>JP: Sergei Rachmaninoff: Piano Concertos Nos. 2 &amp; 3. Good classic music</li>
<li>John: iOS Keyboard push down trick</li>
</ul>
<h3>RANDOM LINKS MENTIONED!  🎉</h3>
<ul>
<li><a href="https://twitter.com/johnsalzarulo/status/995401501169217536">Color Insanity</a></li>
<li><a href="https://www.facebook.com/TheScienceScoop/posts/1959743480725582">More on color insanity</a></li>
<li><a href="https://makefrontendshitagain.party/">MAKE FRONT END SHIT AGAIN</a></li>
</ul>
]]></content:encoded>
      <enclosure length="41264606" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/67bdb3df-1d57-430e-a7b9-3f8d696cc18f/20d1e48e_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Prove It.</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/67bdb3df-1d57-430e-a7b9-3f8d696cc18f/3000x3000/1527205079artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:42:56</itunes:duration>
      <itunes:summary>This week we walk through some awesome tips from Pragmatic Programer Chapter 3.  We talk through debugging strategies, challenging assumptions and more. 
</itunes:summary>
      <itunes:subtitle>This week we walk through some awesome tips from Pragmatic Programer Chapter 3.  We talk through debugging strategies, challenging assumptions and more. 
</itunes:subtitle>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9c486dfa-7650-4cf8-a971-00cf0665aa28</guid>
      <title>...a poor craftsman blames his tools</title>
      <description><![CDATA[<h1>Chapter 3 - The Basic Tools</h1>
<blockquote>
<p>Every craftsman starts his or her journey with a basic set of good quality tools</p>
</blockquote>
<p>Discussion: What are your tools?</p>
<blockquote>
<p>Tools become conduits from the craftsman's brain to the finished product - they have become extensions of his or her hands</p>
</blockquote>
<blockquote>
<p>Always be on the lookout for better ways of doing things</p>
</blockquote>
<h2>Tip 20: Keep Knowledge in plain text</h2>
<p>JP: plain text doesn't become obsolete - as opposed to binary. this seems obvious.  this is mostly about readability</p>
<h2>Tip 21: Use the power of command shells</h2>
<p>JP: you can do everything in the shell that you do using the GUI: launch apps, browsers; search files; <code>touch</code>, <code>mkdir</code>, <code>rm -rf</code>. basically i need to get better at this. <code>touch newfile.rb</code> is faster than <code>right click &gt; new file &gt; newfile.rb &gt; carriage return</code></p>
<h2>Tip 22: use a single editor well</h2>
<p>JP: fuck IDE's, VIM all the way, baby!!! I no longer rely on auto complete and it's amazing. The editor is an extension to your hand</p>
<h2>Tip 23: Always use source code control</h2>
<p>JP: the front end devs at my job don't check their files into git and it blows my mind.</p>
<h2>Tip 24: Fix the problem, not the blame</h2>
<p>JP: &quot;it doesn't really matter whether the bug is your fault or someone else's. it is still your problem&quot;. suck it up!</p>
<ul>
<li>John: There is no User Error - The design of everyday things. - Industrial deaths.</li>
</ul>
<h2>Tip 25: Don't panic when debugging</h2>
<p>JP: don't waste energy denying that a bug is possible. clearly, it is. just breathe</p>
<p><strong>Picks</strong></p>
<ul>
<li>JP: <a href="https://www.amazon.com/dp/B010MH9V3W/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Grit by Angela Duckworth</a> &amp; this <a href="https://www.youtube.com/watch?v=mrdmHK6ogC0">Adam Cuppy Talk</a></li>
<li>John: <a href="https://swappa.com/">Swappa - Buy and sell used tech</a> and <a href="https://www.refurb.me/">refurb.me</a></li>
</ul>
]]></description>
      <pubDate>Fri, 25 May 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/a-poor-craftsman-blames-his-tools-09e078ca</link>
      <content:encoded><![CDATA[<h1>Chapter 3 - The Basic Tools</h1>
<blockquote>
<p>Every craftsman starts his or her journey with a basic set of good quality tools</p>
</blockquote>
<p>Discussion: What are your tools?</p>
<blockquote>
<p>Tools become conduits from the craftsman's brain to the finished product - they have become extensions of his or her hands</p>
</blockquote>
<blockquote>
<p>Always be on the lookout for better ways of doing things</p>
</blockquote>
<h2>Tip 20: Keep Knowledge in plain text</h2>
<p>JP: plain text doesn't become obsolete - as opposed to binary. this seems obvious.  this is mostly about readability</p>
<h2>Tip 21: Use the power of command shells</h2>
<p>JP: you can do everything in the shell that you do using the GUI: launch apps, browsers; search files; <code>touch</code>, <code>mkdir</code>, <code>rm -rf</code>. basically i need to get better at this. <code>touch newfile.rb</code> is faster than <code>right click &gt; new file &gt; newfile.rb &gt; carriage return</code></p>
<h2>Tip 22: use a single editor well</h2>
<p>JP: fuck IDE's, VIM all the way, baby!!! I no longer rely on auto complete and it's amazing. The editor is an extension to your hand</p>
<h2>Tip 23: Always use source code control</h2>
<p>JP: the front end devs at my job don't check their files into git and it blows my mind.</p>
<h2>Tip 24: Fix the problem, not the blame</h2>
<p>JP: &quot;it doesn't really matter whether the bug is your fault or someone else's. it is still your problem&quot;. suck it up!</p>
<ul>
<li>John: There is no User Error - The design of everyday things. - Industrial deaths.</li>
</ul>
<h2>Tip 25: Don't panic when debugging</h2>
<p>JP: don't waste energy denying that a bug is possible. clearly, it is. just breathe</p>
<p><strong>Picks</strong></p>
<ul>
<li>JP: <a href="https://www.amazon.com/dp/B010MH9V3W/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1">Grit by Angela Duckworth</a> &amp; this <a href="https://www.youtube.com/watch?v=mrdmHK6ogC0">Adam Cuppy Talk</a></li>
<li>John: <a href="https://swappa.com/">Swappa - Buy and sell used tech</a> and <a href="https://www.refurb.me/">refurb.me</a></li>
</ul>
]]></content:encoded>
      <enclosure length="37568950" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/0cb5567b-b4cd-4797-826c-051bfbc73a04/09e078ca_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>...a poor craftsman blames his tools</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/0cb5567b-b4cd-4797-826c-051bfbc73a04/3000x3000/1526696133artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:38:54</itunes:duration>
      <itunes:summary>This week we walk through some awesome tips from Pragmatic Programer Chapter 3.  We talk through our tools , keeping knowledge in plain text, command shells, editors, source control and debugging basics. </itunes:summary>
      <itunes:subtitle>This week we walk through some awesome tips from Pragmatic Programer Chapter 3.  We talk through our tools , keeping knowledge in plain text, command shells, editors, source control and debugging basics. </itunes:subtitle>
      <itunes:keywords>ruby on rails, book study, web development, programing, startups, technology, design</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>4</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">afab8e25-8181-4d5a-8acd-995ee547ac34</guid>
      <title>I&apos;ll get back to you...</title>
      <description><![CDATA[<h1>Chapter 2 - A Pragmatic Approach</h1>
<h2>Tip 16: Prototype to learn</h2>
<p><strong>JP</strong>: I love doing this during &quot;exploration&quot; - careful not to use prototypes in prod 👀</p>
<p><strong>John:</strong> prototype vs tracer bullet - Expectations: Remind them that you can build a great prototype of a new car out of balsa wood and duct tape, but you wouldn't try to drive it in rush-hour traffic! - Localhost with ngrok</p>
<hr />
<h2>Tip 17: Program Close to the problem domain</h2>
<p><strong>JP</strong>: Remember to focus on domain problems and not petty implementation details</p>
<p><strong>John:</strong> Let your code be english! - Let it reflect the way your team talks. <code>execute_email_delivery_protical</code> vs <code>send_email</code></p>
<hr />
<h2>Tip 18: Estimate to avoid surprises</h2>
<p><strong>JP</strong>: Be deliberate and keep track... wording is key (i.e. specificity)</p>
<p><strong>John:</strong> Reality - scope is a Moving target - Tracer code and testing helps make sure estimates are well thought out. Charge to estimate / mockup.</p>
<hr />
<h2>Tip 19: Iterate the schedule with code</h2>
<p><strong>JP</strong>: Keep an open line of communication about expectations for scheduling</p>
<p><strong>John:</strong> What to say when you are asked for an estimate &quot;I'll get back to you&quot; - Scope can be revised. Not just timeline.</p>
<h2>Picks</h2>
<ul>
<li><strong>JP:</strong> - <a href="https://en.todoist.com/app?lang=en">Todoist</a></li>
<li><strong>John:</strong> <a href="https://textexpander.com/">text expander</a> - TextExpander lets you instantly insert snippets of text from a repository of emails, boilerplate and other content, as you type.</li>
</ul>
]]></description>
      <pubDate>Fri, 18 May 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/ill-get-back-to-you-510a0578</link>
      <content:encoded><![CDATA[<h1>Chapter 2 - A Pragmatic Approach</h1>
<h2>Tip 16: Prototype to learn</h2>
<p><strong>JP</strong>: I love doing this during &quot;exploration&quot; - careful not to use prototypes in prod 👀</p>
<p><strong>John:</strong> prototype vs tracer bullet - Expectations: Remind them that you can build a great prototype of a new car out of balsa wood and duct tape, but you wouldn't try to drive it in rush-hour traffic! - Localhost with ngrok</p>
<hr />
<h2>Tip 17: Program Close to the problem domain</h2>
<p><strong>JP</strong>: Remember to focus on domain problems and not petty implementation details</p>
<p><strong>John:</strong> Let your code be english! - Let it reflect the way your team talks. <code>execute_email_delivery_protical</code> vs <code>send_email</code></p>
<hr />
<h2>Tip 18: Estimate to avoid surprises</h2>
<p><strong>JP</strong>: Be deliberate and keep track... wording is key (i.e. specificity)</p>
<p><strong>John:</strong> Reality - scope is a Moving target - Tracer code and testing helps make sure estimates are well thought out. Charge to estimate / mockup.</p>
<hr />
<h2>Tip 19: Iterate the schedule with code</h2>
<p><strong>JP</strong>: Keep an open line of communication about expectations for scheduling</p>
<p><strong>John:</strong> What to say when you are asked for an estimate &quot;I'll get back to you&quot; - Scope can be revised. Not just timeline.</p>
<h2>Picks</h2>
<ul>
<li><strong>JP:</strong> - <a href="https://en.todoist.com/app?lang=en">Todoist</a></li>
<li><strong>John:</strong> <a href="https://textexpander.com/">text expander</a> - TextExpander lets you instantly insert snippets of text from a repository of emails, boilerplate and other content, as you type.</li>
</ul>
]]></content:encoded>
      <enclosure length="37872729" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5f8a0ed0-15de-4fe8-a04d-b5e63bcb94bb/510a0578_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>I&apos;ll get back to you...</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/5f8a0ed0-15de-4fe8-a04d-b5e63bcb94bb/3000x3000/1525817248artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:39:13</itunes:duration>
      <itunes:summary>This week we talk through prototyping, sticking to the domain, estimation and.... iteration. Hey, that&apos;s the name of the show. </itunes:summary>
      <itunes:subtitle>This week we talk through prototyping, sticking to the domain, estimation and.... iteration. Hey, that&apos;s the name of the show. </itunes:subtitle>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">48821507-8e31-4d29-a783-e9029698f7a6</guid>
      <title>Tracer bullets</title>
      <description><![CDATA[<h1>Chapter 2 - A Pragmatic Approach</h1>
<p>Overview = combine ideas and processes</p>
<ol>
<li>duplicate knowledge throughout systems</li>
<li>don't split any one piece of knowledge across multiple system components (orthogonality)</li>
<li>insulate projects from their changing environments</li>
<li>gather requirements and implement code at the same time</li>
<li>how to give project estimates</li>
</ol>
<p>This chapter is truly about a &quot;pragmatic&quot; approach to development</p>
<hr />
<h2>Tip 11: Don't Repeat Yourself</h2>
<ul>
<li>if you change one, you'll have to change another</li>
</ul>
<p>Duplicated code arises differently:</p>
<ol>
<li>imposed: devs feel they have no choice</li>
<li>inadvertent: devs don't realize they are duplicating</li>
<li>impatient: devs got lazy because it seems easier</li>
<li>interdeveloper: multiple people on a team duplicate a piece of info</li>
</ol>
<p>we call these the &quot;four i's&quot;</p>
<ul>
<li>
<p>&quot;shortcuts make for long delays&quot;</p>
</li>
<li>
<p>number 4 is a result of large teams - not having a --- dare I say --- a ubiquitous language</p>
</li>
<li>
<p>you need good communication to quell number 4</p>
</li>
<li>
<p>READ DOCS</p>
</li>
<li>
<p>Tip: Lean on code and programmatically generated things to prevent repeating yourself.</p>
</li>
</ul>
<hr />
<h2>Tip 12: Make it easy to reuse</h2>
<ul>
<li>you want to create an environment where it's easier to find and reuse existing stuff so people don't have to go out and create their own</li>
<li><strong>orthogonality</strong></li>
<li>borrowed from geometry</li>
<li>two lines are orthogonal if they meet at right angles - think axes on a graph</li>
<li>move along (or parallel to the x-axis) and theres no change to the y-axis</li>
<li>in computing, &quot;orthogonality&quot; has come to mean independence / decoupling</li>
</ul>
<p>TWO OR MORE THINGS are orthogonal if changes in one do not affect any of the others</p>
<p>i.e. database code will be orthogonal to the UI. you can change the interface without affecting the database</p>
<p>driving stick shift is not orthogonal<br />
helicopter controls are not orthogonal</p>
<p>bottom line: non-orthogonal systems are hard to maintain</p>
<hr />
<h2>Tip 13: Eliminate Effects Between Unrelated things</h2>
<ul>
<li>design components that are self-contained. this is very much the case for react components.</li>
<li>and for ruby methods</li>
<li>and for js functions</li>
<li>you want: independent, single, well defined components</li>
<li>you want: single, independent components that don't need no man</li>
</ul>
<blockquote>
<p>You get two major benefits if you write orthogonal systems: increased productivity and reduced risk.</p>
</blockquote>
<p><strong>ways orthogonality can be applied to your work</strong></p>
<ul>
<li>teams can be more efficient if each major infrastructure component gets its own subteam: database, communications interface, middleware layer, etc</li>
<li>non orthogonal systems lead to bickering teams</li>
<li>system design: should be composed of a set of cooperating modules, each of which implements functionality independent of others</li>
<li>inherently, i think MVC is orthogonal</li>
<li>the flux pattern is also orthogonal in react applications. i think? ask yourself:</li>
</ul>
<blockquote>
<p>if i dramatically change the requirements behind a particular function, how many modules are affected?</p>
</blockquote>
<p>Toolkits and Libraries</p>
<ul>
<li>we're talking Ruby gems, Node modules, etc</li>
<li>choose technologies wisely</li>
</ul>
<p>Testing</p>
<blockquote>
<p>An orthogonally designed and implemented system is easier to test. Because the interactions between the system's components are formalized and limited, more of the system testing can be performed at the individual module level. This is good news, because module level (or unit) testing is considerably easier to specify and perform than integration testing.</p>
</blockquote>
<ul>
<li>building unit tests is a TEST of orthogonality.</li>
<li>easy unit tests == orthogonal</li>
</ul>
<p>Reversability</p>
<blockquote>
<p>Nothing is more dangerous than an idea if it's the only one you have.</p>
</blockquote>
<p>Writing more orthogonal code allows you to more easily reverse changess or eb and flow with the needs of the project.</p>
<p>Bottom line: orthognality is about reduction of interdependency among system components</p>
<hr />
<h2>Tip 14: There are no final decisions</h2>
<ul>
<li>problem: critical decisions aren't easily reversable</li>
<li>imagine switching a codebase to use Mongo after having tens of thousands of records in a Postgres db</li>
<li>HOWEVER - if you REALLY abstracted the idea of a &quot;database&quot; out - you should have the flexibility to make that change, should you need to</li>
<li>you SHOULD prepare for contingencies</li>
</ul>
<blockquote>
<p>instead of carving decisions in stone, think of them mroe as being written in the sand at the beach. A big wave can come along and wipe them out at any time.</p>
</blockquote>
<ul>
<li>this is also why i love the Adapter pattern.</li>
<li>for example - making a folder called &quot;Adapters&quot; when making external http requests in a rails app.</li>
<li>you might have an &quot;geocoordinates_adapter&quot; that has code that calls the google maps api. but because you have encapsulated this idea of geo-coding to it's own class, you're not TIED to using google maps. you can swap this out at any time. pretty dope</li>
</ul>
<hr />
<h2>Tip 15: User Tracer bullets to find the target</h2>
<p>when firing a machine gun in the dark, you either:</p>
<ol>
<li>calculate everything and make a precise shot</li>
<li>or use tracel bullets.</li>
</ol>
<p>Tracer ammunition (tracers) are bullets or cannon caliber projectiles that are built with a small pyrotechnic charge in their base. Ignited by the burning powder, the pyrotechnic composition burns very brightly, making the projectile visible to the naked eye. This enables the shooter to follow the projectile trajectory to make aiming corrections.</p>
<ul>
<li>tracer bullet give immediate feedback and let the shooter make corrections</li>
<li>there are a lot of unknowns</li>
</ul>
<blockquote>
<p>tracer code is not disposable. you write it for keeps. it contains all the error checking, structuring, documentation, and self-checking that any piece of production code has. it simply is not fully functional</p>
</blockquote>
<ul>
<li>kind of like an MVP - let's you quickly iterate and get real user feedback</li>
<li>great part is that it gives devs a structure to work in</li>
<li>know that tracer bullets don't always hit the target. that's okay. just adjust and try again</li>
<li>tracer code is <strong>not</strong> prototyping. you will throw away the prototype and redo it later to make it &quot;better&quot;</li>
<li>this is not the case with the tracer approach</li>
<li>with prototyping, you might also mock functionality and make it &quot;feel&quot; like it's working on the front end while not actually writing the algorithm / business logic</li>
<li>a tracer algorithm might not be fully fleshed out but it's a skeleton that won't be thrown away</li>
<li>there's a different mindset</li>
</ul>
<h2>Picks</h2>
<ul>
<li>JP: <a href="https://github.com/kentcdodds/react-testing-library">react-testing-library</a></li>
<li>John: <a href="https://calendly.com/">Calendly - Easily schedule meetings</a></li>
</ul>
]]></description>
      <pubDate>Fri, 11 May 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/tracer-bullets-0f361e37</link>
      <content:encoded><![CDATA[<h1>Chapter 2 - A Pragmatic Approach</h1>
<p>Overview = combine ideas and processes</p>
<ol>
<li>duplicate knowledge throughout systems</li>
<li>don't split any one piece of knowledge across multiple system components (orthogonality)</li>
<li>insulate projects from their changing environments</li>
<li>gather requirements and implement code at the same time</li>
<li>how to give project estimates</li>
</ol>
<p>This chapter is truly about a &quot;pragmatic&quot; approach to development</p>
<hr />
<h2>Tip 11: Don't Repeat Yourself</h2>
<ul>
<li>if you change one, you'll have to change another</li>
</ul>
<p>Duplicated code arises differently:</p>
<ol>
<li>imposed: devs feel they have no choice</li>
<li>inadvertent: devs don't realize they are duplicating</li>
<li>impatient: devs got lazy because it seems easier</li>
<li>interdeveloper: multiple people on a team duplicate a piece of info</li>
</ol>
<p>we call these the &quot;four i's&quot;</p>
<ul>
<li>
<p>&quot;shortcuts make for long delays&quot;</p>
</li>
<li>
<p>number 4 is a result of large teams - not having a --- dare I say --- a ubiquitous language</p>
</li>
<li>
<p>you need good communication to quell number 4</p>
</li>
<li>
<p>READ DOCS</p>
</li>
<li>
<p>Tip: Lean on code and programmatically generated things to prevent repeating yourself.</p>
</li>
</ul>
<hr />
<h2>Tip 12: Make it easy to reuse</h2>
<ul>
<li>you want to create an environment where it's easier to find and reuse existing stuff so people don't have to go out and create their own</li>
<li><strong>orthogonality</strong></li>
<li>borrowed from geometry</li>
<li>two lines are orthogonal if they meet at right angles - think axes on a graph</li>
<li>move along (or parallel to the x-axis) and theres no change to the y-axis</li>
<li>in computing, &quot;orthogonality&quot; has come to mean independence / decoupling</li>
</ul>
<p>TWO OR MORE THINGS are orthogonal if changes in one do not affect any of the others</p>
<p>i.e. database code will be orthogonal to the UI. you can change the interface without affecting the database</p>
<p>driving stick shift is not orthogonal<br />
helicopter controls are not orthogonal</p>
<p>bottom line: non-orthogonal systems are hard to maintain</p>
<hr />
<h2>Tip 13: Eliminate Effects Between Unrelated things</h2>
<ul>
<li>design components that are self-contained. this is very much the case for react components.</li>
<li>and for ruby methods</li>
<li>and for js functions</li>
<li>you want: independent, single, well defined components</li>
<li>you want: single, independent components that don't need no man</li>
</ul>
<blockquote>
<p>You get two major benefits if you write orthogonal systems: increased productivity and reduced risk.</p>
</blockquote>
<p><strong>ways orthogonality can be applied to your work</strong></p>
<ul>
<li>teams can be more efficient if each major infrastructure component gets its own subteam: database, communications interface, middleware layer, etc</li>
<li>non orthogonal systems lead to bickering teams</li>
<li>system design: should be composed of a set of cooperating modules, each of which implements functionality independent of others</li>
<li>inherently, i think MVC is orthogonal</li>
<li>the flux pattern is also orthogonal in react applications. i think? ask yourself:</li>
</ul>
<blockquote>
<p>if i dramatically change the requirements behind a particular function, how many modules are affected?</p>
</blockquote>
<p>Toolkits and Libraries</p>
<ul>
<li>we're talking Ruby gems, Node modules, etc</li>
<li>choose technologies wisely</li>
</ul>
<p>Testing</p>
<blockquote>
<p>An orthogonally designed and implemented system is easier to test. Because the interactions between the system's components are formalized and limited, more of the system testing can be performed at the individual module level. This is good news, because module level (or unit) testing is considerably easier to specify and perform than integration testing.</p>
</blockquote>
<ul>
<li>building unit tests is a TEST of orthogonality.</li>
<li>easy unit tests == orthogonal</li>
</ul>
<p>Reversability</p>
<blockquote>
<p>Nothing is more dangerous than an idea if it's the only one you have.</p>
</blockquote>
<p>Writing more orthogonal code allows you to more easily reverse changess or eb and flow with the needs of the project.</p>
<p>Bottom line: orthognality is about reduction of interdependency among system components</p>
<hr />
<h2>Tip 14: There are no final decisions</h2>
<ul>
<li>problem: critical decisions aren't easily reversable</li>
<li>imagine switching a codebase to use Mongo after having tens of thousands of records in a Postgres db</li>
<li>HOWEVER - if you REALLY abstracted the idea of a &quot;database&quot; out - you should have the flexibility to make that change, should you need to</li>
<li>you SHOULD prepare for contingencies</li>
</ul>
<blockquote>
<p>instead of carving decisions in stone, think of them mroe as being written in the sand at the beach. A big wave can come along and wipe them out at any time.</p>
</blockquote>
<ul>
<li>this is also why i love the Adapter pattern.</li>
<li>for example - making a folder called &quot;Adapters&quot; when making external http requests in a rails app.</li>
<li>you might have an &quot;geocoordinates_adapter&quot; that has code that calls the google maps api. but because you have encapsulated this idea of geo-coding to it's own class, you're not TIED to using google maps. you can swap this out at any time. pretty dope</li>
</ul>
<hr />
<h2>Tip 15: User Tracer bullets to find the target</h2>
<p>when firing a machine gun in the dark, you either:</p>
<ol>
<li>calculate everything and make a precise shot</li>
<li>or use tracel bullets.</li>
</ol>
<p>Tracer ammunition (tracers) are bullets or cannon caliber projectiles that are built with a small pyrotechnic charge in their base. Ignited by the burning powder, the pyrotechnic composition burns very brightly, making the projectile visible to the naked eye. This enables the shooter to follow the projectile trajectory to make aiming corrections.</p>
<ul>
<li>tracer bullet give immediate feedback and let the shooter make corrections</li>
<li>there are a lot of unknowns</li>
</ul>
<blockquote>
<p>tracer code is not disposable. you write it for keeps. it contains all the error checking, structuring, documentation, and self-checking that any piece of production code has. it simply is not fully functional</p>
</blockquote>
<ul>
<li>kind of like an MVP - let's you quickly iterate and get real user feedback</li>
<li>great part is that it gives devs a structure to work in</li>
<li>know that tracer bullets don't always hit the target. that's okay. just adjust and try again</li>
<li>tracer code is <strong>not</strong> prototyping. you will throw away the prototype and redo it later to make it &quot;better&quot;</li>
<li>this is not the case with the tracer approach</li>
<li>with prototyping, you might also mock functionality and make it &quot;feel&quot; like it's working on the front end while not actually writing the algorithm / business logic</li>
<li>a tracer algorithm might not be fully fleshed out but it's a skeleton that won't be thrown away</li>
<li>there's a different mindset</li>
</ul>
<h2>Picks</h2>
<ul>
<li>JP: <a href="https://github.com/kentcdodds/react-testing-library">react-testing-library</a></li>
<li>John: <a href="https://calendly.com/">Calendly - Easily schedule meetings</a></li>
</ul>
]]></content:encoded>
      <enclosure length="28884515" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/3d778c8b-3750-484d-b259-423eb6677e1f/0f361e37_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>Tracer bullets</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/3d778c8b-3750-484d-b259-423eb6677e1f/3000x3000/1525816772artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:29:51</itunes:duration>
      <itunes:summary>This chapter is truly about a &quot;pragmatic&quot; approach to development -  We discuss duplicating knowledge throughout systems,  insulating projects from their changing environments, gathering requirements and implement code at the same time, how to give project estimates</itunes:summary>
      <itunes:subtitle>This chapter is truly about a &quot;pragmatic&quot; approach to development -  We discuss duplicating knowledge throughout systems,  insulating projects from their changing environments, gathering requirements and implement code at the same time, how to give project estimates</itunes:subtitle>
      <itunes:keywords>pragmatic programer, programming, books, web development</itunes:keywords>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cc8e2120-919f-4bae-800c-4e1bc10cbed5</guid>
      <title>NEW BOOK - The Pragmatic Programmer</title>
      <description><![CDATA[<h1>The Pragmatic Programmer: From Journeyman to Master</h1>
<h1>Preface (Chapter 1)</h1>
<blockquote>
<p>Welcome to Iteration: a weekly podcast about programing, development and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<h1>NEW BOOK Pragmatic Programmer</h1>
<p>by Andy Hunt and Dave Thomas</p>
<blockquote>
<p>This book will help you become a better programmer</p>
</blockquote>
<ul>
<li>
<p>this book was written in freaking 1999! I was 7.</p>
</li>
<li>
<p>programming is a craft</p>
</li>
<li>
<p>&quot;as a programmer, you are part listener, part advisor, part interpreter, and part dictator. you try to capture elusive requirements and find a way of expressing them so that a mere machine can do them justice. you try to document your work so that others can understand it, and you try to engineer your work so that others can build on it. What's more, you try to do all this against the relentless ticking of the project clock. you work small miracle every day&quot;</p>
</li>
<li>
<p>&quot;you shouldn't be welded to any particular technology, but have a broad enough background and experience base to allow you to choose good solutions in particular situations&quot;</p>
</li>
</ul>
<p><strong>What makes a pragmatic programmer</strong></p>
<ol>
<li>early adopter / fast adapter</li>
<li>inquisitive - you ask questions</li>
<li>critical thinker</li>
<li>realistic</li>
<li>jack of all trades</li>
</ol>
<hr />
<p><strong>Tips</strong></p>
<h2>Tip 1: Care about your craft</h2>
<blockquote>
<p>&quot;We who cut mere stones must always be envisioning cathedrals.&quot;</p>
</blockquote>
<h2>Tip 2: Think about your work - never run on auto pilot</h2>
<blockquote>
<p>&quot;great lawns need small amounts of daily care, and so do great programmers.&quot;</p>
</blockquote>
<p>&quot;1% better every day. 365% bettere every year&quot;</p>
<ul>
<li>kaizen - continuous small improvements</li>
</ul>
<h2>Tip 3: Provide Options, Don't make lame excuses</h2>
<ul>
<li>basically, take responsibility</li>
<li>when something can't be done, explain what can be done to salvage the situation</li>
</ul>
<p><strong>Challenge</strong></p>
<ul>
<li>How do you react when someone - such as a bank teller, a mechanic, or a clerk - comes to you with a lame excuse. What do you think of them and their company as a result?</li>
</ul>
<p>hmmmmm.... really gets you thinking</p>
<hr />
<h2>Tip 4: don't leave broken windows</h2>
<p>Software entropy - aka Broken window theory - aka software rot</p>
<p>This is a great metaphor:</p>
<blockquote>
<p>One broken window, left unrepaired for any substantial length of time, instills in the inhabitants of the building a sense of abandonment - ... so another window gets broken. People start littering. graffiti appears.</p>
</blockquote>
<ul>
<li>police in NY and other major cities have cracked (no put intended) down on small stuff in order to keep out the big stuff.</li>
<li>systems rot quickly with one broken window. wow. this cuts me deep. haha.</li>
<li>don't let entropy win!!!</li>
<li>in the opposite case, where there are no broken windows - and its extremely pristine - you don't want to be THAT guy that makes a mess.</li>
</ul>
<hr />
<h2>Tip 5: Be a catalyst for change (gradual deception and you can get what you want haha)</h2>
<p>&quot;The three soldiers returning home from war were hungry. When they saw the village ahead their spirits lifted—they were sure the villagers would give them a meal. But when they got there, they found the doors locked and the windows closed. After many years of war, the villagers were short of food, and hoarded what they had. Undeterred, the soldiers boiled a pot of water and carefully placed three stones into it. The amazed villagers came out to watch. &quot;This is stone soup,&quot; the soldiers explained.</p>
<p>&quot;Is that all you put in it?&quot; asked the villagers. &quot;Absolutely—although some say it tastes even better with a few carrots....&quot; A villager ran off, returning in no time with a basket of carrots from his hoard. A couple of minutes later, the villagers again asked &quot;Is that it?&quot; &quot;Well,&quot; said the soldiers, &quot;a couple of potatoes give it body.&quot; Off ran another villager.&quot;</p>
<hr />
<h2>Tip 6: Remember the big picture</h2>
<p>(don't be the frog who gets boiled gradually)</p>
<hr />
<h2>Tip 7: Make quality a requirements issue</h2>
<p>There will always be tradeoffs. When to ship?</p>
<blockquote>
<p>Great software today is often preferable to perfect software tomorrow. If you give your users something to play with early, their feedback will often lead you to a better eventual solution.</p>
</blockquote>
<hr />
<p><strong>Challenges</strong></p>
<ol>
<li>look at some software you use. can you find evidence that companies are comfortable shipping software they know is not perfect. as a user, would you rather wait for them to iron out all of the bugs? have complex software and accept some bugs? opt for simpler software and have fewer defects?</li>
</ol>
<hr />
<h2>Tip 8: Invest regularly in your knowledge portfolio</h2>
<ul>
<li>knowledge is an <strong>expiring asset</strong></li>
<li>it becomes out of date as new techniques, languages, and environments are developed</li>
<li>JP's pick: https://www.youtube.com/watch?v=ZZUY37RQS-k - &quot;Staying relevant as a programmer&quot;</li>
</ul>
<ol>
<li>invest regularly</li>
<li>diversify</li>
<li>balance portfolio regularly between high risk, high reward investments</li>
<li>buy low and sell high</li>
<li>reviewed and rebalanced periodically</li>
</ol>
<ul>
<li>the same can be said for your KNOWLEDGE portfolio</li>
<li>Diversify: &quot;The more technologies you are comfortable with, the better you will be able to adjust to change&quot;</li>
</ul>
<p><strong>GOALS</strong> - I LOVE this section.</p>
<ol>
<li>learn at least one new language every year. <strong>Different languages solve the same problem in different ways</strong>.</li>
<li>read a technical book each quarter. after you've mastered the technologies you're currently using, branch out and study some that DONT relate to your project</li>
<li>read non technical books</li>
<li>take classes</li>
<li>participate in local user groups (meetups)</li>
<li>experiment with different environments (windows, linux)</li>
<li>stay current</li>
<li>get wired (twitter - follow big players in the space)</li>
</ol>
<blockquote>
<p>It doesn't matter whether you ever use any of these technologies on a project, or even whether you put them on your resume. The process of learning will expand your thinking, opening you to new possibilities and new ways of doing things.</p>
</blockquote>
<hr />
<h2>Tip 9: Critically Analyze What you read and hear</h2>
<p>Don't get swayed by media hype. I'm looking at you <code>create-react-app!</code></p>
<ul>
<li>i was at JS.la and mentioned how <code>create-react-app</code> is the best configuration free react setup. someone challenged me and said it's just the best marketed</li>
</ul>
<hr />
<h2>Tip 10: It's Both What you Say and the way you say it</h2>
<blockquote>
<p>Having the best ideas, the finest code, or the most pragmatic thinking is ultimately sterile unless you can communicate with other people. A good idea is an orphan without effective communication</p>
</blockquote>
<ul>
<li>kind of way we're doing this podcast!</li>
<li><strong>know your audience</strong></li>
<li>understand the needs and interests of your audience</li>
<li>think about all the people and stakeholders and domain experts you have to communicate with as a software engineer</li>
<li>very much, &quot;How to win friends and influence people&quot;</li>
</ul>
<ol>
<li>know what to Say</li>
<li>know your audience</li>
<li>choose your moment - not 4pm on a friday or when your boss is having a bad day</li>
<li>choose a style - know how to deliver your message</li>
<li>make it look good (make it pop). think about how sexy laravel docs are</li>
<li>involve your audience</li>
<li>be a listener</li>
<li>get back to people. ALWAYS respond back to emails. think about how it feels when people don't reespond back to you. even just a &quot;Ill get back to you later&quot; response is better than no response</li>
</ol>
<p>these are great soft skills!</p>
]]></description>
      <pubDate>Fri, 4 May 2018 12:00:00 +0000</pubDate>
      <author>johnsalzarulo@gmail.com (John Jacob &amp; JP Sio - Web Developers)</author>
      <link>https://iteration.simplecast.com/episodes/new-book-the-pragmatic-programmer-ee4babfc</link>
      <content:encoded><![CDATA[<h1>The Pragmatic Programmer: From Journeyman to Master</h1>
<h1>Preface (Chapter 1)</h1>
<blockquote>
<p>Welcome to Iteration: a weekly podcast about programing, development and design through the lens of amazing books, chapter-by-chapter</p>
</blockquote>
<h1>NEW BOOK Pragmatic Programmer</h1>
<p>by Andy Hunt and Dave Thomas</p>
<blockquote>
<p>This book will help you become a better programmer</p>
</blockquote>
<ul>
<li>
<p>this book was written in freaking 1999! I was 7.</p>
</li>
<li>
<p>programming is a craft</p>
</li>
<li>
<p>&quot;as a programmer, you are part listener, part advisor, part interpreter, and part dictator. you try to capture elusive requirements and find a way of expressing them so that a mere machine can do them justice. you try to document your work so that others can understand it, and you try to engineer your work so that others can build on it. What's more, you try to do all this against the relentless ticking of the project clock. you work small miracle every day&quot;</p>
</li>
<li>
<p>&quot;you shouldn't be welded to any particular technology, but have a broad enough background and experience base to allow you to choose good solutions in particular situations&quot;</p>
</li>
</ul>
<p><strong>What makes a pragmatic programmer</strong></p>
<ol>
<li>early adopter / fast adapter</li>
<li>inquisitive - you ask questions</li>
<li>critical thinker</li>
<li>realistic</li>
<li>jack of all trades</li>
</ol>
<hr />
<p><strong>Tips</strong></p>
<h2>Tip 1: Care about your craft</h2>
<blockquote>
<p>&quot;We who cut mere stones must always be envisioning cathedrals.&quot;</p>
</blockquote>
<h2>Tip 2: Think about your work - never run on auto pilot</h2>
<blockquote>
<p>&quot;great lawns need small amounts of daily care, and so do great programmers.&quot;</p>
</blockquote>
<p>&quot;1% better every day. 365% bettere every year&quot;</p>
<ul>
<li>kaizen - continuous small improvements</li>
</ul>
<h2>Tip 3: Provide Options, Don't make lame excuses</h2>
<ul>
<li>basically, take responsibility</li>
<li>when something can't be done, explain what can be done to salvage the situation</li>
</ul>
<p><strong>Challenge</strong></p>
<ul>
<li>How do you react when someone - such as a bank teller, a mechanic, or a clerk - comes to you with a lame excuse. What do you think of them and their company as a result?</li>
</ul>
<p>hmmmmm.... really gets you thinking</p>
<hr />
<h2>Tip 4: don't leave broken windows</h2>
<p>Software entropy - aka Broken window theory - aka software rot</p>
<p>This is a great metaphor:</p>
<blockquote>
<p>One broken window, left unrepaired for any substantial length of time, instills in the inhabitants of the building a sense of abandonment - ... so another window gets broken. People start littering. graffiti appears.</p>
</blockquote>
<ul>
<li>police in NY and other major cities have cracked (no put intended) down on small stuff in order to keep out the big stuff.</li>
<li>systems rot quickly with one broken window. wow. this cuts me deep. haha.</li>
<li>don't let entropy win!!!</li>
<li>in the opposite case, where there are no broken windows - and its extremely pristine - you don't want to be THAT guy that makes a mess.</li>
</ul>
<hr />
<h2>Tip 5: Be a catalyst for change (gradual deception and you can get what you want haha)</h2>
<p>&quot;The three soldiers returning home from war were hungry. When they saw the village ahead their spirits lifted—they were sure the villagers would give them a meal. But when they got there, they found the doors locked and the windows closed. After many years of war, the villagers were short of food, and hoarded what they had. Undeterred, the soldiers boiled a pot of water and carefully placed three stones into it. The amazed villagers came out to watch. &quot;This is stone soup,&quot; the soldiers explained.</p>
<p>&quot;Is that all you put in it?&quot; asked the villagers. &quot;Absolutely—although some say it tastes even better with a few carrots....&quot; A villager ran off, returning in no time with a basket of carrots from his hoard. A couple of minutes later, the villagers again asked &quot;Is that it?&quot; &quot;Well,&quot; said the soldiers, &quot;a couple of potatoes give it body.&quot; Off ran another villager.&quot;</p>
<hr />
<h2>Tip 6: Remember the big picture</h2>
<p>(don't be the frog who gets boiled gradually)</p>
<hr />
<h2>Tip 7: Make quality a requirements issue</h2>
<p>There will always be tradeoffs. When to ship?</p>
<blockquote>
<p>Great software today is often preferable to perfect software tomorrow. If you give your users something to play with early, their feedback will often lead you to a better eventual solution.</p>
</blockquote>
<hr />
<p><strong>Challenges</strong></p>
<ol>
<li>look at some software you use. can you find evidence that companies are comfortable shipping software they know is not perfect. as a user, would you rather wait for them to iron out all of the bugs? have complex software and accept some bugs? opt for simpler software and have fewer defects?</li>
</ol>
<hr />
<h2>Tip 8: Invest regularly in your knowledge portfolio</h2>
<ul>
<li>knowledge is an <strong>expiring asset</strong></li>
<li>it becomes out of date as new techniques, languages, and environments are developed</li>
<li>JP's pick: https://www.youtube.com/watch?v=ZZUY37RQS-k - &quot;Staying relevant as a programmer&quot;</li>
</ul>
<ol>
<li>invest regularly</li>
<li>diversify</li>
<li>balance portfolio regularly between high risk, high reward investments</li>
<li>buy low and sell high</li>
<li>reviewed and rebalanced periodically</li>
</ol>
<ul>
<li>the same can be said for your KNOWLEDGE portfolio</li>
<li>Diversify: &quot;The more technologies you are comfortable with, the better you will be able to adjust to change&quot;</li>
</ul>
<p><strong>GOALS</strong> - I LOVE this section.</p>
<ol>
<li>learn at least one new language every year. <strong>Different languages solve the same problem in different ways</strong>.</li>
<li>read a technical book each quarter. after you've mastered the technologies you're currently using, branch out and study some that DONT relate to your project</li>
<li>read non technical books</li>
<li>take classes</li>
<li>participate in local user groups (meetups)</li>
<li>experiment with different environments (windows, linux)</li>
<li>stay current</li>
<li>get wired (twitter - follow big players in the space)</li>
</ol>
<blockquote>
<p>It doesn't matter whether you ever use any of these technologies on a project, or even whether you put them on your resume. The process of learning will expand your thinking, opening you to new possibilities and new ways of doing things.</p>
</blockquote>
<hr />
<h2>Tip 9: Critically Analyze What you read and hear</h2>
<p>Don't get swayed by media hype. I'm looking at you <code>create-react-app!</code></p>
<ul>
<li>i was at JS.la and mentioned how <code>create-react-app</code> is the best configuration free react setup. someone challenged me and said it's just the best marketed</li>
</ul>
<hr />
<h2>Tip 10: It's Both What you Say and the way you say it</h2>
<blockquote>
<p>Having the best ideas, the finest code, or the most pragmatic thinking is ultimately sterile unless you can communicate with other people. A good idea is an orphan without effective communication</p>
</blockquote>
<ul>
<li>kind of way we're doing this podcast!</li>
<li><strong>know your audience</strong></li>
<li>understand the needs and interests of your audience</li>
<li>think about all the people and stakeholders and domain experts you have to communicate with as a software engineer</li>
<li>very much, &quot;How to win friends and influence people&quot;</li>
</ul>
<ol>
<li>know what to Say</li>
<li>know your audience</li>
<li>choose your moment - not 4pm on a friday or when your boss is having a bad day</li>
<li>choose a style - know how to deliver your message</li>
<li>make it look good (make it pop). think about how sexy laravel docs are</li>
<li>involve your audience</li>
<li>be a listener</li>
<li>get back to people. ALWAYS respond back to emails. think about how it feels when people don't reespond back to you. even just a &quot;Ill get back to you later&quot; response is better than no response</li>
</ol>
<p>these are great soft skills!</p>
]]></content:encoded>
      <enclosure length="63832172" type="audio/mpeg" url="https://cdn.simplecast.com/audio/d51766/d517663e-9c51-4b30-8f73-c285569796d8/44ed2994-022f-4132-8bb5-61de87a74ee5/ee4babfc_tc.mp3?aid=rss_feed&amp;feed=YmvH1ayC"/>
      <itunes:title>NEW BOOK - The Pragmatic Programmer</itunes:title>
      <itunes:author>John Jacob &amp; JP Sio - Web Developers</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/d51766/d517663e-9c51-4b30-8f73-c285569796d8/44ed2994-022f-4132-8bb5-61de87a74ee5/3000x3000/1525410582artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:06:15</itunes:duration>
      <itunes:summary>Iteration: a weekly podcast about programing, development and design through the lens of amazing books, chapter-by-chapter. This week we have the first chapter of a new book - Pragmatic Programer. Follow along through this great book in this super long first episode. </itunes:summary>
      <itunes:subtitle>Iteration: a weekly podcast about programing, development and design through the lens of amazing books, chapter-by-chapter. This week we have the first chapter of a new book - Pragmatic Programer. Follow along through this great book in this super long first episode. </itunes:subtitle>
      <itunes:explicit>no</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
  </channel>
</rss>