<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software Development on Coderrob</title><link>https://coderrob.com/tags/software-development/</link><description>Recent content in Software Development on Coderrob</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 10 Apr 2026 10:00:00 -0500</lastBuildDate><atom:link href="https://coderrob.com/tags/software-development/index.xml" rel="self" type="application/rss+xml"/><item><title>Trust but Verify: The Math of Rigorous Software Development</title><link>https://coderrob.com/posts/trust-but-verify-the-math-of-rigorous-software-development/</link><pubDate>Fri, 10 Apr 2026 10:00:00 -0500</pubDate><guid>https://coderrob.com/posts/trust-but-verify-the-math-of-rigorous-software-development/</guid><description>&lt;h2 id="between-satire-and-ridicule"&gt;Between Satire and Ridicule&lt;/h2&gt;
&lt;p&gt;It started, as these things often do, with a comparison nobody asked for.&lt;/p&gt;
&lt;p&gt;I made a post saying that, with AI-assisted workflows, I can contribute anywhere from &lt;strong&gt;20 to 300,000 lines of change in a day&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That number was not meant to say, &amp;ldquo;Look at me, I make ALL the tokens go brrrrrrrt&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It was me counting additions plus deletions across real work: feature creation, refactoring, documentation, automation, test updates, generated assets, project scaffolding, cleanup, and the supporting files needed to make the work sustainable.&lt;/p&gt;</description></item><item><title>Rethinking Enterprise Software Development: Embracing Automation Over Outdated Hierarchies</title><link>https://coderrob.com/posts/rethinking-enterprise-software-development-embracing-automation-over-outdated-hierarchies/</link><pubDate>Sat, 22 Feb 2025 17:04:43 -0600</pubDate><guid>https://coderrob.com/posts/rethinking-enterprise-software-development-embracing-automation-over-outdated-hierarchies/</guid><description>&lt;p&gt;For too long, legacy enterprise development has been constrained by a top-down model that stifles innovation and impedes progress. The conventional emphasis on individual developers paired with rigid managerial oversight is not only inefficient; it is counterproductive in today’s fast-paced, ever-evolving tech landscape.&lt;/p&gt;
&lt;p&gt;Drawing from my experience building automated code-review agents for enterprise applications, I have witnessed firsthand that current corporate development structures are fundamentally flawed. Rather than investing in isolated training programs or centralizing AI initiatives within a single division, the future lies in leveraging automation to transform enterprise software development into an agile, collaborative, and efficient process.&lt;/p&gt;</description></item><item><title>Unit Testing: Rules and Best Practices</title><link>https://coderrob.com/posts/unit-testing-rules-and-best-practices/</link><pubDate>Fri, 21 Feb 2025 22:37:19 -0600</pubDate><guid>https://coderrob.com/posts/unit-testing-rules-and-best-practices/</guid><description>&lt;h2 id="rules-to-follow"&gt;Rules to Follow&lt;/h2&gt;
&lt;h3 id="first-principles"&gt;FIRST Principles&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt; – Tests should run quickly to allow frequent execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent&lt;/strong&gt; – Tests must not depend on each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeatable&lt;/strong&gt; – A test should always yield the same result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Checking&lt;/strong&gt; – Tests should automatically verify correctness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timely&lt;/strong&gt; – Write tests &lt;strong&gt;before&lt;/strong&gt; or alongside implementation.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="coverage--quality"&gt;Coverage &amp;amp; Quality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Target &lt;strong&gt;85%+ meaningful test coverage&lt;/strong&gt;, prioritizing critical paths.&lt;/li&gt;
&lt;li&gt;Cover &lt;strong&gt;happy paths, edge cases, and failure scenarios&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Async tests should be properly awaited or return promises&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mock dependencies&lt;/strong&gt; to isolate the unit under test.&lt;/li&gt;
&lt;li&gt;Ensure &lt;strong&gt;all branches and conditions are tested&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="self-describing-tests"&gt;Self-Describing Tests&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Descriptive Naming&lt;/strong&gt; – &lt;code&gt;it('should return X when Y happens')&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Truth Tables (&lt;code&gt;it.each&lt;/code&gt;)&lt;/strong&gt; – Cover multiple cases in one statement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mock Naming Convention&lt;/strong&gt; – Differentiate real and mock objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;describe&lt;/code&gt; Blocks&lt;/strong&gt; – Group related tests logically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named Constants&lt;/strong&gt; – Avoid magic values in test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="see-pattern-made-this-one-up"&gt;SEE Pattern (made this one up)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup&lt;/strong&gt; – Initialize inputs and dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execute&lt;/strong&gt; – Run the function under test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect&lt;/strong&gt; – Assert the expected outcome.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: I call it &amp;ldquo;SEE&amp;rdquo; because you &lt;strong&gt;see immediately what it did or didn&amp;rsquo;t do&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Breaking Up the Big Bottom Library: Streamlining Your Code for Long-Term Health</title><link>https://coderrob.com/posts/breaking-up-the-big-bottom-library-streamlining-your-code-for-long-term-health/</link><pubDate>Wed, 11 Sep 2024 21:58:05 -0500</pubDate><guid>https://coderrob.com/posts/breaking-up-the-big-bottom-library-streamlining-your-code-for-long-term-health/</guid><description>&lt;p&gt;Over time, code libraries have a habit of expanding like that one “utility” drawer in your kitchen. At first, it’s helpful—everything in its right place, ready for use. But before long, that drawer becomes a catch-all for every stray function, random helper, and one-off module you couldn’t quite categorize. Eventually, it’s too bloated to find anything efficiently.&lt;/p&gt;
&lt;p&gt;When that happens, it’s time to consider not just a cleanup, but a deeper restructuring. Because left unchecked, your code library could evolve into something far more dangerous—a monolith.&lt;/p&gt;</description></item><item><title>Not all dots are created equal... especially in your Gmail address</title><link>https://coderrob.com/posts/not-all-dots-are-created-equal-especially-in-your-gmail-adress/</link><pubDate>Tue, 03 Sep 2024 21:26:01 -0500</pubDate><guid>https://coderrob.com/posts/not-all-dots-are-created-equal-especially-in-your-gmail-adress/</guid><description>&lt;p&gt;Here’s a quick heads-up that might save you some &lt;em&gt;serious headaches&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gmail doesn’t treat dots in email addresses as unique&lt;/strong&gt;. Whether your address is &lt;code&gt;john.smith@gmail.com&lt;/code&gt; or &lt;code&gt;jo.hn.smith@gmail.com&lt;/code&gt;, if it has a dot &lt;strong&gt;a copy of ALL your email gets sent to &lt;code&gt;johnsmith@gmail.com&lt;/code&gt; too&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;very close family member&lt;/em&gt; learned this the hard way when their identity was stolen. Someone registered a non-dotted version of their email, and it went unnoticed for a while. The result? Credit card fraud&amp;hellip;&lt;/p&gt;</description></item><item><title>Clean Up Your Conditionals: Refactoring If-Else with Switch Statements</title><link>https://coderrob.com/posts/clean-up-your-conditionals-by-refactoring-if-else-with-switch-statements/</link><pubDate>Sun, 18 Aug 2024 13:17:48 -0500</pubDate><guid>https://coderrob.com/posts/clean-up-your-conditionals-by-refactoring-if-else-with-switch-statements/</guid><description>&lt;p&gt;If you&amp;rsquo;re like me, you&amp;rsquo;ve probably dealt with your fair share of long, messy deeply nested &lt;code&gt;if-else&lt;/code&gt; chains. They can get out of hand pretty fast, right?&lt;/p&gt;
&lt;p&gt;One minute you&amp;rsquo;re making a simple decision, the next you&amp;rsquo;re wading through a maze of conditions and deeply nested logic. But guess what?&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a trick that can help clean this up: using &lt;code&gt;switch&lt;/code&gt; and &lt;code&gt;switch(true)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll take a closer look at how you can use &lt;code&gt;switch&lt;/code&gt; statements to break free from the chaos and make your code more readable, more maintainable, and without overloading to your brain juggling the contextual outcomes of each branching statement.&lt;/p&gt;</description></item><item><title>Technology Choice Matters</title><link>https://coderrob.com/posts/technology-choice-matters/</link><pubDate>Thu, 25 Aug 2022 11:34:00 -0500</pubDate><guid>https://coderrob.com/posts/technology-choice-matters/</guid><description>&lt;p&gt;Developers need consistency in the tools they use, as well as a clear understanding of what is expected of them to be productive and successful in their roles. These tools not only impact productivity but also play a pivotal role in shaping the professional and personal well-being of developers.&lt;/p&gt;
&lt;p&gt;As team sizes grow, restructures occur, or new team members are added, it becomes crucial to have a consistent set of tools and technologies that everyone is expected to use.&lt;/p&gt;</description></item><item><title>Contributing to the .NET Runtime</title><link>https://coderrob.com/posts/contributing-to-the-dotnet-runtime/</link><pubDate>Fri, 16 Apr 2021 18:25:55 -0500</pubDate><guid>https://coderrob.com/posts/contributing-to-the-dotnet-runtime/</guid><description>&lt;h2 id="my-first-net-contribution"&gt;My First .Net Contribution&lt;/h2&gt;
&lt;p&gt;Today a feature enhancement I proposed and implemented was merged into the .Net runtime main branch for .Net 6 release!&lt;/p&gt;
&lt;h3 id="the-background"&gt;The Background&lt;/h3&gt;
&lt;p&gt;At the time I was working for a company called, &lt;code&gt;WatchGuard Video&lt;/code&gt;. WatchGuard built body cameras and the evidence management software for them. I was hired originally to come in to help launch &lt;a href="https://support.watchguardvideo.com/hc/en-us/categories/115001623947-Evidence-Library-EL"&gt;Evidence Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The site, when I started, was several independent SPA sites in a mono-repository. Myself and the other engineers were working on upgrading ASP.Net Framework to .Net Core. One of the biggest concerns, beyond authentication, was configuration.&lt;/p&gt;</description></item><item><title>Being a Programmer</title><link>https://coderrob.com/posts/being-a-programmer/</link><pubDate>Wed, 30 Oct 2013 21:00:00 -0500</pubDate><guid>https://coderrob.com/posts/being-a-programmer/</guid><description>&lt;p&gt;&lt;strong&gt;What does that even mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I love creating something that didn&amp;rsquo;t exist before, and then &amp;lsquo;bam&amp;rsquo;—it&amp;rsquo;s a thing that others can use. It&amp;rsquo;s thrilling if it&amp;rsquo;s something people need to use, and the best feeling by far if it&amp;rsquo;s something someone genuinely wants to use.&lt;/p&gt;
&lt;p&gt;At least until someone turns the power off. Then it all becomes a tiny magnetic dance frozen in place or microscopic scratches on a disk. It&amp;rsquo;s peculiar to think of software as both existing and not existing simultaneously.&lt;/p&gt;</description></item></channel></rss>