<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[User Interfacing Newsletter]]></title><description><![CDATA[A publication on architecture and engineering management.]]></description><link>https://userinterfacing.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png</url><title>User Interfacing Newsletter</title><link>https://userinterfacing.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Apr 2026 11:27:29 GMT</lastBuildDate><atom:link href="https://userinterfacing.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Adam Conrad]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[userinterfacing@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[userinterfacing@substack.com]]></itunes:email><itunes:name><![CDATA[Adam Conrad]]></itunes:name></itunes:owner><itunes:author><![CDATA[Adam Conrad]]></itunes:author><googleplay:owner><![CDATA[userinterfacing@substack.com]]></googleplay:owner><googleplay:email><![CDATA[userinterfacing@substack.com]]></googleplay:email><googleplay:author><![CDATA[Adam Conrad]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building things that break]]></title><description><![CDATA[User Interfacing Newsletter Volume 137]]></description><link>https://userinterfacing.substack.com/p/building-things-that-break</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/building-things-that-break</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 05 Aug 2021 21:00:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Continuing my <a href="https://adamconrad.dev/tag/systems-design/">systems design series</a> this week with a new article on fault tolerance. If you&#8217;re doing a systems design interview soon or you just want to know more about web-scale applications continue to follow along! I&#8217;d also suggest you watch <a href="https://www.youtube.com/watch?v=kx-XDoPjoHw">this video</a> which incorporates many of the concepts of applying all the concepts we&#8217;ve studied so far.</p><p>Happy reading!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/fault-tolerance/">Fault tolerance</a></h1><p>The self-proclaimed pessimistic chapter of the book, chapter 8 covers fault tolerance in distributed systems. Let us briefly introduce why  things break in an internet-scale system:</p><ul><li><p><strong>Commodity machines break.</strong> Since internet applications are about <a href="https://adamconrad.dev/blog/replication/">scaling out instead of up</a>, each node in the cluster is cheap. Cheap things break more frequently.</p></li><li><p><strong>The Internet Protocol is unreliable.</strong> There is no guarantee that things will move as intended. Everything is sent over the wire in <em>packets</em>. Traditional telephony networks send everything over in <em>circuits</em>. This lack of a reliable, consistent connection presents problems. The request could be <em>lost</em> or <em>queued</em>. The node accepting the request could <em>stop responding</em> or <em>fail</em> altogether. Worse, your request could have made it all the way to the node and back but was <em>lost on the way back to you</em> or will arrive <em>later than you want it to</em>.     </p><ul><li><p><strong>We add in TCP to make it more reliable.</strong> The downside is there are variable network delays since that queuing and reliability slows the system down.</p></li><li><p><strong>You can trade TCP for UDP if you need more speed.</strong>  If you cannot afford delays in data and can afford less reliability,  consider using UDP. A Zoom call is a good example of when UDP is a  better protocol than TCP.</p></li></ul></li></ul><p>This is in contrast to vertically-scaled systems that rely on beefy supercomputers. These systems often act as if they were single-computer applications. Therefore, we will not be covering this in the book or in the notes.</p><p>The crucial thing to internalize is that <strong>faults happen in the real world all of the time</strong>.  The best anecdote from the book is how a shark bit some network cables and took down parts of Amazon EC2. Even a company as powerful as Amazon cannot prevent the almighty shark from screwing up network connectivity.</p><h2>How to deal with faults</h2><p>If we know faults will happen, then it is vital to be proactive in dealing with them.</p><p><strong>Error handling</strong> is a simple and effective way of staying on top of faults. Keeping your customers aware of issues may only require a browser refresh to correct the problem.</p><p><strong>Heartbeats</strong> help detect faulty or down nodes. A <em>load balancer</em> (like HAProxy or Nginx) will periodically ping nodes to ensure they are up to send them traffic.</p><p><strong>Leader election</strong> is a strategy to elect new write replicas when leaders are down in replicated clusters.</p><p><strong>Timeouts are the gate to try all of the above strategies.</strong>  For customers, the only way to reliably detect faults is to inform them that too much time has elapsed to process their request. In that time,  you will have tried the things above. Once the timeout has been exceeded, it is safe to assume that a fault has occurred.</p><p>How do you choose a sensible timeout? <strong>Measure your response times and variability.</strong> Then, choose a number. Unfortunately, <strong>there is no standard timeout interval that will work for everyone.</strong> Apache Cassandra uses the <a href="https://www.slideshare.net/srisatish/cache-concurrency-cassandrajvmapachecon2010">Phi failure-accrual algorithm</a> to adjust gossip protocols when they check with nodes to determine if they are down. TCP does its own <a href="http://blough.ece.gatech.edu/4110/TCPTimers.pdf">retransmission</a>, but there is not much here for you to take away for your own applications.</p><h3>Timing</h3><p><a href="https://www.freecodecamp.org/news/synchronize-your-software-with-international-customers/">Timezones are hard</a>.  Dealing with time, in general, is difficult. All computers have clocks,  but they are rarely in sync with each other. How do you ensure that the time or duration of an activity is accurate?</p><p><strong>Sync them.</strong> Things called NTP  servers help ensure that the clock you see on your computer is actually correct. If it isn&#8217;t, the NTP server will send back the correct time and update your clock. The problem is, your clock could hop backward. If  you sent a request at <code>10:00:01</code> and it was returned at <code>10:00:00</code>, you have a problem. That is why these kinds of clocks, called <em>time-of-day clocks</em>, are not reliable for measuring time duration.</p><p><strong>Count monotonically.</strong> To safeguard against a standard clock, a <em>monotonic clock</em> is also available on a computer. It is basically a giant timestamp counter that always counts upward, regardless of time syncing issues.  You can still use an NTP server to adjust the monotonic clock, but it does not count backward. If there is a syncing issue, you simply <em>delay when the next value is incremented</em>. This is generally the preferred method for distributed systems.</p><p>Even with both mitigation strategies in place, <strong>no system is perfect</strong>.  There is a network delay from the NTP server to your local clock, so they will never fully be in sync. Firewalls, leap seconds, virtual machines, and physical hardware clock malfunctions all contribute to perpetual inaccuracies between the actual time and the time posted on your machine. As long as you accept this premise, you can achieve reasonably high accuracy with the times you use it.</p><h3>Strategies around timing issues</h3><p>With all of these issues around keeping track of time, there are really only 3 solutions that are worth implementing:</p><ul><li><p><strong>The last write wins</strong>. Cassandra and Riak use this strategy to determine the most recent write to a database. But this suffers from the same basic problem: <em>what is recent</em>? If it is all relative anyway then you could still have two nodes that wrote to the DB with the same timestamp but one node&#8217;s clock is off.</p></li><li><p><strong>Provide times with a delta</strong>. Google Spanner uses this with its <a href="https://cloud.google.com/spanner/docs/true-time-external-consistency">TrueTime API</a>, but good luck using it outside of Google.</p></li><li><p><strong>Limit certain functions that would cause time delays and pauses</strong>.  Garbage collection is a notably slow process that can hang a system.  Ensuring there is enough memory to handle other functions when garbage collection grows unwieldy ensures some fault tolerance.</p></li></ul><p>The message you must remember is that <strong>time is relative, and you cannot achieve </strong><em><strong>real-time</strong></em>.  Real-time, in the truest sense of the word, is reserved for embedded systems so things like your airbag can deploy when it needs to.  Real-time, as it is used for web-scale, is a relative term for feeling instant even if it isn&#8217;t actually an instant operation.</p><h2>Trusting a faulty system</h2><p>Now that we know systems are unreliable, we need to know that the actors can be trusted. The book assumes they can be and that each player in the distributed system acts with honest intention. This is where the old security saying of <strong>trust but verify</strong> comes into play.</p><p><em>Quorums</em>, as we discussed in the <a href="https://adamconrad.dev/blog/replication/">data replication chapter</a>, are a way of obtaining votes from all nodes to figure out what the majority believes about the system during a discrepancy.</p><p>If you have 3 children and ask, &#8220;who stole the cookies from the cookie jar,&#8221; you&#8217;re likely to believe it is child 2 if both 1 and 3  point to 2.</p><p>What if one of them is lying? This is the basis for the <a href="https://www.microsoft.com/en-us/research/uploads/prod/2016/12/The-Byzantine-Generals-Problem.pdf">Byzantine Generals&#8217; problem</a>. Systems that safeguard against lying actors are <em>Byzantine fault-tolerant</em>.  They are only needed for mission-critical systems like aerospace or the blockchain. Internet web-scale systems do not require Byzantine  fault-tolerance (usually in the form of 2/3rd majority vote rather than a  simple majority vote), and we can improve fault tolerance with a few  simple tricks:</p><ol><li><p><strong>Require checksums.</strong> TCP and UDP offer these and ensure that corrupted packets must be retried to ensure data is transferred correctly.</p></li><li><p><strong>Permission, sanitize, validate, error-handle, and output-escape your data.</strong> This <a href="https://alexkrupp.typepad.com/sensemaking/2021/06/django-for-startup-founders-a-better-software-architecture-for-saas-startups-and-consumer-apps.html">blog post</a> beautifully summarizes a recipe to eliminate bugs from your code when ingesting data. Bugs are a source of lying since the system behaves unexpectedly through faulty code.</p></li><li><p><strong>Add redundancy to your NTP servers.</strong> Replication of time synchronization server checks ensures that the majority timestamp is the accurate and correct one.</p></li><li><p><strong>Build systems around crash recovery and partially synchronous system models.</strong>  System models take many forms and shapes. One will not see the strictness of a completely synchronous, Byzantine fault-tolerant system in the real world. But you also don&#8217;t want a fully asynchronous model where even the slightest perturbance shuts down the system. Striking a  middle ground with your system model is a sensible and useful real-world approach.</p></li></ol><p>The next chapter will investigate algorithmic approaches to handling real-world fault tolerance with system models that handle crash recovery and strive for partially synchronous updates.</p><p>This quote at the end of the chapter summarizes how I would recommend  the litany of strategies in this book to a more junior engineer:</p><blockquote><p>If you can avoid opening Pandora&#8217;s box and simply keep things on a single machine, it is generally worth doing so.</p></blockquote><p>It is easy to look at a book like this and think of all the neat technologies you could use on your current project. Resisting the urge to do so and finding ways to say no is arguably a better approach. Most companies and most systems will never require the scale beyond a simple  Postgres server. Barring safeguards around data replication, a simple  RDBMS can scale to millions and millions of records without much else to power it.</p><p>Until we meet again in the next chapter, here is some additional reading material I enjoyed with this week&#8217;s chapter:</p><ul><li><p><a href="https://www.youtube.com/watch?v=iJLL-KPqBpM">A system design question around the &#8220;top-k&#8221; heavy hitters</a>.</p></li><li><p>If you didn&#8217;t watch any of the previous episodes from this channel, you&#8217;ll also want to study their implementation of a <a href="https://www.youtube.com/watch?v=iJLL-KPqBpM">distributed messaging queue</a>.</p></li><li><p><a href="http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html">How to beat the CAP theorem</a> is the inspiration for the system design in the first link.</p></li><li><p><a href="https://www.oreilly.com/radar/questioning-the-lambda-architecture/">This article on the Kappa architecture</a> challenges the merits of the Lambda architecture with a simpler model that uses fewer frameworks and drops batch processing as a requirement.</p></li><li><p><a href="https://www.youtube.com/watch?v=ZWez6hOpirY">Comparing modern stream processing frameworks</a> is a great video that helped me make sense of way too many Apache streaming systems and why they all seemed to be redundant upon first glance.</p></li></ul><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 137 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!</p>]]></content:encoded></item><item><title><![CDATA[How to split up data for scale]]></title><description><![CDATA[User Interfacing Newsletter Volume 136]]></description><link>https://userinterfacing.substack.com/p/how-to-split-up-data-for-scale</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/how-to-split-up-data-for-scale</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 29 Jul 2021 21:00:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Continuing my <a href="https://adamconrad.dev/tag/systems-design/">systems design series</a> this week with a new, trimmer article on partitioning strategies. If you&#8217;re doing a systems design interview soon or you just want to know more about web-scale applications continue to follow along! I&#8217;d also suggest you watch <a href="https://www.youtube.com/watch?v=FU4WlwfS3G0">this video</a> which incorporates many of the concepts of the last two articles and is a good thought exercise.</p><p>Happy reading!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/partitioning/">Partitioning</a></h1><p>This chapter is another central tenant of distributed systems:  partitioning. Also known as sharding, we will explore how to split up large data sets into logical chunks.</p><h2>Strategies for partitioning</h2><p>If <em>replication</em> is about copying all data to different databases and datacenters, then <em>partitioning</em> is about slicing up that data across those databases and datacenters.</p><p>There are a few ways you can split up that data:</p><ul><li><p><strong>By key.</strong> The key can split the rows of data.  Imagine 26,000 names evenly split alphabetically. You could put 1,000  entries in a database for the <em>A</em> user names, 1,000 more for the <em>B</em> names, and so on.</p></li><li><p><strong>By hashed key.</strong> You could hash the same key and then split up the data that way as well. The easiest way to ensure  information is evenly split is to use a modulo (<code>%</code>)  operator (hint: just because it is easy doesn&#8217;t mean it is helpful). If you run the modulo over the number of datacenters, you will always have a key mapped into a datacenter ID.     </p><ul><li><p><strong>Add randomness for active keys.</strong> The above assumes that all keys are read and written in an even distribution. For the ones that are not, you can break up keys further with prefix or suffix IDs. Now the same key can be segmented across shards.</p></li></ul></li><li><p><strong>By a secondary key.</strong> Like the prefix/suffix keys,  you can use an additional key with a secondary index. This will make searching faster for the data that is partitioned.     </p><ul><li><p><strong>For local document search.</strong> You could make this secondary index the key with the value being the original primary key that you added into the shard in the first place.</p></li><li><p><strong>For global document search.</strong> Also called a <em>term index</em>,  you could segment the secondary keys and grab all of the keys across all shards (and shard the term). This is how full-text search databases work.</p></li></ul></li></ul><h2>Strategies for rebalancing</h2><p>Over time, these partitioning strategies will skew unevenly. The easiest way to visualize this is to imagine the old hardcover encyclopedias. They are not 26 volumes split by letter. Instead, letters  likes <code>Q</code> and <code>X</code> are combined while <code>A</code> and <code>S</code> get their own book.</p><p>While you may have an even balance of data to start, it will not necessarily evolve that way. You will need methods to rebalance your data from time to time.</p><p>Remember how I suggested that we use the modulo operator to segment our keys against the datacenters? This works until you add more datacenters. Then your modulo value needs to change, and you need to rebalance <em>all</em> of your data which creates a lot of rewriting as your data scales. This is not ideal. Here are a few better ways:</p><ul><li><p><strong>With a fixed number of partitions.</strong> Rather than use the physical shards as segments, create arbitrary partitions within each shard node. That way, as your shards grow or shrink, the number of partitions stays the same. Then, you simply adjust how many partitions you allocate to each node. <em>Riak and ElasticSearch use this method.</em></p></li><li><p><strong>With a dynamic number of partitions.</strong> The previous example is sensible but suffers from the same problem as earlier that you have data evolve in very skewed portions. If your partitioning segments are chosen poorly, your data will be lopsided. Dynamic rebalancing is using something like a B-Tree to change the structure as partitions are added and removed. The data evolves, and so too do the partitions. <em>HBase and MongoDB use this method.</em></p></li><li><p><strong>With a proportional number of partitions to nodes.</strong>  This is somewhat of a blended approach. The number of partitions is not strictly fixed. It changes as the number of nodes grows and shrinks.  This is not the same as dynamic rebalancing because the dynamism reflects solely on the number of nodes and not on arbitrary boundaries that you define. <em>Cassandra uses this method.</em></p></li></ul><p>These strategies all depend on the configurations you make as a  developer. You can choose how you want to deploy this rebalancing: <em>manually</em> or <em>automatically</em>.</p><p>With manual rebalancing, a developer assigns partitions to nodes.  This requires more effort and time, but it allows you to respond to the needs of your data. Conversely, automatic rebalancing enables the software to do this work for you. Tools like Couchbase and Riak suggest this approach (with approval), but the downside is the unpredictable and possibly suboptimal choices for segmenting and rebalancing your data. A  wrong move by the software could be slow and costly.</p><h2>How to find data</h2><p>With all of this data split up amongst so many physical computers, how do you go about finding them?</p><ul><li><p><strong>You can keep track of all of them on the client.</strong>  The obvious solution is to keep track of each shard in the same way that you have to have your encyclopedias face out on your bookshelf. You have to see which letter you want to access when you approach your bookshelf. The downside is that this is tedious and must be reconfigured every time you add or remove nodes.</p></li><li><p><strong>You can have your request routed for you.</strong> A  middle layer can interpret your query or mutation and figure out where your data is for you. This is like in the old days of telephones when operators connected you to the person on the other end. You did not need to know their phone number. You just needed to remember the number of the operator so they could route the call for you.</p></li><li><p><strong>You can throw a request to any node, and that node will route it.</strong>  This is like calling up a corporation and going through their touchtone service. You know you want to call up Dell customer support, so all calls get routed to a 1-800 number, but it is up to the service to find the exact extension for you. The default number <em>might</em> get you who you are looking for if you know your party&#8217;s extension number, but you may have to navigate the tree of options.</p></li></ul><p>Tools like <a href="https://zookeeper.apache.org/">Apache ZooKeeper</a> handle this configuration management in many popular databases like HBase and Kafka. Engines like Riak and Cassandra use a <a href="https://en.wikipedia.org/wiki/Gossip_protocol">gossip protocol</a> to chain requests from node to node until the data is found.</p><div><hr></div><p>Partitioning is straightforward and not nearly as dense as <a href="https://adamconrad.dev/blog/replication/">replication</a>. There are only so many ways you can split up data. In the <a href="https://adamconrad.dev/blog/scalability-reliability-maintainability/">first post of this series</a>, I noted I would be skipping the next chapter on transactions. The last sentence of the chapter explains why:</p><blockquote><p>In this chapter, we explored ideas and algorithms mostly in the  context of a database running on a single machine. Transactions in  distributed databases open a new set of difficult challenges, which  we&#8217;ll discuss in the next two chapters.</p></blockquote><p>Since I care about educating this audience on distributed systems and systems design, it seems only fair to focus on chapters that tackle transactions in a distributed nature.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 136 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to! </p>]]></content:encoded></item><item><title><![CDATA[Replication aka making copies of stuff]]></title><description><![CDATA[User Interfacing Newsletter Volume 135]]></description><link>https://userinterfacing.substack.com/p/replication-aka-making-copies-of</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/replication-aka-making-copies-of</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 22 Jul 2021 17:00:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Continuing my <a href="https://adamconrad.dev/tag/systems-design/">systems design series</a> this week with a new, beefy article on replication strategies. If you&#8217;re doing a systems design interview soon or you just want to know more about web-scale applications continue to follow along!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/replication/">Replication</a></h1><p>This chapter is the real introduction to distributed systems. We are shifting into the second part of the book here. You will notice that I  intentionally skipped chapter 4 based on a suggested curriculum I  outlined in the <a href="https://adamconrad.dev/blog/scalability-reliability-maintainability/">first post of this series</a>.</p><h2>Horizontal versus vertical scaling</h2><p>Before the chapter gets started, Kleppmann briefly discusses how we&#8217;ve collectively arrived at a <em>shared-nothing architecture</em> of horizontal scaling. Distributed systems design focuses on  scalability so it is important to know the 3 main types of scaling  you&#8217;ll see in real-world systems:</p><ol><li><p><strong>Vertical scaling.</strong> Also known as <em>shared-memory architectures</em> or <em>scaling up</em>, this involves adding more RAM, CPU, and resources to a single machine. The key observation is that <strong>doubling resources will likely more than double your costs</strong>.  As such, vertical scaling is recommended when heavy computation is required at the expense of fault tolerance and reliability. There is a  variant of this called <em>shared-disk architecture</em> which pertains mostly to data warehouse applications that provide additional fault tolerance with multiple machines accessing the same disks on a  centralized network. This still suffers from the same issues when you colocate all data in one data center but has limited use.</p></li><li><p><strong>Horizontal scaling.</strong> Also known as <em>shared-nothing architectures</em> or <em>scaling out</em>,  this refers to adding more machines with commodity resources. This is the primary strategy used when companies scale out their services and hence is the primary focus of this section of the book.</p></li></ol><h2>Replication 101</h2><p>Why do we replicate?</p><ol><li><p><strong>Reduce latency.</strong> Keeping data close to your users reduces the time it takes to physically travel over the wire to your customers.</p></li><li><p><strong>Increase availability.</strong> The server goes down? You&#8217;ve got a backup on a different machine and in a separate data center.</p></li><li><p><strong>Increase throughput.</strong> Drive-thru windows at your bank are convenient but if the line is long you know there are lots of bank tellers available inside to help you out and keep customers and productive.</p></li></ol><p>This chapter discusses three primary reasons <em>why</em> we need to replicate. We&#8217;ll offer strategies to resolve why <strong>data changes all of the time and how we deal with it</strong>.</p><p>If data never changed then replication would be easy. Since data grows and evolves over time, we employ various strategies based on our system&#8217;s specific needs.</p><h3>Leader replication</h3><p>The first two methods involve <strong>leader replication</strong>. Each replica, or copy, has a role: <code>leader</code> or <code>follower</code>. Some schemes invoke a single leader while others leverage multiple leaders. The responsibilities of each are straightforward:</p><ol><li><p><strong>Leaders ingest write data.</strong> Only the leader can modify the database.</p></li><li><p><strong>Followers copy changes from the leader.</strong> Followers must wait for a log file from the leader with changes they will make in the same order the leader made them.</p></li><li><p><strong>Anyone can offer read data.</strong> All replicas can return data to a customer that asks for it. This is called <em>read-scaling architecture</em>.</p></li></ol><p>That last step is the interesting one. What if you ask for data from a  replica that has not copied all of the latest changes yet? This is where replication strategies offer tradeoffs in their approach.</p><p>From here, you can focus on two ways of getting changes to replicas:</p><ol><li><p><strong>Synchronous replication.</strong> As the name implies, you send changes to followers immediately. You then only inform customers when all changes are completed successfully. Practically, this doesn&#8217;t work because if a follower replica hangs then the change fails which hurts durability. To be fair, <strong>synchronous replication is the best strategy to eliminate the risk of data loss</strong>. In reality, when systems use synchronous replication, they will follow a hybrid <em>semi-synchronous replication</em> strategy where one follower is synchronous while the others are asynchronous. Read-scaling architectures don&#8217;t work with this scheme because followers have to wait for leaders to synchronize data which keeps them too busy to accept additional reads.</p></li><li><p><strong>Asynchronous replication.</strong> In this scheme, changes are sent to followers immediately. The difference is you can inform customers when <em>some</em> changes complete successfully. You are not beholden to every follower sending a successful response. This is the most common scheme in production, high-scale application. This trades off speed for no guarantees in durability and eventual consistency.</p></li></ol><p><strong>What if you want to add a new follower to the gang?</strong></p><ol><li><p><strong>Periodically take snapshots of the data.</strong> This is good anyway for backups. Send the latest backup to your new follower.</p></li><li><p><strong>Poll the leader again for changes since the snapshot.</strong>  Now you can assume the new follower is asking for changes as if this were an asynchronous replication strategy. Each database engine has its own scheme for issuing catch-ups such as log sequence numbers or binlog coordinates.</p></li></ol><p><strong>What if things fail?</strong></p><ul><li><p><strong>If the follower fails</strong> then you execute the same catchup strategy for a new follower. Just read from the logs the last changes since the failure and then play catchup.</p></li><li><p><strong>If the leader fails</strong> then you have to elect a new leader. You can either do this <em>manually</em> or <em>automatically</em>.  Manual promotion benefits from careful failover to a verified follower.  The downside is that you have to invest developer time into failovers and can be cumbersome if they occur with some frequency. Automatic promotion relies on selecting a new leader, usually with the closest representation to the leader&#8217;s data.</p></li></ul><p>Reaching consensus with the automatic strategy is fraught with problems:</p><ul><li><p><strong>There might be a gap in the data, even with the best follower chosen.</strong> In this case, you violate strict durability and you incur data loss which is never good.</p></li><li><p><strong>Multiple followers might believe they are the leader.</strong> This can also lead to data loss if both start accepting writes to propagate to the other followers.</p></li><li><p><strong>The heartbeat interval may be too long and miss the latest changes.</strong>  Even if you have one follower with a perfect copy of the leader&#8217;s data,  the leader may have been down long enough to miss some new writes. If the heartbeat to check for its health is in a long enough interval then new changes could have been requested while the leader was down which will be lost for good.</p></li><li><p><strong>The old leader may not relinquish their throne</strong>.  Assuming everything else was correct, you still might see a variant on the second issue where the old leader starts back up and still thinks it is the leader. Now you are in a similar scenario where two leaders are consuming writes and you incur data loss.</p></li></ul><p>Logs help with restoring the data in addition to helping new followers join in on the fun. Each database engine utilizes one of four  replication log schemes:</p><ol><li><p><strong>Statement-based.</strong> These copy raw SQL commands. They are simple but require deterministic commands, which can be too strict for most databases.</p></li><li><p><strong>Write-ahead.</strong> These are logs written before changes to the main disk are stored. This is a common append-only log that is used with things like <a href="https://adamconrad.dev/blog/storage-and-retrieval/">SSTables and B-trees</a> but requires all engines to follow the same format. If the format changes with breaking changes to an engine, then it will require downtime to upgrade. This is what plagues things like major version upgrades in tools like Postgres.</p></li><li><p><strong>Row-based.</strong> This focuses on the values of rows instead of the commands like the previous two. This decouples the data from the storage engine used, which solves the problems from the previous strategy. New versions of Postgres use this, also known as <em>logical log replication</em>. The book doesn&#8217;t seem to see a downside to this approach but, <a href="https://stackoverflow.com/questions/33621906/difference-between-stream-replication-and-logical-replication">this Stack Overflow thread</a> goes into this strategy in greater detail which I appreciated. In short, things take more time because one database is updated at a time methodically.</p></li><li><p><strong>Trigger-based.</strong> This strategy leverages SQL  triggers and stored procedures. While this benefits from functionality native to the language instead of the database engine, these triggers can be complex. Further, this log strategy does not work for NoSQL solutions or any database that doesn&#8217;t leverage SQL, such as graph databases.</p></li></ol><h4>Eventual consistency</h4><p>As mentioned earlier, a read-scaling architecture can provide additional performance for applications that are heavy on reads. The downside of this strategy is that you may read outdated information from a follower node. When a leader node sends data asynchronously to a  follower node, it cannot wait to know if the follower replication succeeded.</p><p>This is what is known as <em>eventual consistency</em>. At some point, <em>eventually</em>,  the data will be synced across all replicas. There is no guarantee when that eventual time will be. But, it is meant to be a reasonably short amount of time so that there is no real compromise in reliability.  Nonetheless, there are occasional complications with eventual  consistency:</p><ul><li><p><strong>Reading right after writing.</strong> Say you update your email. If you make those changes and refresh the page then you&#8217;ll want to see your new email address saved. <em>Read-after-write consistency</em> is a strategy around this but is complicated in distributed systems.</p></li><li><p><strong>Reading into the past.</strong> Say you write a few checks to your bank account. Your bank account starts at $5, then you add two checks of $5 each. In theory, if the eventual consistency is delayed enough between replicas, the leader could show $15, one replica could show $10, and yet another replica could show the original $5. <em>Monotonic reads</em> ensure you only read from one replica so this problem doesn&#8217;t occur. Of course, if the replica fails, you&#8217;re back to square one.</p></li><li><p><strong>Answers to questions you haven&#8217;t asked.</strong> In the previous scenario, you could see a later state before you see a previous state. Not only are you going into the past but you are messing up the causality of the data - you wouldn&#8217;t expect an addition to lead to subtraction of the balance. <em>Consistent prefix reads</em> to ensure that the writes happen in a certain order. If you have a sharded database, you can&#8217;t guarantee this fix unless all of the data is affixed to the same shard. This becomes more complicated but does solve the issue.</p></li></ul><p>All of these problems are difficult to solve with a single-leader replication strategy. They become less difficult when you invoke a  multi-leader replication strategy.</p><h4>Multi-leader replication</h4><p>As the name implies, multi-leader replication allows you to assign multiple leaders at once. This solves nearly all of the problems you see  above:</p><ul><li><p><strong>No need for manual promotion.</strong> With multiple leaders, you don&#8217;t have to worry about being without a leader at all.  Restarting leaders assumes there is at least one leader already able to receive writes.</p></li><li><p><strong>No gap in writes.</strong> Unless you get incredibly unlucky, a leader will exist to ensure there is no downtime of a leader to accept writes. This can happen with a single leader. With multiple leaders, you guarantee there is always a place to accept writes.</p></li><li><p><strong>No leader conflict resolution.</strong> If you know who the leaders are, you can always create a backup scheme so you either fall back to an alternative leader <em>or</em> you have a simple election to keep things smooth.</p></li><li><p><strong>Heartbeat intervals no longer matter (to a point).</strong>  Waiting a long time to see if the leader is still online is not a  problem because you have multiple leaders to fall back on. As long as their heartbeats aren&#8217;t synced and are checked in a staggered fashion,  you can ensure that you&#8217;re constantly aware of at least one online leader.</p></li><li><p><strong>Multiple leaders don&#8217;t necessarily require follower promotion at all.</strong>  One problem with a single-leader scheme is the leader won&#8217;t give up its role as leader when it comes back online. If you have other leaders available, there is no need to promote them. You always have leaders available to do all the work you need. If a particular leader goes offline, you just wait for it to return and push the additional load to your remaining leaders.</p></li></ul><p>In addition to solving problems from single-leader replication, there  are a few use cases where multi-leader replication really shines:</p><ul><li><p><strong>Datacenter replication.</strong> Have multiple data centers? Assign a leader for each data center to ensure all locations have write coverage. The challenge is that you are back to single-leader replication per data center if you don&#8217;t elect multiple leaders per site. Further, writes become far more complicated since you have multiple data centers that have to resolve data changes. That requires costly RPC calls to copy logs from one data center to the other.</p></li><li><p><strong>Offline applications.</strong> What if your mobile phone were a data center? When you&#8217;re offline, you store changes to your local database. When you get back online, you sync your changes with a leader at a data center for persistence and backups. This is multi-leader replication taken to the extreme where every device acts like a leader.</p></li><li><p><strong>Collaborative applications.</strong> Tools like Google  Docs allow you to edit concurrently with other users. Think of your browser as a leader where you publish changes locally and see them instantly in the browser. In the background, you take those changes and push them to a remote leader replica. This replica syncs your changes with the changes of another individual. They ensure they all match nicely.</p></li></ul><p>Everything sounds great - so what&#8217;s the catch? It should be obvious at this point, but the big issue with multi-leader replication is <strong>write conflicts</strong>.  With multiple leaders comes multiple nodes where you can write changes to your database. Who has the correct answer? Is there a leader of leaders?</p><p>The easiest way to mitigate write conflicts is to simply <strong>avoid having them in the first place</strong>.  This may seem like a cop-out answer, but you can design your systems toward conflict avoidance. Having one leader per data center and routing users to specific data centers is a way to avoid conflicts. Specific updates in a particular range of data go to dedicated leaders. Of course, this reverts to being a microcosm of single-leader replication,  so if a data center goes down, you are forced to reconcile concurrent writes on different leaders.</p><p>If you can&#8217;t avoid conflicts, you can use some <em>tie-breaker heuristic</em> such as assigning UUIDs to data centers or records so that the highest numbered ID wins. Simple, but prone to data loss. In theory, this also allows you to merge conflicting values, but then you&#8217;ll need some sort of user intervention to reconcile the concatenated data.</p><p>Of course, you could implement your own custom conflict resolution scheme. Amazon has done with this some surprising effects, such as having items reappear in users&#8217; shopping carts after they have purchased items. While a suboptimal user experience, it is still likely better than losing data.</p><p>How do leaders communicate with each other? The book identifies three specific <em>topologies</em> for communication, and I see there are only two:</p><ul><li><p><strong>Every leader talks to every other leader.</strong> This ensures everyone gets the message from everyone else with a direct line of communication between every leader. The problem here is there is no causality to the writes because there is no order with which leaders are updated. As opposed to&#8230;</p></li><li><p><strong>Leaders update each other in a chain.</strong> An example of this would be a circular or star-shaped topology. In these schemes,  there is an ordering to how leaders communicate with each other which solves the causality problem. The challenge is that if a replica fails during the update chain, it breaks the chain, and all downstream updates will stall out. If a leader is early enough in the chain, most other leaders could suffer from data loss and stale information.</p></li></ul><p>As mentioned before, the best course of action is generally to avoid conflicts in the first place. Many database systems support some kind of conflict resolution scheme, but none are perfect.</p><h3>Leaderless replication</h3><p>The last major strategy with replication is leaderless replication, where <strong>every node can accept reads and writes.</strong>  Amazon Dynamo is the most famous example of leaderless replication and has ushered in a resurgence of this strategy. Cassandra, Riak, and  Voldemort have also adopted leaderless replication schemes. This scheme is ideal for applications that require <strong>high availability and low latency</strong> at the expense of a very loose definition of <strong>eventual consistency and stale reads</strong>.</p><p>When every database replica can write data, you open yourself up to lots of staleness. There are two primary strategies for dealing with  this stale data:</p><ol><li><p><strong>Use subsequent reads to detect stale data.</strong> The next time a user reads data, read it from multiple replicas. If any of those are stale you can issue follow-up writes to ensure the stale nodes are brought back up to the latest versions of the data. This is commonly called <em>read repair</em>.</p></li><li><p><strong>Run a heartbeat to detect stale data.</strong> Every update comes with a version number. Run a background process that pings every node to see what version of the data it has. If any of the nodes are less than the latest version number, update the databases. Continue to ping all databases in regular intervals to ensure staleness is mitigated promptly.</p></li></ol><p>Leaderless replication schemes often implement <em>quorums</em> on reads and writes to create consensus when there is a discrepancy. This is a tuneable threshold that allows developers to configure at exactly which point a vote passes to reconcile when replicas argue over which version of the data is the latest.</p><p><strong>Quorums really only work if you have sufficient replica nodes to break a tie.</strong>  This requires votes from read replicas, write replicas, and ensure those votes outnumber the number of replicas that debate the values. As long you have a majority vote on the state of reads and writes, you can proceed with quorum voting.</p><p>Further, <strong>monitoring is difficult with leaderless replication</strong>.  This is because there is no universal order to how data is consumed. If a node goes down, or worse, several nodes go down, you risk destroying the quorum.</p><p>A concept known as <strong>sloppy quorums</strong> was designed to mitigate against this. It states it is better to <strong>write the data even if a quorum is not achieved</strong> when the required nodes for a quorum vote are down or offline. They still ask for the designated number of votes, but they may not come from the approved pool of original nodes that belong to the quorum. Without the approved set of nodes, you have fewer guarantees into the latest state of the data since these nodes are not as closely monitored.</p><p>This method <em>increases write availability</em> but require further mitigation like <em>hinted handoff</em> to restore the quorum node team. It also requires backup plans like read repair to ensure that restored nodes eventually receive the latest updates.</p><p>Another issue you can run into with leaderless replication is <strong>concurrent writes</strong>.  A single change is propagated across multiple replicas. Each replica is subject to its own network latency and IO. There is no guarantee that any write will arrive at all replicas at the exact same time. How do you reconcile this case?</p><p><strong>Last write wins</strong> is a simple strategy that dictates that the latest write is the one that will persist, and all other writes for the same data are considered stale duplicates that can be dropped.  This sounds great in theory, but in practice, this is <em>bad for durability</em>.</p><p>Say your bank account reads $1. If you somehow issued 2 concurrent updates, mistakenly adding $2 instead of $4, you may run into trouble.  Both updates will say they were completed successfully. But if the $2  change arrives after the $4 change, your bank account will update to $3  even if that isn&#8217;t ultimately the correct answer. Cassandra mitigates this with a UUID attached to every write update to ensure seemingly concurrent operations are indeed differentiated.</p><p>There are numerous algorithms discussed in the book to determine concurrency. <strong>Concurrency is not concerned with things happening at the same </strong><em><strong>time</strong></em><strong> but happening </strong><em><strong>without knowing about each other</strong></em>. It&#8217;s extremely difficult to say with certainty that two events occurred at the <em>exact</em> same time. But they could occur in a close enough interval to not know about each other based on the state of the application.</p><p>Riak knows how to merge concurrent values with its <em>sibling merge</em> functionality. Riak also uses <em>version vectors</em> to issue read repair so that clients can retrieve them on reads and return them back to the databases on writes. My takeaway here is if you are looking for <strong>robust leaderless replication, look no further than Riak</strong>.</p><p>&#8211;</p><p>That wraps up the chapter on replicating distributed data. Another way to distribute data is through partitioning. This is the topic of the next chapter so stay tuned!</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 135 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to! </p>]]></content:encoded></item><item><title><![CDATA[Data models and data storage]]></title><description><![CDATA[User Interfacing Newsletter Volume 134]]></description><link>https://userinterfacing.substack.com/p/data-models-and-data-storage</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/data-models-and-data-storage</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 15 Jul 2021 21:00:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Continuing my <a href="https://adamconrad.dev/tag/systems-design/">systems design series</a> this week with two new articles (one of which I forgot to post last week). If you&#8217;re doing a systems design interview soon or you just want to know more about web-scale applications continue to follow along!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/data-models-and-query-languages/">Data models and query languages</a></h1><p>This chapter focuses on how you can organize and retrieve data from a  database. It primarily focuses on the three primary data modeling  paradigms:</p><ol><li><p>Relational</p></li><li><p>Document</p></li><li><p>Graph</p></li></ol><h2>Relational model</h2><p>This is the incumbent. The relation is the <em>table</em>. The individual datum within the table is the tuple called the <em>row</em>. Properties of a table exist on the <em>column</em>. You know, like any other table you would see in the real world.</p><p>I grew up with these database systems. They are what I studied in college. My master&#8217;s thesis was on RDBMS. They have been the dominant force in data management for most of the last 40 years.</p><p>The most cited open-source examples of relational databases are <strong>MySQL</strong> and <strong>Postgres</strong>.  They&#8217;re still useful and are the first choice for many frameworks like  Ruby on Rails or Django. It&#8217;s just that they suffer from a few problems:</p><ul><li><p><strong>They cannot scale without considerable effort.</strong> They are much harder to replicate or partition than they should be.</p></li><li><p><strong>Limited expressiveness.</strong> Querying and organizing relational schemas fits a specific mold. You have to be okay with that or else you&#8217;ll have to seek alternatives.</p></li></ul><p>So what are the alternatives?</p><h2>Document model and the rise of NoSQL</h2><p>NoSQL (which people would now call &#8220;Not Only SQL&#8221;) describes any kind of database that doesn&#8217;t follow the relational model. One thing I want to highlight is the term <em>polyglot persistence</em>. This refers to the idea that <strong>you can have both relational and nonrelational databases working together</strong>.  It&#8217;s not like you have to choose one paradigm over the other. In fact,  it might be advantageous to use both for your application to serve different needs.</p><p>I think this is important to call out because NoSQL implies that you&#8217;re specifically <em>not</em> choosing SQL. It&#8217;s as though they can&#8217;t work together in an application but in fact, they can and do.</p><ul><li><p>something like a resume could be a series of joins between a user  and their job experiences OR you could nest those joins into one  cohesive JSON model</p></li><li><p>just one thing to fetch     </p><ul><li><p>it actually looks like the thing you&#8217;re representing (a resume <em>is</em> a document) - also means many-to-one and many-to-many relationships don&#8217;t work so well</p></li><li><p>fast: requires no joins since it is self-contained (also means poor support for combining disjointed data)</p></li><li><p>highly flexible: no federated schema (also means no referential integrity)</p></li></ul></li></ul><h3>How do you know the document model is right for you?</h3><p>Are you working with documents like profiles, resumes, HTML pages?  It&#8217;s great. If you can populate that whole document it&#8217;s very efficient.  If you have a lot of nested relationships or links to other documents it starts to become cumbersome.</p><p>A list of jobs might be two separate tables in a relational model. In the document model, they will all be listed out. The exception is if you have created a separate document for all job types. At that point,  you&#8217;re heading in the wrong direction.</p><p>One-to-many, tree-like data structure? Good. Many-to-many, graph-like data structure? Bad - stick with a relational or graph database.</p><p>So when does something look like a document in the real world? The two often-cited examples I see are:</p><ul><li><p><strong>CMS</strong>. The primary object of a blog engine is a blog post which is a document. The important thing is that it is <em>unstructured</em>. The content of the blog doesn&#8217;t need to fit a particular format.</p></li><li><p><strong>E-commerce product catalog</strong>. Imagine a service like Amazon. They have <em>tons</em> of products. Other than the SKU there is really no mandatory format for structuring how you display a product. This falls into the <em>large volumes</em> of <em>unstructured</em> data category which could be a good fit for a document model database.</p></li></ul><h3>Mongo is to Python as Postgres is to Java</h3><p>This analogy just kept swimming in my brain. One of the key benefits  (and drawbacks) of a document database is its loose constraints on schemas. The book makes an interesting analogy in that it&#8217;s like runtime compilation: no schemas are validated on writes on the way into the database but you can validate a schema on read. This means you can only be assured of the structure of the document when it is being read from the database.</p><h4>SQL is to CSS as JSON is to the DOM</h4><p>In a similar but not nearly as clean analogy, we can further think of the paradigms of database programming languages. Relational databases use declarative SQL like CSS. They optimize around <em>patterns</em> rather than <em>algorithms</em> because you just <em>declare</em> how you want to filter out your data and you let the language choose the algorithm. This allows for terse, parallelizable code where the language can handle performance optimization and you focus on just getting your data.</p><p>Since NoSQL databases don&#8217;t necessarily use SQL their method of storage and retrieval revolves around their documents, commonly stored in formats like XML and JSON. In theory, you can use any old imperative programming language like JavaScript to interact with the database. This is nice in theory since you are programming UIs and business logic in the same programming paradigm. The downside is that your code is likely more verbose, uglier, and requires a specific algorithmic sequence to execute. Think of it like styling a page with JavaScript; you could -  but why would you do that to yourself?</p><h3>Writing is not my strength&#8230;</h3><p>Reads are the name of the game here. <strong>Small, unmodified documents are best.</strong>  Anything else you risk heavy performance penalties. Documents get rewritten as a whole so minor updates to big documents are a huge drain on performance. The benefit of having all of the data shoved into one document is to remove the need for complicated things like joins. The drawback is without joins you have to colocate data. This can become expensive if the document becomes expensive.</p><h3>&#8230;and it may not matter</h3><p>Postgres supports JSON columns. Mongo supports foreign references in a  weird sort of join operation. The truth is, the document and relational models may not be all that different soon so you aren&#8217;t locked into one idiom between the major database providers anymore. The book goes into an example of this with the MapReduce extension on MongoDB. I didn&#8217;t  think the example was worth stating here but the last sentence on this  topic is a great summary of what I took away from this section:</p><blockquote><p>The moral of the story is that a NoSQL system may find itself accidentally reinventing SQL, albeit in disguise</p></blockquote><h2>Graph models</h2><p>Remember how earlier I said one-to-many relationships were a good fit for document databases and many-to-many were good for graph or relational databases? Now let&#8217;s pick that apart further.</p><p>If your many-to-many relationship is simple, you can probably get away with a relational database. <strong>For complex many-to-many relationships, a graph database is a good choice.</strong></p><p>What&#8217;s an example of a complex many-to-many relationship? You already know canonical examples:</p><ul><li><p><strong>Social networks.</strong> People know lots of other people. Just ask <a href="https://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon">Kevin Bacon</a>.</p></li><li><p><strong>The web.</strong> Web crawlers are designed to demystify the tangled mess of connecting and indexing every website.</p></li><li><p><strong>Transportation.</strong> Roads, railroads, and airports all connect points across the globe. This is a <a href="https://online.stanford.edu/courses/soe-ycs0012-shortest-paths-revisited-np-complete-problems-and-what-do-about-them">hard problem</a> and one I&#8217;ve <a href="https://adamconrad.dev/blog/np-completeness/">explored before</a>.</p></li></ul><p>To be honest, I found this section to be a bit dense on specific kinds of graph databases that may not be relevant today so I&#8217;ll gloss over each section with the critical parts I took away.</p><h3>Property graphs and Cypher</h3><p><a href="https://neo4j.com/">Neo4j</a> is <em>the</em> example I see all over the web on graph databases. I think if you just knew this one and <a href="https://aws.amazon.com/neptune/">Amazon Neptune</a> (which seems to support all kinds of graph database models) you&#8217;d be fine.</p><p><strong>This is how I would imagine you would design a graph data structure at scale</strong>. There are two main objects in a property graph DB: the <code>vertices</code> and the <code>edges</code>.  Like a database, each of those things has a UUID. They also have information as to where they go and who uses them. And as the <em>property</em> name suggests, each of these objects also has metadata in the form of key-value pairs.</p><p>The power here is in the <em>flexibility to build graphs</em> and the <em>tagging you can store to find your vertices and edges</em>. Property graphs don&#8217;t restrict how you construct your graph. <strong>Graphs don&#8217;t require a schema other than the basic vertex and edge</strong>. So you&#8217;re free to design it however you like. The power of the model is in <em>how you relate things</em>.</p><p>These key-value tags make it easy to find information in the graph <em>without ruining your data model</em>. It also means <strong>you don&#8217;t have a traverse a graph to find information</strong>.  Tags and IDs allow you to quickly lookup vertices or edges without having to go through all of the graph connections. They&#8217;re like the shortcuts to traveling across the network.</p><p><strong>If you need to evolve your features it doesn&#8217;t ruin the data</strong>.  The key-value pairs allow you to create new associations between your core objects without your graph fundamentally having to change. Sounds like Facebook would be a good example of this: people are your edges and their connections are the vertices. In the old days of Facebook, you could list out your favorite bands or movies. A property graph database would allow you to add something like TV shows without having to totally screw up your existing graph or its associations.</p><p><strong>Cypher is to property graphs as SQL is to relations</strong>.  That&#8217;s all you need to know here. It&#8217;s a declarative programming language for Neo4j in the same way SQL is a programming language for databases like MySQL, Postgres, MariaDB, and SQLite.</p><h3>Triple-store graphs and SPARQL</h3><p>This is another graph database variant. Instead of vertices and edges  as the primary objects a triple-store graph uses, you guessed it, three  objects: <code>subjects</code>, <code>predicates</code>, and <code>objects</code>.  This one intuitively makes less sense to me than a property graph because I don&#8217;t think of a graph as I think of an English sentence.</p><p>Here is how you make sense of these three things:</p><ul><li><p><strong>Subjects are always vertices</strong>. They are nouns and stuff like <em>people</em> and <em>fruit</em>.</p></li><li><p><strong>Objects and predicates have 1 of 2 states</strong>.     </p><ol><li><p><strong>The object is another vertex</strong>. Then the <em>predicate is the edge</em> connecting <code>subject</code> and <code>object</code> together.</p></li><li><p><strong>The object is a primitive type</strong>. Then the <em>predicate is a property</em> where the <code>object</code> is a data type of the <code>subject</code>.</p></li></ol></li></ul><p>The book lists <a href="https://www.datomic.com/">Datomic</a> as an example of a triple-store graph but it doesn&#8217;t market itself as a graph database but an amalgamation of many flexible data models. For practical purposes of this audience, you&#8217;re likely not to run into a scenario like this.</p><p><strong>SPARQL is to triple-store graphs as Cypher is to property graphs</strong>. SPARQL is the programming language for triple-store graph databases using the <a href="https://www.w3.org/RDF/">RDF data model for the semantic web</a>.  Given that the Semantic Web never really took off, it&#8217;s more of a  reason why you don&#8217;t need to invest more than a few paragraphs into understanding these things.</p><h2>Further reading and study</h2><p>Since this was a much meatier chapter, I found I had some additional notes from the previous <a href="https://www.youtube.com/watch?v=bUHFg8CZFws">walk-through</a> that was relevant here. There is another video <a href="https://www.youtube.com/watch?v=iJLL-KPqBpM">in that same series</a> I used for practice this week.</p><p>I found myself referencing a few articles which may be helpful in understanding NoSQL databases:</p><ul><li><p>https://shopify.engineering/five-common-data-stores-usage -  Shopify did a nice job of simply explaining the use cases for five different kinds of data stores. The segmentation is a bit odd here and it doesn&#8217;t align with what I&#8217;ve read in the book but it&#8217;s still factual information even if the categorization is faulty.</p></li><li><p>https://www.prisma.io/dataguide/intro/comparing-database-types#relational-databases-working-with-tables-as-a-standard-solution-to-organize-well-structured-data  - This Prisma article was great because it expanded my knowledge even further beyond NoSQL databases to NewSQL, multi-model, time series, and more.</p></li><li><p>https://blog.nahurst.com/visual-guide-to-nosql-systems - I like that this post has a diagram that revolves around the CAP theorem. It helped me place where NewSQL fits and how to actually tell the difference between HBase and Cassandra.</p></li><li><p>https://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis -  Another mega list of NoSQL solutions which categorizes based on popularity rather than storage type. I actually really liked this  because it simplified my thought process to a pretty rock solid list:</p></li></ul><ol><li><p><strong>Want relational?</strong> Use Postgres.</p></li><li><p><strong>Want an in-memory key-value store?</strong> Use Redis.</p></li><li><p><strong>Want relational without the schema?</strong> Use MongoDB.</p></li><li><p><strong>Want web analytics?</strong> Use Cassandra.</p></li><li><p><strong>Want a full-text search?</strong> Use ElasticSearch.</p></li><li><p><strong>Working with documents, specifically a CMS or CRM?</strong> Use CouchDB.</p></li><li><p><strong>Building a search engine or log analysis?</strong> Use HBase.</p></li><li><p><strong>Working with graphs?</strong> Use Neo4J or OrientDB.</p></li></ol><h3>System design tradeoffs between SQL and NoSQL solutions</h3><p>A few questions you have to ask yourself when comparing SQL and NoSQL solutions as they relate to scalability:</p><h4>How do you scale reads? Writes?</h4><p>For SQL solutions, you&#8217;ll want to shard servers when the database runs out of space. Use a cluster proxy to abstract away the shards. Use a  configuration service like ZooKeeper to ensure all shards are online and be sure to toggle backups in the event of a downed shard.</p><p>For NoSQL solutions, you&#8217;ll also want to perform sharing. However,  there is no need for a cluster proxy because each shard knows about the other. Thus, no configuration service is needed.</p><h4>How do you make reads/writes fast?</h4><p>For SQL solutions, you&#8217;ll want to use a shard proxy to cache results and publish metrics, and terminate long-running processes.</p><p>For NoSQL solutions, no shard proxies are required because all nodes know about each other. Quorum nodes are used to ensure you don&#8217;t need to talk to every node to get a consensus on whether or not the operations succeed.</p><h4>How do you prevent data loss?</h4><p>For both SQL and NoSQL solutions, you&#8217;ll want to create read replicas of shards in different data centers.</p><h4>How do you achieve consistency?</h4><p>For SQL solutions, you&#8217;ll want to sync lead data to follower replica data. This leads to consistent data. It also takes a long time to process.</p><p>For NoSQL solutions, data is pushed to the read replicas asynchronously. This provides eventual consistency and is fast.</p><h4>Other questions worth asking</h4><ul><li><p><strong>How do you recover data in case of an outage?</strong>  Data recovery is much harder for a relational system that sacrifices partition tolerance so you&#8217;ll need to focus more on cold storage backups while NoSQL solutions are much easier to replicate their replicas across centers.</p></li><li><p><strong>How do you ensure the data is secure?</strong> I only saw mentions of Accumulo and Riak specializing in security. Otherwise, every database needs to worry about this regardless of storage type.</p></li><li><p><strong>How extensible is the DB to an evolving data model?</strong> Evolving data models are better suited for a graph database than a document database.</p></li><li><p><strong>How easy is it to run on/off-prem?</strong> This question was asked in the systems design video from last week but I don&#8217;t think most companies really need to worry about on or off-premises solutions anymore.</p></li><li><p><strong>How much will it cost?</strong> Most solutions these days are open-source. The cost will come down to your strategy for your horizontal scaling and partitioning.</p></li></ul><div><hr></div><h1><a href="https://adamconrad.dev/blog/storage-and-retrieval/">Storage and retrieval</a></h1><p>This chapter is all about getting and sending data. There are two main kinds of data stores:</p><ol><li><p>OLTP. This includes your traditional relational and NoSQL databases. They comfortably store terabytes of data, are highly available, and are designed for the end-users of your applications.</p></li><li><p>OLAP. This includes data warehouses from names like Oracle and IBM Db2. They store into the petabytes of data, are primarily read-only copies of several  OLTP databases, and are designed for business analysts.</p></li></ol><p>One thing to note about OLAP data stores is the simplicity of their data models. While the entire <a href="https://adamconrad.dev/blog/data-models-and-query-languages/">last chapter</a> was dedicated to the variety of OLTP data models, there are really only two models in use for OLAP systems:</p><ol><li><p><em>Star schemas</em>, named after the star-like shape representing the central fact table that points out to supporting dimension tables</p></li><li><p><em>Snowflake schemas</em>, which add on sub-dimensional tables to the above star schema with a more complex, snowflake-like pattern</p></li></ol><p>The seemingly obvious comparison is that snowflake schemas are more complex because of their additional normalization with sub-dimensional tables. Conversely, star schemas are simpler to conceptualize with less branching. Either way, both support lots (100+) of columns.</p><h2>Column-store databases for big data</h2><p>Wide-column fact tables benefit from column-store databases. As the name suggests, you&#8217;re inverting the way data is stored and retrieved.  Rather than store data in rows, where each entry corresponds to a single object and various properties of that object in columns, you store all of the values for a single property together.</p><p>Since a massively wide fact table is likely only utilizing several columns in a given query, data organized by column lends itself well to these kinds of analytics queries. You can partition and shard data by column which makes searching against particular columns even more efficient.</p><p>Since all data in a given column adheres to the same type, you can think of a column as one giant array. This makes column-store databases effective at compressing data with techniques such as bitmap encoding.  With more stuff able to fit in memory, column stores can effectively use computer caches to leverage lots of CPU cycles to iterate through data.  You can further improve efficiency when grouping or filtering by sorting your columnar data.</p><p>Finally, column stores can leverage highly specialized materialized views called data cubes. Data cubes make it easy to reference a lot of aggregated data. This is a way to precompute data and display it for fast retrieval.</p><p>All of these make reads incredibly efficient for even the largest data sets. The clear downside is the cost to write data. A table with  500 columns might now be spread out across 500 files, one for each column. That means adding a new entry means writing 500 properties to  500 files. If that entry just happens to max out the file size on disk you&#8217;ll have to perform even more writes to partition and segment out your data. In other words, writing is expensive. As we&#8217;ll see later on in this post, there are tools like LSM-Trees that can effectively speed up data storage.</p><h2>Data retrieval techniques</h2><p>Storing data is straightforward. Write data to an append-only log and save the file to disk.</p><p>Retrieving data, on the other hand, that&#8217;s where things get interesting. The book presents a progressively complex way of retrieving data efficiently.</p><h3>Hash index</h3><p><em>Indexing</em> is the general strategy for retrieving data quickly. By writing only the data you search against into memory you trade space for speed. The downside, besides the additional space requirements, is the cost to write the data. Data stored in multiple places requires multiple writes to disk and takes more time.</p><p>One way to index is with a hash code, just as hash maps/tables relate keys to values. An example would be Bitcask. Bitcask is the storage engine powering Riak.</p><p>As we saw from the <a href="https://www.youtube.com/watch?v=bUHFg8CZFws">YouTube</a> example, we need to count video views. The video offers Cassandra as the data storage mechanism of choice. The book might suggest that Riak with Bitcask might be the ideal choice. Bitcask uses an in-memory hash table separate for what is stored in disk. This, in turn, makes frequent writes still fast on read.</p><p>Everything about this sounds great, right? We have a method that is:</p><ul><li><p><em>Scalable</em>: we can shard the data on disk while keeping the indexes in memory</p></li><li><p><em>Fault-tolerant</em>: the database can go down in a separate data center that stores the index</p></li><li><p><em>Eventually consistent</em>: indexes can now be updated independently of the data stored on disk</p></li><li><p><em>High throughput</em>: the right hashing strategy limits collisions which allow for a lot of conflict-free storage</p></li></ul><p>There are two limitations with hash indexes:</p><ol><li><p><em>Slow range queries on indexes.</em> Since the index key is a code and the codes are unique you don&#8217;t gain any speed searching a range of values.</p></li><li><p><em>Size limitations.</em> If you run out of memory the whole thing falls apart. Extreme-scale applications that fill a hash table index completely are the one exception to scalability.</p></li></ol><h3>SSTable</h3><p>The next evolution of hash indexes is Sorted String Tables, also called SSTables. SSTables provide some additional benefits:</p><ul><li><p>They only store keys once, saving on storage space.</p></li><li><p>They sort the keys to further speed lookups.</p></li><li><p>They use a variant of merge sort to merge and compact segments.</p></li><li><p>The organization of that data can be implemented as a red-black or  AVL tree, allowing you to write in any order and read in sorted order.  This makes it easier to store in memory.</p></li></ul><p>I didn&#8217;t touch on segments earlier. A <em>segment</em> is just <strong>a means of sectioning off a data log</strong>. To prevent running out of space you need a means of separating your indexes across files. To reduce the space requirements we <em>compact</em> the segments by removing duplicate keys and only keeping the most recent write to that key.</p><p>This implementation of an in-memory balanced tree for keeping a cascading tier of SSTables is aptly called a <strong>Log-Structured Merge-Tree</strong> or LSM-Tree for short. Lucene, the <a href="https://lucene.apache.org/">Apache search library</a> that powers ElasticSearch and Solr, uses something like an LSM-Tree to store its dictionary of terms and SSTable-like files to map those terms to postings.</p><p>More specifically, if you&#8217;re dealing with a dictionary of words you&#8217;d want to use a structure that tailors itself to strings instead of numbers. We&#8217;ve already evolved past a hash table so that is out. A  self-balancing binary tree is out, too. Suffix/prefix trees like <a href="https://en.wikipedia.org/wiki/Trie">tries</a> are specific to strings but suffer from the same problem of taking up lots of space and eating away at RAM. So what&#8217;s left? That&#8217;s where the mighty <a href="https://en.wikipedia.org/wiki/Bloom_filter">Bloom filter</a> comes to the rescue.</p><p>A Bloom filter is a probabilistic data structure that is sort of an inversion of other data structures. Rather than using the information to find if data is contained within a structure, a Bloom filter tries to determine if something is definitely not in the set or if it might be in a set. The &#8220;might&#8221; part here is key because it&#8217;s not guaranteeing validity. There is a chance for a false positive.</p><p>With a sufficient number of hashes, you can obtain a low false-positive rate to obtain extremely accurate results with a very low amount of indexing space. This solves our biggest problem with indexes when the data is really large and you&#8217;re worried you will run out of in-memory storage for your index. A Bloom filter can handle extreme scale and still perform well with the tradeoff that your results aren&#8217;t always 100% accurate.</p><h3>B-tree</h3><p>We&#8217;ve talked about efficiently retrieving data in memory. What if you want to retrieve data on disk? The <a href="https://en.wikipedia.org/wiki/B-tree">B-tree</a> is the most widely-used and heavily studied database index lookup tree.  I had to build one of these for my relational database class in college. It&#8217;s another self-balancing tree structure used in all of your major RDBMSs like Postgres and MySQL.</p><p>While both LSM-Trees and B-trees contain key-value pairs sorted by key, the strategy for separating data is completely different. The  Log-structured indexes can be of variable size. They can also be quite large, spanning into multiple megabytes. B-tree indexes, by contrast,  are always fixed blocks of typically 4 KB or more. Since disk pages are also aligned in fixed blocks, the B-tree is better suited for sorting and retrieving data on disk instead of in memory.</p><p>B-trees are structured in layers so that the lower levels represent the range of values in between two values in the parent layer. As we saw earlier, in-memory indexes suffer from poor performance in range queries. B-trees do not.</p><p>The <em>branching factor</em> determines how wide each layer of the tree is before the range must be split down to a lower layer. For conventional databases with these 4 KB pages, you could have a branching factor of only 500 and only need to traverse down 4 levels before you have stored 256 <em>terabytes</em> of data. That&#8217;s a flat and efficient tree!</p><p>In terms of system design, how does this compare in performance to the in-memory solutions?</p><ul><li><p>It is also scalable because the partitions are small, 4 KB pages.</p></li><li><p>The data structure inherently supports range queries as a result of the branching factor.</p></li><li><p>Fault tolerance is achieved through a write-ahead log which writes the data changes to the WAL before it is written to the B-tree (hence,  write-_ahead_).</p></li><li><p>Locks on the B-tree called latches can be introduced to preserve consistency in an ACID-compliant manner, achieving a higher level of consistency than with a log-structured index.</p></li></ul><p>When comparing log-structured against B-tree indexes, the main rule of thumb is to <strong>consider performance on reads or writes</strong>.  Though performance testing will confirm this for your implementation,  log-structured indexes are thought to be better for writes. Conversely,  B-trees are considered better for reads. This is because LSM-Trees frequently write, segment, and compact their SSTables to create efficiency.</p><p>On the other hand, B-trees offer a more reliable indexing scheme because the keys are only written once and do not suffer from a high level of writes due to compaction. The pages are separated into small,  predictable pages and do not require sizable computation for write compaction and segmentation. This is particularly useful for transactional databases when ACID guarantees are a must. That would explain why B-trees have stood the test of time for so long.</p><h3>Other indexes</h3><p>The book offers a few more indexing suggestions, such as secondary indexes for joins, clustered indexes where the value is a heap file rather than the raw row data, multi-column indexes like <a href="https://en.wikipedia.org/wiki/R-tree">R-trees</a>, and fuzzy-search indexes like those we talk about with ElasticSearch and Solr.</p><p>Then some indexes are colocated with the whole database in memory,  such as the case with Memcached or Redis. Now the entire thing, both the index and the raw data, are stored in memory. You only need a hard disk for fault tolerance and durability. Further, in-memory databases allow for more flexibility in the data structures they utilize. It is not uncommon to interface with a priority queue or set with something like  Redis.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 134 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to! </p>]]></content:encoded></item><item><title><![CDATA[Scalability, reliability, and maintainability]]></title><description><![CDATA[User Interfacing Newsletter Volume 133]]></description><link>https://userinterfacing.substack.com/p/scalability-reliability-and-maintainability</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/scalability-reliability-and-maintainability</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 29 Jun 2021 17:00:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Last year I wrote a blog post series on <a href="https://www.adamconrad.dev/tag/algorithms">algorithms</a> that is now a <a href="https://www3.cs.stonybrook.edu/~skiena/373/">companion series</a> to the official lectures from Prof. Skiena. I wanted to do the same thing with systems design with the same purpose: to really learn this stuff because I expect the people I&#8217;m hiring to know it as well. It&#8217;s only fair, right?</p><p>So the next several weeks are going to be blog posts on my learnings as I read through <em>Designing Data-Intensive Applications</em>. If you&#8217;re a hiring manager or someone on the job market right now this should be a highly informative series for you to check out and stay tuned for!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/book-club-ch-1/">Scalability, reliability, and maintainability</a></h1><p>Like my series on <a href="https://adamconrad.dev/blog/why-hiring-is-broken-and-how-im-dealing-with-it/">Algorithms</a>, I&#8217;ve decided that I need to <em>really</em> understand systems design.</p><p>I run hiring for multiple teams. Some of our questions revolve around systems design. How can I possibly ask these questions if I couldn&#8217;t answer them perfectly myself?</p><p>It&#8217;s only fair that I master these concepts. The book that everyone seems to agree with is the best book on this topic is <em><a href="https://dataintensive.net/">Designing Data-Intensive Applications</a></em> by Martin Kleppmann.</p><p>In the spirit of my last educational series, I will transcribe my raw notes over the next 7 weeks or so. I do this both to teach my readers and also to reinforce the concepts myself. As I recall from my course on <a href="https://www.coursera.org/learn/learning-how-to-learn">learning how to learn</a>, one of the best ways to learn is to teach others.</p><h2>The syllabus</h2><p>I&#8217;ve decided to craft a syllabus for myself as if I were both the teacher and the student to help keep me on track and reinforcing the concepts. If you have a similar learning plan or have questions about mine, please feel free to <a href="https://adamconrad.dev/newsletter">reach out</a>.</p><ul><li><p>Week 1 (this week)     </p><ul><li><p>Read Chapter 1: Scalability, Reliability, and Maintainability</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=bUHFg8CZFws">Design a scalable system to count events</a></p></li><li><p>Listen: the <a href="https://www.youtube.com/watch?v=grGqCuTcu50">book&#8217;s podcast</a></p></li><li><p>Explore, at a high-level, data tools in the space</p></li></ul></li><li><p>Week 2     </p><ul><li><p>Read Chapter 2: Data Models &amp; Query Languages</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=kx-XDoPjoHw">Top K Problem</a></p></li></ul></li><li><p>Week 3     </p><ul><li><p>Read Chapter 3: Storage &amp; Retrieval</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=iuqZvajTOyA">Distributed cache</a></p></li></ul></li><li><p>Week 4     </p><ul><li><p>Read Chapter 5: Replication</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=FU4WlwfS3G0">Rate limiter</a></p></li></ul></li><li><p>Week 5     </p><ul><li><p>Read Chapter 6: Partitioning</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=bBTPZ9NdSk8">Notification service</a></p></li></ul></li><li><p>Week 6     </p><ul><li><p>Read Chapter 8: Faults &amp; Reliability</p></li><li><p>Practice: <a href="https://www.youtube.com/watch?v=iJLL-KPqBpM">Distributed messaging queue</a></p></li><li><p>Read: <a href="http://highscalability.com/blog/2010/11/16/facebooks-new-real-time-messaging-system-hbase-to-store-135.html">Facebook&#8217;s messaging queue with HBase</a></p></li></ul></li><li><p>Week 7     </p><ul><li><p>Read Chapter 9: Consistency &amp; Consensus</p></li><li><p>Practice: Read the <a href="http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html">High</a><a href="http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster">Scalability</a><a href="http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html">Series</a> on Twitter and implement it</p></li></ul></li><li><p>Week 8     </p><ul><li><p>Skim Ch 10 &amp; 11: Stream and Batch Processing</p></li><li><p>More possible practice that leverage stream/batch processing like <a href="https://www.youtube.com/watch?v=umWABit-wbk">Uber</a></p></li></ul></li></ul><h2>Notes on Chapter 1</h2><p>Chapter one is really an overview chapter. It&#8217;s easy to read and easy to skim. There aren&#8217;t too many deep concepts here. I found lots of shortlists/rules of thumb to be all you need to focus on the basics.</p><h3>Data storage</h3><p>When thinking of data storage, consider these 5 buckets:</p><ol><li><p>DB engines (Postgres, Cassandra, CouchDB)</p></li><li><p>Search indexes (ElasticSearch, Solr)</p></li><li><p>Caches (Memcached, Redis)</p></li><li><p>Batch Processing (Storm, Flink, Hadoop)</p></li><li><p>Stream Processing (Kafka, Samza, Flink)</p></li></ol><h3>Functional vs non-functional requirements</h3><p>Requirements concepts fall into 2 categories:</p><ol><li><p><strong>Functional requirements</strong> such as API design and type signatures</p></li><li><p><strong>Non-functional requirements</strong> like scalability, fault tolerance, and so on</p></li></ol><h3>Requirements gathering</h3><p>When asking questions regarding a product spec for a large-scale system, focus on these 5 categories of questions:</p><ol><li><p><strong>Users:</strong> Who are they? What do they do with the data?</p></li><li><p><strong>Scale:</strong> How many requests/sec? Reads or writes?  Where is the bottleneck? How many users are we supporting? How often/fast do users need data?</p></li><li><p><strong>Performance:</strong> When do things need to be returned/confirmed? What are the tolerance and SLAs for constraints?</p></li><li><p><strong>Cost:</strong> Are we optimizing for development cost or operational/maintenance cost?</p></li><li><p><strong>CAP theorem:</strong> The P (partition tolerance) is always assumed to fail. That is why you always need redundant partitions and backups. Therefore, you want to ask what is more valuable:  consistency or availability?</p></li></ol><p><strong>If consistency is most important</strong>, consider an ACID database like Postgres or MySQL. <strong>If availability is most important</strong>, consider a BASE database like an eventually consistent NoSQL solution such as CouchDB, Cassandra, or MongoDB.</p><h3>The three system qualities in 1 line</h3><p>This chapter can effectively be summarized in 3 sentences:</p><ol><li><p><strong>Scalability</strong> determines if this system can <em>grow</em> with the growth of your product.</p></li><li><p><strong>Reliability</strong> determines if this system produces <em>correct results</em> (nearly) each and every time.</p></li><li><p><strong>Maintainability</strong> determines if this system can <em>evolve</em> with your team and is easy to understand, write, and extend.</p></li></ol><h3>Further reading and study</h3><p>As I said before, this is a pretty simple chapter. I also watched <a href="https://www.youtube.com/watch?v=bUHFg8CZFws">this systems design intro</a>.  This video extended these concepts and informed some of these notes. I  like to accompany learnings with practice to seed new questions for our own <a href="https://indigoag.com/join-us#openings">interview process</a>. <a href="http://highscalability.com/youtube-architecture">This article</a> on YouTube&#8217;s architecture further reinforces the sample problem on the  YouTube video (how meta). You can check your solution against the one that was really used by YouTube.</p><p>Check-in next week with a summary of Chapter 2 of the book: <em>Data Models &amp; Query Languages</em>!</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 133 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to! </p>]]></content:encoded></item><item><title><![CDATA[Effective messaging to engineers]]></title><description><![CDATA[User Interfacing Newsletter Volume 132]]></description><link>https://userinterfacing.substack.com/p/effective-messaging-to-engineers</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/effective-messaging-to-engineers</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 22 Jun 2021 17:00:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>I&#8217;ve been really intrigued by OCR (Optical Character Recognition) technology lately. We&#8217;re doing a lot of document uploads at my job and it would be super helpful to learn more about how to apply this kind of thing in a sensible manner on the front-end. Thankfully, Smashing just released <a href="https://www.smashingmagazine.com/2021/06/image-text-conversion-react-tesseract-js-ocr/">this article</a> this week which I and my teams are pouring through. It&#8217;s my only article for the week I wanted to share here, other than some new newsletter thoughts I&#8217;ve been ruminating over since last week.</p><p>Have a great start to summer!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/effective-messaging-for-candidates/">Effective messaging for candidates</a></h1><p>Recruiters have told me that they achieve a 7% (at best) success rate for replies to messages from candidates. Meanwhile, I&#8217;m able to secure a  <strong>60% success rate</strong> when I reach out to prospective engineering candidates. The main reason for this is that <strong>engineers prefer to hear from other engineers</strong>.  The weight of a message from a VP or Director is much greater than that of a recruiter or someone outside of the engineering org. That&#8217;s why it is so important to <a href="https://adamconrad.dev/blog/its-not-hard-to-care/">message the candidates yourself</a>.</p><h2>How to set up your messages</h2><p>I reach out to candidates on LinkedIn. It&#8217;s hard to find candidate emails. Honestly, I&#8217;m getting enough of a response that I don&#8217;t need to stalk them anyway. This saves me a lot of time so I can just focus on the message.</p><h3>Start your message off with a real greeting</h3><p>Don&#8217;t rely on LinkedIn to create a salutation. Sure, they guarantee you won&#8217;t screw up the spelling (or worst, copy-paste the wrong name).  But they look fake as hell. <em>Don&#8217;t be fake</em>.</p><h3>Next, I&#8217;ll admit they&#8217;re probably happy where they are</h3><p>Most candidates are off the market so I&#8217;m not going to pretend they&#8217;re actively looking and excited to see what we have to offer.</p><p><em>It helps if they have been somewhere for a few years</em>. I&#8217;ll call that out too because then they understand that I&#8217;m reaching out because it&#8217;s reasonable to assume they might be starting to look elsewhere. On the flip side, I won&#8217;t reach out to someone who started a  new job 3 months ago. That would just prove I&#8217;m not paying attention.</p><h3>Why they would be the right fit for the role I have open</h3><p>After we get the reason for connecting out of the way I connect <strong>what they have on their resume to what I&#8217;m looking for</strong>.  I&#8217;ll get specific - their Python experience, a previous employer in the logistics industry, or an interest in microservices and building stream processing tools. Just something to show that I&#8217;m reading the fine print and not just the absolute basics like their name.</p><h3>Hone the message of why we&#8217;re a big deal</h3><p><em>We&#8217;re making software to help farmers raise, sell, and distribute their crops sustainably</em>.  That&#8217;s it. You need to get your message down to something succinct. It helps that we have a strong mission for folks to connect to (and <a href="https://indigoag.com/join-us#openings">I&#8217;m hiring</a>).</p><h3>Close the sale</h3><p>I always end by saying something to the effect of &#8220;if that sounds  interesting can we set up a time to chat next week?&#8221; This is a lesson  I&#8217;ve learned from my days in consulting sales. People are more likely to respond if they <strong>have a specific request with a specific timeframe to respond</strong>. The fewer reasons for a candidate to say no the better.</p><h2>Messaging logistics that might be helpful</h2><p>Now that you&#8217;re ready to hit send, here are the last few things to keep in mind to further optimize your open and response rate:</p><ul><li><p>The <em>best day</em> to send a message is <strong>Thursdays</strong>. Or at the least - not weekends and not the start/end of the week.</p></li><li><p>The <em>best time</em> to send a message is <strong>noon EST</strong>.  It&#8217;s lunch on the east coast and breakfast on the west coast. People  check their emails and messages at this time. If they&#8217;re already on the platform they have more inertia to read and answer.</p></li><li><p>The <em>best length message</em> is <strong>under 500 characters</strong>.  I break that rule often. After all, it&#8217;s hard to capture everything above in under 500 characters. I never go above 600-650 characters. If you can tailor an authentic message in under 500 characters I&#8217;d love to see it because I&#8217;ve had a real hard time making that happen.</p></li><li><p><strong>Respond within 24 hours.</strong> I&#8217;d advise you to check  LinkedIn daily. It helps keep your message congruent in being interested in the candidate by truly wanting to hear from them with a sense of urgency.</p></li></ul><p>With all of these strategies implemented I routinely receive a <strong>60% open rate and a 30% reply rate</strong>. Even if a candidate says no - you can <strong>still win a fan</strong>. Be sure to thank the candidate for opening and responding and be sure to <strong>ask them if they know anyone who would be a better candidate we should talk to</strong>.  Most people are willing to offer up a name (or 3). All of these ideas will help further expand your network and get you closer to hiring your next engineer.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 132 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to! </p>]]></content:encoded></item><item><title><![CDATA[How to stay remote after things return to normal]]></title><description><![CDATA[User Interfacing Newsletter Volume 131]]></description><link>https://userinterfacing.substack.com/p/how-to-stay-remote-after-things-return</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/how-to-stay-remote-after-things-return</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 15 Jun 2021 17:00:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>As opposed to last week, I have two more posts to share with you all in the span of a week. I&#8217;m back on my writing kick and I still have plenty more to share. This week we&#8217;re focusing on <strong>becoming an engineering manager</strong> and <strong>managing remotely</strong> even after the pandemic is over. Remote work has taken a front seat over the last year and now that some parts of the world are starting to get the pandemic under control companies are already starting to roll back their WFH policies.</p><p>If your company is still offering the option I would read below on how to keep it up without losing your sanity.</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/becoming-an-engineering-manager/">Becoming an engineering manager</a></h1><p>The following is a README I give to all of my new managers. Think of it like a step-by-step guide to the broader <a href="https://adamconrad.dev/blog/a-90-day-plan-for-managers/">90-day plan</a> you would offer your manager when you start in a new role.</p><h2>Welcome!</h2><p>Your first few months as a manager here at Indigo are crucial to your success, and we&#8217;re here to support you!</p><p>This new manager issue is a launchpad, and it connects you with crucial information about being a manager at Indigo. It has been designed to ensure you start your journey as a manager with all the resources and training available.</p><p>Items on this issue are identified as either <strong>required</strong> (in bold) or <em>optional</em>  (in italics). Optional items may not be applicable to your style or team dynamic. Experiment with them for a few days or weeks. If you discover a useful practice or resources outside of this list, please feel free to leave a comment or edit this file.</p><h3>Your First Week</h3><ul><li><p><strong>Schedule a handover meeting with the current team manager</strong>.  Items covered should include recent feedback, projects, individual goals, and any shared documents or performance reviews most recently given.</p></li><li><p><strong>Schedule 1:1 meetings with team members (<a href="https://getlighthouse.com/blog/one-on-one-meetings-template-great-leaders/">Template</a>) (<a href="https://larahogan.me/blog/first-one-on-one-questions/">First 1-1 Questions</a>)</strong></p></li><li><p><strong>Update your team and organization wiki pages to reflect the new reporting structure</strong></p></li><li><p><strong>Request access to any team chat channels you should be in</strong></p></li><li><p><em>Create a README of how you work</em></p></li><li><p><em>Read <a href="https://adamconrad.dev/blog/technical-lead-management/">Transitioning to management as a Technical Lead Manager</a></em></p></li></ul><h3>Your First Month</h3><ul><li><p><strong>Focus on 1-1s: ask questions, build rapport, and discuss career development plans with each direct report (<a href="https://getlighthouse.com/blog/one-on-one-meeting-questions-great-managers-ask/">Questions Reference</a>)</strong></p></li><li><p><strong>Review your hiring process</strong></p></li><li><p><em>Define or review measurable goals for your management role with your manager in a 1-1</em></p></li><li><p><em>Modify this document to incorporate learnings you&#8217;ve had as a new engineering manager</em></p></li></ul><h4>Recommended Reading List</h4><ul><li><p><em>The Effective Manager</em> by Mark Horstman (and the accompanying <em>Manager Tools</em> podcast)</p></li><li><p><em>Resilient Management</em> by Lara Hogan</p></li><li><p><em>High Output Management</em> by Andy Grove</p></li><li><p><em>The 27 Challenges Managers Face</em> by Bruce Tulgan (particularly for conflict resolution)</p></li><li><p><em>Accelerate</em> by Nicole Forsgren, Jez Humble, and Gene Kim</p></li><li><p><em>An Elegant Puzzle</em> by Will Larson</p></li><li><p><em>Extreme Ownership</em> by Jocko Willink (and his Jocko Podcast)</p></li><li><p><em>The Making of a Manager</em> by Julie Zhuo</p></li><li><p><em>The Manager&#8217;s Path</em> by Camille Fournier</p></li><li><p><em>The Talent Code</em> by Daniel Coyle</p></li></ul><h3>Days 31-60</h3><ul><li><p><em>Schedule a coffee chat with your recruiting team</em></p></li><li><p><em>Begin incorporating feedback into your 1-1s (<a href="https://www.manager-tools.com/2009/10/management-trinity-part-2">podcast on 1-1s &amp; feedback</a>)</em></p></li></ul><h3>Days 61-90</h3><ul><li><p><em>Begin incorporating coaching &amp; delegation into your 1-1s (<a href="https://www.manager-tools.com/2009/10/management-trinity-part-3">podcast on coaching &amp; delegation</a>)</em></p></li><li><p><em>Work with your manager on decision-making techniques to effectively delegate work and get more out of your direct reports (<a href="https://www.groupmap.com/map-templates/urgent-important-matrix/">Template</a>)</em></p></li></ul><h3>3 Months and Beyond</h3><ul><li><p><em>For Technical Lead or Interim  Managers: Decide with your manager if you want to continue down  technical leadership (e.g. Staff engineer, Principal engineer) or  transition to professional leadership (e.g. Engineering Manager)</em></p></li><li><p><em>Walk through your first quarterly goal setting for your directs with your manager (<a href="https://docs.google.com/document/d/1p7-Jo45VAw-RTUK97p6r9G0y0RtbmRxIlRntrmcfwHM/edit#">Template</a>)</em></p></li><li><p><em>Learn about the performance review process at your company in your manager 1-1</em></p></li></ul><div><hr></div><h1><a href="https://adamconrad.dev/blog/how-to-manage-remotely-and-stay-sane/">How to manage remotely and stay sane</a></h1><p>The last 14 months have been a grand experiment in how to manage teams remotely. In one sense this has been a great success. Teams have managed to stay productive and companies have shown record profits. On the other hand, there is a concern of an eventual return-to-office culture.</p><p>Let&#8217;s look at a few of the most common issues managers have with managing remote teams.</p><h2>Effective communication</h2><p>Remember these two words: <strong>documentation</strong> and <strong>asynchronous</strong>.  Wash, rinse, combine, and repeat. When you communicate with your teams,  do so in an asynchronous way; ensure your teammates can view your messages on their time and in their mediums of choice. That means your message will have to be repeated again and again from Slack to email to the wiki.</p><p>Speaking of wikis, <em>if you answer a question, put it in the documentation</em>.  By documenting things in a permanent medium like a wiki, you effectively automate your ability to answer questions without having to repeat yourself. You also create an easy to reference, permanent,  searchable document for anyone to access.</p><p>The side effect of thinking this way is it <strong>reduces the number of meetings on your calendar</strong>.  Pushing towards asynchronous, document-based communication removes the need for meetings on your calendar since you can comment back-and-forth and evolve the document on your own time.</p><h2>Video calls</h2><p>First raised by <a href="https://www.bbc.com/worklife/article/20200421-why-zoom-video-chats-are-so-exhausting">the BBC</a>,  the last year has showcased a new phenomenon called &#8220;Zoom fatigue.&#8221;  People are sick of seeing little boxes of humans on their laptops and crave real attention from real people. I get that. But that will never solve the problem of your dev who is in Minneapolis and you who are in  San Francisco.</p><p>First, <strong>level the playing field</strong>. Require that all teammates take calls from their laptops rather than an office camera that projects the entire conference room. This might seem like a  trivial/subtle change but it is important for setting context about &#8220;us  versus them.&#8221;</p><p>You don&#8217;t want to assume that those who are permanently remote are second-class citizens in your organization. They will feel this way if they see folks in a conference room Zoom and they are on their laptops.  </p><p>The key difference is in <em>your attention to others</em>. If you have a camera right on your face with a laptop in front of you, you tend to focus on the participants in the Zoom. If you have a camera in a conference room you tend to focus on the people in the conference room and the camera becomes background noise. This is good for those in the conference room and bad for those who are remote.</p><p>So if you need to abandon the conference camera in favor of all laptops even in the office, you should <strong>consider upgrading your AV hardware</strong>. A recent study suggests that <a href="https://tips.ariyh.com/p/good-sound-quality-smarter">better audio quality makes you appear smarter</a> so investing in a solid microphone like the Shure SM57 is a great,  cheap audio upgrade with an interface like the Focusrite Scarlett 2i2.  By extension, getting a better camera (and even lighting) will also improve your perception on Zoom.</p><p>Even if you don&#8217;t have the budget for this at work, it still might be a good investment going forward. If you plan to work remotely for future jobs then these will be investments in your future job prospects as well.</p><h2>Whiteboarding</h2><p>Drawing things on a laptop is notoriously hard. There are few solutions to solving this problem right now. I do have one solution I&#8217;ve found to be useful but it requires investment and practice.</p><p><strong>Buy an iPad with an Apple Pencil.</strong></p><p>I understand this is not a cheap ask. Neither is outfitting a home office with a comfortable, ergonomic chair and desk. However, if you want to commit to working remotely and managing teams then this is a  relatively cheap upgrade in favor of a much-improved whiteboarding experience.</p><p>I really like the <a href="https://apps.apple.com/us/app/microsoft-whiteboard/id1352499399">Microsoft Whiteboard app</a> because it is easy to get drawing on the iPad with the Pencil. The other two things I really like about this app are the ability to create concrete shapes from hand-drawn movements and that it is easy to persist old drawings or share on Zoom.</p><p>It&#8217;s not perfect but it&#8217;s free and I&#8217;ve not yet experienced a limitation using it for work.</p><h2>Interviewing</h2><p>Interviewing remotely is a challenge for sure. You want to create a sense of connection with your candidates.</p><p>I&#8217;ve had <a href="https://www.youtube.com/watch?v=DYAUw7NTHJ0">this video</a> on repeat for the last several weeks because it is jam-packed with advice regardless of whether or not you are conducting interviews remotely. You&#8217;ll gain a lot of insights on whether or not remote is a  limitation for you with hiring.</p><p>Specifically to remote interviewing, I think the best thing you can do is <strong>allow the candidate to use their own IDE and share their whole screen</strong>.  In other words, use the remote interview as a window into how they would actually do their work on a given day. If you frame an interview with that lens that the question of remote versus in-person hiring is no longer a problem. It is solely focused on providing a great experience and not about whether remote is contributing (or hindering) that experience.</p><h2>Strategic work</h2><p>For some reason, managers believe this is the biggest detriment to remote work. Someone recently commented on a LinkedIn post of mine that  &#8220;nothing beats getting a bunch of folks together in a room in front of a  whiteboard&#8221;.</p><p>People have had to strategize throughout the pandemic. Their companies have done very well financially. While some may prefer in-person to remote I fail to see anything about in-office that is <em>inherently</em> a better experience.</p><p>This might be a cop-out answer but I think interweaving many of the suggestions above would solve the strategy problem. Leveraging written communication, improving your setup for video calls, and the right technology makes these kinds of meetings so much easier to express your ideas effectively.</p><p>Strategy meetings, to me, revolve around <a href="https://lethain.com/strategies-visions/">writing dense documentation</a> and may benefit from some whiteboarding with other leaders. A great AV  setup with an iPad and a proctor to keep the meeting on track with notes is all you need to have an effective strategy meeting.</p><h2>Reading emotions and connecting with people</h2><p>This last point is perhaps the most difficult to conquer in a remote environment. Body language, by the sheer fact that video cuts out most of the body, is impossible to read remotely. Still, even if you can&#8217;t see someone&#8217;s whole body does not mean you can&#8217;t read emotions or body language at all.</p><p><strong>Not being on Zoom, is, in and of itself, a signal.</strong> Not turning on your video can be a sign of <a href="https://www.psychologytoday.com/us/blog/lifetime-connections/202004/dealing-zoom-anxiety">anxiety or depression</a>, particularly if one usually is on Zoom but has decided not too recently.</p><p>If the other party is on Zoom you&#8217;ll have to be more perceptive about watching visual cues. Again, without obvious body language cues like crossing legs or folding arms, you can still judge emotions through facial expressions. You just have to work harder to find these cues and be more observant. I&#8217;m not an FBI agent or a psychologist but there are <a href="https://www.amazon.com/Unmasking-Face-Recognizing-Emotions-Expressions/dp/1883536367">books</a> on the subject.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 131 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow.</p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!</p>]]></content:encoded></item><item><title><![CDATA[It's not hard to care]]></title><description><![CDATA[User Interfacing Newsletter Volume 130]]></description><link>https://userinterfacing.substack.com/p/its-not-hard-to-care</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/its-not-hard-to-care</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 08 Jun 2021 20:00:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Well, I blinked and 3 months have passed. In that time my son has turned one, my teams have gone through all sorts of changes, and the world is looking like a much brighter place.</p><p>I won&#8217;t lie - I think part of my hiatus was driven by COVID burnout. There&#8217;s only so much energy you can put into so many things and after a year in lockdown, I had trouble keeping up with releasing consistent content. I had quite a bit, to be fair, but have had to backdate once I actually hit the merge button.</p><p>If you haven&#8217;t watched Bo Burnham&#8217;s <a href="https://www.youtube.com/watch?v=Bs-GdcUfl0Q">Inside</a> I&#8217;d give it a shot. He pretty much hit the nail on the head for grasping how do you live up to your <a href="https://adamconrad.dev/blog/values/">values</a> without becoming a soulless sellout. That said, to get back to it I figured I would offer not one but <em>two</em> of my newer articles (there&#8217;s <a href="https://adamconrad.dev/blog/page3/">thirteen</a> to catch up on) to digest as we close in on the start of summer.</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/its-not-hard-to-care/">It's not hard to care</a></h1><p>I handwrite every single email I send to candidates.</p><p>Every. Single. One.</p><p>Of course, it doesn&#8217;t scale. Of course, it is time-consuming. Of course, rejection sucks, and I&#8217;ll probably get rejected by 99% of the people I reach out to.</p><p>If hiring is your <em>most important</em> activity, then why would you ever put in a &#8220;copy and paste&#8221;-level of effort for people that could provide MILLIONS of dollars of value for your organization?</p><p>Have you ever received an email that was copy-pasted? Have you received an email where they used the wrong name (or reversed your first name with your last name)? I can answer yes to all of those.</p><p>It&#8217;s pure lunacy to me that recruiters and hiring managers don&#8217;t put any effort into the candidates they&#8217;re trying to hire.</p><p><em>Always</em> write a personal note. <em>Always</em> pay attention to their experience, their wants, their needs. <em>Always</em> be a human first, and a hiring manager second.</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/how-to-find-great-engineers/">How to find great engineers</a></h1><p>One of the hardest jobs as an engineering manager is to hire and <a href="https://adamconrad.dev/blog/building-teams">build</a> a great team. The other is to retain and engage them (but that&#8217;s for another day). <strong>The purpose of this article is to walk you through step-by-step how to find and hire great engineering talent</strong>.</p><h2>Top of the funnel</h2><ul><li><p><strong>Create a Monthly Engagement Calendar</strong>. Hiring cycles often happen at the start of the month (and year) so <strong>do most of your sourcing at the beginning of the month</strong>.</p></li><li><p><strong>Reach out to DEVELOPER social networks</strong>. No - not LinkedIn. Not Facebook. Not Instagram. Here&#8217;s some that have worked well:     </p><ul><li><p><em>Hacker News &#8220;Who is Hiring&#8221; thread</em>. Post every month on the first business day. The challenge is you can only do 1 posting per company. So only have 1 engineering manager post for your company.</p></li><li><p><em>Reddit subs for your programming language/framework</em>.  r/technology or r/programming will get you nowhere. But if you&#8217;re hiring a Scala developer, r/scala allows you to post job threads.</p></li><li><p><em>Slack communities</em>. Hiring JavaScript developers? There&#8217;s a <a href="https://babeljs.slack.com/">Slack community for that</a>.</p></li></ul></li><li><p><strong>Find language/framework-specific channels</strong>. Still not getting any interest from the first two steps? Here&#8217;s an example of where you can source JavaScript developers from:     </p><ul><li><p>For Node:         </p><ul><li><p>https://discordapp.com/invite/vUsrbjd</p></li><li><p>https://dev.to/t/node</p></li><li><p>https://hashnode.com/n/nodejs</p></li><li><p>https://spectrum.chat/node?tab=posts</p></li></ul></li><li><p>For React:         </p><ul><li><p>https://discordapp.com/invite/0ZcbPKXt5bZjGY5n</p></li><li><p>https://dev.to/t/react</p></li><li><p>https://hashnode.com/n/reactjs</p></li><li><p>https://spectrum.chat/react?tab=posts</p></li></ul></li></ul></li><li><p><strong>Do the work yourself</strong>. Your recruiting team, if you&#8217;re lucky enough to have one, is probably great. And they need your help! Their job is to supplement your hiring, <em>not do it all for you</em>.</p></li></ul><blockquote><p>The best way to convince developers to join is to be genuinely  interested in them and convince them that the role you are hiring for is  <strong>perfect for them</strong>.</p></blockquote><h2>First contact</h2><ul><li><p><strong>Set up a 30-minute phone call ASAP</strong>. Since you&#8217;ve posted to so many communities, it can be difficult to respond and check in on them. <em>Encourage folks to email you to schedule a time to chat on the phone and engage with them personally</em>.</p></li><li><p><strong>Keep the phone call informal</strong>. You really only need to focus on 4 things:     </p><ul><li><p>What your company is about</p></li><li><p>What <em>your team</em> is about and how it fits into your company&#8217;s grand vision.</p></li><li><p>Learn more about the candidate, what they&#8217;re looking for, and why they&#8217;re interested in you</p></li><li><p>A brief overview of the hiring process (this leads them into the next step by encouraging them to start your interview process).</p></li></ul></li></ul><h2>Interview unconventionally</h2><p>You&#8217;ve invested a lot of effort into hiring. You may not have implemented all of those strategies but <strong>the most important thing about your interview process should be to stand out from the crowd and wow your candidates with a pleasant &amp; fair interview experience</strong>.</p><p><strong>People </strong><em><strong>loathe</strong></em><strong> contrived interview problems</strong>  (e.g. reverse a linked list in memory, traverse a 2D array in a spiral).  They especially hate when those problems have nothing to do with the actual work they will be doing. So don&#8217;t ask them!</p><p><strong>People </strong><em><strong>love</strong></em><strong> practical questions that test the skills they use</strong>.  Interviewing someone on the UI layer? Ask them to implement a mockup.  Need an architect? Have them design Twitter. If you engage candidates with problems they will really encounter, you&#8217;ll learn their true capabilities and they, in return, will feel properly evaluated (read:  happy with the interview experience).</p><p><strong>People are </strong><em><strong>impressed</strong></em><strong> by non-traditional approaches</strong>.  I&#8217;ve used tiny take-home pull request exams to engage an often overlooked part of every developer&#8217;s core job: reading code. Most interviews require developers to write code, but few ask them to read code.</p><div><hr></div><h1>New things I&#8217;ve read recently</h1><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://www.filamentgroup.com/lab/practical-accessibility-1-semantics/">https://www.filamentgroup.com/lab/practical-accessibility-1-semantics/</a> - A shortcut to learning accessibility is to understand when to use all of the HTML tags.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://infrequently.org/2021/03/the-performance-inequality-gap/">https://infrequently.org/2021/03/the-performance-inequality-gap/</a> - The performance budget for mobile even in 2021 is surprisingly low.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2021/03/complete-guide-accessible-front-end-components/">https://www.smashingmagazine.com/2021/03/complete-guide-accessible-front-end-components/</a> - Exhaustive but helpful list for understanding accessibility in front-end development.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://ochronus.online/the-5-common-mistakes-of-new-engineering-managers/">https://ochronus.online/the-5-common-mistakes-of-new-engineering-managers/</a> - So much to agree on here - please stop coding so much, managers!</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 130 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[Trying to hit a deadline? Focus on a target instead]]></title><description><![CDATA[User Interfacing Newsletter Volume 129]]></description><link>https://userinterfacing.substack.com/p/try-to-hit-a-deadline-focus-on-a</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/try-to-hit-a-deadline-focus-on-a</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 09 Mar 2021 18:15:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>First off, I made an update to last week&#8217;s <a href="https://adamconrad.dev/blog/on-culture-fit/">post</a> on culture fit. I got some great comments on how we can evolve the culture fit interview to be inclusive. In retrospect, I agree that we shouldn&#8217;t place absolutes on things like this. Culture fit interviews <em>can</em> be useful if (and only if) they are corrected to be more inclusive with a bend on <em>adding</em> to the culture rather than <em>fitting into it</em>.</p><p>This week&#8217;s post is on my recent obsession with evidence-based scheduling. This came from me diving into <a href="https://github.com/kuchin/awesome-cto">lots of articles</a> on engineering leadership over the weekend. I won&#8217;t have any posts at the end of the newsletter to promote because honestly there is more than enough great content to sift through in that Awesome list.</p><div><hr></div><h1><a href="https://www.adamconrad.dev/blog/hitting-deadlines/">Hitting deadlines</a></h1><p>My recent productivity obsession is around <a href="https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/">Evidence-Based Scheduling</a>.</p><p>Software estimation is hard. But I also want to make sure our stakeholders understand how far we are along in our projects and when we think we can reasonably deliver some software.</p><p>While watching <em>The Last Dance</em> this weekend about the &#8216;98  Chicago Bulls basketball team, I got to thinking about how great sports teams all review tape from their previous performances.</p><p>Who does that in software? I don&#8217;t think I&#8217;ve seen anyone do that.  And yet, if you think about the principles behind the book <em>Deep Work</em>, you have to get as much feedback as possible as to how you are performing at your job.</p><p><em>Practicing</em> estimation is a skill and takes effort and time.  In speaking with a few colleagues and friends on how they&#8217;ve implemented this themselves, there are a few things to keep in mind.</p><h2>Buy-in and messaging is key</h2><p>On the surface, this sounds like micromanagement to the <em>n</em>th degree. Now my boss is tracking my time? <strong>I&#8217;m not tracking your time - YOU are</strong>.  It&#8217;s really easy for a framework for this to sound like a way to place the lens of Big Brother over your development teams. That is <em>not</em> the goal at all.</p><p>Instead, this is about tracking <em>yourself</em> to see how good you are at estimating your own work. Endless articles have demonstrated that we, as an industry, are <em>really</em> bad at estimating how long our work will take. This is putting that into repeated, frequent practice.</p><p>There are no points for completing things early and there is no shame in finishing things way off target. The point is not to grade your performance in matching expectations. <strong>The point is to see what is your pattern for estimation in the first place and account for that.</strong></p><p>Maybe you are the chronic optimist and everything you do actually takes 20% longer than you expect.</p><p>Great! Now we can ensure that if you take a ticket we can reliably add 20% to the estimate to predict when any of your work will arrive.  The time to complete doesn&#8217;t matter; all that matters is the message to stakeholders about when we think this will most likely arrive.</p><h2>It takes a lot of work upfront</h2><p>A friend of mine mentioned that his team of 8 took about 8 hours <em>a week</em> in meetings breaking down tickets in grooming and providing granular estimates of the work that was to be delivered. That&#8217;s a <em>lot</em> of time in meetings per week, particularly for individual contributors.</p><p>At first, that seems like the effort is way too high for a team size that small. However, after a few weeks of working through this system,  they were able to get these meetings down to about 2.5 hours while also increasing their accuracy and delivery.</p><p>Would you spend 5% of your week ensuring your delivery is 90%  accurate to stakeholders? I&#8217;d take that each and every week without fail!</p><h2>Target practice</h2><p>Remember that all of this is not an excuse to let stakeholders pepper your team with deadlines. <strong>It is an anti-pattern to adopt EBS </strong><em><strong>so you can enforce deadlines</strong></em>.  Rather, it is a reaction to an anti-pattern of deadline-driven development so you can get your teams out of the corner you&#8217;ve already backed into.</p><p>The end result of adopting evidence-based scheduling should look something like a bull&#8217;s eye target. This analogy I use time and time again with my team leads when one of their stakeholders is adamant about requiring a specific date for something to arrive.</p><p>Imagine you are firing an arrow at a target 100 yards away with a 5&#8217;  radius. The goal, of course, is to hit the bull&#8217;s eye in as few shots as possible. There are two ways to do this:</p><ol><li><p><strong>Increase your accuracy</strong>. Each time you fire an arrow (i.e. deliver an estimate) it should get closer to your target. In other words, if you think something will take 2 days and you&#8217;re off by 1  day this week and then off by 2 days next week, your estimation skills are only getting worse.</p></li><li><p><strong>Move closer to the target</strong>. It&#8217;s a lot easier to hit a target from 50 yards away than 100. In software, this is just time moving forward. The closer you get to the projected date of delivery  (i.e. target) the clearer the bull&#8217;s eye becomes. You probably know what you hope to accomplish today but who knows what you&#8217;re confident to deliver 9 months from now.</p></li></ol><p>So if you practice hitting a target regularly (i.e. practicing evidence-based scheduling) while simultaneously moving closer to the target (i.e. building more software every day), you should be moving away from deadlines towards target dates which just get more <em>accurate</em> and <em>predictable</em> over time.</p><p>At the beginning of the quarter, your project will arrive in 3 months with 60% confidence. In 2 months the project will arrive in 3 weeks in that month with 80%. In that week, the project will arrive on that  Thursday with 95% confidence. This is how we shift away from deadlines to target dates.</p><p>Stakeholders still hear a date that makes them happy and you aren&#8217;t beholden to a rigid delivery date which makes you happy. Everyone wins.  That is why I am so excited to try this system out and if you have any experience with EBS please let me know.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 129 of the User Interfacing Newsletter. </strong><br><br>No articles this week (see the intro for a great list). If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[Culture fit considered harmful]]></title><description><![CDATA[User Interfacing Newsletter Volume 128]]></description><link>https://userinterfacing.substack.com/p/culture-fit-considered-harmful</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/culture-fit-considered-harmful</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 02 Mar 2021 17:00:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi folks &#128075;</p><p>Lots of great feedback so far on everyone&#8217;s <a href="https://adamconrad.dev/blog/things-to-remember-with-annual-reviews/">annual review process</a> so I&#8217;m glad to see things aren&#8217;t as dire as I imagined. A lot of companies I&#8217;ve heard from are doing great by their employees with thorough reviews with ample feedback throughout the year. Great work!</p><p>There&#8217;s one area that I think we could all use some improvement on and it&#8217;s <strong>hiring. </strong>Modern-day hiring practices are broken and I am convinced that will be one of the big things we look back on someday and scratch our heads as to how we got it so wrong. <strong>Are you proud of how you hire at your company? </strong>Let me know! </p><div><hr></div><h1><a href="https://adamconrad.dev/blog/on-culture-fit/">On culture fit</a></h1><p>A question was asked during a recent <a href="https://www.linkedin.com/events/engineeringmanagementamawithsen6770107754863570944/">panel on Clubhouse</a>  about assessing culture fit. What was once an innocuous term for  &#8220;people who aren&#8217;t terrible human beings&#8221; has quickly become a trigger  for exclusivity, gate-keeping, and homogeneity. Here are my thoughts on  how things got out of hand with this hiring practice.</p><h2>The benefits of finding a cultural fit</h2><p>I can understand where culture fit is seen as a necessary tactic at  some places. At small startups, companies are looking for chemistry  between the founders and these early-stage employees. I get it; all of  you are going to spend a lot of time together taking a big bet that the  thing you are building is going to change the world. I was the first  employee at a startup and I spent many nights working with the founders  until 4am and it all started with a poker game.</p><p>For these early companies, you&#8217;re looking for employees to <strong>define your culture</strong>  which is largely based on the principles that the founders already hold  dear. So if you, as founders, have a semblance of culture, you&#8217;re  looking to ensure the keys to your initial success stay intact when  expanding to hired employees.</p><p>On the surface, this makes sense. Many years later I&#8217;m looking back  on some of these interviews with these founders and I&#8217;m left wondering  if the toxic elements germinate even at the smallest of startups.</p><h3>A culture of homogeneity</h3><p>I remember a very peculiar interview I had with an early-stage  company. We did quite a few technical rounds followed by a round of  beers at a local bar. I knew it was about getting to know the founders  but in retrospect, it was a sign of being part of the group.</p><p>Was I a techie? Did I wear the right hoodies and jeans? Did I know  how to hold down a beer (or five) and still gun sling code like a pro?  Was I willing to do whatever it took to get the job done in a  work-hard-play-hard atmosphere?</p><p>This is where the original idea of finding chemistry ballooned into a  flawed practice I see at many companies now, both large and small.</p><h2>Why I don&#8217;t recommend culture fit interviews</h2><p>My answer, by the way, on the panel was to completely do away with culture fit interviews. I think they are a stain on the tech industry that we will look back on in 5-10 years as a &#8220;what were we thinking?&#8221;  kind of clarity. <strong>Culture fit interviews promote the opposite of  Diversity, Equity, and Inclusion (DEI) - Homogeneity, Inequity, and  Exclusion (HIE)</strong>.</p><p>Culture fit is a tactic to find a <em>homogenous</em> group of people. You&#8217;re literally trying to determine if people are like you. The  common thought here is &#8220;can I see myself having a beer with this person  after work?&#8221; So ask yourself:</p><ul><li><p>Why do we need to have beers? Why not tea?</p></li><li><p>Why do we need to hang out after work? Isn&#8217;t a coworker relationship during normal hours enough?</p></li><li><p>Why do we need to be out somewhere together? Does that diminish the contributions of my remote colleagues?</p></li></ul><p>Diversity is about different perspectives from different backgrounds.  And it&#8217;s not just about demographics like race and socioeconomic background. The kinds of companies you&#8217;ve worked for, whether big or small, all bring new perspectives about how to run and scale an organization. The kinds of jobs your team has had in the past contribute as well: &#8220;purebred&#8221; software engineers from CS schools offer a  completely different window into building software than folks who never went to college and spent the last 5 years working in retail who just recently transitioned into a software job.</p><p>Culture fit is inherently <em>inequitable</em> because it is a  subjective evaluation with an unspoken set of rules. There is no way to get a correct answer to a culture-fit interview. That is because every company has a different way to &#8220;grade&#8221; that question which makes it impossible to provide a way to improve or level the playing field for those that need a boost to balance their technical capabilities and job qualifications.</p><p>Meanwhile, equity is directly aligned with providing a boost for those who have been systematically left out of the conversation. If you&#8217;re used to talking to white MIT grads from Boston or Silicon Valley then you need to explicitly devote more time and attention to the overlooked BIPOC candidates without the same signaling credentials.  You&#8217;re trying to explicitly create room and opportunity for those that are often overlooked. If they already aren&#8217;t part of the in-group, how do you expect to help them with an in-group culture fit question about grinding exams back at Stanford before a kegger?</p><p>Finally, culture fit is <em>exclusive</em> because those unwritten rules I spoke of earlier are designed to weed out people who don&#8217;t fit the mold of the <a href="https://www.imdb.com/title/tt0151804/">prototypical</a> <a href="https://www.hbo.com/silicon-valley">engineer</a> or any other kind of employee you&#8217;re used to seeing. The question is all about showing signals that you&#8217;re part of the group.</p><p>Even without a culture fit question, people will assess culture on first impressions. Have you ever grimaced at an engineer coming into an interview in a suit? Made a snap judgment that the person might be too uptight or corporate? We&#8217;ve all subjected others to unfair biases and it doesn&#8217;t make things better to put someone through an entire interview centered around this concept.</p><p>Inclusive interviews are about bringing everyone into the conversation without adding more reasons to deny someone a seat at the table. It&#8217;s about the opportunity for people in a field that is dominated by white males and has been this way for decades. It is our responsibility and duty to represent and include all kinds of people in a  way that better reflects the diversity of the people in our nation and in our world.</p><p>DEI takes work. DEI is a necessary evolution of job opportunities.  And one way we can move in the right direction is to kill the culture fit interview.</p><div><hr></div><h1>New things I&#8217;ve read recently</h1><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2021/02/building-user-trust-in-ux-design/">https://www.smashingmagazine.com/2021/02/building-user-trust-in-ux-design/</a> - Building trust is a basic thing we should all be working on.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://cgroom.medium.com/take-home-coding-assignments-are-a-waste-of-time-8da74085749e">https://cgroom.medium.com/take-home-coding-assignments-are-a-waste-of-time-8da74085749e</a> - The title is actually bad and contradictory; he says coding assignments work in very specific conditions. We use a takehome assignment on my teams and we adhere to all of his suggestions for takehome assignments to be effective. And THAT is what I would want you to focus on when reading this article.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://medium.com/product-at-shopify/how-to-figure-out-if-your-product-actually-solves-problems-885f242ac36">https://medium.com/product-at-shopify/how-to-figure-out-if-your-product-actually-solves-problems-885f242ac36</a> - More people could heed the advice to check risky assumptions and return to first principles when things aren't working out with product-market fit.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://medium.com/@meetfelipe/measure-what-really-matters-2de3569e55ec">https://medium.com/@meetfelipe/measure-what-really-matters-2de3569e55ec</a> - I largely agree with what is considered good, bad, and ugly with regards to OKRs. Definitely worth the read and clarified a few things for me from the book.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 128 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[Performance reviews don't have to suck]]></title><description><![CDATA[User Interfacing Newsletter Volume 127]]></description><link>https://userinterfacing.substack.com/p/performance-reviews-dont-have-to</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/performance-reviews-dont-have-to</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 16 Feb 2021 17:00:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friends &#128075;</p><p>Last week I shared <a href="https://adamconrad.dev/blog/how-i-applied-the-engineering-management-curriculum/">my curriculum</a> of how I taught myself engineering management over the last several years. Now that performance reviews have kicked off at my company I thought I would share some tips for weathering the storm so they don&#8217;t have to be painful for you in 2021 (because we need 2021 to be less painful than 2020 in a lot of ways).</p><p>Stay healthy!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/things-to-remember-with-annual-reviews/">Things to remember with annual reviews</a></h1><p>Annual reviews have closed from the new year so we&#8217;re now into performance review season. A lot of people I work with seem to have a  lot of reservations and anxieties about this time of year. I find that if you keep the following things in mind you tend to have really smooth and easy reviews.</p><h2>Weave performance reviews into your 1-1s</h2><p>The first thing I say to all of my directs every year is &#8220;there  shouldn&#8217;t be anything in here that you don&#8217;t already know and if there  is we should talk about it.&#8221;</p><p>We never talk about it.</p><p>That&#8217;s because we <strong>bake feedback into every weekly 1-1</strong>.  Anything my folks are doing well (or need work on) are delivered with no more than a one week delay from the moment the event occurs. This allows us to create a true feedback loop where we see performance improvements several times a year rather than once at the annual review.</p><p>In fact, I&#8217;ve never had to write an individual development plan for a  direct. That&#8217;s because we don&#8217;t construct massive waves of change in performance. We tackle issues as they come up rather than in the constraints of an annual review system.</p><p><strong>Tackle one issue at a time and then move on</strong>. If a  recurring theme emerges then that is the time to make note of it in the performance review. But that doesn&#8217;t change the actual game plan. We still tackle feedback and encouragement in real-time and just make sure to highlight major wins/concerns in the annual review based on the previous year&#8217;s evolution of that feedback.</p><h2>Give folks time to read the review</h2><p>Don&#8217;t deliver your review at the same time your directs are reading your feedback for the first time. This creates information asymmetry and an awful feeling for your directs. They not only waste time in the meeting reading the review you wrote them but they also can&#8217;t even begin to process what they have read.</p><p>Imagine you gave a particularly negative review. How do you think they are going to feel when reading that information <em>in front of you</em>?  Probably some combination of mortified and paralyzed because they not only feel bad but they feel like they can&#8217;t show it so they have no place to go. And if they are non-reactive you might believe that they don&#8217;t care or aren&#8217;t willing to take action on this feedback into the next year. Can you see how this is bad for both sides of the review?</p><p>Instead, <strong>give directs at least 24 hours to read their reviews before you meet with them</strong>.  A week is even better. Since you&#8217;ve already baked feedback into your weekly 1-1s this should already be an easy read but now you save even more time from your meeting by pushing off their reading time out of your scheduled meeting so at a bare minimum you just gained some time back in your calendar.</p><p>Now you can use most of the time for your review to <strong>discuss goals for next year and how your feedback can be incorporated into those goals</strong>. This brings me to my last point&#8230;</p><h2>If you do these right, performance reviews are forward-looking meetings</h2><p>If both you and your direct are on the same page throughout the year and you&#8217;ve had them read your review a week in advance then why do you even need to meet? <strong>To look ahead.</strong></p><p>Your meeting just became so much more effective because instead of lamenting on the past you can focus on the future. Now your performance review is about doubling-down on the things your directs have done well and weaving improvements into the areas your directs need improvement.  The best way to do this is to show them the goals of your team or function and figure out <strong>how your direct plays into achieving those goals</strong>.</p><p>Now instead of your performance review being a recollection of the last year&#8217;s work you can continue to charge ahead with <em>how last year can indicate what the upcoming year will be like</em>.</p><p>For this review season, for example, I spent about 10 of the 30  minutes pulling up the review, glossing over it with my directs, and leaving room for questions or concerns (of which there were exactly 0).  For half of my directs, most of those 10 minutes were actually explaining how the performance review system works because this is their first annual review. The rest of that time was also spent explaining how our performance review system is going to change in this new year.</p><p>The remaining 20 minutes were focused on our function&#8217;s goals for  2021 and how we can weave them into their teams&#8217; goals. We talked about the big things we want to accomplish and why they are perfectly positioned to take our business to the next level.</p><p>It was aspirational. It was inspirational. It was&#8230;exciting.  Definitely not what you would expect to hear when you think of performance reviews but if you are doing all of the right things then it doesn&#8217;t have to be painful; even if you have under-performers. I&#8217;d actually say this system is better for under-performers because they aren&#8217;t caught off guard and they can instead be excited to improve in the future rather than be reminded of the past.</p><div><hr></div><h1>New things I&#8217;ve read recently</h1><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://responsibleweb.app/#Responsive-Web-Design">https://responsibleweb.app/</a> - This is great; it's all on one page and it's a summation of the things you should consider when designing web apps.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://www.browserlondon.com/blog/2021/01/04/front-end-predictions-2021/">https://www.browserlondon.com/blog/2021/01/04/front-end-predictions-2021/</a> - I don't know if WASM will be a thing this year but we are certainly seeing monoliths becoming a thing at our company.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://v8.dev/blog/adaptor-frame">https://v8.dev/blog/adaptor-frame</a> - Warning: there is assembly code in this blog post. This is a very advanced look at speeding up JavaScript calls.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://larahogan.me/blog/performance-reviews-should-be-unsurprising-fair-and-motivating/">https://larahogan.me/blog/performance-reviews-should-be-unsurprising-fair-and-motivating/</a> - It is performance review season. Are you prepared? I know I do these things.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 127 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[Build your own engineering management learning curriculum]]></title><description><![CDATA[User Interfacing Newsletter Volume 126]]></description><link>https://userinterfacing.substack.com/p/build-your-own-engineering-management</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/build-your-own-engineering-management</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 09 Feb 2021 20:00:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friends &#128075;</p><p>Last week we covered a <a href="https://adamconrad.dev/blog/teach-yourself-engineering-management/">reading list</a> for learning engineering management if you get promoted. This week we&#8217;re going to cover how you can apply this reading list to your own work and how I did it myself. </p><div><hr></div><h1><a href="https://adamconrad.dev/blog/how-i-applied-the-engineering-management-curriculum/">How I applied the engineering management curriculum</a></h1><p>Last week I posted a <a href="https://adamconrad.dev/blog/teach-yourself-engineering-management/">reading list</a> of the books I have read (or plan to read this year) on engineering management. My concern is that no one teaches you this stuff in an MBA  or at work so you&#8217;re kind of forced to do this on your own.</p><p>Further, it&#8217;s a challenge because engineering management is like a  mid-career switch. In many ways, you&#8217;re starting over from scratch and many of the techniques you&#8217;ve applied as a software engineer no longer apply as an engineering manager. So where did I begin?</p><h2>I first explored some more universal topics</h2><p>I have to be honest, I don&#8217;t actually remember when I started reading from this reading list. At the time I was averaging nearly a book a  week so it&#8217;s difficult to pin down in the early days what I read first and in what order. But just reflecting back on the list I&#8217;m pretty sure I  started with some more universally-applicable books like <em>How to Win Friends and Influence People</em> and <em>Never Split the Difference</em>.</p><p>I read these two several years ago even before I was an engineering manager. I&#8217;m pretty sure <em>How to Win Friends</em> was just a general recommendation on networking and making connections in the industry which has always been a concern of mine. <em>Never Split the Difference</em> became relevant when I started my <a href="https://anonconsulting.com">consulting business</a> and I wanted to make sure I was coming to the table prepared when my clients wanted to talk pricing.</p><p>Throughout the years I&#8217;ve built side projects I&#8217;ve explored lots of books around entrepreneurship so I think that&#8217;s where <em>Traction</em> and <em>Venture Deals</em> came in but I know for a fact that was also at the time I was plowing through books. I&#8217;m pretty sure I read <em>Venture Deals</em> in one day on a bus ride back from NYC and within the next week, I continued that trend with <em>Zero to One</em> and <em>The Hard Thing About Hard Things</em>.</p><p>None of these are management or leadership books but I think it&#8217;s important to give you context that <strong>I  read books at the moment I was experiencing situations I wasn&#8217;t prepared for and wanted an expert opinion for how to handle them</strong>.</p><h2>Solving problems as they occur</h2><p>So given that criteria for reading the first engineering management book I read were when I was a tech lead who was offered the chance to have direct reports informally. And I quickly ran into a tricky interpersonal situation.</p><p>That&#8217;s when a coworker recommended me <em>The 27 Challenges Managers Face</em>.  I had experienced an exact situation that was spelled out in one of the  27 challenges in that book. So my first pass at this book was to solve that exact problem.</p><p>My next pass at the book was a quick read of the other 26 issues. I  will say I haven&#8217;t actually read this book thoroughly cover-to-cover because as I mentioned in the last article, I don&#8217;t think this kind of book benefits from a cover-to-cover read. I think it&#8217;s great to read quickly to internalize the problems you might face. Later, keep it in your back pocket as a reference guide when you run into tricky situations with your directs.</p><h2>My first management job</h2><p>Once I officially earned my first formal engineering management position, that was when I started diving into my real reading list. It was prompted by a few aptly titled Ask Hacker News posts about how to transition into Engineering Management.</p><p>There was one comment that recommended the <em>Manager Tools</em> podcast and so I went right to their website and looked for the basics.  That&#8217;s where the &#8220;Management Trinity&#8221; was first introduced to me. That weekend I put these three podcast episodes on repeat. Any workout I was listening to them over and over again. I even think I listened to them as I was falling asleep, hoping I would retain this information subliminally.</p><p>The podcast is I think over a decade old so once I started listening to the other episodes I heard about the <em>Effective Manager</em> book as a cross-promotion for the podcast so at some point I got the book and read that.</p><p>Again, if you&#8217;ve listened to the podcast you&#8217;ve already hit the main talking points. These were the things that taught me the engineering management basics: <strong>1-1s, coaching, feedback, and delegation</strong>. The book and the podcast drill those concepts into your brain with lots of examples.</p><p>So for at least the first 6 months of my new management job, all I  practiced were those 4 concepts until I felt comfortable in all of them.  And then 3 months later I quit.</p><h2>Starting my consulting firm</h2><p>After my management job I read most of the chapters in <em>Cracking the Coding Interview</em> because I figured I&#8217;d have to do a bunch of coding interview questions even as an engineering manager. I didn&#8217;t find any companies I liked that were hiring engineering managers so I started my own consulting firm and became a freelance developer.</p><p>At this point, I really kicked up my reading because, in addition to managing teams as an outsider, I had to learn all about marketing,  sales, and all of the non-technical things I have never learned before.</p><p>This is when I read books like <em>SPIN Selling</em> and <em>Never Split the Difference</em>.  You won&#8217;t see most of these books in my recommended reading list because that&#8217;s for a completely different curriculum on starting your own consulting business which I may someday create a curriculum for as well.</p><p>I only ran this company full time for about a year and a half; it would have been longer but my next client turned out to be my next full-time job.</p><h2>My current company and current role</h2><p>I&#8217;m currently working at the company I thought was going to be my next consulting gig. I passed all of their hiring tests and everything.  As soon as I was ready to sign on the dotted line with my consulting engagement they also offered me a full-time position in case I wanted to take that instead. The offer was better than I expected and it offered health insurance so I took the offer and went back to full-time.</p><p>For the first 6 months or so I was in an individual contributor role so my management training took a backseat. Soon enough, a management opportunity opened up, and, leveraging my previous management experience and training, I applied for the role of director (the job I currently have).</p><p>Once I landed director I knew I had to level up my learning yet again. I was back into voracious book reading mode.</p><p>Since I had nailed the basics with <em>The Effective Manager</em> I  didn&#8217;t feel the need to re-read any older material so I dove right into books that were catered for more senior management. I was reading a  bunch of blogs at the time on the topic so I started plucking books from their recommended reading lists. <em>High Output Management</em> came up time and time again so I read it in a weekend.</p><p>As I stated in the last article, I didn&#8217;t get too much out of it that applies to directors directly but I did cross-reference the 200-point  checklist that is listed at the end of the book to ensure I covered as many aspects as I could with the team that I had.</p><p>I can&#8217;t name any of the tactics off hand right now but I would just encourage you to read the book and nail that checklist. You&#8217;ll see that unless you&#8217;re a VP or CTO you&#8217;re going to have a hard time being able to act on all of the things Grove recommends.</p><p>This is more true today because he ran a hardware company in the 90s  so doing things like &#8220;walking the floor&#8221; on any of the assembly lines simply won&#8217;t apply to the folks that read this since you&#8217;re most likely managing software teams.</p><p>The other books I read around this time were <em>The Talent Code</em> and <em>The Little Book of Talent</em>, both of which were recommended in the Drift company podcast time and time again. These were the books where I applied <strong>identifying top performers</strong> in both retention and hiring. It&#8217;s also a great way to identify talent habits for yourself in improving your own performance at work.</p><h3>Director-level learnings</h3><p>The first book that really clicked for me as a director was <em>Extreme Ownership</em>. Alongside books, I also listen to a lot of podcasts. Jocko Willink&#8217;s podcast is a favorite of mine and just like the <em>Manager Tools</em> podcast, I heard about the corresponding book enough times that I had to read it.</p><p>This was the first new concept I learned in a while: <strong>ownership and accountability</strong>. I knew about these things, sure, but this was the first time I took the ownership part to a new, <em>extreme</em> level. I know, cue eye roll.</p><p>But unlike in the past, this was the first time I felt the gravity of my role as a director. I wasn&#8217;t just making decisions for one team, I  was making decisions for lots of teams and lots of people, even some that I didn&#8217;t directly interface with.</p><p>I&#8217;ve heard this saying before: <em>the further up the career ladder you go, the longer and harder it is to see your successes or failures</em>. That means the initiatives you drive today might take months or years to see any concrete results or changes in culture.</p><p>That&#8217;s crazy timing because just today I received upward feedback from a skip-level report that I was praised for having been one step ahead of the company on certain initiatives such as building out OKRs that channel down from company or organizational goals.</p><p>The truth is I had no plan to be ahead of the curve, I simply saw what other companies were doing, experimented with some tools and tactics, and doubled down on the effective ones. OKRs seemed like a  no-brainer to me and I started implementing them over a year ago. More than a year later I am only just receiving feedback from my directs that this was a good tool to use for our teams.</p><p>This relates back to the <em>Extreme Ownership</em> because I know everything I teach my teams comes back to me. Every success and every failure I have to own.</p><p>It&#8217;s really easy to say &#8220;this person was late and it is their fault  for being lazy.&#8221; It&#8217;s really hard to see within yourself that they might be late because you never told your teams that arriving promptly for meetings is a cultural habit you want to build.</p><p>It&#8217;s also really easy to say &#8220;this person missed the deadline because  they didn&#8217;t work hard enough.&#8221; It&#8217;s really hard to see within yourself that they might have missed that deadline because you didn&#8217;t check in with them when they got stuck and that you didn&#8217;t reinforce why the deadline was so important to hit in the first place.</p><p>At the end of the day, <strong>it </strong><em><strong>all</strong></em><strong> comes back to you</strong>. I&#8217;m glad I learned this lesson now.</p><h3>A military theme</h3><p>The next book on my list came from a recommendation from yet another  Ask Hacker News thread&#8230;because we, as engineers, have never seemed to figure out the transition to engineering management.</p><p>I just so happened to have finished a book from a military officer so it was quite impeccable timing that one of the top comments on this thread was about a free leadership book produced by the US Army. I  figured if they can train millions of Americans to fight in the most powerful army in the world then they probably have figured out how to train junior officers and generals alike.</p><p><em>ADP 6-22</em>, which sounds like the name of a Star Wars robot assassin, was a very short and to-the-point read that I got through in one night. I should probably read this one again. This is like <em>How to Win Friends and Influence People</em> in that it is so fundamental that you learn something new every time you go back and read it. This is more than just a book for leaders like me, this is a book for every kind of leader in every kind of profession.</p><p>Because of this broad appeal, I am saddened to say I can&#8217;t recall any lessons that I haven&#8217;t already learned elsewhere. I mean we&#8217;re talking real basic stuff like how to communicate effectively and how to report up the chain of command. These are all such cornerstone topics I  couldn&#8217;t tell you if I learned them because of this book or if I learned them years ago and they were resurfaced through this book.</p><p>This post is a reminder to myself that I have to read this book again. It&#8217;s also a reminder that when I finished reading this book I  recommended Jocko Willink cover it on his podcast. He replied back to my tweet but I&#8217;m pretty sure he hasn&#8217;t covered it yet.</p><p>In looking for that podcast episode I just discovered the Army <a href="https://rdl.train.army.mil/catalog-ws/view/ADP6-22-Audiobook/index.html">also published an audiobook of this manual</a> so if you&#8217;d rather listen to the book now you have 0 excuses. Both are free to download from the US Army website.</p><h3>High octane learning</h3><p>The last three books I&#8217;ve read on engineering management were probably the most rewarding and the most tactical since I had listened to the &#8220;Management Trinity&#8221; over three years ago. These were <em>Accelerate</em>, <em>The Manager&#8217;s Path</em>, and <em>An Elegant Puzzle</em>.</p><p><em>Accelerate</em> teaches you about the <a href="https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance">DORA metrics</a> which completely revolutionized how I thought about measuring the performance and effectiveness of my teams. It radically simplified my quest for understanding how strong my developers were without having to resort to controversial tools like Code Climate Velocity and Jellyfish.  This book on its own can transform how much work your teams get done through their DevOps practices.</p><p><em>The Manager&#8217;s Path</em> does a great job of spelling out the typical career ladder for a manager. Since I didn&#8217;t read this book until  I was a director, I mostly skipped over the previous roles I had already attained: tech lead and front-line engineering manager.</p><p>Director is the next major leap because you go from leading individuals to leading teams via other engineering managers. Now you&#8217;re not coaching individuals on how to write effective code, you&#8217;re teaching managers all of the things you were supposed to have learned yourself in the books I had already read.</p><p>This book helped me dial in on a few new concepts I hadn&#8217;t really practiced before: <strong>skip level 1-1s, coaching managers, and peer management</strong>.</p><p>As an aside, I can&#8217;t imagine being a director without having read so many books beforehand. What is it like to teach other managers if we&#8217;re already really bad at teaching our craft?</p><p>I guess this can come through hard-fought experience as well which is why I can&#8217;t stress enough that <strong>books are one of the cheapest, highest ROI ways to accelerate your career</strong>.  There is no way I would be successful as a director today if I didn&#8217;t make up for the lack of job experience with a massive amount of self-education.</p><p><em>An Elegant Puzzle</em> is the last book I&#8217;ve read on engineering management. It&#8217;s a pretty large book and I&#8217;ve been slowly making my way through it since the past summer. A big reason why it has taken so long is that I learn something new on nearly every page. I find myself reading and re-reading pages because the nuggets are so golden I have to stop and take a second look.</p><p>From sizing engineering teams to delivering presentations to senior leadership, these are the kinds of duties I have to perform as a  director. I think one of the reasons I&#8217;ve been able to stay successful in my current role is because of this book. There are literally too many lessons I&#8217;ve learned from this book that it would take me an entire series of blog posts to synthesize them all so I would just encourage you to read the book for yourself.</p><h2>What&#8217;s next</h2><p>The only two books that were in the curriculum that I haven&#8217;t mentioned yet are <em>Nonviolent Communication</em> and <em>The Trillion-Dollar Coach</em>.</p><p>I read <em>NVC</em> a year ago right before we kicked off a big feedback week as a company but I found I had already internalized this framework from the feedback topic on the <em>Manager Tools</em>  Management Trinity. The exact, step-by-step framework that Horstman recommends for delivering feedback is almost entirely based on <em>Nonviolent Communication</em>. If you&#8217;ve read <em>The Effective Manager</em> you don&#8217;t need to read this book if you specifically want to deliver feedback as a manager.</p><p>I still haven&#8217;t read <em>The Trillion-Dollar Coach</em> because as I  stated before I think the lessons here are likely above my pay grade.  That said, I&#8217;m still probably going to read it next because I&#8217;m really intrigued to read about how this guy has managed to persuade so many top executives to utilize him as a coach. That story alone is astounding enough that I want to read about it and maybe I&#8217;ll pick up so useful management topics.</p><p>Finally, if I were to organize the upcoming reading list from my previous post of 40 books, I&#8217;d say the next three after <em>The Trillion-Dollar Coach</em> would be: <em>Resilient Management</em>, <em>Turn the Ship Around!</em>, and <em>The Five Dysfunctions of a Team</em>. I&#8217;m incredibly intrigued by <em>Resilient Management</em> because I respect Lara Hogan&#8217;s work and read her blog. I&#8217;ve heard <em>Turn the Ship Around!</em> more times than I can recall and I am a sucker for any book that has a military theme wrapping management concepts. <em>The Five Dysfunctions of a Team</em> is yet another book that has been recommended so many times in my circles that I have to read it sooner rather than later.</p><p>I&#8217;m sure there are plenty of books I should have read earlier in my remaining list of 40 books and as I read them I&#8217;ll be sure to update my curriculum but I&#8217;d also love to hear from you what books you&#8217;ve found most valuable in your education as an engineering manager.</p><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 126 of the User Interfacing Newsletter. </strong><br><br><strong>No new links for this week. </strong>From the <a href="https://userinterfacing.substack.com/p/teach-yourself-engineering-management">last installment of the newsletter</a>, I pointed out that links are taking a backseat and will be added now as I find truly beneficial links to share with you all.</p><p>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,</p><p>Adam</p>]]></content:encoded></item><item><title><![CDATA[Teach yourself engineering management]]></title><description><![CDATA[User Interfacing Newsletter Volume 125]]></description><link>https://userinterfacing.substack.com/p/teach-yourself-engineering-management</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/teach-yourself-engineering-management</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 02 Feb 2021 18:00:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi again old friend &#128075;</p><p>Now that we&#8217;re a month into 2021 I&#8217;m still finding there to be a real lack of quality articles in the front-end world.</p><p>So the best way I can solve this problem is to contribute articles rather than complain about a lack of good content. That means you&#8217;re going to see two major changes to this newsletter:</p><ol><li><p><strong>I will be writing long-form articles every week and publishing them here, in full. </strong>That means you don&#8217;t need to subscribe to my <a href="https://adamconrad.dev/blog/">blog</a> you can just read everything I write in this Substack.</p></li><li><p><strong>I&#8217;ll still have industry articles as I find them, but it won&#8217;t be the main focus of the newsletter. </strong>Maybe 2020 sapped the life out of my ability to find good articles, or maybe there was just less quality content in the feeds I checked last year. But I can&#8217;t reliably create a post every week given the current stream of content and the only way I can best serve this community is to de-emphasize that portion of what I&#8217;ve built so far.</p></li></ol><p>I know a great number of you appreciate the hand-curation of articles every week. So this may change your interest in the newsletter going forward and I get that. My hope is that the new format will both provide you more value and make the newsletter more engaging and interesting going forward. Any feedback or thoughts please let me know!</p><div><hr></div><h1><a href="https://adamconrad.dev/blog/teach-yourself-engineering-management/">Teach yourself engineering management</a></h1><p>Engineering management is rarely taught to new managers.</p><p>The usual path to management looks something like this: your manager identifies you as someone with potential but there are either (A) no more ranks to climb as an engineer or (B) no good managers they can hire so they put you in the manager slot.</p><p>This is troublesome for two reasons:</p><ol><li><p>Not everyone wants to be a manager</p></li><li><p>For those that do, they&#8217;re thrust into the job without any training or help</p></li></ol><p>If you&#8217;re one of the lucky managers who actually wanted to make this change then you <em>need</em> to learn how to manage effectively.</p><p>This curriculum is based on what I taught myself over the last 4  years to climb the ranks from engineering manager to director. This curriculum is also the same one I will use to continue up the ranks to  VP and CTO as I believe the advice and needs change as you move higher in an organization.</p><p>I&#8217;m going to arrange this much like you would a computer science curriculum: start with some core courses (books) and then bridge into more advanced concepts, with optional side tracks for certain specialties (or weaknesses) to focus on as you gain more knowledge.</p><h2>Freshmen Core Curriculum (Mandatory Reading)</h2><p>I consider this to be the base of all learning for engineering managers - from line managers who call themselves &#8220;Engineering Manager&#8221;  all the way up to founders. Anyone can get something great out of these  books and they are the ones that are recommended the most often:</p><h3>The Effective Manager &amp; The Manager Tools podcast</h3><p>When I first started out I just wanted someone to walk me through the basics. That&#8217;s exactly what this book and the podcast do for you. I&#8217;ll simplify it even further: <a href="https://www.manager-tools.com/2009/10/management-trinity-part-1">listen to the Manager Tools Trinity</a>. This is your 101 intro course.</p><p><strong>If you took nothing else away from this post, listen to the Trinity.</strong></p><p>It is opinionated. It might even be considered controversial. But if you nailed <strong>one-on-ones, feedback, coaching, and delegation</strong> you would be 80% ahead of your peers.</p><p>The book expands on these 4 concepts with examples aplenty but I&#8217;d recommend you listen to these 3 podcast episodes on repeat until every concept from each episode is drilled into your brain. Nothing has carried me as far into my management career as these three episodes.</p><h3>Extreme Ownership</h3><p>This one is so foundational that I would argue this is for everyone,  not just managers. In a way, I could consider this to be the prologue to the management curriculum.</p><p>This book was written by a Navy SEAL officer who says that <strong>you own everything in your life.</strong> And I do mean <em>everything</em>. Every failure, every win, and every stalemate is attributed to something you have done.</p><p>Your developer didn&#8217;t push code with tests? You own that because you didn&#8217;t ensure they internalized the policy on tests must be delivered with code.</p><p>Your team missed a deadline? You didn&#8217;t reduce the scope and have an exit strategy for what could happen if the milestones slip.</p><p>No matter what the question, it all comes back to <em>you</em>. The magical thing is once you internalize this concept and lead by example, <em>everyone</em> on your teams picks up on this and they also share in that ownership.  It&#8217;s an accountability feedback loop that only trends in a positive direction.</p><h3>Army Leadership and the Profession (ADP 6-22)</h3><p>Speaking of military books, here&#8217;s another leadership book is taken directly from the US Army that you can read for free <a href="https://armypubs.army.mil/epubs/DR_pubs/DR_a/pdf/web/ARN20039_ADP%206-22%20C1%20FINAL%20WEB.pdf">here</a>.</p><p>I didn&#8217;t find this book until I was a director but this is one of the highest-recommended books on leadership I&#8217;ve ever come across. <em>This</em> is an actual Leadership 101 book. It covers everything from mindset to effective communication to how to actually lead and get others to follow.</p><p>While <em>TEM</em> is the most tactical 101 book for your needs as an engineering manager, this is the true 101 must-read for any manager in any profession. If the world&#8217;s most powerful military uses it to train their officers then I would imagine it can be a great foundational read for you as well.</p><h3>The Manager&#8217;s Path</h3><p>Once you&#8217;ve nailed the tactical basics with the right mindset, only then can you begin to see the hierarchy of how one develops into a  manager from a technical lead. This is a bit more high-level than the other two books because it covers the whole path from tech lead all the way up to VP and CTO.</p><p>I like this book because it helps you understand the relevant concepts that are most important at each level. I reference this book every once and a while even as a director just so I can refresh my memory on what is most important at my current level and how to start thinking about operating at the next level.</p><h3>The 27 Challenges Managers Face</h3><p>This is your dictionary and thesaurus of engineering management. As the book says, it walks you through how to handle 27 of the most common challenges with the people on your teams. Everything from under-productive developers to personal conflicts, this book walks through each scenario step-by-step.</p><p>Because you&#8217;re never going to memorize, internalize, or encounter all  27 issues when you first start out, this book is best left to skim once to keep in the back of your head so that when you do encounter a  situation, you can remember it was covered in this book and to quickly look it up for actionable guidance in your difficult situation.</p><h2>Sophomore Curriculum (for Directors)</h2><p>Honestly, you could stop here and you&#8217;d be way ahead of other managers in the field. At some point, you&#8217;ll move up in your career and you&#8217;ll need to focus on a different set of things.</p><p>Instead of learning how to hire engineers and conduct interviews,  you&#8217;re learning how to create hiring programs. Instead of hiring for a  budget, you&#8217;re drafting the budget. Instead of building a team, you&#8217;re building many teams and training those managers to run those teams autonomously.</p><p>These are the books for your next set of challenges:</p><h3>An Elegant Puzzle</h3><p>This is arguably my favorite engineering management book. Like <em>The Effective Manager</em>, it has play-by-play guidance on extremely important topics to managers. The difference is that <em>TEM</em> covers the tactics to manage individual contributors (ICs). <em>An Elegant Puzzle</em>, however, covers the tactics to manage and build teams.</p><p>As a director, this is my CLRS <em>Algorithms</em> book. It is both my bible and my reference guide for all of the major facets of my job as a director. It covers everything from how to size engineering teams to how to build a hiring funnel.</p><p>Given that Will wrote this as a tech leader at Stripe (and is now a  CTO at Calm) this book is useful for anyone at the director stage and above. I am sure I will continue to reference this as I transition into senior management roles.</p><h3>The Talent Code</h3><p>This is about how to nurture talent and bring out top performers. I  debated whether or not to add this to the Core Curriculum because it is something any manager would benefit from learning more about. However,  this is more of an advanced concept in coaching and arguably about identifying top talent as a hiring manager.</p><p>Therefore, I just don&#8217;t see this as a core reading but if you are so inclined to dive more into the coaching aspect of management, this is a  great book.</p><p>There is also <em>The Little Book of Talent</em> which is like an abridged version of this book with 52 specific tips and traits for fostering talent which is an acceptable substitute for this one if you didn&#8217;t enjoy this book. Personally, I like <em>TLBOT</em> more since I found the backstories of some of these talent aspects to be ranting diatribes but to each their own.</p><h3>Accelerate</h3><p>This book is not about management. But once you become a director you&#8217;ll want to start measuring the performance of your teams to help identify bottlenecks, weak points, and performance gaps. <em>Accelerate</em> provides the most robust, scientifically-backed means with which to do so.</p><p>The book is the foundation for the <a href="https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance">DORA metrics</a>  (also known as the &#8220;Four Keys&#8221;) so you could theoretically skip the whole book and read just this blog post and you would get the gist of what they are trying to accomplish.</p><p>If you do want to read more, the actual meat of the study and the takeaways are in the first half of the book. If you&#8217;re a real nerd for the scientific method, the second half of the book goes into the details of how the study was conducted and really dives into <em>how</em> they determined the results while the first half focuses on <em>what</em> the results were.</p><h2>Junior Curriculum (for VPs)</h2><p>As I mentioned before - I&#8217;ve never been a VP of Engineering so I  can&#8217;t speak to whether these are good books for VPs, but they are books I  have read and plan to revisit when I get there because I found them to be unnecessary for my journey so far.</p><h3>High Output Management</h3><p>To start, this is a great book and is in the engineering management canon for a reason. That reason is it was written by the former CEO of  Intel who helped transform the company into the leading semiconductor outfit in the world.</p><p>But that&#8217;s exactly it - it was written by a CEO. The things he needs to think about to run a successful organization are not what you need to worry about as a line manager or even as a director. All of the other books above should come before you read this book. I know this because I  read it and I don&#8217;t remember what I retained from it.</p><p>I know it was a great read at the time but the only thing I can remember that applies to my work is that there was a massive  200-something point checklist at the end of the book to evaluate yourself and your organization in areas for improvement. This is exactly the kind of list that is useful for someone who runs an entire engineering organization but is major overkill if you don&#8217;t.</p><p>And even then, this book was written in 1995 so there are a lot of stories and concepts that are both dated and more relevant to the hardware industry (while I primarily cater to software leaders).</p><p>I&#8217;ll definitely reference this for the next company I join but if you read the other books first you&#8217;d be in a great spot.</p><h3>Trillion Dollar Coach</h3><p>Warning: I haven&#8217;t read this book yet. That alone should be a reason why you can understand why it is in the higher-level curriculum than my pay grade. Why?</p><p>So far, everyone who has recommended this book to me has either been a  CEO or a CTO of a startup. And this book is about engineering startup playbooks. This tells me that it&#8217;s all about building engineering teams with top-brass leaders in mind.</p><p>The title gives that away: the term &#8220;trillion-dollar coach&#8221; comes from the fact that this management consultant has helped guide the chief executives at Apple, Google, and Intuit, who have a combined market cap well into the trillions.</p><p>Browsing the table of contents, terms like &#8220;team first&#8221; and &#8220;envelope of trust&#8221; are the kind of visionary, aspirational wordsmithery of those who command a very senior title. Therefore, this is a book I want to get to but I&#8217;d rather work through much of my reading list first before I  get here.</p><h2>Senior Curriculum (for CTOs and Founders)</h2><p>At this level, you&#8217;re writing checks or you&#8217;re pitching to the people who write those checks. If line managers are tactical, directors are strategic, and VPs are visionary, then you are the foundation and the exemplar. Everything stems from you.</p><p>You might be a technical co-founder or you&#8217;re incoming CTO of the entire United States in which case thanks for reading my blog, I have no idea how you got here or why you&#8217;re taking advice from me.</p><p>I have co-founded <a href="https://gettoknowapp.com/">a venture of mine</a> which is just me and a friend so I can&#8217;t say these books help in managing humans but they have been useful as the CTO of that outfit.</p><h3>Venture Deals</h3><p>This is a great founder 101 book because it explains all the nuances of setting up a software company, scaling it, and all of the nuances about raising capital and pitching to investors.</p><p>While it is definitely framed more for founders than for leaders at established companies, there is some <em>excellent</em> wisdom in here about how to organize your company. There is a great exercise in here about how you split up all of the executive roles based on the number of founders you have and how to complement skill sets based on all of the functions a company needs to operate, such as marketing, sales, and engineering.</p><p>What resonates with me as a leader is that <strong>building teams require some combination of redundancy and complement in skill sets.</strong>  Know what skills you need to bolster (e.g. front end) and what skills are lacking to round out your teams (e.g. platform engineering) and it will be easier to scale with the needs of your organization.</p><h3>The Hard Thing About Hard Things</h3><p>I&#8217;ll admit, this is one of those pop non-fiction books that have a  lot of cool stories marrying Ben Horowitz&#8217;s love of technology and hip-hop. I came for the stories and stayed for a few nuggets of sage advice. The biggest one being <strong>nip rumor culture in the bud.</strong></p><p>This one I noticed from a previous startup and when it&#8217;s bad, it is toxic. Knowing what it looks like first-hand and how to resolve it  (thanks to this book), I&#8217;m much more aware of how to maintain a strong culture with integrity and honesty now and how information needs to travel from the top down.</p><p>The other one I remember is to <strong>take care of your people.</strong> Empathy, trust, and psychological safety are <a href="https://adamconrad.dev/blog/technical-lead-management/">tops on my list</a> of skills to build as a leader and there are a lot of examples where  Ben was put in a rough situation and had to either fire someone compassionately or ask way too much from his employees. He knew the only way he could ask so much was if he spent the rest of his time caring for his people.</p><p>That kind of caring takes <em>years</em> to build with your teams and the only way you will get people to join your crazy ride is to deeply care about how they are as people.</p><h3>Zero to One</h3><p>This is another pop non-fiction book from Peter Thiel that everyone seems to reference but is really full of stories and lacking in major tactics. You walk away from books like this and <em>THTAHT</em> with like one or two nuggets and appreciate for what it is: a fun read feigned as education.</p><p>Thiel really lets his libertarian pride shine in this one. I&#8217;m not trying to get political here but the main takeaway I got from this book is that <strong>moats are powerful</strong> and <strong>crush your enemies with a monopoly.</strong></p><p>I think if I were running a venture-backed firm with a bit more fire under my ass this book would have spoken to me more but I found it a bit too cutthroat for me. Your mileage may vary and it is a  highly-recommended book so I&#8217;m still willing to include it here.</p><h3>Traction</h3><p>Another book that is not about management. But the only way you&#8217;ll grow big enough to be a manager of people is to build something people want so much that you need to hire folks to build it fast enough.</p><p><em>Traction</em> has a ton of great insights I&#8217;ve used to build my side projects into profitable ventures with tactics on how to get users.  I haven&#8217;t even begun to use all of the tricks in this book but it is absolutely a worthwhile read particularly if you are an early-stage software startup founder.</p><h2>Specialty tracks and additional books I&#8217;ve enjoyed</h2><p>Many college CS programs offer you the opportunity to specialize in certain disciplines within computer science after you learn the basics.  These include artificial intelligence, programming languages, and human-computer interaction.</p><p>Similarly, engineering management has a few specialties as well and  I&#8217;ve read a few books that delve into very particular facets of the  management craft:</p><h3>Influence, persuasion, and soft skills</h3><p><em>How to Win Friends and Influence People</em> is a classic among the classics. I think it is one of the most highly-read non-fiction books of all time.</p><p>The title is so to the point you might hide the cover on the subway for fear you might look like a social Luddite. It is not that kind of book. This book is not how to make friends for dummies.</p><p>This is a book on getting others to do things you want <em>without losing your moral compass</em>.  Influence is a very neutral term: to some, it sounds like something slimy a salesman does to convince you to sign on the dotted line. To others, it sounds like the kind of charismatic tactic President Clinton used to win over voters in the presidential debates.</p><p>I&#8217;d say this book is one of those gentle reminders that <strong>you should be nice to people and that being nice to people makes it much easier to get them to see your side.</strong></p><p>This book just has to be read (and re-read) to be believed. It should be on everyone&#8217;s reading list for the simple fact it&#8217;s so widely accessible and in every library that it&#8217;s basically free.</p><h3>Health and productivity</h3><p><em>How Not to Die</em> is a mammoth text at over 570 pages. It&#8217;s not a management book. It&#8217;s not a software book. It&#8217;s not even a self-help book by how you would commonly define that genre of book. This is a book on healthy eating.</p><p>In a year like we&#8217;ve just had, health has become a front-and-center reality for us all. Healthy habits have <a href="https://www.cdc.gov/workplacehealthpromotion/model/control-costs/benefits/productivity.html">been shown</a> to increase productivity.</p><p>I live by six healthy habits that doctors recommend every day:</p><ol><li><p>Eat right</p></li><li><p>Exercise</p></li><li><p>Don&#8217;t smoke</p></li><li><p>Drink in moderation</p></li><li><p>Reduce stress</p></li><li><p>Get enough sleep</p></li></ol><p>This book tackles habit number 1. It explains how <a href="https://nutritionfacts.org/video/dr-gregers-daily-dozen-checklist/">this doctor&#8217;s list of a dozen food groupings</a> help reduce all-cause mortality for all but one of the top 20 reasons people die (the one it can&#8217;t help are car accidents). From obesity to cardiovascular disease, all of these foods and habits help you improve your health through the basics we&#8217;ve learned all along: a diet rich in whole fruits, vegetables, legumes, and grains is shown to improve health.</p><p>There is even an app for both <a href="https://apps.apple.com/us/app/dr-gregers-daily-dozen/id1060700802">iOS</a> and <a href="https://play.google.com/store/apps/details?id=org.nutritionfacts.dailydozen&amp;hl=en&amp;gl=US">Android</a> to help you track your daily progress on eating these key foods. I use it and my Apple Watch as one of my key health staples for ensuring I  meet these 6 habits every day.</p><p>A healthy manager is a productive manager operating a peak performance.</p><h3>Giving feedback</h3><p><em>Nonviolent Communication</em> spells out a four-step process for delivering feedback. This one was a game-changer for me on how to speak to people in a way to promote behavior change without casting blame or making people feel bad.</p><p>If you want the ultimate deep-dive into how to deliver feedback that resonates with your directs, this is a book to read and study carefully.</p><h3>Salary negotiation, hiring, and retention</h3><p><em>Never Split the Difference</em> is great whether you are looking for a new job or you are trying to hire a key candidate. It was written by an FBI hostage negotiator who takes a pretty hard stance on how to jump into a negotiation.</p><p>This is another one of those books that take 300 pages to convey a  few key points as most pop self-help books do these days. I thought the book was entertaining so I didn&#8217;t mind the fluff but the biggest takeaway I got from this book is the phrase <strong>how am I supposed to do that?</strong></p><p>If I recall correctly, the author was put on the spot to negotiate a  really tough situation like how to give terrorists millions of dollars or else they will kill the ambassador. Most people who read this panic and have no idea what to do and figure the author is totally trapped into this nearly-impossible scenario. His response is clutch: &#8220;how am I  supposed to do that?&#8221;</p><p>In other words, <strong>if the person on the other side of the table is being unreasonable, turn their poor offer back on them through empathy</strong>.  Let&#8217;s say you&#8217;re making a cool $150K at your current job and the company interviewing you just offered you $110K for acing their interview.</p><p>You can reply with &#8220;how am I going to be able to take that offer when  I&#8217;m already making more than that?&#8221; You&#8217;re putting the onus on the hiring manager to come up with a really good reason why they should make the obviously irrational choice of choosing to leave their current job for a worse one with a lower salary. This forces the hiring manager into a situation where they have to come back to the table with a stronger offer.</p><p>As a manager, you can use this tactic as well&#8230;but I&#8217;ve already said enough about this book. It&#8217;s great and it goes into a bunch more tactics on negotiation which you can use when looking to hire new members for your team(s).</p><h3>Interview process &amp; design</h3><p><em>Cracking the Coding Interview</em> is the canonical reference for developers looking to pass the interview at the FAANG companies and land that big salary. The whole purpose of this book is to game the system like one does for studying the MCAT or SATs with practice questions used at real companies.</p><p><strong>I&#8217;m </strong><em><strong>not</strong></em><strong> recommending this book so you can just copy questions from here to use in your interviews.</strong> In fact, I am recommending the opposite: this book is a great way to identify which questions are complete <em>nonsense</em>.</p><p>If you&#8217;re a web startup you have no business asking JavaScript developers about bit manipulation and bit shifting. Is it useful knowledge? Possibly. Do any of you read this article actually use heavy bit shifting techniques in your code? Extremely unlikely.</p><p>The only time I found a bit manipulation interview question praiseworthy was an interview I did many years ago for a hardware company that built IoT devices. They actually used these techniques and the interview question was actually really fun.</p><p>For the rest of you, this is a net-negative and just makes you look pretentious and leading to more false negatives than you can stand to lose in the hiring process.</p><p>The bonus for reading this book is if you ever decide to become an IC  again you&#8217;ll have no trouble getting a job or grinding LeetCode.</p><h2>Books on my list that I haven&#8217;t organized yet</h2><p>Finally, here are the books on my reading list as a manager that I  haven&#8217;t read before and I don&#8217;t know where to bucket them in the curriculum yet. As I read them I&#8217;ll update this post with where they should fit. For now, here are the books on my reading list  that I hope  to get through in 2021:</p><ul><li><p><em>The Art of Leadership</em></p></li><li><p><em>The Charisma Myth</em></p></li><li><p><em>The Coaching Habit</em></p></li><li><p><em>Confessions of an Advertising Man</em></p></li><li><p><em>Content Inc</em></p></li><li><p><em>Deep Work</em></p></li><li><p><em>Difficult Conversations</em></p></li><li><p><em>The Effective Executive</em></p></li><li><p><em>First, Break All the Rules</em></p></li><li><p><em>The Five Dysfunctions of a Team</em></p></li><li><p><em>High Growth Handbook</em></p></li><li><p><em>It&#8217;s Not How Good You Are, It&#8217;s How Good You Want To Be</em></p></li><li><p><em>Leadership Step by Step</em></p></li><li><p><em>The Making of a Manager</em></p></li><li><p><em>Managing Humans</em></p></li><li><p><em>Managing the Unmanageable</em></p></li><li><p><em>Measure What Matters</em></p></li><li><p><em>Mindset: The New Psychology of Success</em></p></li><li><p><em>No Hard Feelings</em></p></li><li><p><em>The ONE Thing</em></p></li><li><p><em>Only the Paranoid Survive</em></p></li><li><p><em>The Phoenix Project</em></p></li><li><p><em>Quiet Leadership</em></p></li><li><p><em>Radical Acceptance</em></p></li><li><p><em>Radical Candor</em></p></li><li><p><em>Righting Software</em></p></li><li><p><em>Running Lean</em></p></li><li><p><em>Software Engineering at Google</em></p></li><li><p><em>Sprint</em></p></li><li><p><em>Start with Why</em></p></li><li><p><em>Strategic Logic</em></p></li><li><p><em>Team of Teams</em></p></li><li><p><em>Team Topologies</em></p></li><li><p><em>Technical Leadership and the Balance with Agility</em></p></li><li><p><em>Technology Strategy Patterns</em></p></li><li><p><em>Thinking in Promises</em></p></li><li><p><em>The Timeless Way of Building</em></p></li><li><p><em>Turn the Ship Around!</em></p></li><li><p><em>The Win Without Pitching Manifesto</em></p></li><li><p><em>Your Code as a Crime Scene</em></p></li></ul><div><hr></div><h1>New things I&#8217;ve read recently</h1><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/12/practical-introduction-dependency-injection/">https://www.smashingmagazine.com/2020/12/practical-introduction-dependency-injection/</a> - A simplified explanation (with solid examples) of this basic principle.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://dndkit.com/">https://dndkit.com/</a> - I don't know why Drag-n-Drop has been so elusive on React (in a lightweight way) but I finally found something worth using!</p></li><li><p><a href="https://www.smashingmagazine.com/2021/01/front-end-performance-2021-free-pdf-checklist/">https://www.smashingmagazine.com/2021/01/front-end-performance-2021-free-pdf-checklist/</a> - Everything related to performance under the sun. Extensive and will take a long time to get through but you can probably skip over the obvious things you already know.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://measuringu.com/nps-confidence-intervals/">https://measuringu.com/nps-confidence-intervals/</a> - Measuring confidence intervals involves just a little bit of statistics and math but can be worth it to assure your surveys are reliable in what they are showing.</p></li><li><p><a href="https://i.redd.it/scthk1rsup961.jpg">https://i.redd.it/scthk1rsup961.jpg</a> - TIL "prefers-reduced-motion" is a thing in CSS for a11y. Nice!</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://allenc.com/2021/01/productive-enough/">https://allenc.com/2021/01/productive-enough/</a> - I also no longer understand why GTD would be considered out of style?</p></li><li><p><a href="https://candost.blog/how-to-stop-endless-discussions/">https://candost.blog/how-to-stop-endless-discussions/</a> - We're actually thinking about this on my teams - how can we generate feedback asynchronously to ensure we stay productive without creating endless meetings?</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><strong>Aaaand we&#8217;re done with issue 125 of the User Interfacing Newsletter. </strong><br><br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter? Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br><br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[The time to start is now]]></title><description><![CDATA[User Interfacing Newsletter Volume 124]]></description><link>https://userinterfacing.substack.com/p/the-time-to-start-is-now</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/the-time-to-start-is-now</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Fri, 01 Jan 2021 02:37:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I just sent this email to everyone.</p><p>Most people think that January 1st represents some magical reset button for the world and how they can operate. Yes, 2020 was a bummer and 2021 is looking to be much brighter. But there is nothing inherently special about tomorrow that will unlock who you want to become. <strong>There is no better time than the present to appreciate what you have and begin to go after the things you want. </strong></p><p>So here&#8217;s to the final newsletter of the year without having to wait for some arbitrary clock to decide when we should get started on our goals!</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://css-tricks.com/2020-was-not-a-good-year-for-learning/">https://css-tricks.com/2020-was-not-a-good-year-for-learning/</a> - This might explain why I've found it tough to find good content lately...there hasn't been good teaching going on!</p></li><li><p><a href="https://www.zainrizvi.io/blog/the-interviewing-advice-no-one-shares/">https://www.zainrizvi.io/blog/the-interviewing-advice-no-one-shares/</a> - The new year means interviewing so get a head start before the year begins.</p></li><li><p><a href="https://www.youtube.com/watch?v=VfGW0Qiy2I0">https://www.youtube.com/watch?v=VfGW0Qiy2I0</a> - No better time to hone in on all the fundamentals of web development than right now!</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://css-tricks.com/how-to-load-fonts-in-a-way-that-fights-fout-and-makes-lighthouse-happy/">https://css-tricks.com/how-to-load-fonts-in-a-way-that-fights-fout-and-makes-lighthouse-happy/</a> - I did this for my personal sites and it is hard to do and some extra work but worth it for a great experience!</p></li><li><p><a href="https://www.smashingmagazine.com/2020/11/weaving-web-accessibility-usability/">https://www.smashingmagazine.com/2020/11/weaving-web-accessibility-usability/</a> - Not just about the basics of accessibility guidelines but also how to deliver this to customers when doing user interviews.</p></li><li><p><a href="https://blog.pragmaticengineer.com/performance-self-review-for-software-engineers-with-an-example/">https://blog.pragmaticengineer.com/performance-self-review-for-software-engineers-with-an-example/</a> - It's annual review season, so don't forget to write something great about yourself!</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="http://wondermark.com/garfield-color/">http://wondermark.com/garfield-color/</a> - What a wonderful look into a thing I never thought I'd think about.</p></li><li><p><a href="https://www.smashingmagazine.com/2020/12/design-simple-ui-complex-solution/">https://www.smashingmagazine.com/2020/12/design-simple-ui-complex-solution/</a> - A thoughtful (though cursory) look at how we can simplify UIs with examples.</p></li><li><p><a href="https://www.smashingmagazine.com/2020/12/feature-prioritizing-ways-reduce-subjectivity-bias/">https://www.smashingmagazine.com/2020/12/feature-prioritizing-ways-reduce-subjectivity-bias/</a> - Reducing bias is useful regardless of your field.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://jeffchen.dev/posts/Technical-Interview-Checklist/">https://jeffchen.dev/posts/Technical-Interview-Checklist/</a> - I will be filling in the gaps in my own process with this list.</p></li><li><p><a href="https://stackoverflow.blog/2020/12/07/measuring-developer-productivity/">https://stackoverflow.blog/2020/12/07/measuring-developer-productivity/</a> - This productivity article I&#8217;m going to keep in my back pocket for a while.</p></li><li><p><a href="https://www.businessinsider.com/biden-cto-vaccine-distribution-climate-change-2020-12">https://www.businessinsider.com/biden-cto-vaccine-distribution-climate-change-2020-12</a> - The upcoming technical leadership in the White House is in for a huge challenge. What challenges are we up for in the new year?</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 124 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter?</strong> <strong>Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[How much do side projects help when interviewing?]]></title><description><![CDATA[User Interfacing Newsletter Volume 123]]></description><link>https://userinterfacing.substack.com/p/how-much-do-side-projects-help-when</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/how-much-do-side-projects-help-when</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Tue, 17 Nov 2020 17:00:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi again old friend &#128075;</p><p>Turns out you&#8217;d much rather receive less email but keep it super relevant and full of articles. As much as I&#8217;d love to send the emails weekly I&#8217;ve really struggled to keep the quality of the content high with that kind of frequency so it may continue to become a bi-weekly (or even monthly) newsletter. </p><p>Thanks for the feedback and enjoy this round!</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://old.reddit.com/r/learnjavascript/comments/jic377/javascript_string/">https://old.reddit.com/r/learnjavascript/comments/jic377/javascript_string/</a> - This is about as basic as it gets for a beginner - how to use strings!</p></li><li><p><a href="https://joshwcomeau.com/operator-lookup/">https://joshwcomeau.com/operator-lookup/</a> - This is a great tool for understanding all of the operators that are used in JavaScript. Really fun to play around with!</p></li><li><p><a href="https://www.smashingmagazine.com/2020/11/authenticating-react-apps-auth0/">https://www.smashingmagazine.com/2020/11/authenticating-react-apps-auth0/</a> - Learning how to authenticate without rolling your own authentication is a really smart move.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://blog.bitsrc.io/best-practices-with-react-hooks-69d7e4af69a7">https://blog.bitsrc.io/best-practices-with-react-hooks-69d7e4af69a7</a> - I like the recommendation to use useState with an object as opposed to a series of separate state hook calls.</p></li><li><p><a href="https://www.stillbreathing.co.uk/2016/10/13/technical-credit">https://www.stillbreathing.co.uk/2016/10/13/technical-credit</a> - Technical debt is making the code worse. Technical credit is making your code better. First time I've heard this phrase before.</p></li><li><p><a href="https://allenc.com/2020/11/how-much-engineering-side-projects-help-with-engineering-careers/">https://allenc.com/2020/11/how-much-engineering-side-projects-help-with-engineering-careers/</a> - People want to see your software skills when working on a team, not in a silo for your solo projects.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://www.a11yproject.com/posts/2020-10-15-no-mouse-days/">https://www.a11yproject.com/posts/2020-10-15-no-mouse-days/</a> - I love the idea of a no mouse day to find empathy for those with disabilities requiring keyboard navigation. I bet it is harder than you think, especially if you haven't used Vim or Emacs before!</p></li><li><p><a href="https://danuker.go.ro/the-grand-unified-theory-of-software-architecture.html">https://danuker.go.ro/the-grand-unified-theory-of-software-architecture.html</a> - I'm reading <em>Clean Architecture </em>right now so maybe I don't have to after reading this article.</p></li><li><p><a href="https://secretgeek.github.io/html_wysiwyg/html.html">https://secretgeek.github.io/html_wysiwyg/html.html</a> - If you've ever wondered what a quine is, here is an example illustrated in HTML.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://medium.com/pinterest-engineering/how-a-one-line-change-decreased-our-build-times-by-99-b98453265370">https://medium.com/pinterest-engineering/how-a-one-line-change-decreased-our-build-times-by-99-b98453265370</a> - This is only about cloning repos, but I think the core lesson here is to give your teams the freedom to innovate even when things already seem like they are doing just fine.</p></li><li><p><a href="https://blog.pragmaticengineer.com/what-becoming-an-engineering-manager-is-like/">https://blog.pragmaticengineer.com/what-becoming-an-engineering-manager-is-like/</a> - Not sure if lonely is the right word but it certainly creates a level of separation between when you were an IC and now in your position as an EM.</p></li><li><p><a href="http://feedproxy.google.com/~r/AmSciPizzaLunch/~5/dj8lWCw8i6g/20200701_Lima.mp3">http://feedproxy.google.com/~r/AmSciPizzaLunch/~5/dj8lWCw8i6g/20200701_Lima.mp3</a> - The first data visualizations are over 40,000 years old!</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 123 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter?</strong> <strong>Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[Let's talk about browser storage and left-side bias]]></title><description><![CDATA[User Interfacing Newsletter Volume 122]]></description><link>https://userinterfacing.substack.com/p/we-need-to-talk-about-local-storage</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/we-need-to-talk-about-local-storage</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 22 Oct 2020 17:00:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi &#128075; I did it again.</p><p>For those of you dedicated followers that have emailed me, you know that this is not run by a robot or a marketing firm - I am a real human hand-crafting these emails every week(-ish) with the articles I read. So I won&#8217;t send you anything unless I know it is good which is why I skipped yet another week.</p><p>I&#8217;m now realizing there are a few options here with the newsletters, <strong>and I&#8217;d love your opinion if you could share it with me</strong>:</p><ul><li><p><strong>A. I&#8217;d like smaller, more frequently newsletters. </strong>Instead of 12 articles across 4 levels of expertise, I could send <strong>1 a day but only cover 1-3 most-read articles with more commentary. </strong>Based on the volume of articles that come in my RSS feed (typically 300-400 a day) I can almost guarantee 1-3 good articles a day that will get my attention. Or&#8230;</p></li><li><p><strong>B. I&#8217;d like fewer, higher-quality newsletters. </strong>Continuing the strategy I&#8217;ve been doing, I can keep it to (roughly) once a week but instead focus the collection on a summary of the week (or even month) but spend more time (and length) per newsletter issue.</p></li></ul><p>Would love your feedback, and depending on the responses I&#8217;m going to try out different strategies and see where you land. </p><p>Now on to the articles!</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/10/react-validation-formik-yup/">https://www.smashingmagazine.com/2020/10/react-validation-formik-yup/</a> - Formik and Yup are pretty standard in React these days so this would be a good one to study up on.</p></li><li><p><a href="https://www.youtube.com/watch?v=kClcUzAhz9g">https://www.youtube.com/watch?v=kClcUzAhz9g</a> - A nice, short 10 minute video on how Styled Components work.</p></li><li><p><a href="https://css-tricks.com/a-primer-on-the-different-types-of-browser-storage/">https://css-tricks.com/a-primer-on-the-different-types-of-browser-storage/</a> - You should learn how browser storage can work (such as localStorage, indexedDB, and cookies).</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://www.hassellinclusion.com/blog/accessible-design-reviews/">https://www.hassellinclusion.com/blog/accessible-design-reviews/</a> - I didn't think about text resizing in this article about accessibility reviews.</p></li><li><p><a href="https://www.youtube.com/watch?v=VslCVu7T9iw">https://www.youtube.com/watch?v=VslCVu7T9iw</a> - Need a database to test your app? Try EasyBase.</p></li><li><p><a href="https://measuringu.com/revisiting-the-left-side-bias/">https://measuringu.com/revisiting-the-left-side-bias/</a> - Should you change the way you design forms? I don't think so. I feel like the answer is "people read left to right". I'd like to see this study compared with an RTL language like Japanese.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/10/typescript-in-50-lessons-pre-release/">https://www.smashingmagazine.com/2020/10/typescript-in-50-lessons-pre-release/</a> - In just 50 easy installments you too can be a TypeScript expert.</p></li><li><p><a href="https://www.smashingmagazine.com/2020/10/supercharge-testing-react-applications-wallabyjs/">https://www.smashingmagazine.com/2020/10/supercharge-testing-react-applications-wallabyjs/</a> - Looking for a new testing system? Try wallaby.js!</p></li><li><p><a href="https://davidwalsh.name/cookiestore">https://davidwalsh.name/cookiestore</a> - Geez cookies will never die, huh?</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://vasilishynkarenka.com/learning/">https://vasilishynkarenka.com/learning/</a> - I use basically all of these tactics and it definitely works (hint hint: start a blog or newsletter!)</p></li><li><p><a href="https://gist.github.com/sw-yx/7aeedbeac1bb81017cd4f9d66b223b63">https://gist.github.com/sw-yx/7aeedbeac1bb81017cd4f9d66b223b63</a> - If you're a leader you should be hiring from diverse backgrounds. No excuses - get on this!</p></li><li><p><a href="https://increment.com/documentation/">https://increment.com/documentation/</a> - I only discovered this issue but it is super important if you're a leader to document things well for your teams.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 122 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. </p><p><strong>Interested in sponsoring the newsletter?</strong> <strong>Have questions, comments, or corrections? </strong>Hit that &#8617;&#65039; reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[18 yr olds teaching TypeScript, where the hell have I been? and more...]]></title><description><![CDATA[User Interfacing Newsletter Volume 121]]></description><link>https://userinterfacing.substack.com/p/18-yr-olds-teaching-typescript-where</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/18-yr-olds-teaching-typescript-where</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Wed, 07 Oct 2020 13:00:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What&#8217;s up! &#128075;</p><p>I&#8217;ve run this newsletter for over two years and I rarely skip a week. This time I actually skipped <strong>two weeks</strong> which is completely unlike me. I&#8217;ve always maintained that I won&#8217;t send out a newsletter that isn&#8217;t valuable to you. In this case, I didn&#8217;t find many solid articles in the last few weeks. I could have easily stuffed the newsletter with a bunch of filler articles to meet my quota - but I just won&#8217;t waste my time reading them (and neither should you). So I hope the hiatus was worthwhile, and I&#8217;ll continue to skip weeks if I ever find a shortage of quality articles.</p><p>Glad to see you again!</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/10/understanding-typescript-generics/">https://www.smashingmagazine.com/2020/10/understanding-typescript-generics/</a> - Friendly reminder that this author is 18 years old and is teaching others on the basics of TypeScript generics. Incredible!</p></li><li><p><a href="https://css-tricks.com/styling-complex-labels/">https://css-tricks.com/styling-complex-labels/</a> - This is a great, short tutorial on styling labels.</p></li><li><p><a href="https://www.youtube.com/watch?v=fTBwD3sb5mw">https://www.youtube.com/watch?v=fTBwD3sb5mw</a> - Lots of positive feedback from beginners here on how to build a virtual machine in JavaScript.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://davidwalsh.name/vital-web-performance">https://davidwalsh.name/vital-web-performance</a> - Web performance is now considered a "vital" activity by Google. Please act accordingly.</p></li><li><p><a href="https://www.smashingmagazine.com/2020/10/face-motion-typography/">https://www.smashingmagazine.com/2020/10/face-motion-typography/</a> - Looking to create a cool demo at a hackathon? Check this article out and be prepared to wow and impress your coworkers!</p></li><li><p><a href="https://w3c.github.io/web-share/">https://w3c.github.io/web-share/</a> - This is a brand new API draft which is pretty cool. Excited to not require external share widgets anymore.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://css-tricks.com/accessible-web-animation-the-wcag-on-animation-explained/">https://css-tricks.com/accessible-web-animation-the-wcag-on-animation-explained/</a> - Remember the phrase "pause, stop, hide" for animation accessibility.</p></li><li><p><a href="https://changelog.com/posts/good-reason-experienced-devs-say-it-depends">https://changelog.com/posts/good-reason-experienced-devs-say-it-depends</a> - Lots of people say "it depends" because they've seen enough situations to give an answer either way. Lawyer and doctors are probably the ones you hear from the most.</p></li><li><p><a href="http://antirez.com/news/134">http://antirez.com/news/134</a> - A short and sweet article on why open source is both freedom and a huge responsibility on the author.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://medium.com/better-programming/5-mistakes-that-engineering-managers-make-75aecf42525c">https://medium.com/better-programming/5-mistakes-that-engineering-managers-make-75aecf42525c</a> - I'm pretty good about most of these, but I definitely get in the weeds too often when I should be delegating.</p></li><li><p><a href="https://thoughtbot.com/playbook">https://thoughtbot.com/playbook</a> - Reading through this playbook now for a rubric for a software development life cycle.</p></li><li><p><a href="https://fellow.app/blog/2020/expert-tips-for-new-managers/">https://fellow.app/blog/2020/expert-tips-for-new-managers/</a> - Lots of good folks interviewed here.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 121 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. Interested in sponsoring the newsletter? Have questions, comments, or corrections? Hit that reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[JavaScript media queries, dependency injection, and more...]]></title><description><![CDATA[User Interfacing Newsletter Volume 120]]></description><link>https://userinterfacing.substack.com/p/javascript-media-queries-dependency</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/javascript-media-queries-dependency</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 17 Sep 2020 13:00:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What&#8217;s up! &#128075;</p><p>Every week I find myself cobbling together the last few bits of articles at the last second. I might want to work on <a href="https://www.theengineeringmanager.com/managing-managers/bucketing-your-time/">time management</a>. That one is gonna be a serious read (and re-read) this week. What are you most looking to read in the upcoming week?</p><p>Stay safe,</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://blog.greenroots.info/my-favorite-javascript-tips-and-tricks-ckd60i4cq011em8s16uobcelc">https://blog.greenroots.info/my-favorite-javascript-tips-and-tricks-ckd60i4cq011em8s16uobcelc</a> - These are great tips for a beginner. I actually didn't know about Number.isInteger - even I learned something!</p></li><li><p><a href="https://css-tricks.com/working-with-javascript-media-queries/">https://css-tricks.com/working-with-javascript-media-queries/</a> - You read this right, it does say JavaScript (not CSS) media queries.</p></li><li><p><a href="https://medium.com/@michael.karen/getting-started-with-modern-javascript-arrow-functions-d38053b27e31">https://medium.com/@michael.karen/getting-started-with-modern-javascript-arrow-functions-d38053b27e31</a> - This is a great back to basics post on arrow functions in JavaScript.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://web.dev/content-visibility/">https://web.dev/content-visibility/</a> - Cut down rendering time by almost 90%? Sign me up.</p></li><li><p><a href="https://charity.wtf/2020/09/14/useful-things-to-know-about-engineering-levels/">https://charity.wtf/2020/09/14/useful-things-to-know-about-engineering-levels/</a> - I feel like so many earl-to-mid-level engineers need to hear. Though I disagree about generalists - they can level-up earlier in their career but the further up the ladder you go the more you need to specialize and have a niche.</p></li><li><p><a href="https://medium.com/@Sentinelone_tech/dependency-injection-in-typescript-from-scratch-d1a4422043a0">https://medium.com/@Sentinelone_tech/dependency-injection-in-typescript-from-scratch-d1a4422043a0</a> - Learn you a dependency injection for greater good.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://www.tlt21.com/build-vs-buy-decisions-in-the-age-of-software-abundance/">https://www.tlt21.com/build-vs-buy-decisions-in-the-age-of-software-abundance/</a> -Build the tool or buy it? Great recommendation from a coworker for those of you who are in charge of some serious projects. </p></li><li><p><a href="https://www.patkua.com/blog/multipliers/#more-1181">https://www.patkua.com/blog/multipliers/#more-1181</a> - This guy normally writes for managers but I think this important for you lead/staff/principal engineers because the first moment I realized the idea of being a "value multiplier" was when I started mentoring as a tech lead. Very worthwhile read whether you are a manager or an IC.</p></li><li><p><a href="https://charity.wtf/2020/09/06/if-management-isnt-a-promotion-then-engineering-isnt-a-demotion/">https://charity.wtf/2020/09/06/if-management-isnt-a-promotion-then-engineering-isnt-a-demotion/</a> - No, you do not have to go into management to keep growing in your career as a developer. Don't let your boss tell you otherwise.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://knowyourteam.com/blog/2020/09/14/the-13-best-questions-to-ask-during-the-remote-onboarding-process/">https://knowyourteam.com/blog/2020/09/14/the-13-best-questions-to-ask-during-the-remote-onboarding-process/</a> - I definitely ask some of these questions when people join my org but I still think some of these are awkward to ask (like pet peeves or what bugs you).</p></li><li><p><a href="https://medium.com/the-leadership-journal/ten-worst-answers-you-should-not-give-when-interviewing-for-a-manager-role-468881104304">https://medium.com/the-leadership-journal/ten-worst-answers-you-should-not-give-when-interviewing-for-a-manager-role-468881104304</a> - I haven't personally given these answers before but I've heard them in engineering manager interviews I've given so don't be one of these folks!</p></li><li><p><a href="https://quietstars.com/lax2020/">https://quietstars.com/lax2020/</a> - This was a recommended talk to me on setting OKRs. I love this and you should check out the accompanying links that come with the talk.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 120 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to  your friends, family, and/or coworkers to help it grow. Interested in sponsoring the newsletter? Have questions, comments, or corrections? Hit that reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[The flaw of averages, the latest in behavioral economics, and more...]]></title><description><![CDATA[User Interfacing Newsletter Volume 119]]></description><link>https://userinterfacing.substack.com/p/the-flaw-of-averages-the-latest-in</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/the-flaw-of-averages-the-latest-in</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Sat, 12 Sep 2020 13:00:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What&#8217;s up! &#128075;</p><p>It just hit me that I&#8217;ve been doing this for over 2 years now. That&#8217;s wild. Thank you for all of my day ones who have been reading this since the beginning! Keep reading and stay safe out there.</p><p>All the best,</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://dev.to/liviufromendtest/5-projects-you-can-build-to-become-a-better-web-developer-221i">https://dev.to/liviufromendtest/5-projects-you-can-build-to-become-a-better-web-developer-221i</a> - These are actually solid projects for beginners that aren't the same old Todo list.</p></li><li><p><a href="https://www.youtube.com/watch?v=tyJelsUG-z4">https://www.youtube.com/watch?v=tyJelsUG-z4</a> - If you're interested in game programming this could be fun.</p></li><li><p><a href="https://old.reddit.com/r/funny/comments/iqxm0r/special_skills/">https://old.reddit.com/r/funny/comments/iqxm0r/special_skills/</a> - Alright this last one is cute. Hang in there!</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/09/component-library-react-emotion/">https://www.smashingmagazine.com/2020/09/component-library-react-emotion/</a> - This is a great take on building component libraries from first principles.</p></li><li><p><a href="https://www.benfrederickson.com/github-wont-help-with-hiring/">https://www.benfrederickson.com/github-wont-help-with-hiring/</a> - If you're changing jobs this is some food for thought though I think plenty of interviewers check out Github profiles (I check every single one that comes through my group, at least).</p></li><li><p><a href="https://css-irl.info/why-i-dont-have-time-for-your-coding-challenge/">https://css-irl.info/why-i-dont-have-time-for-your-coding-challenge/</a> - I guess these are reasonable objections but at the same time as a hiring manager I've seen a real influx of unqualified candidates, and it can be a good way to filter out bad candidates.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://jaredpalmer.com/blog/react-is-becoming-a-black-box">https://jaredpalmer.com/blog/react-is-becoming-a-black-box</a> - The hottest of hot takes coming directly from the horse's mouth (interesting take on the state of React directly from an engineering director at Facebook).</p></li><li><p><a href="https://www.youtube.com/watch?v=heh4OeB9A-c">https://www.youtube.com/watch?v=heh4OeB9A-c</a> - This goes beyond API design but in general how you should code functions and classes for maximum usability.</p></li><li><p><a href="https://diverseeducation.com/article/189682/">https://diverseeducation.com/article/189682/</a> - As more things shift online with the current state of the world we have to cater to a more accessible-focused audience.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="https://www.youtube.com/watch?v=Opjq1JT_dS8">https://www.youtube.com/watch?v=Opjq1JT_dS8</a> - Behavioral economics is an important facet of user experience that combines psychology and economics. A good watch if you're looking for the latest and greatest thinking in UX research.</p></li><li><p><a href="https://www.itechart.com/blog/measuring-performance-of-dev-teams-webinar/">https://www.itechart.com/blog/measuring-performance-of-dev-teams-webinar/</a> - A free webinar on Monday for leaders. Check it out!</p></li><li><p><a href="https://hbr.org/2002/11/the-flaw-of-averages">https://hbr.org/2002/11/the-flaw-of-averages</a> - Alright so I won't be averaging things out as frequently anymore.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 119 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. Interested in sponsoring the newsletter? Have questions, comments, or corrections? Hit that reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item><item><title><![CDATA[A FREE full stack course, web design in 4 minutes, and more...]]></title><description><![CDATA[User Interfacing Newsletter Volume 118]]></description><link>https://userinterfacing.substack.com/p/a-free-full-stack-course-web-design</link><guid isPermaLink="false">https://userinterfacing.substack.com/p/a-free-full-stack-course-web-design</guid><dc:creator><![CDATA[Adam Conrad]]></dc:creator><pubDate>Thu, 03 Sep 2020 13:00:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GsKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec048c6c-1b87-4dd1-becb-5f0e3b2a1c52_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What&#8217;s up! &#128075;</p><p>I just moved into my new home so I&#8217;m curious: <strong>what is your dream home office setup? </strong>I decked out my home office space and I&#8217;m really happy with the result but I&#8217;d love to hear from you what you like about your dream space in case I&#8217;m missing anything.</p><p>Now onto the links&#8230;</p><div><hr></div><p><strong>For Beginners:</strong></p><ol><li><p><a href="https://meiert.com/en/blog/minimal-web-development/">https://meiert.com/en/blog/minimal-web-development/</a> - I will be sending this to the beginners I know. I just don't see most of them reading the entire HTML or ECMAscript spec.</p></li><li><p><a href="https://css-tricks.com/heres-how-i-solved-a-weird-bug-using-tried-and-true-debugging-strategies/">https://css-tricks.com/heres-how-i-solved-a-weird-bug-using-tried-and-true-debugging-strategies/</a> - A good script for beginners to follow on how to debug problems you run into.</p></li><li><p><a href="https://fullstackopen.com/en">https://fullstackopen.com/en</a> - Wow how have I not seen this before? I'm probably going to take this course.</p></li></ol><p><strong>For Seasoned Pros:</strong></p><ol><li><p><a href="https://www.smashingmagazine.com/2020/09/building-react-apps-storybook/">https://www.smashingmagazine.com/2020/09/building-react-apps-storybook/</a> - If you haven't used Storybook yet now may be the time to get started. No more excuses!</p></li><li><p><a href="https://jgthms.com/web-design-in-4-minutes/">https://jgthms.com/web-design-in-4-minutes/</a> - Clever. Very clever.</p></li><li><p><a href="https://blog.pankaj.pro/are-you-using-trailing-commas-in-your-javascript-ckel799m200oiijs17m9f0iir">https://blog.pankaj.pro/are-you-using-trailing-commas-in-your-javascript-ckel799m200oiijs17m9f0iir</a> - Trailing commas are nice. Leading commas are next level.</p></li></ol><p><strong>For Experts:</strong></p><ol><li><p><a href="https://ericwbailey.design/writing/a11y-is-web-accessibility.html">https://ericwbailey.design/writing/a11y-is-web-accessibility.html</a> - The origins of "a11y" and web accessibility as well as why it's not completely about helping people with disabilities.</p></li><li><p><a href="https://accessly.io/blog/caption-101-how-do-captions-work-on-videos/">https://accessly.io/blog/caption-101-how-do-captions-work-on-videos/</a> - Captions are a great way to add accessibility to your HTML5 videos. They are also not the easiest to understand so this is worth the read.</p></li><li><p><a href="https://www.patkua.com/blog/book-recommendations-by-engineering-leaders/">https://www.patkua.com/blog/book-recommendations-by-engineering-leaders/</a> - Not just for leaders, there are a lot of advanced topics here I encourage you to read.</p></li></ol><p><strong>For Managers &amp; Leaders:</strong></p><ol><li><p><a href="http://stewiewrites.com/make-an-i-wont-do-list/">http://stewiewrites.com/make-an-i-wont-do-list/</a> - It's a short list but I do think as a leader it is valuable to say no more than you say yes to things.</p></li><li><p><a href="https://medium.com/@tsleslie84/theres-a-big-difference-between-a-team-and-a-working-group-8d5f21204a6a">https://medium.com/@tsleslie84/theres-a-big-difference-between-a-team-and-a-working-group-8d5f21204a6a</a> - It was my understanding that working groups are temporary but I'm not sure if there's a broader definition here to consider.</p></li><li><p><a href="https://www.theatlantic.com/family/archive/2020/08/how-make-friends-lonely-boss-workaholic/615709/">https://www.theatlantic.com/family/archive/2020/08/how-make-friends-lonely-boss-workaholic/615709/</a> - People hate interacting with their boss. Something to consider if you want to move up the management ladder is it gets lonelier at the top.</p></li></ol><div><hr></div><h3>&#128591; That&#8217;s all folks &#128591;</h3><p><br><strong>Aaaand we&#8217;re done with issue 118 of the User Interfacing Newsletter. </strong><br> <br>If you got something out of this newsletter, feel free to forward it to your friends, family, and/or coworkers to help it grow. Interested in sponsoring the newsletter? Have questions, comments, or corrections? Hit that reply button and let me know what you're up to!<br> <br> Cheers,<br> Adam</p>]]></content:encoded></item></channel></rss>