<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Engineering Manager · Jared Lynskey</title>
    <link>https://jared.lynskey.co.nz/en/tags/engineering-manager/</link>
    <description>Short stories of value on software engineering and engineering leadership — performance reviews, hiring and scaling teams, CI/CD, DevOps monitoring and agentic AI. Written from Seoul.</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© 2026 Jared Lynskey</copyright>
    <lastBuildDate>Sat, 07 Nov 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/en/tags/engineering-manager/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Working as a Software Engineer in Korea: Half the Job Is Nunchi</title>
      <link>https://jared.lynskey.co.nz/en/posts/2026/2026-10-22-software-engineer-in-korea/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2026/2026-10-22-software-engineer-in-korea/</guid>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +1300</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>korea</category>
      <category>Seoul</category>
      <category>career</category>
      <category>Nunchi</category>
      <category>communication</category>
      <category>culture</category>
      <category>Engineering Manager</category>
      <category>Hiring</category>
      <category>leadership</category>
      <category>startups</category>
      <category>Freelance</category>
      <category>new zealand</category>
      <description>Working as a software engineer in Korea, from a New Zealander in Seoul since 2019: the engineering travels, but half the job is 눈치 (nunchi), reading what the room wants without anyone saying it. What it is, why &#39;optics&#39; is the wrong word, where it shows up on a dev team, what changed when I became the manager being read, and what I&#39;d tell anyone considering the move.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve worked in software in Korea since 2019: a research company, two startups, twenty months as an engineering manager, and freelance since October 2025. The engineering travels; a web backend doesn&rsquo;t care which country it&rsquo;s deployed from. What nobody tells you is that the other half of the job is 눈치 (nunchi), the Korean word for reading what a room wants without anyone having to say it. Nobody tells you because saying it out loud would rather defeat the point.</p>
<p>I&rsquo;m a New Zealander based in Seoul. This is what it has looked like from the inside, from both sides of the hiring table, and what I&rsquo;d tell anyone thinking about the move.</p>

<h2 class="relative group">How I got here
    <div id="how-i-got-here" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-i-got-here" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>My route in was a master&rsquo;s in computer science at Kyung Hee University, from March 2017 to February 2019, after a BSc at Waikato and a year in network operations at a telco back home. Every semester our lab went to KSC and KCC, two domestic computing conferences. At KSC 2018 in PyeongChang the sponsors included several of Korea&rsquo;s biggest tech companies, and there were recruitment booths for anyone job hunting, which is worth knowing if you&rsquo;re a grad student here.</p>
<p>Since then:</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">When</th>
					<th style="text-align: left">Role</th>
					<th style="text-align: left">Where</th>
					<th style="text-align: left">The work</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">Jun 2019 – Jun 2020</td>
					<td style="text-align: left">Research Assistant Manager</td>
					<td style="text-align: left">A computer-vision research company</td>
					<td style="text-align: left">Training data generated inside game engines, and a UI for renewable energy monitoring</td>
			</tr>
			<tr>
					<td style="text-align: left">Jun 2020 – Sep 2022</td>
					<td style="text-align: left">Full-stack developer</td>
					<td style="text-align: left">A customer-support SaaS startup</td>
					<td style="text-align: left">The support platform itself, plus its cloud infrastructure and the CI/CD</td>
			</tr>
			<tr>
					<td style="text-align: left">Sep 2022 – Feb 2024</td>
					<td style="text-align: left">Full-stack developer, acting lead</td>
					<td style="text-align: left">A creator-platform startup</td>
					<td style="text-align: left">A platform for content creators and a community app, with backends in Python, Rust and Java</td>
			</tr>
			<tr>
					<td style="text-align: left">Feb 2024 – Oct 2025</td>
					<td style="text-align: left">Engineering manager</td>
					<td style="text-align: left">A Seoul software company</td>
					<td style="text-align: left">A team of engineers, and delivery from scoping through to release</td>
			</tr>
			<tr>
					<td style="text-align: left">Oct 2025 – now</td>
					<td style="text-align: left">DevOps / MLOps engineer</td>
					<td style="text-align: left">Freelance</td>
					<td style="text-align: left">On-premise infrastructure: high-availability PostgreSQL and LLM serving</td>
			</tr>
	</tbody>
</table>
<p>The engineering was the familiar half. The support startup is where I learned how much of shipping software is actually operations, and the creator platform&rsquo;s backend ran on more stacks than I&rsquo;d choose today. The local differences sit at the edges. Naver is a search engine you have to care about: when I launched a new website for Kiwi Alumni, I did its SEO for Google and Naver both. Korean platforms crawl under names you won&rsquo;t guess (Naver&rsquo;s crawler is Yeti, and Kakao&rsquo;s link previews come from one called kakaotalk-scrap). And Korean online banking still wants its own security software installed on your computer.</p>
<p>None of that is the hard part, though.</p>

<h2 class="relative group">What 눈치 is, and why &ldquo;optics&rdquo; isn&rsquo;t it
    <div id="what-눈치-is-and-why-optics-isnt-it" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-%eb%88%88%ec%b9%98-is-and-why-optics-isnt-it" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>눈치 is the sense for what other people think, want or expect, picked up from the situation rather than from anything they&rsquo;ve said. 눈 means &ldquo;eye&rdquo;, and Euny Hong, whose 2019 book <em>The Power of Nunchi</em> is the best-known English introduction, translates the whole word as &ldquo;eye-measure&rdquo;. It turns up in a few everyday phrases. Someone who is 눈치가 빠르다 is quick to read a room. Someone who is 눈치가 없다 can&rsquo;t read one at all, and it isn&rsquo;t a compliment. And 눈치를 보다 is keeping an eye on how others are reacting, usually someone senior, and adjusting to stay on the right side of it.</p>
<p>The English word people reach for is &ldquo;optics&rdquo;, and it&rsquo;s the wrong one. Optics is how something looks from outside, whatever it actually is: &ldquo;the optics of announcing bonuses in the same week as the layoffs&rdquo;. It&rsquo;s about appearances, and it&rsquo;s managed by whoever is being looked at. 눈치 mostly points the other way. It&rsquo;s about how well you see other people, not how you look to them. The two only meet in 눈치를 보다, where you watch everyone else in order to manage how you look to them, and that&rsquo;s the version that turns up in articles about Korean offices.</p>
<p>The examples in those articles are much the same each time: not leaving before your team lead does, the 눈치 people feel about actually taking their annual leave (연차), knowing when you&rsquo;re allowed to go home from a 회식 (a team dinner), and deciding whether to contradict a senior in the meeting or quietly afterwards. Whatever you make of them, they share a shape. Each is a rule that everyone follows and nobody states.</p>
<p>It&rsquo;s a separate problem from the language, too. Korean is in the words. 눈치 is in everything around them.</p>

<h2 class="relative group">Where it shows up on a dev team
    <div id="where-it-shows-up-on-a-dev-team" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#where-it-shows-up-on-a-dev-team" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>That shape is what dev teams run on. A few months into my first management job I wrote <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-05-05-team-norms/" >a post about team norms</a> that began with this: most of the friction I dealt with wasn&rsquo;t technical. It was people running on different unspoken assumptions about how fast a code review should come back, what &ldquo;done&rdquo; actually means, and whether it&rsquo;s rude to ping someone twice. I didn&rsquo;t use the word then, but that list is what 눈치 reads, every line of it. Each one is a rule a team agrees on without saying, and a newcomer can only pick it up by watching.</p>
<p>In the same post I grumbled about new hires learning the norms &ldquo;as folklore instead of hearing them explicitly during onboarding&rdquo;, and about global teams assuming their baseline is everyone&rsquo;s. Folklore is the best English word I&rsquo;ve found for what 눈치 runs on. When you&rsquo;re the foreigner on the team, yours is the baseline that&rsquo;s off, and the folklore isn&rsquo;t written down anywhere you could read it.</p>
<p>The standup is where it costs the most. In 2023 I wrote about <a href="https://jared.lynskey.co.nz/en/posts/2023/2023-09-23-reactive-vs-proactive-communication/" >a project I was leading that fell behind</a> while I waited for someone to ask about it. Someone finally did, three weeks later, and by then it was a disaster. Good 눈치 doesn&rsquo;t fix that. Reading the room tells you what nobody wants to hear; it doesn&rsquo;t tell you to say it anyway. The habit I took away is the opposite of waiting. Say it first, in writing, before anyone asks: &ldquo;This is taking longer than I thought. Now looking at 8–10 days instead of 5. Want me to cut scope or push the deadline?&rdquo;</p>

<h2 class="relative group">When you&rsquo;re the one being read
    <div id="when-youre-the-one-being-read" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#when-youre-the-one-being-read" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>In February 2024 I started managing an engineering team at a Seoul software company, and 눈치 turned round. As a developer I&rsquo;d been the one reading the room. As the manager, I was the room. What I said in a meeting, what I didn&rsquo;t, how quickly I replied and what time I went home were all things other people could now read.</p>
<p>A lot of what I&rsquo;d written as a project lead applies with more force once you&rsquo;re the manager. If people don&rsquo;t feel safe telling you what&rsquo;s broken, <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-01-02-engineeringmanager/" >you&rsquo;ll be the last person to find out</a>. <a href="https://jared.lynskey.co.nz/en/posts/2023/2023-09-25-transperency/" >Sit on information too long</a> and people can sense it, and the rumour mill fills whatever silence you leave. <a href="https://jared.lynskey.co.nz/en/posts/2023/2023-10-13-i-dont-know/" >&ldquo;I don&rsquo;t know&rdquo; feels like failure</a> when five people in a meeting are waiting on your answer, which is exactly why it&rsquo;s worth saying. And the line I keep coming back to: people can&rsquo;t read your intent, only your words. In a team that runs on 눈치 they&rsquo;ll try anyway, from your face, from what you skip and from when you leave, which is a good reason to give them less to guess.</p>
<p>What I leaned on was unglamorous. One-on-ones with everyone, kept about the person rather than the sprint, with the plain question that does most of the work: &ldquo;Is there anything you need from me or the team to help with your tasks?&rdquo;</p>
<p>A short list of team norms, three to five of them, written where everyone could see them, including what happens when the manager breaks one. Going to ask the people who will never speak up in a room of eight, instead of waiting for them to. And an honest &ldquo;no, and here&rsquo;s why&rdquo; in place of a &ldquo;we&rsquo;ll see&rdquo; that never comes up again, because a vague answer is just one more thing to read the room for. A month in, <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-03-03-product-team-outing/" >the product team&rsquo;s outing</a> started at a café with a workshop on each other&rsquo;s values and team norms, which is about as direct an answer to 눈치 as a company can give: a morning spent saying out loud the things that usually go unsaid.</p>

<h2 class="relative group">Being hired as a foreigner
    <div id="being-hired-as-a-foreigner" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#being-hired-as-a-foreigner" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>I don&rsquo;t have a recruiting playbook for Korea. What I have is the hiring manager&rsquo;s side of it, and the advice that falls out of that is 눈치 pointed at the employer before you sign.</p>
<p>When I was hiring as a manager, the developers I most wanted were never on the job boards, and founders, <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-07-01-internships/" >as I&rsquo;ve written before</a>, would much rather hire someone they&rsquo;ve already worked with. So the best way in is anything that lets people see you work first. An internship at a small company has a habit of quietly turning into a job offer. A hackathon gives you a whole weekend of it: in 2023 I was on a team of four that won the Seoul Tech Impact Hackathon, hosted by Lunit Global, with an app for finding street food vendors, who in Korea don&rsquo;t have addresses.</p>
<p>Then there&rsquo;s the <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/" >coffee chat</a>. I wrote that how someone behaves in a relaxed conversation tells you more about working with them than a rehearsed interview ever will, and that it runs both ways. For a candidate it&rsquo;s the one chance to read a team before you&rsquo;re inside it. The questions I&rsquo;d ask from the candidate&rsquo;s chair: what&rsquo;s the biggest challenge the team is facing right now, why did you join and what&rsquo;s kept you here, and what&rsquo;s something about working here that might surprise me. That last one is a polite way of asking for the 눈치 up front. Evasive answers about turnover or direction tell you plenty on their own.</p>

<h2 class="relative group">If you&rsquo;re hiring a foreign developer
    <div id="if-youre-hiring-a-foreign-developer" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#if-youre-hiring-a-foreign-developer" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>If you run a team in Korea and you&rsquo;re hiring a developer from somewhere else, the most useful thing you can do is the phrase from that norms post: make the implicit explicit. Don&rsquo;t leave them to learn your rules as folklore. Tell them in the first week how fast reviews are expected back, what &ldquo;done&rdquo; means, whether a second ping is rude, what time people actually go home, and whether taking leave involves anything beyond the form. The last two are the classic 눈치 questions, the ones nobody inside the team thinks to say.</p>
<p>After that it&rsquo;s the boring habits that leave less to read. Tell people before they ask; a Friday email to stakeholders with three bullets (what shipped, what&rsquo;s next, anything you&rsquo;re worried about) takes ten minutes. Ask the quiet ones directly rather than waiting for them in the meeting. Give real answers, &ldquo;no&rdquo; included, with the reason attached. And interview every candidate with the same questions against the same rubric. That one took me a while to learn, but it&rsquo;s the only fair way to compare people; otherwise you end up favouring whoever you spoke to most recently. It also means the candidate who doesn&rsquo;t know your team&rsquo;s unspoken rules gets asked exactly what the one who does gets asked.</p>

<h2 class="relative group">The New Zealand community here
    <div id="the-new-zealand-community-here" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-new-zealand-community-here" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>In 2018, while I was still a student, I took the photos at a Kiwi Chamber leadership breakfast, and wrote afterwards that I really enjoy volunteering for events that promote the relationship between the two countries. Since January 2020 I&rsquo;ve chaired Kiwi Alumni, a community for New Zealanders in Korea and for people who studied in New Zealand and now live and work here. It&rsquo;s a volunteer role, and mostly people work: organising events and building relationships with the New Zealand Embassy and education institutions, plus unglamorous jobs like a new logo and a website members can actually find things on. In 2023 we ran <a href="https://jared.lynskey.co.nz/en/posts/2023/2023-09-22-kiwi-alumni-my-role/" >Kiwi Alumni Night</a> with the Embassy, and it ended up on KTV.</p>
<p>What I wrote after that night is the nearest thing this post has to a thesis. People who&rsquo;ve lived in both Korea and New Zealand understand how to bridge the differences, because they&rsquo;ve experienced both cultures. If you&rsquo;re coming here to work, find those people, wherever you&rsquo;re from. They&rsquo;re the ones who&rsquo;ll tell you in plain words what the room was saying.</p>

<h2 class="relative group">Freelancing from Seoul
    <div id="freelancing-from-seoul" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#freelancing-from-seoul" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>I went freelance in October 2025, after leaving the manager&rsquo;s job. In practice that&rsquo;s contract DevOps and MLOps work, mostly on-premise: a high-availability PostgreSQL cluster, then serving infrastructure for LLMs on the same hardware. More of it has turned out to be quality control than plumbing, watching traces and multi-turn conversations to find where model output drifts. Since February 2026 I&rsquo;ve also been building a marketplace and community app of my own, on the side.</p>
<p>Freelancing doesn&rsquo;t get you out of 눈치; it changes what you read. The first thing I look at anywhere I land is the monitoring, because it tells you more about a team than the README does. That&rsquo;s 눈치 for systems: reading what a team actually does rather than what it says it does.</p>

<h2 class="relative group">What I&rsquo;d tell someone considering it
    <div id="what-id-tell-someone-considering-it" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-id-tell-someone-considering-it" aria-label="Anchor">#</a>
    </span>
    
</h2>
<ol>
<li>Come in through a door where people see you work before they hire you. Mine was a master&rsquo;s. A hackathon, an internship at a small company or your own country&rsquo;s community here do the same job, and the community is where you&rsquo;ll find the people who&rsquo;ve lived on both sides.</li>
<li>Don&rsquo;t rule out small companies; most of my career has been at them. At a ten-person company there&rsquo;s nobody to hand the boring work to, and what you build actually goes live.</li>
<li>Read the team before you join. Use the coffee chat, ask what would surprise you about working there, and take evasive answers about turnover seriously.</li>
<li>Don&rsquo;t wait to be asked. A slipping estimate, a risky change, a decision someone else depends on: say it first, in writing.</li>
<li>Ask for the unwritten rules out loud: how fast reviews come back, what &ldquo;done&rdquo; means, whether a second ping is rude. If nobody has written them down, offer to.</li>
<li>Learn the stack around your stack. Naver and Kakao matter here in ways your Google habits won&rsquo;t cover.</li>
</ol>
<p>The engineering is the half you can prepare for before you arrive. 눈치 is the half you learn on the job, and the quickest way I know to learn it is to ask people to say the quiet part out loud, and to say yours first.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2026/2026-10-22-software-engineer-in-korea/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>What Is a Coffee Chat? How It Differs From an Interview, and What to Ask</title>
      <link>https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/</guid>
      <pubDate>Fri, 12 Jul 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Engineering Manager</category>
      <category>Team</category>
      <category>People</category>
      <category>Team Size</category>
      <category>Scaling</category>
      <category>Efficiency</category>
      <category>Talent Scouting</category>
      <category>Coffee Chat</category>
      <category>Recruitment</category>
      <category>Hiring</category>
      <category>Culture Fit</category>
      <category>Networking</category>
      <description>A coffee chat is an informal 30–45 minute conversation, over coffee or a video call, to see whether a deeper conversation makes sense. It&#39;s not an interview. Why it&#39;s become my favourite way to meet developers, how I run one, the questions worth asking, what to wear and talk about if you&#39;re the one invited, and the ways people ruin them.</description>
      <content:encoded><![CDATA[<p>The developers I most want to hire are never on the job boards. They&rsquo;re heads-down building something, reasonably content where they are, and rightly suspicious of recruiter messages. Since moving into engineering management this year, the tool I&rsquo;ve come to rely on for meeting them is embarrassingly simple: a coffee.</p>
<p>A coffee chat is 30–45 minutes, informal, at a café or over a video call. No whiteboard, no panel, no trick questions. I talk about what we&rsquo;re building and why, they talk about what they&rsquo;re working on and what they&rsquo;d want next, and both of us leave knowing whether a deeper conversation makes sense. Hiring is a matching problem more than a selection problem, and this is the fastest way I know to trade the information that matching actually needs.</p>

<h4 class="relative group">Why I bother
    <div id="why-i-bother" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-i-bother" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>I&rsquo;ve stopped thinking of these chats as recruiting. They&rsquo;re just conversations, and every so often one turns into a hire — sometimes eighteen months later, when the person&rsquo;s circumstances change. The pipelines that reliably produce good hires are built out of relationships like that, not out of job ads.</p>
<p>They also fix the job-description problem. JDs are generic by necessity. Over coffee, a candidate can ask the questions that actually matter to them: what does success look like in the first six months, who would I be working with, what&rsquo;s the hairiest technical problem on the team right now. People who hear honest answers to those questions self-select well.</p>
<p>And a chat shows your culture instead of describing it. Whether you turn up prepared, curious, and respectful of someone&rsquo;s time says more than any careers page. It runs both ways, too — how someone behaves in a relaxed conversation tells you more about working with them than a rehearsed interview ever will.</p>
<p>The moments where a coffee chat earns its keep: approaching someone who isn&rsquo;t looking, warming up a referral before anything formal, and talking with someone weighing a career shift — IC to management, startup to enterprise, or the reverse. In a tight talent market, that covers most of the people you want.</p>

<h4 class="relative group">How I run one
    <div id="how-i-run-one" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-i-run-one" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>The first message decides everything. Generic outreach gets deleted. Do your homework and be honest about your intentions:</p>
<p><em>&ldquo;Hi Sarah, I noticed your talk on distributed systems at QCon and your blog posts on event sourcing. We&rsquo;re tackling similar challenges at [Company] as we scale our payment infrastructure. Would you be open to a 30-minute coffee chat? No interview agenda—just curious to hear your perspective and share what we&rsquo;re working on.&rdquo;</em></p>
<p>That works because it&rsquo;s specific, upfront, and offers something (a conversation about interesting problems) rather than only asking for time. Then make it easy: offer a few time options, pick a spot convenient for them or a video tool that doesn&rsquo;t need a download, and send a proper calendar invite so nobody&rsquo;s guessing.</p>
<p>The chat itself only needs a loose shape. A few minutes of real small talk and why you reached out. Then their story — current work, what they enjoy, what frustrates them, what they&rsquo;d want in the next thing — where your job is mostly to listen. Then yours: the mission, the team&rsquo;s actual challenges, hard parts included, because candidates respect transparency and can smell a sales pitch. The most valuable stretch is the open one near the end: what would need to be true for them to consider a move? Close with explicit next steps, even if the next step is just &ldquo;let&rsquo;s stay in touch&rdquo;.</p>
<p>Follow up within 24 hours with a short note that references something specific, and deliver anything you promised — an intro, a link, whatever. The boring aftermath is the real culture demo.</p>
<p>If you do this more than occasionally, keep a simple spreadsheet of who you&rsquo;ve talked to and check in every so often, even with no role open. And it needn&rsquo;t be a manager-only activity — some of the best chats happen when your engineers grab coffee with impressive people in their own networks. That&rsquo;s where good referrals come from.</p>

<h4 class="relative group">Questions that earn their slot
    <div id="questions-that-earn-their-slot" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#questions-that-earn-their-slot" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Ones I ask:</p>
<ul>
<li>&ldquo;What&rsquo;s been the most interesting problem you&rsquo;ve worked on recently?&rdquo;</li>
<li>&ldquo;What would you want to be different in your next role?&rdquo;</li>
<li>&ldquo;What&rsquo;s your learning style? How do you like to grow professionally?&rdquo;</li>
<li>&ldquo;What questions do you have that would help you evaluate whether this could be a fit?&rdquo;</li>
</ul>
<p>Ones I&rsquo;d ask if I were on the other side of the table:</p>
<ul>
<li>&ldquo;What&rsquo;s the biggest challenge the team is facing right now?&rdquo;</li>
<li>&ldquo;How do you measure success for this role?&rdquo;</li>
<li>&ldquo;What does the path to promotion look like?&rdquo;</li>
<li>&ldquo;Why did you join the company? What&rsquo;s kept you here?&rdquo;</li>
<li>&ldquo;What&rsquo;s something about working here that might surprise me?&rdquo;</li>
</ul>

<h4 class="relative group">If you&rsquo;re the one invited
    <div id="if-youre-the-one-invited" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#if-youre-the-one-invited" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Most people who look up what a coffee chat is are on the other side of the table from me: someone has asked them for one, and they want to know what they&rsquo;re walking into. Here&rsquo;s what I&rsquo;d tell you from the side that sends the invitations.</p>
<p>It isn&rsquo;t an interview. Nobody is scoring you and there&rsquo;s no test, so you don&rsquo;t need to prepare answers. It is still a first impression, though, so treat it like meeting a future colleague rather than a friend of a friend. The difference from an interview is that you&rsquo;re allowed to be curious, and you&rsquo;re expected to ask as much as you answer.</p>
<p>Wear what you&rsquo;d wear to work there on an ordinary day. If you don&rsquo;t know, smart casual is never wrong. On a video call, have the camera on and find a quiet room; that matters more than the shirt.</p>
<p>Preparation takes about half an hour. Read what the company makes and anything the person has written or built. Have a two-minute version of what you work on now and what you&rsquo;d want next, because that question is coming. Bring two or three of your own questions; the list above is a fair start.</p>
<p>As for what to talk about: your work, what you enjoy about it, what you&rsquo;re curious about in theirs. Leave salary for later unless they raise it. It&rsquo;s perfectly fine to ask whether there&rsquo;s a role in mind and what the process would look like if there were.</p>
<p>Whoever did the inviting usually pays. Offer, but don&rsquo;t make a thing of it. Send a short thank-you within a day that mentions something you actually talked about, and you&rsquo;ve done more than most.</p>
<p>And if you want one yourself, ask. Keep the message short, say why that person, and make it easy to say yes: &ldquo;I&rsquo;ve been following your team&rsquo;s work on the new search, and I&rsquo;m thinking about moving into platform engineering. Would you have 30 minutes for a coffee or a call in the next few weeks? Happy to work around you.&rdquo; Most people say yes to a request that specific.</p>

<h4 class="relative group">Ways to ruin it
    <div id="ways-to-ruin-it" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ways-to-ruin-it" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>The fastest is turning it into a stealth interview. Start quizzing someone on technical skills or sliding in behavioural questions and you&rsquo;ve broken the implicit deal — save that for the formal process. Over-selling is a close second: the hires that stick are the people who joined with clear eyes about the hard parts. Turning up unprepared, or going silent afterwards, does quieter damage; every chat shapes what that person tells their network about you.</p>
<p>From my side of the table, the warning signs are a candidate with no curiosity about anything, a conversation that feels purely transactional, or someone who describes every past employer with the same bitterness. Candidates should keep their own list: a rep who can&rsquo;t explain why the work matters, evasive answers about turnover or direction, and anyone more interested in selling you than understanding you.</p>
<p>Not every chat leads anywhere, and that&rsquo;s fine — most don&rsquo;t. The point is that the next time you need to fill a critical role, you&rsquo;re not starting from a blank job ad. You&rsquo;re starting from a stack of real conversations. Reach out with an invitation to coffee, not a job description.</p>

<h4 class="relative group">Further Reading
    <div id="further-reading" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#further-reading" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p><strong>Related Articles on This Site:</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-12-19-star-interviews/" >Using the STAR Method for Developer Interviews</a> - for when the chat turns into a formal interview process</li>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-02-10-prioritizing-onboarding/" >Three Things I&rsquo;m Focusing on as a New Engineering Manager</a> - what makes teams work, which is what you&rsquo;re matching for</li>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-07-01-internships/" >Why You Should Intern at a Startup</a> - useful context when chatting with someone weighing a startup move</li>
</ul>
<p><strong>External Resources:</strong></p>
<ul>
<li><a href="https://review.firstround.com/articles/hiring-engineers/"  target="_blank" rel="noreferrer">First Round Review: Hiring Engineers</a> - startup hiring guides from experienced operators</li>
<li><a href="https://larahogan.me/blog/first-one-on-one-questions/"  target="_blank" rel="noreferrer">Lara Hogan&rsquo;s &ldquo;Questions for Our First 1:1&rdquo;</a> - written for 1:1s, works brilliantly over coffee</li>
<li><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"  target="_blank" rel="noreferrer">Patrick McKenzie on Salary Negotiation</a> - worth reading to understand the candidate&rsquo;s side of the table</li>
<li><a href="https://whothebook.com/" target="_blank" rel="noreferrer">Who: The A Method for Hiring</a> - Geoff Smart and Randy Street&rsquo;s framework for systematic hiring</li>
<li><a href="https://hbr.org/topic/subject/hiring-and-recruitment"  target="_blank" rel="noreferrer">Harvard Business Review: Hiring and Recruitment</a> - research-backed pieces on talent acquisition</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Engineering Performance Reviews: How I Run Them, With a Template and Examples</title>
      <link>https://jared.lynskey.co.nz/en/posts/2024/2024-04-27-performance-reviews/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2024/2024-04-27-performance-reviews/</guid>
      <pubDate>Sat, 27 Apr 2024 00:30:03 +0000</pubDate>
      <dc:creator>Me</dc:creator>
      <category>Engineering Manager</category>
      <category>Performance Reviews</category>
      <category>KPI</category>
      <category>Feedback</category>
      <category>Software Engineering</category>
      <category>Leadership</category>
      <description>How I run performance reviews for software engineers: what each side should expect, the agenda I follow, KPIs that fit the person, a review template you can copy, self-review questions, and examples of feedback specific enough to act on.</description>
      <content:encoded><![CDATA[<p>A useful performance review for a software engineer is a two-way conversation, not a verdict. The engineer brings a self-review, the manager brings specific examples, and you both leave with two or three measurable goals you agreed to and a written record of them. Below is how I run one, the template I fill in, and what specific feedback sounds like next to the vague kind.</p>
<p>Since taking over an engineering team earlier this year, performance reviews have gone from something that happens <em>to</em> me to something I&rsquo;m responsible for running. I&rsquo;m writing this partly to organise my own thinking, so take it as notes from someone figuring it out rather than gospel.</p>

<h2 class="relative group">Why bother with reviews at all?
    <div id="why-bother-with-reviews-at-all" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-bother-with-reviews-at-all" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The purpose, at any level, comes down to two things: help people keep learning, and make sure the ones performing beyond their role actually get rewarded for it.</p>
<p>Plenty of small companies claim they don&rsquo;t have the time or resources for reviews, and quietly fall back on tenure as the only signal for who&rsquo;s ready for a senior role. That&rsquo;s a mistake, and not just because tenure is a lazy metric. Skipping reviews removes the two-way channel between employer and employee, and the working relationship suffers for it.</p>
<p>It cuts in both directions. An engineer can be working in what they honestly believe is the best way for the company while their habits, methods, or communication style drift somewhere unhelpful — without feedback, nobody catches it. And employers who never hear from their people in a structured way stay comfortably oblivious to what those people actually think of the company.</p>

<h2 class="relative group">What each side should walk in expecting
    <div id="what-each-side-should-walk-in-expecting" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-each-side-should-walk-in-expecting" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>From the employee&rsquo;s side the list isn&rsquo;t complicated. They want to know how their work lines up with the team&rsquo;s goals, what they&rsquo;re doing well, and where to improve — specifically, not &ldquo;communicate better&rdquo;. They want their contributions recognised, a real conversation about career progression and training, and a process that&rsquo;s fair and based on their work rather than office politics.</p>
<p>From my side of the table, I expect people to arrive with a self-assessment: their own view of what went well and what didn&rsquo;t. I&rsquo;m hoping for openness to feedback rather than a defence lawyer&rsquo;s opening statement, a genuine discussion about future goals, and honest insight into how they feel they fit into the team. Reviews are also when I do my own planning — team composition, potential promotions, who needs what kind of development.</p>

<h2 class="relative group">One framework won&rsquo;t fit every engineer
    <div id="one-framework-wont-fit-every-engineer" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#one-framework-wont-fit-every-engineer" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Engineering teams span different cultural backgrounds, experience levels, and specialities, and the same review script doesn&rsquo;t work for everyone. Equal treatment and fair treatment aren&rsquo;t the same thing; the approach has to flex with each person&rsquo;s needs, career stage, and contribution. The baseline is making sure every engineer&rsquo;s role and responsibilities are clearly defined and actually match their compensation.</p>
<p>The place this bites hardest is titles and pay. When someone is unsure about their title or feels ready for promotion, vague encouragement is poison. What works is concrete: agree on specific challenges or project goals that serve as the benchmark for the next rank, so advancement has objective criteria instead of vibes. Same for compensation — if someone feels underpaid or wants more responsibility, put measurable targets into their plan that spell out what needs to happen before the next review to justify the change. Then actually hold both sides to it at that review.</p>
<p>Improvement feedback needs the same treatment. A specific training programme, workshop, or project aimed at a specific gap is useful. &ldquo;Keep growing your skills&rdquo; is not.</p>

<h2 class="relative group">Benchmarks start at the first meeting
    <div id="benchmarks-start-at-the-first-meeting" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#benchmarks-start-at-the-first-meeting" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The first review meeting with a new report is mostly about setting the baseline. Walk through what the role actually involves and how it feeds team and company goals. Agree on the measurable outcomes performance will be judged against. Set goals for the near term and further out. It&rsquo;s also the right moment to talk about culture and expected behaviour, how and when feedback will arrive, what resources and mentorship are available, and what the career path from their seat looks like. None of this is thrilling, but every later review is easier because it happened.</p>

<h2 class="relative group">The agenda I use after that
    <div id="the-agenda-i-use-after-that" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-agenda-i-use-after-that" aria-label="Anchor">#</a>
    </span>
    
</h2>
<ol>
<li>Small talk. It sounds trivial, but it takes the tension out of the room, and the rest of the conversation is more honest for it.</li>
<li>Run through the agenda so nobody gets ambushed by a topic.</li>
<li>Growth since the last review — name the progress explicitly. People rarely notice their own.</li>
<li>Current performance, strengths first.</li>
<li>Areas for improvement, each with a specific, realistic target attached.</li>
<li>Career plans, and whether the current work actually points at them.</li>
<li>Targets, goals, and actionable items for the next review.</li>
</ol>

<h2 class="relative group">KPIs only work if they&rsquo;re personal
    <div id="kpis-only-work-if-theyre-personal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kpis-only-work-if-theyre-personal" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>For engineers on a product team, KPIs have to fit both the team&rsquo;s objectives and the individual. Front-end, back-end, and full-stack roles differ; junior and senior roles differ more. Commit volume might tell you something about a junior developer, and it tells you nothing about a senior engineer whose main output is architectural decisions. That&rsquo;s why KPIs get set in a conversation, not copied from a template.</p>
<p>The areas I look at:</p>
<ul>
<li>Quality of code: error rates, adherence to standards, how often their work needs bug fixes</li>
<li>Project delivery: milestones and deadlines met</li>
<li>Innovation and problem solving: efficiency improvements, hard problems actually resolved</li>
<li>Collaboration: peer reviews, contribution to team goals and discussions</li>
<li>Personal development: learning goals hit, certifications, new technologies picked up</li>
<li>Customer impact: feedback from users, engagement with the features they shipped</li>
</ul>
<p>On the measurable side, unit testing is an input I&rsquo;ve been warming to. <a href="https://www.infoq.com/articles/unit-tests-performance-review/"  target="_blank" rel="noreferrer">This article</a> from InfoQ looks at folding unit testing into performance reviews — the mechanics of it, and what it does to team culture — and argues for mixing qualitative and quantitative measures of code health. Worth a read if you&rsquo;re hunting for KPIs that don&rsquo;t reduce engineers to line counts.</p>
<p>Whatever you pick, agree on it together in the review or a 1:1, and revisit it as roles, projects, and technology shift. A KPI nobody agreed to is just a stick.</p>

<h2 class="relative group">The template I fill in
    <div id="the-template-i-fill-in" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-template-i-fill-in" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>I keep one document per person and add a section per review, so the history is in one place. This is the skeleton:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## Performance review: [Name], [period]
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Role and level:**</span> [title, and what that level means on this team]
</span></span><span class="line"><span class="cl"><span class="gs">**Goals from last review:**</span> [copied from the previous section]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Self-review (filled in by the engineer beforehand)
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> What went well, with an example or two
</span></span><span class="line"><span class="cl"><span class="k">-</span> What didn&#39;t, and what they&#39;d do differently
</span></span><span class="line"><span class="cl"><span class="k">-</span> What they want to be doing in a year
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Progress on last review&#39;s goals
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> [Goal]: met / partly / not met, with the evidence
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Strengths (specific examples)
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> [What they did, when, and what it changed]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Areas to improve (each with a target)
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> [Behaviour or skill] → [what &#34;better&#34; looks like] by [date]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Career and level
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Where they are against the next level, and what&#39;s missing
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Goals until the next review
</span></span></span><span class="line"><span class="cl"><span class="k">1.</span> [Measurable goal]
</span></span><span class="line"><span class="cl"><span class="k">2.</span> [Measurable goal]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Agreed actions
</span></span></span><span class="line"><span class="cl">- [Who] will [do what] by [when]</span></span></code></pre></div></div>
<p>The self-review comes in a day or two before the meeting, never during it. Reading it first changes the conversation: half the time the engineer has already named the thing I was going to raise, and we can spend the meeting on what to do about it.</p>

<h2 class="relative group">Questions for the self-review
    <div id="questions-for-the-self-review" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#questions-for-the-self-review" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>These are the prompts I send ahead of time. They&rsquo;re open on purpose, so the answers tell me how someone sees their own work, not just what they did:</p>
<ul>
<li>What are you most proud of since the last review, and why that?</li>
<li>Where did you get stuck, and what would have unstuck you sooner?</li>
<li>What feedback have you had from teammates or reviewers that stuck with you?</li>
<li>Which of last review&rsquo;s goals do you think you met, and which do you want to drop or change?</li>
<li>What do you want to learn next, and is your current work giving you a chance to?</li>
<li>What should I be doing differently as your manager?</li>
</ul>
<p>The last question gets the most awkward pauses and the most useful answers.</p>

<h2 class="relative group">What specific feedback sounds like
    <div id="what-specific-feedback-sounds-like" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-specific-feedback-sounds-like" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Most bad review feedback isn&rsquo;t harsh, it&rsquo;s vague. Here&rsquo;s the difference, with examples of the kind I try to write:</p>
<table>
	<thead>
			<tr>
					<th>Vague</th>
					<th>Specific</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>&ldquo;Communicate better.&rdquo;</td>
					<td>&ldquo;On the payments migration, the delay surfaced in the sprint review rather than when you found it two weeks earlier. Next time, flag a slip in the team channel the day you see it.&rdquo;</td>
			</tr>
			<tr>
					<td>&ldquo;Great job this quarter.&rdquo;</td>
					<td>&ldquo;Your write-up of the caching options let us decide in one meeting instead of three. Keep doing those for anything that takes more than a day to choose.&rdquo;</td>
			</tr>
			<tr>
					<td>&ldquo;Be more senior.&rdquo;</td>
					<td>&ldquo;At the next level, I&rsquo;d expect you to own a feature&rsquo;s design end to end. Lead the design review for the search rework and bring two options with the trade-offs.&rdquo;</td>
			</tr>
			<tr>
					<td>&ldquo;Code quality needs work.&rdquo;</td>
					<td>&ldquo;Three of your last ten PRs needed a follow-up fix for missing edge cases. Add tests for the failure paths before asking for review, and we&rsquo;ll look at the rate again next quarter.&rdquo;</td>
			</tr>
	</tbody>
</table>
<p>Each specific version names an event, says what it changed, and points at something the person can do next. It takes longer to write, which is exactly why I make myself collect examples through the quarter instead of trying to remember them the night before.</p>

<h2 class="relative group">Write it down
    <div id="write-it-down" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#write-it-down" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>After the meeting, write a summary: the key points discussed, any issues raised, the action items, and the objectives both of you agreed to. It sounds bureaucratic, but the written record is what prevents the &ldquo;that&rsquo;s not what we agreed&rdquo; conversation six months later. Documented issues get tracked instead of evaporating, action items hand the next review its opening agenda, and people take goals more seriously once they&rsquo;re on paper.</p>
<p>That&rsquo;s the whole system, really: clear expectations from day one, KPIs shaped to the person, everything documented, and follow-up on every action item. A review that isn&rsquo;t a two-way conversation with measurable outcomes is a checkbox exercise, and engineers can smell a checkbox exercise from the calendar invite.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-04-27-performance-reviews/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Software Engineer to Engineering Manager: What Actually Changes</title>
      <link>https://jared.lynskey.co.nz/en/posts/2024/2024-01-02-engineeringmanager/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2024/2024-01-02-engineeringmanager/</guid>
      <pubDate>Tue, 02 Jan 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>engineering manager</category>
      <category>career</category>
      <category>leadership</category>
      <category>team management</category>
      <description>Going from software engineer to engineering manager is a career change, not a promotion. How the two jobs differ day to day, the skills that matter, and how to prepare for the move before the title arrives.</description>
      <content:encoded><![CDATA[<p><strong>It&rsquo;s a career change, not a promotion</strong></p>
<p>I&rsquo;m about to make this move myself, so I&rsquo;ve spent the last while talking to people who&rsquo;ve done it and reading whatever I could find. The clearest lesson so far: going from engineer to engineering manager isn&rsquo;t a step up. It&rsquo;s a step sideways into a completely different job. Your output stops being code and becomes whatever your team produces. Everyone says this, and from what I can tell, everyone still underestimates it.</p>
<p><strong>What actually changes</strong></p>
<p>You stop solving technical problems directly and start solving people problems. The calendar fills up with 1:1s, planning meetings, and cross-team alignment. Hiring and performance reviews land on your desk. Most of the job becomes making sure the team has what it needs — context, clear priorities, and as little nonsense as possible — to get on with the work.</p>
<p>The awkward part is that you still have to stay technical enough to hold your own in architecture discussions and make sensible judgment calls, while accepting that you can&rsquo;t be the one writing the code anymore. The managers I&rsquo;ve watched try to do both usually end up doing both badly.</p>
<p><strong>Engineer vs engineering manager, side by side</strong></p>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Software engineer</th>
					<th>Engineering manager</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Your output</td>
					<td>Code, designs, reviews</td>
					<td>What the team ships, and the team itself</td>
			</tr>
			<tr>
					<td>Judged on</td>
					<td>The quality and impact of your own work</td>
					<td>Delivery, retention, and how much people grow</td>
			</tr>
			<tr>
					<td>A typical day</td>
					<td>Focus time, pull requests, design discussions</td>
					<td>1:1s, planning, hiring, unblocking people</td>
			</tr>
			<tr>
					<td>Feedback loop</td>
					<td>Hours or days: the tests pass, the feature ships</td>
					<td>Months: a hire works out, someone gets promoted</td>
			</tr>
			<tr>
					<td>Hands-on technical work</td>
					<td>Most of the week</td>
					<td>Reviews and architecture calls, rarely the critical path</td>
			</tr>
	</tbody>
</table>
<p>The feedback loop is the row people warn about most. As an engineer you get a small win most days. As a manager the wins are real but slow, and you have to get used to not knowing for a while whether a decision was right.</p>
<p><strong>The skills that seem to matter</strong></p>
<p>Communication is most of it. You become the translator between your team, product, and leadership, and a surprising amount of the job is making sure those three groups are talking about the same thing. Trust matters more than any process: if people don&rsquo;t feel safe telling you what&rsquo;s broken, you&rsquo;ll be the last person to find out. Your calendar will genuinely try to eat you alive, so protecting time to think — and time for your team — is a constant fight. And you need to understand what the business is actually trying to do, or you can&rsquo;t point anyone in a useful direction.</p>
<p><strong>Preparing before the title arrives</strong></p>
<p>The advice I keep hearing, and the bit I can already vouch for: start leading before anyone gives you the title. Run a project, mentor someone, organise something. I&rsquo;ve spent the past year acting as a project lead, and that experience is doing far more for me than any book. That said, books help — &ldquo;<a href="https://www.oreilly.com/library/view/the-managers-path/9781491973882/" target="_blank" rel="noreferrer">The Manager&rsquo;s Path</a>&rdquo; by Camille Fournier is the one everybody recommends, and having read it, I see why. Keep your technical skills sharp, because the architecture debates don&rsquo;t stop. And find a mentor who&rsquo;s already made the transition; they&rsquo;ll steer you around mistakes that only look obvious in hindsight.</p>
<p><strong>The trade-off</strong></p>
<p>More influence over how things get built, but you&rsquo;ll rarely build them yourself. I expect some days that will feel great, and other days I&rsquo;ll badly miss writing code. Everyone who&rsquo;s done this tells me that&rsquo;s normal. Ask me again in six months.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-01-02-engineeringmanager/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Why Good Managers Say &#34;I Don&#39;t Know&#34; (and How to Say It Well)</title>
      <link>https://jared.lynskey.co.nz/en/posts/2023/2023-10-13-i-dont-know/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2023/2023-10-13-i-dont-know/</guid>
      <pubDate>Fri, 13 Oct 2023 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Engineering Manager</category>
      <category>Leadership</category>
      <category>Communication</category>
      <category>Management</category>
      <description>Why saying &#34;I don&#39;t know&#34; at work builds trust instead of costing it, how to say it without sounding unprepared, phrases you can actually use, and why it isn&#39;t rude when a next step follows.</description>
      <content:encoded><![CDATA[<p>The managers I&rsquo;ve rated most highly over the years all shared one habit: when they didn&rsquo;t know something, they just said so. No bluffing, no vague hand-waving. &ldquo;I don&rsquo;t know — let&rsquo;s find out.&rdquo;</p>
<p>I&rsquo;ve been thinking about this a lot lately because I&rsquo;ve been leading projects myself, and the temptation to bluff is real. When someone asks you a question in a meeting and five people are waiting on the answer, &ldquo;I don&rsquo;t know&rdquo; feels like failure. It isn&rsquo;t. Most of the time it&rsquo;s the strongest thing you can say, as long as you follow it with what happens next: who you&rsquo;ll ask, or when you&rsquo;ll come back with the answer.</p>

<h3 class="relative group">Bluffing gets found out
    <div id="bluffing-gets-found-out" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#bluffing-gets-found-out" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Software moves too fast for anyone to hold it all in their head, and engineers can smell a bluff from across the room. The first time your team catches you pretending to know something, they quietly downgrade everything else you say. Whereas a manager who admits a gap and then goes and closes it earns the opposite: people trust their actual answers, because they know a real answer when they hear one.</p>

<h3 class="relative group">It&rsquo;s a starting point, not an answer
    <div id="its-a-starting-point-not-an-answer" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#its-a-starting-point-not-an-answer" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>The trick is what comes after. &ldquo;I don&rsquo;t know&rdquo; followed by nothing is just shrugging. What good managers do next is ask better questions — &ldquo;how does this compare to what we&rsquo;re using now?&rdquo;, &ldquo;what breaks if we&rsquo;re wrong about this?&rdquo; — and then point those questions at the right people. Every team has someone who practically lives in the database, someone who knows all the ugly frontend edge cases. You don&rsquo;t need to know everything; you need to know who does, and to actually ask them.</p>

<h3 class="relative group">How to say &ldquo;I don&rsquo;t know&rdquo; at work without sounding unprepared
    <div id="how-to-say-i-dont-know-at-work-without-sounding-unprepared" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-to-say-i-dont-know-at-work-without-sounding-unprepared" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>The rule I try to follow: &ldquo;I don&rsquo;t know&rdquo; is never the end of the sentence. A few versions that work out loud:</p>
<ul>
<li>&ldquo;I don&rsquo;t know yet. I&rsquo;ll find out and get back to you by Thursday.&rdquo;</li>
<li>&ldquo;Not sure, but Sam built that service. Let&rsquo;s ask them.&rdquo;</li>
<li>&ldquo;My best guess is X, but I&rsquo;d want to check Y before we commit to it.&rdquo;</li>
<li>&ldquo;I don&rsquo;t have that number to hand. I&rsquo;ll post it in the channel after this meeting.&rdquo;</li>
<li>&ldquo;I haven&rsquo;t looked into that properly, so I&rsquo;d rather not guess. Give me until tomorrow.&rdquo;</li>
</ul>
<p>Is it rude? Not when there&rsquo;s a next step attached. What people find rude, or at least frustrating, is a shrug that leaves them no further along, or a confident answer that turns out to be made up. Job interviews work the same way: if you don&rsquo;t know, say so, then talk through how you&rsquo;d find out. That tells the interviewer more than a guess would.</p>

<h3 class="relative group">Decisions come out better
    <div id="decisions-come-out-better" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#decisions-come-out-better" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Decisions in software tend to stick around, so it&rsquo;s worth being honest about which parts you&rsquo;re sure of and which parts you&rsquo;re guessing. Admitting the gaps up front means you gather what&rsquo;s missing before deciding instead of after, and it gives people who disagree with you room to say so — which is exactly when you most need to hear it. Once you&rsquo;ve decided, explain the why. And if it turns out you were wrong, say that too. Nothing kills a team&rsquo;s honesty faster than a manager who can&rsquo;t admit a bad call.</p>
<p>None of this is complicated. Ask questions, listen to the people who know more than you (there are always people who know more than you), and be upfront when you&rsquo;re guessing. &ldquo;I don&rsquo;t know, but let&rsquo;s find out&rdquo; has done more for my credibility than any answer I&rsquo;ve ever bluffed my way through.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-10-13-i-dont-know/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Git Graph in the Terminal and VS Code: Track Progress Without Micromanaging</title>
      <link>https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/</guid>
      <pubDate>Fri, 02 Jun 2023 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Git</category>
      <category>Git Graph</category>
      <category>VS Code</category>
      <category>Project Management</category>
      <category>Engineering Manager</category>
      <description>How to see a git graph: the git log --graph command and an alias for it, comparing two branches, and the graph views in VS Code. Then how I use it to follow progress without micromanaging.</description>
      <content:encoded><![CDATA[<p>The quickest way to see a git graph is in the terminal: <code>git log --graph --oneline --all --decorate</code> draws every branch as lines of text, one commit per line, with branch and tag names next to the commits they point at. In VS Code you can use the Source Control Graph that&rsquo;s built into the Source Control view, or install the Git Graph extension for a bigger, clickable version. Both are covered in more detail at the end of this post.</p>
<p>Nobody enjoys being asked &ldquo;how&rsquo;s it going?&rdquo; — and as the one leading a project at work, I still need to know how it&rsquo;s going. My compromise is the git graph: I look at it before I ask anyone anything, and most of the time it already has the answer. It shows commit activity, branching and merging at a glance, and nobody has to sit in a meeting for it.</p>

<h3 class="relative group">What the graph actually tells you
    <div id="what-the-graph-actually-tells-you" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-the-graph-actually-tells-you" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRqoAAABXRUJQVlA4IJ4AAAAQBgCdASogABgAPw1yrE0mIyIhKAqoxiGJ5QC3uywCxQFpuHEPXSkTd6B0z2RWZa4T7Y8RfsruOsAA/vd8+2CpyheBOdEz3RjVNYlC9RtFoqjOvb/UUWB572vAmnOtzv/AnG5mtp9GYAzXQce5Jk69dXACVLuYiXixGTwngnNtwm/gJSEGWEDi7N2CT1vDSW68w98W/Qmb3QPw7xAAAA==')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Git Graphs"
    width="2560"
    height="1920"
    src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp 800w, https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_b6056380eece4a86.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_1c52b3c34db54258.webp"></span></figure>
</p>
<p>If you haven&rsquo;t looked at one closely: every node is a commit, every divergent path is a branch, and the whole thing reads as a timeline of the project. That layout carries a surprising amount of information:</p>
<ul>
<li>A glance shows how many branches are active and how often commits are landing.</li>
<li>A branch that suddenly goes quiet, or one that hasn&rsquo;t merged for weeks, usually means someone is stuck. That&rsquo;s an early warning worth having.</li>
<li>Merge frequency tells you how the team collaborates. Frequent merges mean work is actually being integrated; long-lived branches usually mean someone has drifted off into siloed work.</li>
</ul>

<h3 class="relative group">Fewer interruptions, better conversations
    <div id="fewer-interruptions-better-conversations" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#fewer-interruptions-better-conversations" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>The obvious win is that I don&rsquo;t have to interrupt anyone to know where things stand. The bigger win is what happens when a conversation <em>is</em> needed: it starts from the graph rather than from assumptions. &ldquo;This branch hasn&rsquo;t moved since Tuesday — anything blocking you?&rdquo; is a much better opener than &ldquo;any updates?&rdquo;</p>
<p>It also helps to make the routine explicit. Mine is a quick glance most mornings and a proper look once a week. The team knows that&rsquo;s the rhythm, so nobody gets surprised.</p>

<h3 class="relative group">Don&rsquo;t turn it into surveillance
    <div id="dont-turn-it-into-surveillance" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dont-turn-it-into-surveillance" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>This is the part I have to keep reminding myself of. Commit count is not value — one thoughtful commit can beat fifty noisy ones. Seeing every commit doesn&rsquo;t entitle you to question every decision; trust the team and step in only when a pattern genuinely looks like trouble. And when you do bring the graph into a conversation, it&rsquo;s a starting point for feedback, not evidence for a prosecution.</p>

<h3 class="relative group">Viewing the graph in the terminal
    <div id="viewing-the-graph-in-the-terminal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#viewing-the-graph-in-the-terminal" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Nothing to install, just Git:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git log --graph --oneline --all --decorate</span></span></code></pre></div></div>
<p>What each flag does:</p>
<ul>
<li><code>--graph</code> draws the branch and merge lines down the left-hand side.</li>
<li><code>--oneline</code> puts each commit on one line: its short hash and the first line of its message.</li>
<li><code>--all</code> shows every branch and tag, remote ones included, instead of only the branch you&rsquo;re on.</li>
<li><code>--decorate</code> prints branch and tag names next to the commits they point at. Recent versions of Git already do this when the output goes to a terminal, but the flag keeps them when you pipe the output somewhere else.</li>
</ul>
<p>Nobody wants to type that every morning, so make it an alias:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global alias.graph <span class="s2">&#34;log --graph --oneline --all --decorate&#34;</span>
</span></span><span class="line"><span class="cl">git graph</span></span></code></pre></div></div>
<p>On a long-lived repo the full graph scrolls forever. A few ways to cut it down:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git graph --since<span class="o">=</span><span class="s2">&#34;2 weeks ago&#34;</span>    <span class="c1"># only the last two weeks</span>
</span></span><span class="line"><span class="cl">git graph -20                      <span class="c1"># only the last 20 commits</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline main..feature                <span class="c1"># on feature, not yet in main</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline --left-right main...feature  <span class="c1"># both sides, marked &lt; and &gt;</span></span></span></code></pre></div></div>
<p>The last two compare two branches, and they use plain <code>git log</code> rather than the alias because <code>--all</code> would pull every other branch back in. Two dots shows what <code>feature</code> has that <code>main</code> doesn&rsquo;t. Three dots with <code>--left-right</code> shows what each side has that the other doesn&rsquo;t, which is a quick way to see how far a long-lived branch has drifted.</p>

<h3 class="relative group">Viewing the graph in VS Code
    <div id="viewing-the-graph-in-vs-code" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#viewing-the-graph-in-vs-code" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>VS Code has a graph built in. Open the Source Control view (Ctrl+Shift+G) and the Source Control Graph is one of the sections in that panel; it has been there since version 1.93 (August 2024). By default it follows the current branch and its remote, and the branch picker in the graph&rsquo;s title bar adds others. For a quick look, that&rsquo;s all you need.</p>
<p>For every branch at once, install the Git Graph extension by mhutchie (search for &ldquo;Git Graph&rdquo; in the Extensions view). Open it from the Git Graph item in the status bar, the Git Graph icon at the top of the Source Control view, or the Command Palette with <em>Git Graph: View Git Graph (git log)</em>. Click a commit to see the files it changed, or click one commit and Ctrl/Cmd-click another to compare the two. It hasn&rsquo;t had a release since 2021, which is one more reason the built-in graph is worth knowing about.</p>
<p>If the Git Graph button doesn&rsquo;t appear, the extension probably hasn&rsquo;t found a repository. By default it only checks the folders you opened, not their subfolders, so open the repository&rsquo;s own folder or raise <code>git-graph.maxDepthOfRepoSearch</code> in the settings.</p>

<h3 class="relative group">Other tools
    <div id="other-tools" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#other-tools" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Most Git tools draw a graph somewhere. <code>gitk --all</code> is Git&rsquo;s own history browser. GitHub, GitLab and Bitbucket each have a &ldquo;network&rdquo; or &ldquo;graph&rdquo; view on the repository page. And the desktop clients, SourceTree (free, from Atlassian), GitKraken, Tower and TortoiseGit on Windows, all have one too.</p>
<p>Whichever you pick, the goal is the same: understand the progress, don&rsquo;t count the commits.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
