<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Onboarding on Gruion</title><link>https://www.gruion.com/blog/tags/onboarding/</link><description>Recent content in Onboarding on Gruion</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 11 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.gruion.com/blog/tags/onboarding/index.xml" rel="self" type="application/rss+xml"/><item><title>Developer Onboarding: From 3 Days to 3 Hours</title><link>https://www.gruion.com/blog/post/5/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><dc:creator>Gruion</dc:creator><guid>https://www.gruion.com/blog/post/5/</guid><description>New hires shouldn't spend their first week fighting their dev environment. &lt;br />Here's how to fix developer onboarding once and for all.</description><content:encoded><![CDATA[<h2 id="the-onboarding-tax">The Onboarding Tax</h2>
<hr>
<p>It&rsquo;s Monday morning. Your new senior developer just started. They&rsquo;re excited, motivated, ready to contribute.</p>
<p>By Wednesday, they&rsquo;re frustrated. They still can&rsquo;t run the app locally.</p>
<p><strong>The onboarding doc is 47 pages long</strong>. Half of it is outdated. The database setup fails with a cryptic error. Someone mentions &ldquo;oh yeah, you also need to install this other thing&rdquo; that isn&rsquo;t documented.</p>
<p>Sound familiar? This is the <strong>onboarding tax</strong> — and it costs more than you think.</p>
<h2 id="the-real-cost-of-bad-onboarding">The Real Cost of Bad Onboarding</h2>
<hr>
<p>Let&rsquo;s do the math for a senior developer earning €80,000/year:</p>
<ul>
<li><strong>3 days</strong> of onboarding = €1,000 in salary</li>
<li><strong>Plus</strong> the senior developer helping them = another €500</li>
<li><strong>Plus</strong> the frustration and bad first impression = priceless</li>
</ul>
<p>Now multiply by every new hire. And every time someone switches teams. And every time someone returns from vacation and forgets how things work.</p>
<p><strong>A startup hiring 10 developers per year loses €15,000+ just on dev environment setup.</strong></p>
<p>But the real cost is harder to measure: <strong>the signal it sends about your engineering culture</strong>.</p>
<h2 id="why-onboarding-is-broken">Why Onboarding Is Broken</h2>
<hr>
<p>Most dev environment issues come from the same root causes:</p>
<h3 id="1-works-on-my-machine-dependencies">1. &ldquo;Works on My Machine&rdquo; Dependencies</h3>
<ul>
<li>Different Node versions</li>
<li>Different Python versions</li>
<li>Missing system libraries</li>
<li>Conflicting database versions</li>
<li>That one developer on Windows</li>
</ul>
<h3 id="2-tribal-knowledge">2. Tribal Knowledge</h3>
<ul>
<li>&ldquo;Oh, you need to run this script first&rdquo;</li>
<li>&ldquo;Ask John, he knows how to set up the VPN&rdquo;</li>
<li>&ldquo;The README is outdated, ignore step 3&rdquo;</li>
<li>&ldquo;You need access to this secret Notion page&rdquo;</li>
</ul>
<h3 id="3-accumulated-cruft">3. Accumulated Cruft</h3>
<ul>
<li>Services added but never documented</li>
<li>Environment variables that nobody remembers</li>
<li>That one script from 2019 that still needs to run</li>
</ul>
<h2 id="the-solution-containerized-dev-environments">The Solution: Containerized Dev Environments</h2>
<hr>
<p>The fix is simpler than you think: <strong>make the dev environment reproducible and automatic</strong>.</p>
<h3 id="docker-compose-for-local-development">Docker Compose for Local Development</h3>
<p>Instead of documenting how to install PostgreSQL, Redis, and Elasticsearch:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># docker-compose.yml</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">postgres</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">postgres:15</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">POSTGRES_DB</span>: <span style="color:#ae81ff">myapp</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">POSTGRES_PASSWORD</span>: <span style="color:#ae81ff">localdev</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;5432:5432&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">redis</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">redis:7</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;6379:6379&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">app</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">build</span>: <span style="color:#ae81ff">.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">postgres</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">redis</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;3000:3000&#34;</span>
</span></span></code></pre></div><p>Now setup is: <code>docker compose up</code>. That&rsquo;s it.</p>
<h3 id="dev-containers-for-full-isolation">Dev Containers for Full Isolation</h3>
<p>Dev Containers go further: <strong>the entire development environment runs in a container</strong>, including your editor extensions and tools.</p>
<p>VS Code and other IDEs support this natively. Your <code>.devcontainer/devcontainer.json</code> defines everything:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;MyApp Dev&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;dockerComposeFile&#34;</span>: <span style="color:#e6db74">&#34;docker-compose.yml&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;service&#34;</span>: <span style="color:#e6db74">&#34;app&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;workspaceFolder&#34;</span>: <span style="color:#e6db74">&#34;/app&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;customizations&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;vscode&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;extensions&#34;</span>: [
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;dbaeumer.vscode-eslint&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;esbenp.prettier-vscode&#34;</span>
</span></span><span style="display:flex;"><span>      ]
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>New developer? They clone the repo, open in VS Code, click &ldquo;Reopen in Container&rdquo;, and <strong>everything just works</strong>.</p>
<h2 id="the-ideal-onboarding-flow">The Ideal Onboarding Flow</h2>
<hr>
<p>Here&rsquo;s what onboarding should look like:</p>
<table>
	<thead>
			<tr>
					<th>Step</th>
					<th>Time</th>
					<th>What Happens</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>5 min</td>
					<td>Clone the repo</td>
			</tr>
			<tr>
					<td>2</td>
					<td>10 min</td>
					<td>Open in VS Code, click &ldquo;Reopen in Container&rdquo;</td>
			</tr>
			<tr>
					<td>3</td>
					<td>15 min</td>
					<td>Wait for container to build (first time only)</td>
			</tr>
			<tr>
					<td>4</td>
					<td>5 min</td>
					<td>Run <code>npm start</code> or equivalent</td>
			</tr>
			<tr>
					<td>5</td>
					<td>Done</td>
					<td>App is running locally</td>
			</tr>
	</tbody>
</table>
<p><strong>Total time: under 1 hour.</strong> No documentation reading. No &ldquo;ask John&rdquo;. No mystery errors.</p>
<h2 id="what-you-need-to-build-this">What You Need to Build This</h2>
<hr>
<p>To get from 3-day onboarding to 3-hour onboarding, you need:</p>
<h3 id="1-containerized-services">1. Containerized Services</h3>
<p>All dependencies (databases, caches, queues) run in Docker. No local installation required.</p>
<h3 id="2-seed-data-automation">2. Seed Data Automation</h3>
<p>One command to populate the database with realistic test data:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>make seed
</span></span><span style="display:flex;"><span><span style="color:#75715e"># or</span>
</span></span><span style="display:flex;"><span>npm run db:seed
</span></span></code></pre></div><h3 id="3-environment-variable-management">3. Environment Variable Management</h3>
<p>A <code>.env.example</code> file with sensible defaults. Or better: <strong>secrets automatically injected</strong> for development.</p>
<h3 id="4-documentation-that-cant-rot">4. Documentation That Can&rsquo;t Rot</h3>
<p>The best documentation is code. If setup requires running commands, put them in a Makefile or script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>make setup   <span style="color:#75715e"># Does everything</span>
</span></span><span style="display:flex;"><span>make test    <span style="color:#75715e"># Runs tests</span>
</span></span><span style="display:flex;"><span>make start   <span style="color:#75715e"># Starts the app</span>
</span></span></code></pre></div><h3 id="5-ci-that-validates-setup">5. CI That Validates Setup</h3>
<p>Your CI pipeline should <strong>test that the dev environment works</strong>. If someone breaks the setup, the build fails.</p>
<h2 id="the-investment">The Investment</h2>
<hr>
<p>Building this takes time upfront:</p>
<ul>
<li><strong>2-3 days</strong> to create Docker Compose setup</li>
<li><strong>1-2 days</strong> to add dev container support</li>
<li><strong>1 day</strong> to automate seed data</li>
<li><strong>1 day</strong> to clean up documentation</li>
</ul>
<p><strong>Total: about 1 week of work.</strong></p>
<p>For a team that will hire 10+ developers over the next year, this pays for itself almost immediately.</p>
<h2 id="get-help-setting-it-up">Get Help Setting It Up</h2>
<hr>
<p>Don&rsquo;t have time to build this yourself? Don&rsquo;t want to learn Docker Compose intricacies?</p>
<p>We offer a dedicated <strong>Developer Environment Setup</strong> service:</p>
<ul>
<li>Docker Compose configuration for all services</li>
<li>Dev container setup for VS Code</li>
<li>Seed data automation</li>
<li>Documentation cleanup</li>
<li>CI validation</li>
</ul>
<p><strong>Result: new developers productive in hours, not days.</strong></p>
<p><a href="https://www.gruion.com/#contact">Book a free infrastructure audit</a> and we&rsquo;ll assess your current onboarding process — and show you exactly how to fix it.</p>
]]></content:encoded><enclosure url="https://www.gruion.com/blog/post/5/images/picture.png" type="image/jpeg" length="0"/><media:content url="https://www.gruion.com/blog/post/5/images/picture.png" medium="image" type="image/jpeg"/><media:thumbnail url="https://www.gruion.com/blog/post/5/images/picture.png"/></item></channel></rss>