<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Matt Rogish</title><link>https://mattrogish.com/</link><description>Recent content on Matt Rogish</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 03 Apr 2026 11:19:34 -0400</lastBuildDate><atom:link href="https://mattrogish.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Disposable Software - How to Stop Worrying and Love the AI Code</title><link>https://mattrogish.com/blog/2026/04/03/disposable-software-how-to-stop-worrying-and-love-the-ai-code/</link><pubDate>Fri, 03 Apr 2026 11:19:34 -0400</pubDate><guid>https://mattrogish.com/blog/2026/04/03/disposable-software-how-to-stop-worrying-and-love-the-ai-code/</guid><description>&lt;p&gt;It&amp;rsquo;s pretty clear we&amp;rsquo;re in the &amp;ldquo;disposable software era&amp;rdquo;. Plenty of blog posts chatting about it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aicoding.substack.com/p/the-disposable-software-era?triedRedirect=true" target="_blank"&gt;The Disposable Software Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ct839.com/en/blog/disposable-software-ai-redefines-what-software-means/" target="_blank"&gt;Disposable Software: How AI is Redefining What Software Means&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;etc. Just google &amp;ldquo;&lt;a href="https://letmegooglethat.com/?q=Disposable&amp;#43;Software" target="_blank"&gt;Disposable software&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;For the most part, though, the examples referenced are about small, bespoke solutions to particular problems, often short-lived and/or non-production coded stuff, or things like &amp;ldquo;LLM needs to do a thing so it spits out some python, executes it, and deletes it.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Thinking out Loud</title><link>https://mattrogish.com/writing/</link><pubDate>Mon, 30 Mar 2026 15:42:01 -0400</pubDate><guid>https://mattrogish.com/writing/</guid><description/></item><item><title>LLMs &amp; Agents: How do they Work?</title><link>https://mattrogish.com/blog/2026/03/20/llms-agents-how-do-they-work/</link><pubDate>Fri, 20 Mar 2026 10:23:26 -0400</pubDate><guid>https://mattrogish.com/blog/2026/03/20/llms-agents-how-do-they-work/</guid><description>&lt;figure class="highlight codedef-hidden" data-codedef="simplified_pre_training_loop" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# CONCEPTUAL PRE-TRAINING LOOP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;internet_documents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; crawl_internet()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;internet_documents&lt;span style="color:#f92672"&gt;.&lt;/span&gt;each &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;doc&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 1. Tokenize the entire document into an array of integers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# In reality, this is done in chunks since the docs are probably too big. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ATFLLM (Ask The F.. LLM) to learn about different chunk sizes.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tokens &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(doc) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Inputs are tokens 0 to N-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# [&amp;#34;The&amp;#34;, &amp;#34;capital&amp;#34;, &amp;#34;of&amp;#34;, &amp;#34;France&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;Paris&amp;#34;, &amp;#34;and&amp;#34;, &amp;#34;its&amp;#34;, &amp;#34;population&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;about&amp;#34;, &amp;#34;2&amp;#34;, ...] &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokens&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;...-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Labels are tokens 1 to N (The &amp;#34;Answer&amp;#34; is just the next token)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# [&amp;#34;capital&amp;#34;, &amp;#34;of&amp;#34;, &amp;#34;France&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;Paris&amp;#34;, &amp;#34;and&amp;#34;, &amp;#34;its&amp;#34;, &amp;#34;population&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;about&amp;#34;, &amp;#34;2&amp;#34;, &amp;#34;million&amp;#34;, ....]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokens&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;..-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 2. THE FORWARD PASS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# The model predicts the probability for EVERY token in the sequence at once &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# (this is magic that GPUs provide since they are embarrassingly parallel) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; predictions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;predict(inputs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 3. THE LOSS (The &amp;#34;Grade&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We compare the predicted probability of the &amp;#39;correct&amp;#39; next token &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# to the actual token that was in the text. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Lower number is better.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loss &lt;span style="color:#f92672"&gt;=&lt;/span&gt; calculate_loss(predictions, labels)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 4. THE BACKWARDS UPDATE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Nudge the weights prior to this so that (for example) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# &amp;#39;is&amp;#39; predicts &amp;#39;about&amp;#39; more strongly next time.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;adjust_weights(loss)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;figure class="highlight codedef-hidden" data-codedef="generate_thoughts" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;generate_thoughts&lt;/span&gt;(prompt, number_of_samples&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trajectories &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n_samples&lt;span style="color:#f92672"&gt;.&lt;/span&gt;times &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thought_trace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate(prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;max_tokens&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8192&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;temperature&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trajectories &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;thoughts&lt;/span&gt;: thought_trace&lt;span style="color:#f92672"&gt;.&lt;/span&gt;thoughts, &lt;span style="color:#e6db74"&gt;answer&lt;/span&gt;: thought_trace&lt;span style="color:#f92672"&gt;.&lt;/span&gt;answer }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; trajectories
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;figure class="highlight codedef-hidden" data-codedef="train_thinking_step" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Process-Supervised Training (Thinking)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;train_thinking_step&lt;/span&gt;(prompt, ground_truth_answer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 1. Generate a &amp;#34;Thought Trace&amp;#34; (Chain of Thought)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thought_trace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate_thoughts(prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 2. EVALUATE THE PROCESS (The &amp;#34;Secret Sauce&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We use a Process Reward Model (PRM) to grade each step&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; step_rewards &lt;span style="color:#f92672"&gt;=&lt;/span&gt; thought_trace&lt;span style="color:#f92672"&gt;.&lt;/span&gt;map &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;step&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process_reward_model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;grade(step) &lt;span style="color:#75715e"&gt;# Is this step logical?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 3. EVALUATE THE OUTCOME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final_answer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate_final_answer(prompt, thought_trace)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outcome_reward &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (final_answer &lt;span style="color:#f92672"&gt;==&lt;/span&gt; ground_truth_answer ? &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; : &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 4. REINFORCEMENT LEARNING&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We update the weights based on the SUM of the step rewards&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total_reward &lt;span style="color:#f92672"&gt;=&lt;/span&gt; step_rewards&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sum &lt;span style="color:#f92672"&gt;+&lt;/span&gt; outcome_reward
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;update_weights_via_ppo(total_reward)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;figure class="highlight codedef-hidden" data-codedef="generate_with_cot" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;generate_with_cot&lt;/span&gt;(prompt, number_of_samples&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trajectories &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; number_of_samples&lt;span style="color:#f92672"&gt;.&lt;/span&gt;times &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We sample with Temperature &amp;gt; 0 to encourage exploration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Higher values create more hallucinations as it starts to &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# drift further and further from the training data.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thought_trace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate( prompt, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_tokens&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8192&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;temperature&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trajectories &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;thoughts&lt;/span&gt;: thought_trace&lt;span style="color:#f92672"&gt;.&lt;/span&gt;thoughts, &lt;span style="color:#e6db74"&gt;answer&lt;/span&gt;: thought_trace&lt;span style="color:#f92672"&gt;.&lt;/span&gt;answer }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; trajectories
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;figure class="highlight codedef-hidden" data-codedef="calculate_reward" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculate_reward&lt;/span&gt;(thought_trace, final_answer, correct_answer, thought_complexity)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Step 1: RL VR &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If it&amp;#39;s wrong we need to negatively reinforce this path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;unless&lt;/span&gt; final_answer &lt;span style="color:#f92672"&gt;==&lt;/span&gt; correct_answer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Base reward for being right&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Step 2: Evaluation via Process Reward Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; helpfulness, correctness, coherence, complexity, verbosity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; process_reward_model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;evaluate(thought_trace)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Did it actually &amp;#39;think&amp;#39; or just guess?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Various models might tune these all differently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; helpfulness &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; coherence &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; correctness &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; complexity &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# And so on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Token efficiency check: &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If the thought trace is 10,000 words for a 2+2 problem, penalize it.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; verbosity &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reward
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;figure class="highlight codedef-hidden" data-codedef="calculate_loss_for_tool_syntax" aria-hidden="true"&gt;
 &lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculate_loss_for_tool_syntax&lt;/span&gt;(response, ideal_response)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# This is handwavy to keep the code simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We needed a tool, they didn&amp;#39;t get it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Could still be helpful so don&amp;#39;t kill it entirely&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;didnt_use_tool?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Picked the wrong tool - big problem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; ideal_response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We know we needed to use the right tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool &lt;span style="color:#f92672"&gt;==&lt;/span&gt; ideal_response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; is_valid_tool_call(response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool_call)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# A broken tool call is bad, we don&amp;#39;t want to learn wrong syntax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;For as much as AI has dramatically changed all of our lives, mine included, I was a bit uneasy that I didn&amp;rsquo;t really know how they are implemented and how they work. What is thinking and chain-of-thought reasoning? How does it choose a tool? What are parameters, exactly, and why are more of them better? What&amp;rsquo;s an Agent? What&amp;rsquo;s MCP?&lt;/p&gt;</description></item><item><title>Why Doesn't Apple Get AI?</title><link>https://mattrogish.com/blog/2026/03/18/why-doesnt-apple-get-ai/</link><pubDate>Wed, 18 Mar 2026 13:01:20 -0400</pubDate><guid>https://mattrogish.com/blog/2026/03/18/why-doesnt-apple-get-ai/</guid><description>&lt;h1 id="a-few-single-line-stories-in-everyday-frustration"&gt;A Few Single-line Stories in Everyday Frustration&lt;/h1&gt;
&lt;p&gt;&amp;ldquo;Hey Siri, what&amp;rsquo;s the weather tomorrow?&amp;rdquo;&lt;/p&gt;










&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;Looks like thunderstorms tomorrow. The high temperature will be 66 degrees, and low will be 33.&lt;/p&gt;

 &lt;/blockquote&gt;
 
&lt;/figure&gt;&lt;p&gt;So you go outside with an umbrella and a t-shirt only to realize that it&amp;rsquo;s nearly snowing when you&amp;rsquo;re out. Why? Because of a chart that looks like this:&lt;/p&gt;
&lt;p&gt;
 &lt;img src="https://mattrogish.com/images/apple_and_ai/weather.png" alt=""&gt;
&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hey Siri, play Toxic&amp;rdquo;. And then &amp;ldquo;Toxic&amp;rdquo; by Britney Spears plays instead of the one in my library that I already listened to today (&lt;a href="https://www.youtube.com/watch?v=Mvaosumc4hU" target="_blank"&gt;BoyWithUke&lt;/a&gt;)!&lt;/p&gt;</description></item><item><title>The Wanting Comes in Waves</title><link>https://mattrogish.com/blog/2026/03/17/the-wanting-comes-in-waves/</link><pubDate>Tue, 17 Mar 2026 15:28:13 -0400</pubDate><guid>https://mattrogish.com/blog/2026/03/17/the-wanting-comes-in-waves/</guid><description>&lt;h1 id="drowning-in-a-sea-of-tokens"&gt;Drowning in a Sea of Tokens&lt;/h1&gt;
&lt;p&gt;It&amp;rsquo;s no secret that AI-produced slop is filling up social networks, websites, blogs, job search sites, homework. B2B marketers have completely clogged the internets here and - perhaps because they lack the confidence, or just value the convenience - I see clearly AI-produced &amp;ldquo;personal&amp;rdquo; content in Slack groups, newsletters, mailing lists and Discords of all shapes and sizes.&lt;/p&gt;
&lt;p&gt;And I get it. The pull is undeniable. The magical autocomplete super tempting. I keep trying to resist; when I&amp;rsquo;m typing out a post I will have Sonnet critique my work and I have to fight taking the suggestions verbatim. To quote the famous Jim Gaffigan: &amp;ldquo;Hey, that&amp;rsquo;s something I&amp;rsquo;d say!&amp;rdquo;&lt;/p&gt;</description></item><item><title>Agents and the Era of Overproduction</title><link>https://mattrogish.com/blog/2026/03/11/agents-and-the-era-of-overproduction/</link><pubDate>Wed, 11 Mar 2026 11:14:45 -0400</pubDate><guid>https://mattrogish.com/blog/2026/03/11/agents-and-the-era-of-overproduction/</guid><description>&lt;h1 id="memory-lane"&gt;Memory Lane&lt;/h1&gt;
&lt;p&gt;It seems somewhat fitting that now, March 11, 2026, almost three years ago to the day that OpenAI&amp;rsquo;s GPT-4 was released (&lt;span class="sidenote" data-sidenote-id="sn-6f1bc60bf9c9cea8fbe216930ca2b809-0"&gt;&lt;label
 class="sidenote-label"
 for="sn-6f1bc60bf9c9cea8fbe216930ca2b809-0"
 data-sidenote-target="sn-6f1bc60bf9c9cea8fbe216930ca2b809-0"
&gt;and almost three years after I asked GPT-4 my first recorded question&lt;/label&gt;&lt;input
 class="sidenote-checkbox"
 type="checkbox"
 id="sn-6f1bc60bf9c9cea8fbe216930ca2b809-0"
/&gt;&lt;span class="sidenote-content sidenote-right" data-sidenote-content="sn-6f1bc60bf9c9cea8fbe216930ca2b809-0"&gt;I distinctly remember asking GPT3.5 to create a song about something in the style of Nine Inch Nails, but my ChatGPT.com history only goes back to March 27, 2023.&lt;br&gt;
&lt;br&gt;
Compare &lt;a href="https://chatgpt.com/s/t_69b187d1a48c8191827b42e6f6a1040a" target="_blank"&gt;March 2023&lt;/a&gt; with &lt;a href="https://chatgpt.com/s/t_69b18b8d4d5c8191938f78d191f48ce2" target="_blank"&gt;March 2026&lt;/a&gt;. (I have no idea why I was interested in this.)
&lt;/span&gt;&lt;/span&gt;), I&amp;rsquo;m writing my first thoughts on it.&lt;/p&gt;</description></item><item><title>Writing - All Posts</title><link>https://mattrogish.com/archive/</link><pubDate>Tue, 10 Mar 2026 10:00:00 -0500</pubDate><guid>https://mattrogish.com/archive/</guid><description/></item><item><title>How I Write Software With Agents</title><link>https://mattrogish.com/blog/2026/03/09/how-i-write-software-with-agents/</link><pubDate>Mon, 09 Mar 2026 15:00:58 -0400</pubDate><guid>https://mattrogish.com/blog/2026/03/09/how-i-write-software-with-agents/</guid><description>&lt;p&gt;There&amp;rsquo;s a lot of churn in the AI/LLM/Agent space, but I&amp;rsquo;ve landed on an approach that reliably produces production-quality code for non-trivial work. The core insight is simple: use multiple LLMs to develop a solid architecture, then implement it through a phased &lt;strong&gt;crawl/walk/run&lt;/strong&gt; approach.&lt;/p&gt;
&lt;p&gt;Getting the plan right before writing code is where most of the value is. Here&amp;rsquo;s how that plays out in practice.&lt;/p&gt;
&lt;h1 id="process-overview"&gt;Process Overview&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Set up your environment&lt;/li&gt;
&lt;li&gt;Arrive at an architecture thru multiple LLMs&lt;/li&gt;
&lt;li&gt;Adversarially review the result&lt;/li&gt;
&lt;li&gt;Generate a crawl/walk/run implementation plan&lt;/li&gt;
&lt;li&gt;Implement phase by phase, reviewing as I/you go&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="environment-prep"&gt;Environment Prep&lt;/h1&gt;
&lt;h2 id="dev-containers"&gt;Dev Containers&lt;/h2&gt;
&lt;p&gt;The agent needs to run your tests, catch its own errors, and iterate without you babysitting it. Without that feedback loop, you&amp;rsquo;re stuck manually pasting error messages back in or clicking &amp;ldquo;yes, run &lt;code&gt;bin/rails test&lt;/code&gt;&amp;rdquo; after every step.&lt;/p&gt;</description></item><item><title>Choking: How Systems We Create at Work Sabotage Employees and Job Applicants</title><link>https://mattrogish.com/blog/2018/11/15/choking-how-systems-we-create-at-work-sabotage-employees-and-job-applicants/</link><pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/11/15/choking-how-systems-we-create-at-work-sabotage-employees-and-job-applicants/</guid><description>&lt;h1 id="preamble"&gt;Preamble&lt;/h1&gt;
&lt;p&gt;I recently attended a small networking meetup of entrepreneurs and startup founders. About halfway through, the organizers invited people to give a small elevator pitch about what they&amp;rsquo;re working on and how they can help the group, and what help they need. As an &lt;a href="https://www.16personalities.com/enfp-personality" target="_blank"&gt;ENFP&lt;/a&gt; I relish the opportunity to get up in front of people and share something and hopefully learn something in return.&lt;/p&gt;
&lt;p&gt;So, naturally, I raised my hand. Instead of giving the smooth, polished pitch I normally give about what I&amp;rsquo;m working on, I stammered. I had trouble clearly articulating my vision and opportunity, and how I could help everyone there. In short, I choked.&lt;/p&gt;</description></item><item><title>iPad Only?</title><link>https://mattrogish.com/blog/2018/11/15/ipad-only/</link><pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/11/15/ipad-only/</guid><description>&lt;p&gt;I’ve never been completely satisfied with my computer setup. Sure, the 2015 13” MacBook Pro I have is &lt;em&gt;fine&lt;/em&gt;, it does what I need it to do. But as someone that travels a lot, it’s bulky and the battery life isn’t that great, and outside of this blog and some side projects, I don’t really do any software development. Nothing that remotely taxes the machine, aside from occasionally compiling new versions of Ruby.&lt;/p&gt;</description></item><item><title>How to Setup Eero With Multiple Wired Eero</title><link>https://mattrogish.com/blog/2018/08/29/how-to-setup-eero-with-multiple-wired-eero/</link><pubDate>Wed, 29 Aug 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/08/29/how-to-setup-eero-with-multiple-wired-eero/</guid><description>&lt;p&gt;After upgrading to Gigabit FiOS, I recently setup a series of &lt;a href="https://eero.com/" target="_blank"&gt;eero&lt;/a&gt; devices in my house, replacing a couple of non-meshed Netgear routers. It wasn&amp;rsquo;t incredibly obvious how to setup a wired backhaul and so I thought y&amp;rsquo;all could use some quick pointers, as I got it wrong a few times.&lt;/p&gt;</description></item><item><title>Why I Work Remotely</title><link>https://mattrogish.com/blog/2018/07/16/why-i-work-remotely/</link><pubDate>Mon, 16 Jul 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/07/16/why-i-work-remotely/</guid><description>&lt;p&gt;Remote work is in the news again. Oh, boy.&lt;/p&gt;</description></item><item><title>How to Come Up With Profitable Business Ideas</title><link>https://mattrogish.com/blog/2018/05/24/how-to-come-up-with-profitable-business-ideas/</link><pubDate>Thu, 24 May 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/05/24/how-to-come-up-with-profitable-business-ideas/</guid><description>&lt;p&gt;A few days ago I came across this article from Indiehackers (a really cool site!) called &lt;a href="https://www.indiehackers.com/round-table/how-to-come-up-with-profitable-online-business-ideas" target="_blank"&gt;&amp;ldquo;How to Come Up with Profitable Online Business Ideas&amp;rdquo;&lt;/a&gt;. It&amp;rsquo;s basically a giant list of folks that built something describing their process, which I guess is helpful to some degree, but ultimately feels like it misses the mark.&lt;/p&gt;
&lt;p&gt;It opens with:&lt;/p&gt;










&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;Interested in building a startup, or starting your own small business to make money on the side? Learn by example from dozens of entrepreneurs who share how they came up with great business ideas.&lt;/p&gt;</description></item><item><title>Lessons From Theranos Disaster</title><link>https://mattrogish.com/blog/2018/05/23/lessons-from-theranos-disaster/</link><pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2018/05/23/lessons-from-theranos-disaster/</guid><description>&lt;p&gt;I recently had some time to myself (a rarity nowadays!) as I was doing a few transcon flights, so I picked up the new book on Theranos (&lt;a href="https://books.google.com/books/about/Bad_Blood.html?id=CcJFDwAAQBAJ" target="_blank"&gt;Bad Blood: Secrets and Lies in a Silicon Valley Startup&lt;/a&gt;). I just finished the book - it’s a great read with a lot of interesting, painful lessons.&lt;/p&gt;
&lt;p&gt;Silicon Valley&amp;rsquo;s VC “Cult of Personality” venerates the unstoppable, delusional young founder that builds the next Facebook when all the data shows us that - generally speaking - entrepreneurial success comes from knowledge, skills, and experience. Repeated studies&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;/data&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; show that the average age of a successful startup founder is closer to 40&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; than 20.&lt;/p&gt;</description></item><item><title>A Modest Proposal How to Replace Semver</title><link>https://mattrogish.com/blog/2015/01/01/a-modest-proposal-how-to-replace-semver/</link><pubDate>Thu, 01 Jan 2015 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2015/01/01/a-modest-proposal-how-to-replace-semver/</guid><description>&lt;p&gt;I was browsing the Twitterscape and saw this tweet:&lt;/p&gt;










&lt;figure&gt;
 &lt;blockquote cite="https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e"&gt;
 &lt;p&gt;Ultimately, SemVer is a false promise that appeals to many developers — the promise of pain-free, don&amp;rsquo;t-have-to-think-about-it, updates to dependencies. But it simply isn&amp;rsquo;t true.&lt;/p&gt;

 &lt;/blockquote&gt;
 
 &lt;figcaption class="blockquote-caption mt-2 text-sm text-gray-600 dark:text-gray-400"&gt;
 &lt;span class="italic"&gt;**jashkenas**, Why Semantic Versioning Isn't&lt;/span&gt;
 &lt;span class="mx-1"&gt;-&lt;/span&gt;
 &lt;a class="underline decoration-dotted hover:decoration-solid break-all" href="https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e" rel="noopener noreferrer"&gt;https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e&lt;/a&gt;
 &lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;p&gt;Mercifully I&amp;rsquo;ve been able to ignore Semver for a long time, but all this bru-ha-ha
got me thinking about how we solved it in a previous open-source project (years ago).&lt;/p&gt;</description></item><item><title>How to Make Remote Teams Work</title><link>https://mattrogish.com/blog/2014/05/01/how-to-make-remote-teams-work/</link><pubDate>Thu, 01 May 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/05/01/how-to-make-remote-teams-work/</guid><description>&lt;h2 id="274-years"&gt;274 years&lt;/h2&gt;
&lt;p&gt;The population of Manhattan is roughly 1.5 million people. On the weekend. On a weekday,
the population &lt;em&gt;doubles&lt;/em&gt; to 3 million people. Almost two million people commute from outside
the city. Each work day.&lt;/p&gt;
&lt;p&gt;Their commute time is, on average, &lt;a href="http://www.nydailynews.com/new-york/new-yorkers-havelongest-commute-times-article-1.1426047" target="_blank"&gt;48 minutes&lt;/a&gt; &lt;em&gt;each way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For 1.5 million people, who spend 96 minutes a day commuting, that&amp;rsquo;s 144,000,000 total minutes. 2,400,000 hours. 100,000 days. 274 years.&lt;/p&gt;
&lt;h2 id="274-years-spent-commuting-tofrom-manhattan-each-work-day"&gt;274 years spent commuting to/from Manhattan each work day&lt;/h2&gt;
&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/remote/metro.jpg" alt="Metro."&gt;
 &lt;figcaption&gt;Metro.&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>How to Interview Programmers Part 2</title><link>https://mattrogish.com/blog/2014/02/18/how-to-interview-programmers-part-2/</link><pubDate>Tue, 18 Feb 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/02/18/how-to-interview-programmers-part-2/</guid><description>&lt;style&gt;
 #callout {
 background: #F9F9F9;
 padding: 1.5em 1.25em;
 border-radius: 3px;
 display: flex;
 flex-direction: row;
 margin-bottom: 20px;
 }
 #callout-inner {
 margin-left: 1em;
 }
 @media (max-width: 767px) {
 #callout {
 padding: 1.5em 0.75em 1.5em 0.6em;
 }
 #callout-inner {
 margin-left: 0.5em;
 }
 }
 &lt;/style&gt;
 &lt;div id="callout" style=""&gt;
 &lt;div&gt;🚩&lt;/div&gt;
 &lt;div id="callout-inner"&gt;
 This was written before AI changed everything.
 &lt;/div&gt;
 &lt;/div&gt;
&lt;p&gt;In a previous post, I outlined a general strategy to &lt;a href="https://mattrogish.com/blog/2013/06/26/how-to-interview-programmers/"&gt;interview programmers&lt;/a&gt;.
Today, I&amp;rsquo;ll be more specific, including examples and rationales, on how to hire
Ruby/Rails developers.&lt;/p&gt;</description></item><item><title>Automatically Maintaining and Improving Code Quality</title><link>https://mattrogish.com/blog/2014/02/06/automatically-maintaining-and-improving-code-quality/</link><pubDate>Thu, 06 Feb 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/02/06/automatically-maintaining-and-improving-code-quality/</guid><description>&lt;p&gt;New software projects start the same way: clean, well-tested, and fresh in
everyone&amp;rsquo;s minds. Over time, however, the knowledge fades as little-visited
parts of the code aren&amp;rsquo;t touched, folks move to other projects, and new developers
come on board. Test coverage drops. &lt;a href="http://www.youtube.com/watch?v=JmzuRXLzqKk" target="_blank"&gt;Mass hysteria&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Without automated, enforced quality and test coverage metrics, entropy wins and you get stuck in a vicious cycle.&lt;/p&gt;
&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/slop_feedback_loop.jpg" alt="Slop feedback loop."&gt;
 &lt;figcaption&gt;Slop feedback loop.&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;We have some tools in our arsenal to help prevent code rust: we can institute
code reviews, we can pair program, or folks can &amp;ldquo;lunch-n-learn&amp;rdquo; to demo code.
All these are well and good, but require &lt;em&gt;active&lt;/em&gt; effort to maintain quality.
What if there were automated methods to help ensure code quality that didn&amp;rsquo;t
require manual intervention?&lt;/p&gt;</description></item><item><title>30 Years of Mac</title><link>https://mattrogish.com/blog/2014/01/26/30-years-of-mac/</link><pubDate>Sun, 26 Jan 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/01/26/30-years-of-mac/</guid><description>&lt;p&gt;&lt;a href="http://www.apple.com/30-years/" target="_blank"&gt;30 years ago&lt;/a&gt;, Steve Jobs and Apple &lt;a href="http://www.youtube.com/watch?v=2B-XwPjn9YY" target="_blank"&gt;unveiled the Macintosh&lt;/a&gt;.
Most people have seen that video, but I bet most haven&amp;rsquo;t seen the one he filmed eight
years later, demoing the latest version of his new operating system, NeXTSTEP3.0.&lt;/p&gt;
&lt;p&gt;Fascinating to see the Mac heritage in NeXTSTEP carry through the acquisition and transformation into OS X.
It&amp;rsquo;s hard to remember, but in 1992 Microsoft had just released Windows 3.1 - NeXT was light-years ahead of Microsoft.&lt;/p&gt;</description></item><item><title>Remember Your Target Audience</title><link>https://mattrogish.com/blog/2014/01/24/remember-your-target-audience/</link><pubDate>Fri, 24 Jan 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/01/24/remember-your-target-audience/</guid><description>&lt;p&gt;In the software business, most folks work in an office. Maybe a quiet, private
one, or one of the dastardly &lt;a href="https://mattrogish.com/blog/2012/03/17/open-plan-offices-must-die/"&gt;open plan&lt;/a&gt; ones.
But not usually, say, a sports arena. Or in a moving vehicle.&lt;/p&gt;
&lt;p&gt;Sometimes, this fact is lost on the people making the software. They design buttons
that are washed out when the surveyor on a phone or tablet views it outside in the sun. Or they use too
many external libraries in the HTML and end up swamping users who are on high-latency
connections.&lt;/p&gt;</description></item><item><title>How Winners Win: John Boyd and the Four Qualities of Victorious Organizations</title><link>https://mattrogish.com/blog/2014/01/19/how-winners-win-john-boyd-and-the-four-qualities-of-victorious-organizations/</link><pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/01/19/how-winners-win-john-boyd-and-the-four-qualities-of-victorious-organizations/</guid><description>&lt;p&gt;&lt;a href="http://jasonlefkowitz.net/2013/03/how-winners-win-john-boyd-and-the-four-qualities-of-victorious-organizations/" target="_blank"&gt;How winners win: John Boyd and the four qualities of victorious organizations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve read &amp;ldquo;Boyd: The Fighter Pilot Who Changed the Art of War&amp;rdquo; and it has changed how I look at problems. Finding my own &lt;a href="http://en.wikipedia.org/wiki/OODA_loop" target="_blank"&gt;OODA loop&lt;/a&gt; has been instrumental at improving my success in my work. His four qualities might help improve yours.&lt;/p&gt;</description></item><item><title>Is This What Its Supposed to Feel Like</title><link>https://mattrogish.com/blog/2014/01/19/is-this-what-its-supposed-to-feel-like/</link><pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/01/19/is-this-what-its-supposed-to-feel-like/</guid><description>&lt;p&gt;&lt;a href="https://web.archive.org/web/20140623074515/http://blog.42floors.com/is-this-what-its-supposed-to-feel-like/" target="_blank"&gt;Is this what it&amp;rsquo;s supposed to feel like?&lt;/a&gt;&lt;/p&gt;










&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;I just got an email from an engineering prospect who has decided to turn down our offer. We put so much time and effort and passion into recruiting him. He decided he wants to go off and start his own company right now.&lt;/p&gt;

 &lt;/blockquote&gt;
 
&lt;/figure&gt;&lt;p&gt;I think more and more startup CEOs (and hiring managers) are figuring this out. At least, I&amp;rsquo;m telling every one I meet - for technical talent, you are not competing against the other startups in your neighborhood. Or even ones doing the same thing. Or startups in general. You&amp;rsquo;re competing against the awesome developer doing their own thing.&lt;/p&gt;</description></item><item><title>The Death of Expertise</title><link>https://mattrogish.com/blog/2014/01/19/the-death-of-expertise/</link><pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2014/01/19/the-death-of-expertise/</guid><description>&lt;p&gt;&lt;a href="http://thefederalist.com/2014/01/17/the-death-of-expertise/" target="_blank"&gt;The Death of Expertise&lt;/a&gt;&lt;/p&gt;










&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;Having equal rights does not mean having equal talents, equal abilities, or equal knowledge. It assuredly does not mean that “everyone’s opinion about anything is as good as anyone else’s.” And yet, this is now enshrined as the credo of a fair number of people despite being obvious nonsense.&lt;/p&gt;

 &lt;/blockquote&gt;
 
&lt;/figure&gt;&lt;p&gt;&lt;a href="https://twitter.com/TheWarRoom_Tom" target="_blank"&gt;Tom Nichols&lt;/a&gt; makes a point that we in technology have
known / identified for a long time. As the cost of knowledge transfer approaches zero,
everyone thinks they know everything and can make expert level decisions. “I know about
JSON and I heard Google uses MapReduce, let’s use MongoDB!”&lt;/p&gt;</description></item><item><title>How to Interview Programmers</title><link>https://mattrogish.com/blog/2013/06/26/how-to-interview-programmers/</link><pubDate>Wed, 26 Jun 2013 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2013/06/26/how-to-interview-programmers/</guid><description>&lt;style&gt;
 #callout {
 background: #F9F9F9;
 padding: 1.5em 1.25em;
 border-radius: 3px;
 display: flex;
 flex-direction: row;
 margin-bottom: 20px;
 }
 #callout-inner {
 margin-left: 1em;
 }
 @media (max-width: 767px) {
 #callout {
 padding: 1.5em 0.75em 1.5em 0.6em;
 }
 #callout-inner {
 margin-left: 0.5em;
 }
 }
 &lt;/style&gt;
 &lt;div id="callout" style=""&gt;
 &lt;div&gt;🚩&lt;/div&gt;
 &lt;div id="callout-inner"&gt;
 This was written before AI changed everything.
 &lt;/div&gt;
 &lt;/div&gt;
&lt;p&gt;&lt;em&gt;I&amp;rsquo;ve posted a follow up with more specifics on &lt;a href="https://mattrogish.com/blog/2014/02/18/how-to-interview-programmers-part-2/"&gt;&amp;ldquo;How to Interview Programmers Part 2&amp;rdquo;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Google has finally come clean that they figured out what many of us have been
repeating for years: &lt;a href="http://www.nytimes.com/2013/06/20/business/in-head-hunting-big-data-may-not-be-such-a-big-deal.html?_r=0" target="_blank"&gt;brain teasers in interviews don&amp;rsquo;t lead to measurably better employee outcomes.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>I Judge a Company by Its Bathrooms</title><link>https://mattrogish.com/blog/2012/12/12/i-judge-a-company-by-its-bathrooms/</link><pubDate>Wed, 12 Dec 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/12/12/i-judge-a-company-by-its-bathrooms/</guid><description>&lt;p&gt;I travel quite a bit. As such, I have a membership to my preferred airline&amp;rsquo;s lounge.
It provides a nice quiet space away from the blaring security announcements
and inane airport CNN. The airline has recently spent a lot of money renovating
the lounge network to give it a &amp;ldquo;fresh&amp;rdquo; look-and-feel. I think it looks sort of
tacky, but the one thing they got right happened in the bathrooms.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They&amp;rsquo;re noisy. That is to say, there&amp;rsquo;s an exhaust fan that is just the right
amount of white noise.&lt;/li&gt;
&lt;li&gt;The urinals have an appropriately sized divider between them&lt;/li&gt;
&lt;li&gt;The stalls are actually little rooms. Floor to ceiling walls, a door that closes.&lt;/li&gt;
&lt;li&gt;The sinks are fashionable, have towels, and hand lotion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s really quite nice. So, why do most employee bathrooms look like a prison?&lt;/p&gt;</description></item><item><title>Don't Build Big Software: A Small Software Manifesto</title><link>https://mattrogish.com/blog/2012/09/14/dont-build-big-software-a-small-software-manifesto/</link><pubDate>Fri, 14 Sep 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/09/14/dont-build-big-software-a-small-software-manifesto/</guid><description>&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;Facts do not cease to exist because they are ignored.&lt;/p&gt;

 &lt;/blockquote&gt;
 
 &lt;figcaption class="blockquote-caption mt-2 text-sm text-gray-600 dark:text-gray-400"&gt;
 &lt;span class="italic"&gt;Aldous Huxley, "Proper Studies", 1927&lt;/span&gt;
 
 
 &lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;p&gt;In my last post, I discussed why &lt;a href="https://mattrogish.com/blog/2012/08/16/software-effort-estimation-considered-harmful/"&gt;software effort estimation was harmful&lt;/a&gt;.
I mentioned that you can&amp;rsquo;t add up all the individual tasks to get a completion
date at some arbitrary point in the future, and you can&amp;rsquo;t (with some caveats)
use estimation to &amp;ldquo;staff up&amp;rdquo; a project from the beginning.&lt;/p&gt;
&lt;p&gt;Where does this leave us? Should we not estimate at all? These folks think so:&lt;/p&gt;</description></item><item><title>Software Effort Estimation Considered Harmful</title><link>https://mattrogish.com/blog/2012/08/16/software-effort-estimation-considered-harmful/</link><pubDate>Thu, 16 Aug 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/08/16/software-effort-estimation-considered-harmful/</guid><description>&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/estimation/dal73.png" alt="Dal73."&gt;
 &lt;figcaption&gt;Dal73.&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Delta Air Lines tells me it will take two hours and twenty-five minutes
to fly from New York City to Atlanta, GA. American says two thirty. United?
Two thirty-four. Yet, the captain just told me it was &amp;ldquo;one-hour forty-five&amp;rdquo; minutes
&amp;ldquo;wheels-up to wheels-down&amp;rdquo;. What gives?&lt;/p&gt;
&lt;p&gt;It turns out that the US Department of Transportation (US DOT) rates the airlines
by &amp;ldquo;on-time performance&amp;rdquo;: whether or not the aircraft reaches the gate by the quoted
time. So, like any rational actors, the airlines pad the flight time to account
for ground delays (waiting by the gate for the tug driver to appear),
re-routes due to bad weather, etc. - but also to goose the ratings.&lt;/p&gt;</description></item><item><title>Vagrant a Repeatable Dev Project Setup</title><link>https://mattrogish.com/blog/2012/05/17/vagrant-a-repeatable-dev-project-setup/</link><pubDate>Thu, 17 May 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/05/17/vagrant-a-repeatable-dev-project-setup/</guid><description>&lt;p&gt;A few weeks ago I &lt;a href="https://mattrogish.com/blog/2012/05/03/on-repeatable-dev-project-setup/"&gt;wrote a post&lt;/a&gt;
lamenting the lack of standardized project bootstrapping. Several of the commenters
suggested &lt;a href="http://vagrantup.com/" target="_blank"&gt;Vagrant&lt;/a&gt;, so I have spent the last week or so
giving it a try.&lt;/p&gt;
&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/challenge_accepted.jpg" alt="Challenge accepted."&gt;
 &lt;figcaption&gt;Challenge accepted.&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Here is what&amp;rsquo;s awesome about Vagrant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses Chef or Puppet to add packages to a base VM&lt;/li&gt;
&lt;li&gt;Easily maintain and rebuild VMs&lt;/li&gt;
&lt;li&gt;Pretty straightforward install process on OS X, Linux, and Windows&lt;/li&gt;
&lt;li&gt;Mounts your source project internally so you can work on your code in the VM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s what I don&amp;rsquo;t like about Vagrant:&lt;/p&gt;</description></item><item><title>On Repeatable Dev Project Setup</title><link>https://mattrogish.com/blog/2012/05/03/on-repeatable-dev-project-setup/</link><pubDate>Thu, 03 May 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/05/03/on-repeatable-dev-project-setup/</guid><description>&lt;p&gt;Last night I had the following exchange on Twitter:&lt;/p&gt;
&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/devsetup/devsetuptwitter.png" alt="Devsetuptwitter."&gt;
 &lt;figcaption&gt;Devsetuptwitter.&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Having just jumped on board to a newish Django project here at &lt;a href="http://fundinggates.com" target="_blank"&gt;work&lt;/a&gt;,
I feel their pain. Although I don&amp;rsquo;t know the Django ecosystem as well as Rails,
I do know that projects should contain a readme, and I shouldn&amp;rsquo;t have to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;execute server runner&lt;/li&gt;
&lt;li&gt;install missing lib or package that it complained about&lt;/li&gt;
&lt;li&gt;goto: 1 until working&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every development project, no matter how complex,
should have a repeatable, predictable (preferably scripted) new developer
project bootstrap.&lt;/p&gt;</description></item><item><title>Working Too Much Is Stupid</title><link>https://mattrogish.com/blog/2012/04/17/working-too-much-is-stupid/</link><pubDate>Tue, 17 Apr 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/04/17/working-too-much-is-stupid/</guid><description>&lt;p&gt;There is a big brouhaha because Facebook COO Sheryl Sandberg
&amp;ldquo;admits &amp;hellip; walk[ing] out of this office every day at 5:30&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Oh, the &lt;a href="http://news.ycombinator.com/item?id=3852190" target="_blank"&gt;shock and horror&lt;/a&gt;. &lt;a href="http://news.ycombinator.com/item?id=3848760" target="_blank"&gt;The wailing and gnashing of teeth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why is this news? Why do folks think that working gobs and gobs of hours, as
software developers, leads to better software, faster?&lt;/p&gt;
&lt;p&gt;Sure, for something repetitive and methodological like bricklaying, you can
crank up the hours worked dial and see the wall getting built faster. And,
sure, there&amp;rsquo;ll be small bugs here and there (sloppiness as the worker gets
tired, etc.) but generally nothing that will materially affect the structural
integrity of the wall.&lt;/p&gt;</description></item><item><title>Expense Reports Are Bullshit</title><link>https://mattrogish.com/blog/2012/04/16/expense-reports-are-bullshit/</link><pubDate>Mon, 16 Apr 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/04/16/expense-reports-are-bullshit/</guid><description>&lt;h1 id="or-every-developer-gets-an-amex"&gt;Or: Every Developer Gets an Amex&lt;/h1&gt;
&lt;p&gt;How often does this happen where you work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Developer begs, pleads with boss to go to technical conference&lt;/li&gt;
&lt;li&gt;Boss negotiates with developer on getting a cheaper hotel. (It&amp;rsquo;s only $69 a night! Clean sheets optional. 30 minute bus ride from conference. What a steal!)&lt;/li&gt;
&lt;li&gt;Boss orders developer to get cheaper, three stop flight instead of more expensive non-stop&lt;/li&gt;
&lt;li&gt;Developer attends conference&lt;/li&gt;
&lt;li&gt;Developer returns from conference with a pile of low value receipts ($20 for lunch, $40 for cab to airport)&lt;/li&gt;
&lt;li&gt;Developer spends two hours painstakingly scanning each receipt and constructs a spreadsheet with itemized list of charges&lt;/li&gt;
&lt;li&gt;Boss approves charges without even looking at them&lt;/li&gt;
&lt;li&gt;goto 1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How brain-dead is this? Here you have a highly-paid software developer doing super-low value data entry. It probably cost you $200 to have them enter all this junk.&lt;/p&gt;</description></item><item><title>Open Plan Offices Must Die</title><link>https://mattrogish.com/blog/2012/03/17/open-plan-offices-must-die/</link><pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate><guid>https://mattrogish.com/blog/2012/03/17/open-plan-offices-must-die/</guid><description>&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;There are a million ways to lose a work day, but not even a single way to get one back.&lt;/p&gt;

 &lt;/blockquote&gt;
 
 &lt;figcaption class="blockquote-caption mt-2 text-sm text-gray-600 dark:text-gray-400"&gt;
 &lt;span class="italic"&gt;&lt;b&gt;DeMarco &amp;amp; Lister&lt;/b&gt;, Peopleware&lt;/span&gt;
 
 
 &lt;/figcaption&gt;
 
&lt;/figure&gt;









&lt;figure&gt;
 &lt;blockquote &gt;
 &lt;p&gt;How does a large software project get to be one year late? Answer: One day at a time!&lt;/p&gt;

 &lt;/blockquote&gt;
 
 &lt;figcaption class="blockquote-caption mt-2 text-sm text-gray-600 dark:text-gray-400"&gt;
 &lt;span class="italic"&gt;&lt;b&gt;Brooks&lt;/b&gt;, The Mythical Man-Month&lt;/span&gt;
 
 
 &lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;p&gt;
 &lt;figure&gt;
 &lt;img src="https://mattrogish.com/images/office_space/applestore.jpg" alt="Apple Store Upper West Side"&gt;
 &lt;figcaption&gt;Apple Store Upper West Side&lt;/figcaption&gt;
 &lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s trendy right now to produce office space that looks like an Apple store. Bright,
airy, cheerful, lots of open space, big ceilings, blonde wood, attractive and friendly
employees. I can&amp;rsquo;t blame the urge - I love seeing the latest architectural masterpieces
the geniuses at Apple routinely cook up. Living in New York I have the opportunity
of being a short hop away from no less than five of them.&lt;/p&gt;</description></item><item><title>About</title><link>https://mattrogish.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattrogish.com/about/</guid><description/></item><item><title>AI-Powered Integrations &amp; Automation</title><link>https://mattrogish.com/ai_agentic_automation_engineering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattrogish.com/ai_agentic_automation_engineering/</guid><description/></item><item><title>Contact</title><link>https://mattrogish.com/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattrogish.com/contact/</guid><description/></item><item><title>Strategic CTO Advisory Services</title><link>https://mattrogish.com/strategic_cto_advisory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattrogish.com/strategic_cto_advisory/</guid><description/></item><item><title>Track Record</title><link>https://mattrogish.com/track_record/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattrogish.com/track_record/</guid><description/></item></channel></rss>