<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hudson Burgess</title>
    <description>The latest articles on Forem by Hudson Burgess (@hudsonburgess7).</description>
    <link>https://forem.com/hudsonburgess7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F34096%2Fc42348df-e2aa-444c-a078-72834cd4d742.jpg</url>
      <title>Forem: Hudson Burgess</title>
      <link>https://forem.com/hudsonburgess7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hudsonburgess7"/>
    <language>en</language>
    <item>
      <title>Do you practice TDD?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Sat, 17 Nov 2018 15:50:22 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/do-you-practice-tdd-3lbc</link>
      <guid>https://forem.com/hudsonburgess7/do-you-practice-tdd-3lbc</guid>
      <description>&lt;p&gt;If so, what made you want to start?&lt;/p&gt;

&lt;p&gt;If not, why not?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>tdd</category>
    </item>
    <item>
      <title>How to systematically determine requirements?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Tue, 24 Jul 2018 15:37:05 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/how-to-systematically-determine-requirements-4ci2</link>
      <guid>https://forem.com/hudsonburgess7/how-to-systematically-determine-requirements-4ci2</guid>
      <description>&lt;p&gt;My team has a serious problem with forgetting seemingly obvious requirements. The 1-2 weeks before a release are full of "oh wait, we forgot about &lt;em&gt;x&lt;/em&gt;. But it's an easy change, no big deal." Simple omissions are bound to happen, but by the time we release, the list of omissions we caught is usually bigger than the list of initial requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's a good starting point for systematically determining requirements for new features &lt;em&gt;up front&lt;/em&gt;&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Questions to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;are there any checklists you use?&lt;/li&gt;
&lt;li&gt;are there any particular areas where more requirements are forgotten than others? (ex. security, UI layout, etc.)&lt;/li&gt;
&lt;li&gt;any useful / widely accepted books addressing this subject?&lt;/li&gt;
&lt;li&gt;have you been on a team that successfully addressed this problem; if so, how did you fix it?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>requirements</category>
    </item>
    <item>
      <title>Making an Architectural Decision: A Live Example</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Mon, 23 Jul 2018 13:32:47 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/making-an-architectural-decision-a-live-example-1o03</link>
      <guid>https://forem.com/hudsonburgess7/making-an-architectural-decision-a-live-example-1o03</guid>
      <description>&lt;p&gt;&lt;em&gt;I'm literally writing this to work through my thoughts, so I thought I'd share.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Framework: Angular + ngrx&lt;/p&gt;

&lt;p&gt;Scenario: Your application is able to generate a particular type of report. Any user can run and see a summary of said report, but they need to pay &lt;em&gt;x&lt;/em&gt; amount to see the whole thing.&lt;/p&gt;

&lt;p&gt;Two things need to happen here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user has to pay to unlock a particular report.&lt;/li&gt;
&lt;li&gt;If that transaction completes successfully, the report needs to be marked as "unlocked."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We could do all this sequentially. Make the payment API call, then make the unlock call. But that might involve duplicating some existing logic, and it might force me to create some awkward "payment + report" object.&lt;/p&gt;

&lt;p&gt;We could also make one of those actions a side effect. But which one?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is payment a "pre" side effect of unlocking the report?&lt;/li&gt;
&lt;li&gt;or is unlocking the report a "post" side effect of paying for the report?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The former seems to make more sense. The end goal is unlocking a report, not spending money, so let's say unlocking the report is the "main" control flow here.&lt;/p&gt;

&lt;p&gt;But the payment &lt;em&gt;must&lt;/em&gt; succeed for the report to be unlocked. So is it really a side effect? &lt;em&gt;Shouldn't side effects should be independent of the thing that triggered them?&lt;/em&gt; Perhaps the side effect idea isn't so great.&lt;/p&gt;

&lt;p&gt;&amp;lt;pause and think for a few minutes...&amp;gt;&lt;/p&gt;

&lt;p&gt;Well, I have &lt;code&gt;@ngrx/effects&lt;/code&gt;. As much as I hate using it as an API wrapper (re &lt;a href="https://medium.com/@m3po22/stop-using-ngrx-effects-for-that-a6ccfe186399"&gt;Stop using ngrx/effects for that&lt;/a&gt;), it's a useful way to compose API calls from different services. Just because the library has "effects" in the name doesn't mean it &lt;em&gt;has&lt;/em&gt; to be used strictly for side effects. We're certainly not restrciting it to that kind of usage right now. (Maybe in the future I should alias &lt;code&gt;@ngrx/effects&lt;/code&gt; with a different name so our particular usage makes more sense?)&lt;/p&gt;

&lt;p&gt;I guess I'll do that. Use the existing payment logic, write an &lt;code&gt;unlock()&lt;/code&gt; service method, then use &lt;code&gt;@ngrx/effects&lt;/code&gt; to chain them together.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Inspired by DHH's &lt;a href="https://www.youtube.com/playlist?list=PL9wALaIpe0Py6E_oHCgTrD6FvFETwJLlx"&gt;"On Writing Software Well"&lt;/a&gt; video series&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>thoughtprocess</category>
    </item>
    <item>
      <title>How much should you refactor names when domain terminology changes?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Tue, 17 Jul 2018 11:16:57 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/how-much-should-you-refactor-names-when-domain-terminology-changes-k73</link>
      <guid>https://forem.com/hudsonburgess7/how-much-should-you-refactor-names-when-domain-terminology-changes-k73</guid>
      <description>&lt;p&gt;This is hard to explain in the abstract, so here's a hypothetical scenario:&lt;/p&gt;

&lt;p&gt;You're building an app to manage inventory for a store that sells computer monitors. One day, the store decides that in the future monitors will be called "displays." Your managers promptly commit to this terminology change in conversations with you, and the marketing team ensures that all of their content reflects the change too. To the company, this change in terminology is important.&lt;/p&gt;

&lt;p&gt;As a developer and a software craftsman, should you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refactor all occurrences of &lt;code&gt;monitor&lt;/code&gt; in your code to &lt;code&gt;display&lt;/code&gt; (in class names, variable names, folder structure, etc.) to keep the terminology consistent?&lt;/li&gt;
&lt;li&gt;leave the names alone because only the devs will see them, and the mismatch in terms will probably not cause any confusion?&lt;/li&gt;
&lt;li&gt;something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How much should you refactor names when domain terminology changes?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Good first steps for a JS style guide?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Sun, 03 Jun 2018 23:39:54 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/good-first-steps-for-a-js-style-guide-3bc2</link>
      <guid>https://forem.com/hudsonburgess7/good-first-steps-for-a-js-style-guide-3bc2</guid>
      <description>&lt;p&gt;Right now I'm essentially the only frontend dev at my company, but we have plans to bring on one more (sometime soon, I think? ¯\&lt;em&gt;(ツ)&lt;/em&gt;/¯). With that in mind, I'd like to start writing some sort of JS style guide / best practices doc. &lt;strong&gt;What are some good first items to include?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Should we wrap critical built-in modules?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Fri, 05 Jan 2018 17:52:28 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/should-we-wrap-critical-built-in-modules-4pdi</link>
      <guid>https://forem.com/hudsonburgess7/should-we-wrap-critical-built-in-modules-4pdi</guid>
      <description>

&lt;p&gt;I've spent the last two weeks migrating one project from Angular's deprecated &lt;code&gt;Http&lt;/code&gt; module to the new (more elegant) &lt;code&gt;HttpClient&lt;/code&gt;. &lt;em&gt;Two weeks&lt;/em&gt; -- in my opinion that's way too much maintenance time on a single layer of the app. I encountered something similar in the fall with Angular Material.&lt;/p&gt;

&lt;p&gt;Which brings me to the question: &lt;strong&gt;should we wrap critical built-in modules to avoid this kind of massive overhaul?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Uncle Bob suggests that we should avoid concrete dependencies where possible, you'd think that concrete dependencies on the framework itself would be okay. But this &lt;code&gt;HttpClient&lt;/code&gt; debacle is proving otherwise.&lt;/p&gt;

&lt;p&gt;Additional follow-up question: &lt;strong&gt;If / when we should put our own interface around critical modules, how do we define "critical?" What sort of modules warrant this kind of architecture?&lt;/strong&gt;&lt;/p&gt;


</description>
      <category>discuss</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Running on Fumes: Some Small Productivity Tricks</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Thu, 14 Dec 2017 00:00:00 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/running-on-fumes-some-small-productivity-tricks-2bc</link>
      <guid>https://forem.com/hudsonburgess7/running-on-fumes-some-small-productivity-tricks-2bc</guid>
      <description>&lt;p&gt;The past week of work has been unusually long and tedious. Just wanted to share a few small tips I’ve been using to power through it:&lt;/p&gt;

&lt;h2&gt;
  
  
  1) Listen to the same thing on a loop
&lt;/h2&gt;

&lt;p&gt;I picked this up from Tim Ferriss. Apparently, several top performers listen to the same song on repeat when they need to stay focused. I find that one song gets old pretty quickly, so I loop an entire album instead – right now, &lt;em&gt;The Shape of Colour&lt;/em&gt; by Intervals. It’s energizing, has zero lyrics, and all the tracks sound similar enough that they flow together into one 34-minute opus (turning on cross-fade helps too).&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Ignore the time
&lt;/h2&gt;

&lt;p&gt;Nothing makes a long day worse than thinking about how much longer it’s going to be. I’ve removed the clock from the menu bar on my computer and keep my phone out of sight.&lt;/p&gt;

&lt;p&gt;3) Write down what you need to do in small steps&lt;/p&gt;

&lt;p&gt;Separate &lt;em&gt;what&lt;/em&gt; you need to do from &lt;em&gt;how&lt;/em&gt; you actually do it. This gets all the racing high-level thoughts out of your head so you can &lt;a href="https://www.amazon.com/Extreme-Ownership-U-S-Navy-SEALs/dp/1250183863/ref=sr_1_sc_1"&gt;prioritize and execute&lt;/a&gt;. You’ll be surprised how much more efficient and effective this makes you, especially if you’re tired. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the developers: if you’re having a hard time with a complex function, use comments or &lt;a href="https://dev.to/cannikin/make-your-pseudocode-your-real-code-96n"&gt;pseudocode&lt;/a&gt; to outline it first. If anything, you’ll probably write cleaner code with this approach!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4) Switch tasks for a few minutes if your brain really gets fried
&lt;/h2&gt;

&lt;p&gt;Guess where this post came from…&lt;/p&gt;

&lt;h2&gt;
  
  
  5) Don’t let yourself totally stop working
&lt;/h2&gt;

&lt;p&gt;Even though I’m taking a break by writing this, I’m still producing something. Keep up the little bit of momentum you do have. The sooner you finish what you need to do, the sooner you can put it away and forget about it. Fight to the finish.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>What heuristics do you use when developing a frontend testing strategy?</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Tue, 05 Dec 2017 15:50:57 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/what-heuristics-do-you-use-when-developing-a-frontend-testing-strategy-4ah</link>
      <guid>https://forem.com/hudsonburgess7/what-heuristics-do-you-use-when-developing-a-frontend-testing-strategy-4ah</guid>
      <description>&lt;p&gt;I'm currently on an Angular project with a decent sized test suite (~1000 tests), but it takes a long time to run and misses a lot of critical bugs -- I want to take a more nuanced approach.&lt;/p&gt;

&lt;p&gt;On a broad level: what's your frontend testing philosophy?&lt;/p&gt;

&lt;p&gt;If that's too vague, here are some more specific questions to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are your percentages of unit tests / integration tests / end-to-end tests?&lt;/li&gt;
&lt;li&gt;Are there good quantifiable metrics for how long a (unit) test suite should take to run?&lt;/li&gt;
&lt;li&gt;In terms of time spent on production code vs. tests, when is writing a challenging test &lt;em&gt;not&lt;/em&gt; worth the effort (especially for E2E tests)?&lt;/li&gt;
&lt;li&gt;When, if ever, is it okay to remove tests for stable code?&lt;/li&gt;
&lt;li&gt;Do you split your test suite into different groups of tests? If so, how, and when do you run each group?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>testing</category>
    </item>
    <item>
      <title>Code Like a Conversation: Basic Levels of Abstraction</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Thu, 19 Oct 2017 00:00:00 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/code-like-a-conversation-basic-levels-of-abstraction-84m</link>
      <guid>https://forem.com/hudsonburgess7/code-like-a-conversation-basic-levels-of-abstraction-84m</guid>
      <description>

&lt;p&gt;Consider the following conversation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;* at le Starbucks *&lt;br&gt;
Friend: “Hey Hudson! What are you up to today?”&lt;br&gt;
Me: “Not much, it’s an easy day today. Just working on a simple web app. I’ll probably grab lunch with some friends this afternoon and read a bit this evening. What about you?”&lt;br&gt;
Friend: “Sounds fun. A few friends and I are going to see &lt;em&gt;&amp;lt;recently released movie&amp;gt;&lt;/em&gt; tonight; do you want to come?”&lt;br&gt;
Me: “Sure, I’ve been wanting to go see it.”&lt;br&gt;
Friend: “Great! I’ll text you the details later.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ignoring the fact that I dislike staring at screens outside of writing / programming, that’s a conceivable conversation. Now consider this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;* at le Starbucks *&lt;br&gt;
Friend: “Hey Hudson! What are you up to today?”&lt;br&gt;
Me: “Quite a lot. I got out of bed at 4:23am this morning, cooked breakfast and showered, realized I needed gas, drove to the gas station, swiped my debit card and entered my pin, filled up the gas tank, and went to work. Now I’m taking a break from editing line 105 of &lt;code&gt;search-form.component.ts&lt;/code&gt; on my current project. I’ll probably grab lunch with some friends this afternoon, then go home and read with a cup of decaf coffee made in my French press.&lt;br&gt;
Friend: “Sounds fun. A few friends and I are driving to the theater to purchase tickets for &lt;em&gt;&amp;lt;recently released movie&amp;gt;&lt;/em&gt;, find seats in the theater in which it’s playing, then fixate our eyes on the screen therein until it ends; do you want to come?”&lt;br&gt;
Me: “Sure, I’ve been wanting to go to the theater and watch it.”&lt;br&gt;
Friend: “Great! I’ll send you the details via SMS later.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine if every conversation were like that (the horror…)&lt;/p&gt;

&lt;p&gt;The first interaction is easy to follow because it stays at the same level of abstraction. Work, eat lunch, read, see a movie – these are high-level, simple statements about what my friend and I are doing. The second interaction is hard to follow because it uses several different levels of abstraction. 4:23am and using SMS are very low-level, specific details about &lt;em&gt;how&lt;/em&gt; I did something; getting lunch and mentioning a few friends are descriptive and don’t involve details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our code should look like the first conversation and stay at a consistent level of abstraction. Instead, it often looks like the second.&lt;/strong&gt; It forces the reader to context switch constantly and makes understanding the code needlessly difficult.&lt;/p&gt;

&lt;p&gt;To help you refactor the “conversation 2 kind of code, here are 3 levels of abstraction that I’ve been using recently.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The primitive level
&lt;/h2&gt;

&lt;p&gt;Ints, strings, booleans, pointers, etc. Functions and methods that operate on primitive types, properties, or class members are very low-level. Put another way, these functions should do only the “grunt work of the application. Working at this level can get a little dull because it’s usually easy – that’s probably a sign that you’re doing it right.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The problem space level
&lt;/h2&gt;

&lt;p&gt;This depends on what you’re building. In general, the problem space level operates on objects &lt;em&gt;in the realm of your client.&lt;/em&gt; For instance, if you’re building a library application, the problem space level might contain &lt;code&gt;Book&lt;/code&gt;s, &lt;code&gt;Patron&lt;/code&gt;s, &lt;code&gt;ConferenceRoom&lt;/code&gt;s, and &lt;code&gt;Computer&lt;/code&gt;s. If you’re building a course registration system, the problem space level might contain &lt;code&gt;Course&lt;/code&gt;s, &lt;code&gt;Professor&lt;/code&gt;s, and &lt;code&gt;Classroom&lt;/code&gt;s. This is probably the lowest level of abstraction you’ll use when talking to your client.&lt;/p&gt;

&lt;p&gt;The problem space level should consist of classes that simply &lt;em&gt;group related values and functions&lt;/em&gt;. Classes shouldn’t need to talk to each other very much; that’s what the component level is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The component level
&lt;/h2&gt;

&lt;p&gt;Components operate on items from the problem space level. To use the library example again, a &lt;code&gt;CheckoutComponent&lt;/code&gt; might create a &lt;code&gt;Checkout&lt;/code&gt; record from a &lt;code&gt;Patron&lt;/code&gt; and a &lt;code&gt;Book&lt;/code&gt;. To use the course registration example, a &lt;code&gt;SignUpForm&lt;/code&gt; might allow a &lt;code&gt;Student&lt;/code&gt; to sign up for a &lt;code&gt;Course&lt;/code&gt;. In general, the component level does the interesting work that makes you money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I realize this will be an almost childish review for some people, but thinking in these three concrete levels has helped me tremendously lately.&lt;/p&gt;

&lt;p&gt;Are there additional levels of abstraction you tend to use? Different abstraction approaches altogether? Let me know.&lt;/p&gt;


</description>
      <category>cleancode</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Holy Grail of Good Software</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Wed, 27 Sep 2017 00:00:00 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/the-holy-grail-of-good-software-4j</link>
      <guid>https://forem.com/hudsonburgess7/the-holy-grail-of-good-software-4j</guid>
      <description>

&lt;h2&gt;
  
  
  The worst part of development
&lt;/h2&gt;

&lt;p&gt;Building software requires so many steps in parallel: writing code, unit testing code, some manual testing, occasionally hopping over to Postman, three Stack Overflow tabs, the &lt;a href="https://ux.useronboard.com/slack-i-m-breaking-up-with-you-54600ace03ea"&gt;“asynchronish”&lt;/a&gt; Slack messages (grr)… you get the point.&lt;/p&gt;

&lt;p&gt;We know from experience that &lt;em&gt;just writing code&lt;/em&gt; demands a huge amount of attention and deep thinking. Every frustrated Google search and every rebuild-and-try-again chips away at our mental resources. Every “am I doing something wrong? distracts our colleagues. Every pull request that gets sent back for changes (needed as the changes may be) halts progress on another issue and derails a valuable train of thought.&lt;/p&gt;

&lt;p&gt;So why is our collective response to accept that development is a messy process, add another monitor or two, and throw some line about “multitasking in the job description (which was probably already &lt;a href="https://www.stackoverflowbusiness.com/blog/3-common-flaws-of-developer-job-descriptions"&gt;badly written&lt;/a&gt; anyway)?&lt;/p&gt;

&lt;p&gt;How on earth do we expect to write – to design – good software like that?&lt;/p&gt;

&lt;h2&gt;
  
  
  180
&lt;/h2&gt;

&lt;p&gt;What if we didn’t have to multitask to that extent?&lt;/p&gt;

&lt;p&gt;What if we didn’t have to cobble together our understanding of an API from Slack threads and Postman experiments?&lt;/p&gt;

&lt;p&gt;What if we were confident enough to only download official docs and work offline? (Psst… &lt;a href="http://devdocs.io/"&gt;DevDocs&lt;/a&gt;…)&lt;/p&gt;

&lt;p&gt;What if we never manually tested our code before we shipped it?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Holy Grail
&lt;/h2&gt;

&lt;p&gt;Maybe I’m nuts. Maybe this is too lofty a goal.&lt;/p&gt;

&lt;p&gt;Except that all of those things are possible. Force more efficient communication. Document your code, whether it’s self-describing or needs another doc. Study your framework. Use automated build tools. And for the love of everything holy, &lt;em&gt;write better tests.&lt;/em&gt; None of it is hard.&lt;/p&gt;

&lt;p&gt;I dare you: the next time you have to fix a bug… &lt;em&gt;don’t run your app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re scared to push code without running it manually, you don’t have a good enough support system. Period.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether that support system is pair programming, more focused coding sessions, comprehensive tests, robust build pipelines, better infrastructure, or better engineers (or all of the above), I could care less.&lt;/p&gt;

&lt;p&gt;Bugs will still happen. But you’ll spend less time fixing them. And less time introducing them in the first place.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://hudsonburgess.com/2016/12/10/why-good-teams-stagnate.html"&gt;Be the engineer you wish you had.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set an aggressively high bar, and do &lt;em&gt;not&lt;/em&gt; back down.&lt;/p&gt;


</description>
      <category>cleancode</category>
      <category>testing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Scaffolding: Another Benefit of Clean Code</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Fri, 22 Sep 2017 00:00:00 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/scaffolding-another-benefit-of-clean-code</link>
      <guid>https://forem.com/hudsonburgess7/scaffolding-another-benefit-of-clean-code</guid>
      <description>&lt;p&gt;Imagine this scenario: you’ve been asked to build a particular feature that depends on someone else’s work. Maybe that work is happening within your team, maybe not. Either way, it needs to be done as quickly as possible. What do you do?&lt;/p&gt;

&lt;p&gt;This has happened to me more than once in the past few weeks. My solution?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don’t worry about it. Just write good code around it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two clean coding practices in particular can help us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaking things into small pieces: This makes it easy to isolate implementation you don’t have yet, whether you need it from someone else or you simply haven’t figured out how to do it yet.&lt;/li&gt;
&lt;li&gt;‎Testing: code that’s broken into smaller, independent, more manageable pieces is also easier to test, both in isolation and integrated. This way, when new code shows up, you can test it quickly and have confidence that it’ll play nicely with your existing work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lots of CLI tools (ex. Angular CLI, Rails generators, etc.) already scaffold around code you don’t have yet. Why don’t you do the same thing yourself?&lt;/p&gt;

</description>
      <category>software</category>
      <category>clean</category>
      <category>code</category>
    </item>
    <item>
      <title>7 Reasons You Should Be Using Test-Driven Development</title>
      <dc:creator>Hudson Burgess</dc:creator>
      <pubDate>Tue, 08 Aug 2017 00:00:00 +0000</pubDate>
      <link>https://forem.com/hudsonburgess7/7-reasons-you-should-be-using-test-driven-development</link>
      <guid>https://forem.com/hudsonburgess7/7-reasons-you-should-be-using-test-driven-development</guid>
      <description>&lt;p&gt;If you aren’t familiar with it, test-driven development (TDD) is a software development practice where you write tests &lt;em&gt;before&lt;/em&gt; you write application code.&lt;/p&gt;

&lt;p&gt;TDD is something most computer science students are taught, but are never actually required to use. And you can get away without doing it for most of your coursework. (I have some thoughts on that &lt;a href="http://hudsonburgess.com/2017/06/07/hypothetical-course-titles.html"&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;At any rate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Good tests make good documentation&lt;/strong&gt; – both for you and anyone who might come onto your project later. Test frameworks like &lt;a href="https://jasmine.github.io/"&gt;Jasmine&lt;/a&gt; and &lt;a href="https://mochajs.org/"&gt;Mocha&lt;/a&gt; read like plain English. Name your tests in a way that describes the tested function’s behavior in a particular circumstance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You’ll code faster.&lt;/strong&gt; Even if writing a correct function implementation is difficult, pre-written tests will give you a clear target to hit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You’ll code correctly faster.&lt;/strong&gt; Keep your test runner open to get continuous feedback on your work. This will get you to a correct implementation faster than coding an entire module at once and then testing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You won’t forget to write the tests.&lt;/strong&gt; Code without tests should make you uneasy, period. A comprehensive, passing test suite is reassurance to you and other developers that your code (probably) won’t break.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It provides a solid starting point for later work.&lt;/strong&gt; Similar to #1. Also, if you pick a project back up after a few months, you’ll forget how most of the code works. Tests can be a reminder, and a tested code base can be a fallback if you suddenly break things.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It pushes you to write cleaner code.&lt;/strong&gt; Long, complicated functions are hard to test. Simple tests and clear descriptions will naturally lead to shorter, more readable application code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You’ll write more meaningful tests.&lt;/strong&gt; With code already written, it’s easy to write tests that just pass instead of tests that confirm useful functionality. Imagine if your math professor only tested you on things you already knew – that wouldn’t be very useful!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do you have more reasons? Drop a comment below!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is part of a &lt;a href="https://www.bti360.com/clean-code-series/"&gt;6-part series&lt;/a&gt; on clean code. It’s some of the most valuable reading I’ve ever done as a developer.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
    </item>
  </channel>
</rss>
