<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  
    <title type="text" xml:lang="en">Hunter Gerlach</title>
    <link type="application/atom+xml" rel="self" href="https://www.huntergerlach.com/atom.xml"/>
  
  <link href="https://www.huntergerlach.com/"/>
  <id>https://www.huntergerlach.com/</id>
  <updated>2026-07-17T19:39:25Z</updated>
  <author>
    <name>Hunter Gerlach</name>
    <email>hunter(at)huntergerlach.com</email>
  </author>
  <rights type="text">Copyright © 2026 Hunter Gerlach. All rights reserved.</rights>
  
  <entry>
  <title type="text">A Constitutional Republic for Your AI Agents</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/a-constitutional-republic-for-your-ai-agents.html" />
  <id>https://www.huntergerlach.com/a-constitutional-republic-for-your-ai-agents</id>
  <published>2026-07-04T00:00:00Z</published>
  <updated>2026-07-04T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p><em>What 250 years of American constitutional design can teach you about trusting agentic systems.</em></p>

<p>Today, the United States turns 250.</p>

<p>Most of the attention will be on the celebration. Mine keeps drifting to the design. The most useful way to honor a founding is not nostalgia. It is to borrow the design pattern.</p>

<p>I should be clear about what this is. I am not a historian or a political scientist, and this is not a political post. I am an engineer working on a specific problem: how to safely delegate real work to AI agents. The anniversary just happens to put a 250-year-old answer to a similar problem back in the news.</p>

<p>Read through an engineer’s eyes, the founding was a systems architecture problem. The Constitution is a governance framework for a country of non-deterministic agents: millions of humans who are unpredictable, self-interested, occasionally brilliant, and frequently wrong. The founders did not try to fix human nature. They built a structure that assumed it. Madison put the operating principle plainly in Federalist No. 51: “Ambition must be made to counteract ambition.” And a few lines later: “If men were angels, no government would be necessary.”</p>

<p>That may be the most relevant sentence in 18th-century political thought for the age of AI agents. Because agents are not angels either. They hallucinate. They inherit poisoned context. They produce confident nonsense. And they are moving from answering questions to taking actions: sending emails, opening pull requests, negotiating with other agents, spending money.</p>

<p>So the question is not: <em>Can I trust this agent?</em></p>

<p>The better question is: <em>Can I trust the system that governs this agent?</em></p>

<p>That is a different question. It is also the question constitutional government was built to answer.</p>

<h2 id="start-with-the-sovereign">Start with the sovereign</h2>

<p>Before the branches, the American design settles a prior question: who holds power in the first place? Not the government. The people. Every power the government has is delegated, enumerated, and revocable. That is what sovereignty means.</p>

<p>In your agent republic, the sovereign is you. Agents hold no native authority. Everything they can do is delegated from you, everything delegated is bounded, and everything bounded can be revoked. Agenda-setting stays with the sovereign too: agents work in response to your mandate, not their own.</p>

<p>Hold onto that, because every design choice below is downstream of it.</p>

<h2 id="the-mistake-most-people-make-with-agents">The mistake most people make with agents</h2>

<p>There are two obvious ways to use agents, and both fail.</p>

<p>The first is blind trust: ask the agent, accept the answer, let it act, hope it was right. This is how you get a model making a bad assumption, approving its own plan, and taking real-world action before anyone notices.</p>

<p>The second is exhaustive review: check every claim, approve every step manually. Safer, but it defeats the point. If the human must review everything, the human remains the bottleneck. The agent never becomes a delegate. It stays a typing accelerator.</p>

<p>The third path is constitutional:</p>

<p><strong>Let agents work. Do not let one agent hold all powers.</strong></p>

<p>That is the whole trick. Everything else is implementation detail.</p>

<h2 id="law-first-action-second-judgment-last">Law first, action second, judgment last</h2>

<p>The Constitution lists the branches in a deliberate order. Article I is the legislature. Article II is the executive. Article III is the courts. I will not pretend to know everything the framers meant by that sequence. But read as a design document, it sketches a theory of a high-trust society: law comes first, because most behavior in a functioning society is governed by rules people have already internalized, not by a judge pre-approving every act. Action comes second, with real latitude inside the law. Judgment comes last, after the fact, and its rulings feed back into the law.</p>

<p>Agents deserve the same order.</p>

<p><strong>Legislative: write the law before any agent acts.</strong> Policies, acceptance criteria, budgets, boundaries. Versioned, testable, scoped, expiring. A prompt is advice; a policy is law. If your standards live only in a prompt, you have suggestions, not standards. The sovereign ratifies the law. Agents can help draft it, but they do not enact it.</p>

<p>You do not need a complete legal code on day one. The founders did not write one either. They started with a bill of rights: a short list of hard limits no future law could cross, and left the rest to be worked out. Your agent republic starts the same way. A handful of inviolable rules from the first hour: never spend money, never send anything external without a signature, never modify your own policies. Everything else starts narrow and grows. New laws get written the way they always have: when an edge case finds you.</p>

<p><strong>Formation: evals are how agents grow up.</strong> Here is the piece most agent architectures skip. Think about how a human becomes trustworthy. Nobody hands a teenager the car keys after a courtroom hearing. They get years of formation: prompts revised constantly, right and wrong reinforced daily, small freedoms extended and sometimes pulled back. Evals are that process for agents. Continuous testing against the law, before consequential authority is ever granted. An agent does not earn latitude by seeming smart. It earns latitude by passing the curriculum, repeatedly, under conditions that look like the real job. Formation is what allows judgment to move to the end instead of blocking every act.</p>

<p><strong>Executive: act within enumerated powers.</strong> The executive branch is the only one that mutates state, so its powers are enumerated, not general. Inside its jurisdiction, it moves fast and does not stop to ask permission. At the edges, it hits structure, not persuasion: deterministic gates that no clever argument can talk past. This is the pattern underneath the whole design: stochastic in thought, deterministic in authority. The founders could only make usurpation punishable. A gate makes it impossible. And some actions, like an irreversible wire transfer, sit outside any agent’s enumerated powers entirely and require the sovereign’s signature. That is not distrust. That is the constitution doing its job.</p>

<p><strong>Judicial: review after, and let rulings compound.</strong> With law written and formation done, judgment can sit where the framers put it: at the end. Review after the fact only works if there is a record worth reviewing, so every meaningful action produces a receipt: the mandate, the policy version, the evidence, the tool calls, the outcome, the rollback path. Not the agent’s summary of the test run. The actual test output. Without receipts, after-the-fact review is theater. With them, the judicial function audits, adjudicates failures, and turns verdicts into precedent. A violation shrinks jurisdiction. A clean record expands it. Every ruling flows back into the law and the evals, so the system gets more trustworthy with use. Trust is jurisdiction: the calendar agent that safely rescheduled a hundred meetings earned autonomy for scheduling, not the right to move money.</p>

<h2 id="the-operating-loop">The operating loop</h2>

<p>In practice, all of this runs as one loop:</p>

<p><strong>Law → Formation → Action → Receipt → Review → Amend</strong></p>

<p>The sovereign holds the pen at both ends. You write the law, and you ratify the amendments. In between, agents act with real latitude, bounded by structure, accountable to review.</p>

<p>The doctrine is short:</p>

<p>Let stochastic systems advise.
Let bounded systems act.
Let humans amend.</p>

<h2 id="the-real-promise">The real promise</h2>

<p>The promise of agents is not that they will be perfect. They will not be. The promise is that we can build systems where trust is earned before authority is granted, and mistakes are caught, judged, and compounded into better law. That is what constitutional government tried to do for human power. It did not make people angels. It made power safer to grant.</p>

<p>None of it works, though, if you treat non-determinism as a defect to be engineered away. It is the feature. The reason to delegate to an agent at all is that it can produce answers you did not specify in advance. The same range of possibility that makes an agent useful is what makes it risky, and you cannot keep one while eliminating the other. The engineering problem is combining non-deterministic judgment with deterministic authority so the variance lands where you can afford it. And that requires leaders to accept something uncomfortable: some level of risk is the price of the reward. A republic that tolerates no failure gets no initiative. The founders accepted that trade for people. We will have to accept it for agents.</p>

<p>Two hundred fifty years is one experiment, still running, and I hold the analogy loosely. But it is also the longest-running production system we have for governing non-deterministic agents at scale, and it would be strange not to borrow from it.</p>

<p>As America turns 250, that may be the best idea to carry forward into the agent age:</p>

<p>Do not build oracle machines. Build trust machinery.</p>

<p>Fast where reversible.
Careful where consequential.
Impossible where forbidden.
Audited where trusted.
Human where sovereign.</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">Principles: A Living List</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/principles.html" />
  <id>https://www.huntergerlach.com/principles</id>
  <published>2026-04-30T00:00:00Z</published>
  <updated>2026-04-30T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>This is a living list of principles I’ve encountered, adopted, and pressure-tested over the years. Some are borrowed from people smarter than me. A few I had to learn the hard way. All of them have earned their place by showing up when it mattered.</p>

<p>I’ll keep updating this as I find new ones worth keeping, or retire ones that stop being useful.</p>

<hr />

<h2 id="the-hardest-problems-are-rarely-technical">The hardest problems are rarely technical.</h2>

<p>Most end up being people problems. The system does what the organization tells it to, whether anyone intended that or not.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway’s Law</a></p>

<hr />

<h2 id="learn-why-not-just-what">Learn why, not just what.</h2>

<p>Being wrong is fine. Not understanding why is not. Before you tear something down, make sure you know why it was built in the first place.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/G._K._Chesterton#Chesterton's_fence">Chesterton’s Fence</a></p>

<hr />

<h2 id="bias-toward-motion">Bias toward motion.</h2>

<p>Start simple, start now. A complex system that works is always built from a simple system that worked first. The bigger risk is standing still.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/John_Gall_(author)#Gall's_law">Gall’s Law</a></p>

<hr />

<h2 id="strategy-is-a-choice-not-a-result">Strategy is a choice, not a result.</h2>

<p>Decide what matters. Then decide what doesn’t. Strategy isn’t something that happens to you. It’s something you choose.</p>

<hr />

<h2 id="outcomes-over-empire">Outcomes over empire.</h2>

<p>The size of the team is not the measure of the impact. When the metric becomes the goal, it stops being a useful metric. This will matter even more as AI makes it possible to do more with less.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart’s Law</a></p>

<hr />

<h2 id="steadiness-is-a-superpower">Steadiness is a superpower.</h2>

<p>Things will go wrong. Your composure determines the outcome. The person who stays calm in the room is usually the one who finds the way through.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/Murphy%27s_law">Murphy’s Law</a></p>

<hr />

<h2 id="if-you-cant-explain-why-it-exists-it-probably-shouldnt">If you can’t explain why it exists, it probably shouldn’t.</h2>

<p>Purpose before mechanics. Every feature, process, and meeting should be able to justify itself. If it can’t, remove it.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it">YAGNI</a></p>

<hr />

<h2 id="convictions-should-be-stress-tested-not-defended">Convictions should be stress-tested, not defended.</h2>

<p>The fastest way to a better answer is to put yours out first. Hold strong opinions loosely, and invite people to challenge them.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/Ward_Cunningham#%22Cunningham's_Law%22">Cunningham’s Law</a></p>

<hr />

<h2 id="automate-the-process-question-what-remains">Automate the process, question what remains.</h2>

<p>Process should earn its place. Automate what you can, and regularly ask whether the rest is still necessary. If a process can’t be automated, it should at least be intentional.</p>

<p>Related: <a href="https://www.oreilly.com/library/view/97-things-every/9780596809515/ch08.html">Scout Rule</a></p>

<hr />

<h2 id="open-by-default">Open by default.</h2>

<p>Transparency surfaces problems faster. Share what you learn. Reduce barriers for others. Open source isn’t an identity; it’s a strategy that works.</p>

<p>Related: <a href="https://en.wikipedia.org/wiki/Linus%27s_law">Linus’s Law</a></p>

<hr />

<h2 id="build-thinkers-not-followers">Build thinkers, not followers.</h2>

<p>Independence over output. The best thing you can do for someone is teach them to think for themselves. Multiply yourself through others, not by creating dependencies on yourself.</p>

<hr />

<p><em>Last updated: April 2026</em></p>
 ]]></content>
</entry>


  <entry>
  <title type="text">Why Complex Systems Fail Quietly — and How to Correct Them</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/why-complex-systems-fail-quietly.html" />
  <id>https://www.huntergerlach.com/why-complex-systems-fail-quietly</id>
  <published>2025-12-13T00:00:00Z</published>
  <updated>2025-12-13T00:00:00Z</updated>
  <content type="html"><![CDATA[ <h1 id="why-complex-systems-fail-quietly--and-how-to-correct-them">Why Complex Systems Fail Quietly — and How to Correct Them</h1>

<p>Most systems don’t fail dramatically.<br />
They fail quietly.</p>

<p>They slow down. They confuse people. They produce answers no one fully trusts. Responsibility blurs. Everyone stays busy, but nothing feels solid.</p>

<p>AI didn’t cause this. It exposed it.</p>

<p>The real problem is not intelligence — it’s <strong>loss of clarity</strong>.</p>

<h2 id="a-common-failure-pattern">A Common Failure Pattern</h2>

<p>Consider a common example: an organization deploys an AI system to triage support tickets, loans, claims, or incidents. At first, it works. Throughput improves. Costs drop. Humans remain “in the loop.”</p>

<p>Months later, something feels off.</p>

<p>Edge cases rise. Overrides become routine. When a bad decision occurs, no one can explain <em>why</em> the system behaved as it did. Postmortems point everywhere — the model, the data, the policy, the workflow. Responsibility dissolves into the system itself.</p>

<p>Nothing is obviously broken. But no one is confident.</p>

<p>This is quiet failure.</p>

<p>The instinctive response is to add more layers: dashboards, rules, approvals, governance. Each layer promises control, but together they reduce agency. Humans supervise outcomes they no longer understand.</p>

<h2 id="restoring-agency">Restoring Agency</h2>

<p>Now compare that to a corrected version of the same system.</p>

<p>The organization redraws the boundaries.</p>

<p>Deterministic rules are made explicit and separated from probabilistic decisions. The model is constrained to recommendation, not execution, for high-risk cases. Every automated decision produces a short, human-readable rationale and a traceable path back to inputs and policy. Overrides are logged not as exceptions, but as learning signals.</p>

<p>Most importantly, responsibility is made local again: specific humans own specific failure modes.</p>

<p>The result is not perfect accuracy. It is something better.</p>

<p>Humans trust the system because they can interrogate it. Failures are faster to diagnose. Improvements compound because decisions leave artifacts. The system becomes easier to operate as it grows, not harder.</p>

<blockquote>
  <p><strong>Aside:</strong> Agency is not the same thing as <em>agents</em>.<br />
Agents are components that act.<br />
Agency is the ability for humans to understand, intervene, and remain accountable.<br />
You can add agents and still lose agency. Restoring it is a design choice.</p>
</blockquote>

<p>Intelligence is no longer a black box. It is a tool.</p>

<h2 id="the-principle">The Principle</h2>

<p>The lesson is not “use less AI.”<br />
It is <strong>design for clarity before scale</strong>.</p>

<p>Instead of asking, “How do we automate this?” ask:</p>

<ul>
  <li>Where must decisions remain explicit?</li>
  <li>What uncertainty belongs with machines vs humans?</li>
  <li>How will failures surface quickly?</li>
  <li>Who can intervene meaningfully?</li>
</ul>

<p>Clarity is not simplicity.<br />
Clarity is knowing <strong>where complexity belongs</strong> — and where it does not.</p>

<p>The future will not belong to those who build the smartest systems.<br />
It will belong to those who build systems that stay legible as they grow.</p>

<p>That is how you scale intelligence without losing agency.</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">How to get a job at Red Hat</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/getting-a-job-at-red-hat.html" />
  <id>https://www.huntergerlach.com/getting-a-job-at-red-hat</id>
  <published>2023-02-08T00:00:00Z</published>
  <updated>2023-02-08T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>If you’re interested in joining Red Hat, you’re not alone. Many people have asked for advice on how to get a job at the company. This post will guide you through the process, with a focus on joining Red Hat as a consultant. However, the steps outlined here will be applicable for most roles within the company.</p>

<h2 id="research-the-company">Research the Company</h2>

<p>Before applying for a job, take the time to research Red Hat and its culture. Start by reading about the company’s values, mission, and products. Look for information about the work environment to see if it’s a good fit for you. Read employee reviews and feedback online to get a better understanding of what it’s like to work at Red Hat. Keep in mind that Red Hat has a strong and unique culture, so it’s important to determine if it’s a good fit for you before you apply.</p>

<h2 id="connect-with-red-hat-employees">Connect with Red Hat Employees</h2>

<p>Reaching out to local Red Hat employees can provide valuable advice and guidance. Attend industry events and conferences where Red Hat employees might be present, and connect with them on LinkedIn, Twitter, GitHub, or other professional networks. Ask for referrals or introductions from your existing network. The goal should absolutely not be to secure a job through these connections, but rather to build a relationship and learn more about working at Red Hat.</p>

<h2 id="the-scenario">The Scenario</h2>

<p>After your research and interactions, you’re now sure you want to join Red Hat. Let’s start with the scenario to help you navigate the next few steps: At your current company, you are in a role that allows you to get exposure to Red Hat products. You find the idea of working with these products daily compelling. You also love sharing your knowledge with people, so you think a role in Consulting will be a good fit. Not only that, but you have been in your current role for a while, so you think the role of Senior Consultant is where you would fit in. Alright, now we can dig in.</p>

<h2 id="find-the-right-role">Find the Right Role</h2>

<p>Take a look at the <a href="https://jobs.redhat.com" alt="job listings on Red Hat website">available jobs on Red Hat’s website</a> and review a few of them. Make sure to find the role that best fits your background, abilities, and area of interest. Some roles may be more focused on AppDev, while others may be more focused on the platform engineering and infrastructure side of the house.</p>

<h2 id="identify-the-right-part-of-the-organization">Identify the Right Part of the Organization</h2>

<p>Once you have a good understanding of the type of consulting role that best fits your background, abilities, and interests, it’s time to determine which part of the organization would be the best fit for you. There are different teams within Red Hat that support different types of customers. For example, there is a team that supports public sector customers (NAPS, the North American Public Sector group) like the Department of Defense and many well-known public service providers. On the other hand, there are consultants who support commercial customers (NACOM, North America Commercial) such as healthcare providers, banks, telecommunications companies, and other well-known brands.</p>

<h2 id="search-for-the-right-job-posting">Search for the Right Job Posting</h2>

<p>After identifying which part of the organization you are best suited, you can then start searching for the specific job posting that matches your skills and experience. The job postings available on Red Hat’s website usually provide a clear description of the expectations and responsibilities of each role. Make sure to read a few of these postings to get a better understanding of the types of roles available and to find one that best fits your needs.</p>

<h2 id="update-your-resume-and-cover-letter">Update Your Resume and Cover Letter</h2>

<p>Once you’ve found a role (or roles) you would be a good candidate for, it’s time to apply. This should go without saying, but you need to ensure that your resume and cover letter (assuming it is needed) are up-to-date and that they accurately reflect your relevant skills and experience. Tailor your cover letter to the specific role you are applying for and emphasize your passion for Red Hat’s products and culture. Highlighting your relevant experience and qualifications will increase your chances of standing out to hiring managers and getting hired.</p>

<h2 id="apply-for-the-job">Apply for the Job</h2>

<p>Once you’ve updated your resume and cover letter, it’s time to apply for the job. Red Hat’s application process is straightforward and easy to navigate. You can apply for a job by clicking on the “Apply Now” button on the job posting. You will be asked to create an account and upload your resume and cover letter. You will also be asked to answer a few questions about your background and experience. Once you’ve completed the application, you will receive an email confirmation. If you are a good fit for the role, you will be contacted by a Red Hat recruiter to schedule an interview.</p>

<p>If you know someone at Red Hat, you can ask them to refer you for the role. This could increase your chances of getting hired. Even if it doesn’t increase your changes, it still allows the referring employee to help you with the application process, track your submission status, and to provide you with valuable feedback.</p>

<h2 id="prepare-for-the-interview-process">Prepare for the Interview Process</h2>

<p>Getting hired at Red Hat requires not only a strong application but also a successful interview. It’s essential to prepare for the interview process by researching common interview questions and practicing your answers in advance. You don’t need to wear a suit and tie, but dress professionally. Red Hat is generally relaxed about clothes as it’s more important that you know your way around the technology, but it’s still important to make a good first impression. During the interview, make sure your enthusiasm for the company and interest in the role are clear. Ask thoughtful questions about the role and the company to demonstrate your interest and more importantly to get a better understanding of what it’s like to work at Red Hat. This is your chance to learn directly from the people who work there, so make the most of it.</p>

<h2 id="stay-active-and-connected">Stay Active and Connected</h2>

<p>If you are not hired right away, don’t get discouraged. Keep practicing your interview skills and networking. Stay in touch with your Red Hat contact and ask for feedback on your application. Keep working towards your goal and eventually, you will get there. In the meantime, consider taking courses or attending workshops related to Red Hat’s products and services to further your knowledge and skills. Stay up-to-date on the latest industry developments and participate in online forums or discussion groups to network with other professionals in the field. Obtain certifications and other credentials to demonstrate your expertise and increase your chances of getting hired. You should also consider volunteering for open source projects to gain valuable experience and build your resume.</p>

<h2 id="maintain-relationships">Maintain Relationships</h2>

<p>Finally, it’s important to maintain genuine relationships with your Red Hat contacts. Consider connecting with them on LinkedIn or reaching out to them periodically to offer help and to check in and see if there are any new opportunities that would be a good fit for your skills and experience. By maintaining these relationships, you will not only increase your chances of being hired at Red Hat, but you will also have a strong network for when you are inevitably hired on to Red Hat.</p>

<p>Good luck with your job search!</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">How to Effectively Use AI Tools in Your Software Development Process</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/how-to-use-ai-in-software-development.html" />
  <id>https://www.huntergerlach.com/how-to-use-ai-in-software-development</id>
  <published>2023-01-01T00:00:00Z</published>
  <updated>2023-01-01T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>As a software engineer, I am constantly looking for ways to improve my efficiency and productivity. One area of technology that I’ve found which has gained a lot of attention in recent years is artificial intelligence (AI). AI tools can help you write code more quickly by generating it automatically based on a prompt or set of instructions.</p>

<p>However, it’s important to use AI tools as a supplement to, rather than a replacement for, human expertise and judgment. While AI can be a useful tool, it’s not perfect, and it’s always a good idea to review the code that it generates to ensure that it meets the desired specifications and is of high quality.</p>

<p>What follows is my evaluation of the benefits and limitations of current AI tooling. I did not focus on any one single tool, but rather the genre as a whole. After exploring the landscape, we’ll wrap up with a few tips for using these tools effectively. Let’s dig in.</p>

<p>The Benefits of AI Tools:</p>

<ul>
  <li>Increased consistency: AI tools can help ensure that code is written consistently, following established guidelines and standards. This can make it easier to maintain and update the code in the future.</li>
  <li>Fewer errors: AI tools can help reduce the number of errors in code by automatically generating it based on a prompt or set of instructions. This can save time and effort that would otherwise be spent debugging and fixing errors.</li>
  <li>Improved efficiency: By automating certain tasks, AI tools can help you complete projects more quickly and efficiently. This can free up time to focus on more complex or creative tasks.</li>
  <li>Increased productivity: By using AI tools to automate routine tasks, you can increase your overall productivity and get more done in less time.</li>
  <li>Expanded knowledge: Using an AI tool that is trained on a large dataset of code and information can provide access to a wider range of knowledge and experience than an individual human software engineer. This can be a benefit when using AI tools to generate code or perform other tasks.</li>
</ul>

<p>The Limitations of AI Tools:</p>

<ul>
  <li>Complexity: AI tools may not have the same level of understanding of the problem domain as a human software engineer, and therefore may not be able to generate code for more complex tasks.</li>
  <li>Review and testing: The generated code still needs to be reviewed and tested to ensure that it is correct and meets the desired specifications. Skipping this step could lead to errors and issues that could have been caught with a thorough review.</li>
  <li>Lack of creativity: AI tools may not be able to come up with creative or innovative solutions to problems, as they are limited to the information and instructions provided to them.</li>
  <li>Dependency: Relying too heavily on AI tools may lead to a loss of skills and knowledge, as developers may not have the opportunity to practice and improve their own coding abilities.</li>
  <li>Bias: If the dataset used to train an AI tool is biased, the tool may generate biased output as well. It’s important to carefully consider the dataset used to train the tool and ensure that it is diverse and representative.</li>
  <li>Connectivity: The current generation of AI tools (specifically LLMs) are hosted online by large organizations. Any requests you make to their service can be logged and this is a valid concern for some people/organizations. Additionally, you cannot access the service if you yourself are not connected to the internet (e.g. travel - although, that is increasingly less of a problem).</li>
</ul>

<p>Despite these limitations, AI tools can still be a valuable addition to a software engineer’s toolkit when used effectively. And now for the tips I promised for using AI tools effectively in software development.</p>

<p>Tips for Using AI Tools Effectively:</p>

<ul>
  <li>Use the AI tool as a supplement, not a replacement: As mentioned earlier, it’s important to use AI tools as a supplement to, rather than a replacement for, human expertise and judgment. This will help ensure that the code being generated is of high quality and meets the desired specifications.</li>
  <li>Review the generated code carefully: Make sure to take the time to review the code that the AI tool generates. This will help you catch any errors or issues that the tool may have missed.</li>
  <li>Understand the limitations of the AI tool: It’s important to have a clear understanding of the capabilities and limitations of the AI tool you are using. This will help you know when it is appropriate to use the tool and when it may be better to write code manually.</li>
  <li>Use the tool in moderation: Don’t rely on the AI tool for every task. Instead, use it judiciously and only when it can add value to your workflow.</li>
  <li>Continually improve your own skills: Make sure to continually improve your own programming skills, even if you are using AI tools. This will help ensure that you are able to understand and review the code that the tool generates, as well as write code manually when necessary.</li>
</ul>

<p>By following these tips, you can maximize the value of AI tools in your workflow and avoid becoming overly reliant on them.</p>

<p>However, it’s always a good idea to periodically check in with yourself to ensure that you are using the tools effectively. One way to do this is to ask yourself the following “break glass” question (i.e. a question that’s available in case you don’t know what else to do): “If I had to write code manually, would I be able to do so effectively?” If the answer is “no,” it may be a sign that you are becoming overly reliant on the AI tool. In such cases, it may be a good idea to take a step back and reassess your use of the tool to ensure that it is being used effectively and in a way that complements your own skills and expertise.</p>

<blockquote>
  <p>Break Glass Question: “If I had to write code manually, would I be able to do so effectively?”</p>
</blockquote>

<p>In some cases, you may be able to write large blocks of effective code manually without the help of an AI tool, but it might take longer because you would need to perform some research, make a number of decisions, and iterate towards a solution. In these situations, it’s important to be mindful of the scope of the AI usage and avoid biting off more than you can chew, as this can lead to the over-reliance problem mentioned earlier. To strike the right balance, consider using the AI tool to automate certain tasks or generate code for simple, routine tasks, while reserving more complex or creative tasks for yourself. This can help ensure that you are using the AI tool effectively and not asking it to do too much at once.</p>

<p>AI tools can be a valuable addition to a software engineer’s toolkit, providing the ability to generate code quickly and improve efficiency. But remember, it’s important to use these tools to supplement your own expertise and judgment, not to do all the work on your behalf. By understanding the benefits and limitations of AI tools, and using them effectively, you can maximize their value in your workflow.</p>

<p>Do you have any tips for using AI tools effectively in software development? Share your thoughts in the comments below!</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">Reflections on 2022: Personal and Professional Growth</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/reflections-on-2022.html" />
  <id>https://www.huntergerlach.com/reflections-on-2022</id>
  <published>2022-12-31T00:00:00Z</published>
  <updated>2022-12-31T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>2022 was a year of personal and professional growth for me.</p>

<p>In addition to welcoming my third child into the world, I also had the opportunity to work on the VCS Collection System, a project that was a huge accomplishment for myself and my team. The VCS Collection System required tons of man hours to complete, but it allowed us to learn so much in such a short period of time – both about technology and about ourselves.</p>

<p>We spent two years building and supporting multiple systems to help customers safely return to the office at the end of the pandemic. On top of that, we open sourced the VCS Collection System in accordance with our values, making the code freely available to the public.</p>

<p>In a future blog post, I will go into more detail about the VCS Collection System and the challenges and triumphs we faced while working on it.</p>

<p>One of the highlights of the year for me actually happened relatively recently with the rise of ChatGPT, which broke the internet. Likewise, it has consumed much of my time since. It has been an exciting and challenging experience learning about this new technology, and I have enjoyed figuring out how to use it effectively in my everyday life.</p>

<p>Moreover, I have enjoyed finding and contributing to the LangChain community. LangChain is an open source LLM python library. I stumbled upon the project while building an application and had just overcome a technical hurdle. It was frustrating at first because I felt like it had been wasted time, but I realized that it helped me better understand the library from the start. My contributions to-date have been relatively small, but it’s been fun watching the community grow and solve problems day in and day out. I plan to continue contributing in the foreseeable future.</p>

<p>As I look ahead to the new year, I am excited to continue building on the progress I have made in terms of personal goals. I have been focusing on building technical depth and consistency, and I am proud of the progress I have made. In 2023, I hope to see even more progress in these areas, as well as continue building strong relationships in my open source communities.</p>

<p>To ring in the new year, I will be keeping things low-key with family. Thank you for reading my blog post. If you have any comments or questions, please find me on Twitter. I would love to hear from you! Here’s to a successful and fulfilling 2023!</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">Learning to code</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/learning-to-code.html" />
  <id>https://www.huntergerlach.com/learning-to-code</id>
  <published>2022-12-30T00:00:00Z</published>
  <updated>2022-12-30T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>Hey there! If you’re reading this, you’re probably interested in learning how to code and maybe even becoming a professional software engineer. Well, you’re in the right place! Whether you have a degree in computer science or are just starting out on your own, there are plenty of ways to get into the world of programming.</p>

<p>First things first, what’s your goal? Do you want to build a killer app, solve a specific problem, or just learn a new skill? Having a clear goal will help keep you motivated and focused as you work your way through the learning process.</p>

<p>Now, let’s talk about choosing a programming language. There are tons of options out there, but if you’re just starting out and feeling a little overwhelmed, Python is a great choice. It’s versatile, easy to use, and has a huge community of developers. Plus, it’s used in all sorts of applications, from web development to data analysis.</p>

<p>As you start learning, it’s helpful to find an instructor or resource that clicks with you. YouTube is a great place to find programming tutorials and courses, and there are tons of talented and experienced instructors out there who offer their knowledge for free. Look for content that’s easy to understand and fits your learning style – it’ll make the process much more efficient and enjoyable.</p>

<p>Okay, so you’re working through a tutorial and suddenly you hit a wall. Don’t worry, this is completely normal! When you get stuck, take a break, do some additional research, and try again. It’s important to be persistent and keep trying until you fully grasp the concept. And remember, practice makes perfect – the more you code, the better you’ll get.</p>

<p>As you continue learning and solving problems, you’ll start to identify areas where you have a solid understanding and others where you might need to improve. Focus on learning concepts rather than technologies – technologies come and go, but the underlying concepts stay the same.</p>

<p>In addition to your primary instructor or course, it’s helpful to seek out additional resources like online documentation (don’t be afraid to read the docs), forums, and online communities. These can provide additional perspectives and help you troubleshoot problems.</p>

<p>Collaborating with others is also a great way to learn and improve your skills. If you’re in school, consider joining a programming club or online community, or working on a project with a group of friends or classmates. If you’re not in school, Twitter, StackOverflow, and GitHub are excellent places to find experienced and helpful people.</p>

<p>And don’t forget to stay up to date! The field of programming is constantly evolving, with new technologies and techniques being developed all the time. Keep an eye on industry newsletters, blogs, and social media accounts to stay informed about the latest developments. You don’t need to take action on the new hotness right away, but if it comes up multiple times from a variety of resources it might be time to explore it further.</p>

<p>Finally, don’t be afraid to ask for help. It’s okay to not know everything, and there are tons of people out there who are willing to help you learn and grow. Reach out to your instructor, a mentor, or a community for assistance when you’re stuck.</p>

<p>In summary, the key to becoming a successful programmer is to have a clear goal, choose a language that fits your needs, find an instructor you enjoy learning from, be persistent in your learning and problem-solving, and don’t be afraid to ask for help. With dedication and hard work, you can achieve your programming goals and even turn it into a rewarding career. Good luck, and happy coding!</p>
 ]]></content>
</entry>


  <entry>
  <title type="text">Deploying a Next.JS Application to Multiple Stages with GitHub Pages and GitHub Actions</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/multi-site-with-nextjs-and-github-pages.html" />
  <id>https://www.huntergerlach.com/multi-site-with-nextjs-and-github-pages</id>
  <published>2022-12-29T00:00:00Z</published>
  <updated>2022-12-29T00:00:00Z</updated>
  <content type="html"><![CDATA[ <h1 id="deploying-a-nextjs-application-to-multiple-stages-with-github-pages-and-github-actions">Deploying a Next.JS Application to Multiple Stages with GitHub Pages and GitHub Actions</h1>

<p>Are you looking for a way to deploy your Next.JS application to multiple stages or environments, such as staging and production? In this blog post, I’ll show you how to use GitHub Pages and Actions to set up a multi-stage deployment process for your Next.JS application.</p>

<h2 id="setting-up-github-pages-for-the-staging-environment">Setting up GitHub Pages for the Staging Environment</h2>

<p>GitHub Pages is a free hosting service that allows you to publish static websites directly from a GitHub repository (provided you follow their generous terms of service). You can use GitHub Pages to host your Next.JS application in the staging environment by pushing your code changes to the <code class="language-plaintext highlighter-rouge">main</code> branch of a repository.</p>

<p>To set up GitHub Pages for the staging environment, follow these steps:</p>

<ol>
  <li>Create a new repository for your Next.JS application.</li>
  <li>Add the code for your Next.JS application to the repository.</li>
  <li>Go to the settings page for the repository and enable GitHub Pages for the <code class="language-plaintext highlighter-rouge">main</code> branch.</li>
  <li>Configure any necessary details, such as the URL of the staging environment.</li>
  <li>Push your code changes to the <code class="language-plaintext highlighter-rouge">main</code> branch of the repository. The application will be automatically deployed to the staging environment by GitHub Pages.</li>
</ol>

<h2 id="setting-up-github-actions-for-the-production-environment">Setting up GitHub Actions for the Production Environment</h2>

<p>GitHub Actions is a powerful tool that allows you to automate your workflow and build, test, and deploy your applications. You can use GitHub Actions to set up a workflow that deploys your Next.JS application to the production environment when you create a new release and tag it with the desired version number.</p>

<p>To set up GitHub Actions for the production environment, follow these steps:</p>

<ol>
  <li>Create a new repository for your GitHub Actions workflow.</li>
  <li>Add the code and configuration for the workflow to the repository.</li>
  <li>Configure any necessary details, such as the URL of the production environment.</li>
  <li>Create a new release of your Next.JS application and tag it with the desired version number. The GitHub Actions workflow will automatically deploy the application to the production environment.</li>
</ol>

<h2 id="conclusion">Conclusion</h2>

<p>By using GitHub Pages and Actions, you can easily set up a multi-stage deployment process for your Next.JS application. Whether you’re deploying to staging or production, these tools make it easy to automate your workflow and ensure that your application is always up-to-date.</p>

<p>I hope this blog post has helped you understand how to use GitHub Pages and Actions to deploy your Next.JS application to multiple stages or environments. If you have any questions or comments, feel free to reach out to me on Twitter or LinkedIn.</p>

<h2 id="links">Links</h2>

<p>Repositories:</p>

<ul>
  <li><a href="https://github.com/HunterGerlach/multi-stage-deployment-example-nextjs-github-pages-staging">https://github.com/HunterGerlach/multi-stage-deployment-example-nextjs-github-pages-staging</a></li>
  <li><a href="https://github.com/HunterGerlach/multi-stage-deployment-example-nextjs-github-pages-production">https://github.com/HunterGerlach/multi-stage-deployment-example-nextjs-github-pages-production</a></li>
</ul>

<p>Live demo sites:</p>

<ul>
  <li><a href="https://huntergerlach.github.io/multi-stage-deployment-example-nextjs-github-pages-staging">https://huntergerlach.github.io/multi-stage-deployment-example-nextjs-github-pages-staging</a></li>
  <li><a href="https://huntergerlach.github.io/multi-stage-deployment-example-nextjs-github-pages-production">https://huntergerlach.github.io/multi-stage-deployment-example-nextjs-github-pages-production</a></li>
</ul>
 ]]></content>
</entry>


  <entry>
  <title type="text">Hello World</title>
  <link rel="alternate" type="text/html" href="https://www.huntergerlach.com/hello-world.html" />
  <id>https://www.huntergerlach.com/hello-world</id>
  <published>2022-12-28T00:00:00Z</published>
  <updated>2022-12-28T00:00:00Z</updated>
  <content type="html"><![CDATA[ <p>Hello, world…</p>

<p>Today, I wanted to share a simple yet timeless message with all of you: “Hello, world!”</p>

<p>You may be wondering, what does this phrase mean and why is it so important? Well, “Hello, world!” is often used as a starting point for new programmers learning a programming language. It is a simple program that outputs the message “Hello, world!” to the screen, which serves as a way to verify that the basic syntax of the programming language is correct and that the programmer’s environment is set up properly.</p>

<p>But beyond just being a technical exercise, “Hello, world!” is a way to connect with others and to start building a community. It’s a way of saying “I’m here, and I’m excited to share my thoughts and experiences with you.”</p>

<p>So with that said, I hope that this simple message can serve as a reminder to stay connected and to always keep learning and growing. Whether you’re a seasoned programmer or just starting out, there is always more to learn and discover.</p>

<p>Thank you for stopping by and I hope you’ll join me on this journey of self-discovery and growth.</p>

<p>Until next time.</p>
 ]]></content>
</entry>



</feed>
