<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Ishan Yash · writing</title>
  <link>https://ishanyash.com/writing/</link>
  <atom:link href="https://ishanyash.com/rss.xml" rel="self" type="application/rss+xml"/>
  <description>AI and analytics engineer in the UK. I turn messy data into things people trust, write about the work, and coach people in AI and data through the UK job market.</description>
  <language>en-gb</language>
  <lastBuildDate>Sun, 01 Nov 2026 21:24:49 GMT</lastBuildDate>
  <item>
    <title>Dry-run your dbt models before you pay for them</title>
    <link>https://ishanyash.com/writing/dry-run-dbt-models-before-you-pay/</link>
    <guid isPermaLink="true">https://ishanyash.com/writing/dry-run-dbt-models-before-you-pay/</guid>
    <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
    <description>BigQuery will tell you what a query costs before it runs. Here is how to put that number in the pull request, using a small open-source tool I wrote</description>
    <category>data-engineering</category><category>dbt</category><category>bigquery</category><category>tools</category>
    <content:encoded><![CDATA[<p>On BigQuery&#39;s on-demand pricing you pay per byte scanned. A dbt model that reads a whole table where it used to read a filtered slice costs more every time it runs, and nothing in the usual review loop shows that. The SQL compiles. The tests pass. The CI is green. The bill arrives a month later.</p>
<p>BigQuery already knows the answer. Every query can be submitted as a dry run, which returns the bytes it would process without executing it, at no charge. The gap is that dry runs live in the console or the API, not in the pull request where the decision is made.</p>
<h2 id="putting-the-number-in-the-review"><a class="heading-anchor" href="#putting-the-number-in-the-review" aria-label="Link to this section">Putting the number in the review</a></h2>
<p><a href="https://github.com/ishanyash/dbt-cost" rel="noopener noreferrer" target="_blank">dbt-cost</a> is a small Python CLI that closes that gap. It reads the compiled dbt manifest, resolves the models you ask for using dbt&#39;s own selector syntax, sends each model&#39;s SQL to the dry-run endpoint, and prices the result.</p>
<figure class="code" data-lang="bash"><div class="code-bar"><span>bash</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-bash">pip install dbt-cost
dbt compile
dbt-cost estimate <span class="tok-string">&quot;stg_orders+&quot;</span></code></pre></figure>
<p>That gives a table of the selected models with bytes scanned and the estimated cost at the on-demand rate (default $6.25 per TB, changeable with <code>--price</code>). <code>dbt-cost report</code> does the whole project, grouped by layer, so you can see which marts are carrying the bill.</p>
<p>The useful command is <code>diff</code>. Compile the manifest on the base branch and on the pull request, then:</p>
<figure class="code" data-lang="bash"><div class="code-bar"><span>bash</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-bash">dbt-cost diff --base-manifest base/manifest.json --pr-manifest pr/manifest.json --format markdown --threshold <span class="tok-number">10</span></code></pre></figure>
<p>It prints the models whose cost changed, with before, after and the difference, as Markdown that a GitHub Action can post as a sticky comment on the pull request. With <code>--threshold</code> it exits non-zero when the increase crosses the limit, so the check fails and the reviewer sees why. The repository has a <a href="https://github.com/ishanyash/dbt-cost/tree/main/examples" rel="noopener noreferrer" target="_blank">workflow</a> that does the two compiles and the comment end to end.</p>
<h2 id="what-it-cannot-do"><a class="heading-anchor" href="#what-it-cannot-do" aria-label="Link to this section">What it cannot do</a></h2>
<p>Dry-run mode is hard-coded. The tool cannot execute a query or read data; it needs only the BigQuery Job User role and read access to the tables the models reference, and it authenticates with Application Default Credentials by default. It is BigQuery only. And a dry run estimates bytes scanned, which is not the whole bill: slot-based pricing, storage and incremental models that scan less at run time than the compiled SQL suggests all need judgement on top.</p>
<h2 id="why-bother"><a class="heading-anchor" href="#why-bother" aria-label="Link to this section">Why bother</a></h2>
<p>Because cost is a code review question. The engineer who removed a partition filter can put it back in a minute if the number is in front of them. Finding it on the invoice is a different conversation with different people in it.</p>
<p>The pattern generalises beyond dbt and beyond BigQuery: if a system can tell you what an action will cost before you take it, wire that into the place the action is reviewed.</p>
]]></content:encoded>
  </item>
  <item>
    <title>UK data jobs, October 2026: the numbers, and what changed</title>
    <link>https://ishanyash.com/writing/uk-data-jobs-october-2026/</link>
    <guid isPermaLink="true">https://ishanyash.com/writing/uk-data-jobs-october-2026/</guid>
    <pubDate>Wed, 28 Oct 2026 00:00:00 GMT</pubDate>
    <description>Data engineer and data analyst pay and ad counts in the UK this autumn, the Graduate visa change coming in January, and the ICO&#39;s call on agentic AI</description>
    <category>uk-market</category><category>data-engineering</category><category>careers</category>
    <content:encoded><![CDATA[<p>Most data-career advice online is American. Salary numbers in dollars, visa rules that do not apply, interview formats UK companies do not use. This is the first of a monthly post that sticks to what is true here: the numbers for UK data roles, and anything that changed in the rules around them.</p>
<p>Everything below has a source. Where a number comes from one aggregator, I say so.</p>
<h2 id="data-engineer-pay-flat-ads-up"><a class="heading-anchor" href="#data-engineer-pay-flat-ads-up" aria-label="Link to this section">Data engineer: pay flat, ads up</a></h2>
<p><a href="https://www.itjobswatch.co.uk/jobs/uk/data%20engineer.do" rel="noopener noreferrer" target="_blank">IT Jobs Watch</a> tracks permanent job ads across the UK and reports a six-month window. For the six months to 27 October 2026, for permanent Data Engineer roles:</p>
<div class="table-wrap"><table><thead><tr><th></th>
<th>UK</th>
<th>London</th>
<th>UK excluding London</th>
</tr></thead><tbody><tr><td>Median advertised salary</td>
<td>£70,000</td>
<td>£80,000</td>
<td>£65,000</td>
</tr><tr><td>10th percentile</td>
<td>£45,000</td>
<td></td>
<td></td>
</tr><tr><td>90th percentile</td>
<td>£100,000</td>
<td></td>
<td></td>
</tr><tr><td>Permanent ads in the window</td>
<td>2,213</td>
<td>640</td>
<td>1,472</td>
</tr></tbody></table></div>
<p>The median has not moved. It was £70,000 in the same window in 2025 and in 2024, and the non-London median has sat at £65,000 for the same period. If you were hoping a tight market would push pay up, the ads do not show it yet.</p>
<p>What has moved is volume. The same source counted 651 Data Engineer ads in this window in 2025 and 1,028 in 2024, against 2,213 now. That is one aggregator&#39;s count, and ad counts are noisy (reposts, agencies, the same role listed in three cities), so treat the direction as real and the multiple as rough. Data Engineer ads are 1.83% of all permanent UK vacancies in the window, which for one job title is a lot.</p>
<p>Two other cuts worth knowing. The North of England had 608 ads at a median of £66,805, not far behind the South East&#39;s £65,000 on 249 ads. And 565 ads were tagged work-from-home at a £70,000 median, the same as the national figure, so remote is not trading at a discount.</p>
<h3 id="what-the-ads-ask-for"><a class="heading-anchor" href="#what-the-ads-ask-for" aria-label="Link to this section">What the ads ask for</a></h3>
<p>Share of Data Engineer ads mentioning each skill, same source and window:</p>
<div class="table-wrap"><table><thead><tr><th>Skill</th>
<th>Share of ads</th>
</tr></thead><tbody><tr><td>SQL</td>
<td>37.1%</td>
</tr><tr><td>Python</td>
<td>33.4%</td>
</tr><tr><td>Azure</td>
<td>26.5%</td>
</tr><tr><td>Data modelling</td>
<td>22.6%</td>
</tr><tr><td>ETL</td>
<td>22.6%</td>
</tr><tr><td>Data quality</td>
<td>21.1%</td>
</tr><tr><td>AI</td>
<td>19.6%</td>
</tr></tbody></table></div>
<p>SQL and Python first, as every year. Azure is the cloud that appears most; AWS next, GCP less often. One in five ads now mentions AI, which for a data engineering title is new. Read a few of those ads and it is mostly pipelines that feed models, not training them.</p>
<h2 id="data-analyst-more-ads-lower-ceiling"><a class="heading-anchor" href="#data-analyst-more-ads-lower-ceiling" aria-label="Link to this section">Data analyst: more ads, lower ceiling</a></h2>
<p>Same source, same window, permanent <a href="https://www.itjobswatch.co.uk/jobs/uk/data%20analyst.do" rel="noopener noreferrer" target="_blank">Data Analyst</a> roles:</p>
<div class="table-wrap"><table><thead><tr><th></th>
<th>UK</th>
<th>London</th>
<th>UK excluding London</th>
</tr></thead><tbody><tr><td>Median advertised salary</td>
<td>£57,500</td>
<td>£60,000</td>
<td>£55,000</td>
</tr><tr><td>10th percentile</td>
<td>£33,000</td>
<td></td>
<td></td>
</tr><tr><td>90th percentile</td>
<td>£68,750</td>
<td></td>
<td></td>
</tr><tr><td>Permanent ads in the window</td>
<td>992</td>
<td>231</td>
<td></td>
</tr></tbody></table></div>
<p>Ad count was 504 in this window last year and 631 the year before, so analyst hiring has roughly doubled by this measure. The gap to engineering is the thing to notice: a £12,500 difference at the median and a £31,000 difference at the 90th percentile. The analyst ceiling is low. Moving from analyst to analytics engineer or data engineer is where the pay step is.</p>
<p>Analyst ads ask for SQL (32.1%), Power BI (26.7%) and Python (18.5%). Power BI, not Tableau, not Looker. If you are applying for analyst roles in the UK and have never opened Power BI, that is the gap to close first.</p>
<h2 id="the-graduate-visa-shortens-in-january"><a class="heading-anchor" href="#the-graduate-visa-shortens-in-january" aria-label="Link to this section">The Graduate visa shortens in January</a></h2>
<p>If you are an international student or know one, this is the change that matters most this year.</p>
<p>From 1 January 2027 the Graduate visa, the post-study route most international graduates use to get their first UK job, drops from two years to 18 months for bachelor&#39;s and master&#39;s graduates. PhD graduates keep three years. People who apply before 31 December 2026 keep the two-year version. <a href="https://www.freeths.co.uk/insights-events/legal-articles/2026/changes-to-graduate-visas/" rel="noopener noreferrer" target="_blank">Freeths</a> has the detail; check <a href="https://www.gov.uk/graduate-visa" rel="noopener noreferrer" target="_blank">GOV.UK</a> for the current rules before you rely on any date.</p>
<p>Eighteen months is enough, but it changes the plan. The first job search cannot wait for the dissertation to be marked. And the sponsorship conversation with an employer needs to start in the first year, not the second.</p>
<p>The bigger change in the government&#39;s 2025 white paper, the proposal to raise the settlement qualifying period from five years to ten, was still at consultation stage at the last update from the <a href="https://commonslibrary.parliament.uk/research-briefings/cbp-10267/" rel="noopener noreferrer" target="_blank">House of Commons Library</a>. It is not in force. Anyone telling you otherwise is ahead of the law.</p>
<h2 id="the-ico-wants-to-hear-about-agentic-ai"><a class="heading-anchor" href="#the-ico-wants-to-hear-about-agentic-ai" aria-label="Link to this section">The ICO wants to hear about agentic AI</a></h2>
<p>On 8 October 2026 the Information Commissioner&#39;s Office opened a call for evidence on how existing UK data protection law applies to agentic AI, systems that take actions rather than only generate text (<a href="https://www.privacyworld.blog/2026/10/uk-regulator-launches-call-for-evidence-on-agentic-ai/" rel="noopener noreferrer" target="_blank">Squire Patton Boggs, 20 October</a>). No new rules yet. But if your job involves building agents that touch customer data, the questions the ICO is asking are the ones your own data protection officer will be asking next year. Worth reading the call itself.</p>
<h2 id="what-to-do-with-this"><a class="heading-anchor" href="#what-to-do-with-this" aria-label="Link to this section">What to do with this</a></h2>
<ul>
<li>Pricing yourself: the medians above are what ads say, not what people get. Use them as a floor for the conversation, and remember the London premium is about £10,000 at the median for engineers and £5,000 for analysts.</li>
<li>Choosing what to learn: SQL, Python, Azure, modelling. For analyst roles, Power BI. Everything else is secondary to the ads.</li>
<li>On a Graduate visa: if you finish in 2026, apply for the visa before the year ends. If you finish in 2027, plan for 18 months and start applying in the final term.</li>
</ul>
<p>Next month: the same numbers again, so the trend is visible, and whatever else moved.</p>
<p>Sources: <a href="https://www.itjobswatch.co.uk/jobs/uk/data%20engineer.do" rel="noopener noreferrer" target="_blank">IT Jobs Watch, Data Engineer</a> and <a href="https://www.itjobswatch.co.uk/jobs/uk/data%20analyst.do" rel="noopener noreferrer" target="_blank">Data Analyst</a>, six months to 27 October 2026; <a href="https://www.freeths.co.uk/insights-events/legal-articles/2026/changes-to-graduate-visas/" rel="noopener noreferrer" target="_blank">Freeths on Graduate visa changes</a>, 11 February 2026; <a href="https://commonslibrary.parliament.uk/research-briefings/cbp-10267/" rel="noopener noreferrer" target="_blank">House of Commons Library briefing CBP-10267</a>; <a href="https://www.privacyworld.blog/2026/10/uk-regulator-launches-call-for-evidence-on-agentic-ai/" rel="noopener noreferrer" target="_blank">Privacy World on the ICO call for evidence</a>, 20 October 2026.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Tailor a data engineering application with AI in twenty minutes</title>
    <link>https://ishanyash.com/writing/tailor-applications-with-ai-in-twenty-minutes/</link>
    <guid isPermaLink="true">https://ishanyash.com/writing/tailor-applications-with-ai-in-twenty-minutes/</guid>
    <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
    <description>A repeatable 20-minute workflow for tailoring your CV and cover note to one job ad using an AI assistant, without inventing anything</description>
    <category>careers</category><category>ai-tools</category><category>job-search</category><category>cv</category>
    <content:encoded><![CDATA[<p>Tailoring every application is the advice everyone gives and almost nobody follows, because it takes too long. An AI assistant changes that. Not by writing your CV for you, but by doing the tedious parts: pulling requirements out of an ad, spotting gaps, and suggesting rewordings you then check.</p>
<p>This post describes a workflow I use that takes around twenty minutes per application. It assumes you already have a decent master CV. If you do not, fix that first.</p>
<h2 id="the-rules-before-you-start"><a class="heading-anchor" href="#the-rules-before-you-start" aria-label="Link to this section">The rules before you start</a></h2>
<p>Set these in your head before you open the assistant. They matter more than the prompts.</p>
<ul>
<li><strong>Never fabricate.</strong> The assistant will happily invent tools, numbers and outcomes. Everything that ends up in your CV must be true and must be something you can talk about in an interview.</li>
<li><strong>Never paste personal data belonging to other people.</strong> No colleague names, no client names, no internal documents. Your own CV and a public job ad are enough.</li>
<li><strong>Keep a master CV.</strong> Tailored versions are derived from it and never replace it. Store it somewhere you will not accidentally overwrite.</li>
<li><strong>You are the editor.</strong> The assistant drafts; you decide. Every change gets read by you before it is saved.</li>
</ul>
<h2 id="minute-0-to-5-extract-the-must-haves"><a class="heading-anchor" href="#minute-0-to-5-extract-the-must-haves" aria-label="Link to this section">Minute 0 to 5: extract the must-haves</a></h2>
<p>Paste the job ad into the assistant and ask it to separate what the employer requires from what they would like. Most adverts bury the real requirements under boilerplate about culture and benefits.</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Here is a job advert for a data engineering role. Read it and give me:

1. The must-have skills and experience, as a short bullet list, in the employer&#39;s own words where possible.
2. The nice-to-haves, as a separate list.
3. The three things this employer seems to care about most, based on what they repeat or emphasise.

Do not add anything that is not in the advert. If something is ambiguous, say so.

[paste advert here]</code></pre></figure>
<p>Read the output against the ad. If the assistant has added something that is not there, delete it. You should now have a short list, usually five to ten items, of what you need to show.</p>
<h2 id="minute-5-to-10-map-requirements-to-real-experience"><a class="heading-anchor" href="#minute-5-to-10-map-requirements-to-real-experience" aria-label="Link to this section">Minute 5 to 10: map requirements to real experience</a></h2>
<p>This is the step that keeps you honest. For each must-have, write one line about where in your own history you have done it. If you have not done it, write &quot;no&quot; and move on.</p>
<p>Do this yourself first, quickly, in a plain text file. Then give the assistant your master CV and the requirements list and ask it to find matches you may have missed.</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Below is my master CV and a list of requirements from a job advert. For each requirement, tell me which parts of my CV already provide evidence for it. Quote the relevant bullet or line.

Where my CV has no evidence for a requirement, say &quot;no evidence found&quot; and do not suggest anything to add. I will decide what to do about gaps myself.

Requirements:
[paste list]

My CV:
[paste master CV]</code></pre></figure>
<p>The phrase &quot;do not suggest anything to add&quot; is deliberate. Left to its own devices, the assistant will propose plausible-sounding experience to fill gaps. That is exactly what you do not want.</p>
<p>At the end of this step you know two things: which of your real experience to bring forward, and which gaps are genuine. Genuine gaps are fine. Most candidates do not meet every requirement. What matters is that you do not pretend to.</p>
<h2 id="minute-10-to-15-rewrite-the-bullets"><a class="heading-anchor" href="#minute-10-to-15-rewrite-the-bullets" aria-label="Link to this section">Minute 10 to 15: rewrite the bullets</a></h2>
<p>Now you work on the CV itself. Three types of change are allowed:</p>
<ol>
<li><strong>Reordering.</strong> Move the bullets and skills that match the ad nearer the top of each section.</li>
<li><strong>Rewording.</strong> Use the employer&#39;s terminology where it is accurate. If they say &quot;ELT&quot; and you have been saying &quot;ETL&quot; for a dbt-based pipeline, ELT is the better word and it is true.</li>
<li><strong>Expanding.</strong> If a bullet is thin on something the ad cares about, and you have the real detail, add it.</li>
</ol>
<p>One type of change is not allowed: adding anything that did not happen.</p>
<p>Ask the assistant for suggestions bullet by bullet rather than for a whole rewritten CV. Whole rewrites are hard to check and tend to drift. A good prompt looks like this:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Rewrite this CV bullet so it better shows the requirement below. Keep every fact exactly as it is. Do not add tools, numbers or outcomes that are not in the original. If the original does not support the requirement, say so instead of rewriting.

Requirement: experience designing pipelines with retries and alerting

Original bullet:
- Built the nightly load for the finance warehouse using Airflow, with task retries and Slack alerts on failure.</code></pre></figure>
<p>Compare each suggestion with the original. Accept it only if every claim in the new version is already in the old one or is something you know to be true and can add yourself. Reject anything that sounds better than what happened.</p>
<p>Also update the summary line at the top of the CV. Two or three sentences, specific to this type of role. It is the single highest-value edit you can make.</p>
<h2 id="minute-15-to-18-write-the-cover-note"><a class="heading-anchor" href="#minute-15-to-18-write-the-cover-note" aria-label="Link to this section">Minute 15 to 18: write the cover note</a></h2>
<p>Most UK applications do not need a full cover letter, but a short note helps when there is a free-text box or a recruiter email. Keep it to about 120 words. Four short paragraphs:</p>
<ul>
<li>Which role you are applying for and one sentence on why it interests you.</li>
<li>Two or three sentences linking your strongest matching experience to their main requirements.</li>
<li>One sentence acknowledging a gap, if there is an obvious one, and how you would close it.</li>
<li>A plain closing line.</li>
</ul>
<p>Give the assistant the requirements list and the two or three bullets you want to feature, and ask for a 120-word draft in plain British English with no adjectives about yourself. Then edit it so it sounds like you. If you would not say &quot;I am excited to leverage my skills&quot; out loud, do not write it.</p>
<h2 id="minute-18-to-20-the-honesty-check"><a class="heading-anchor" href="#minute-18-to-20-the-honesty-check" aria-label="Link to this section">Minute 18 to 20: the honesty check</a></h2>
<p>Before you send anything, read the tailored CV and the note once more with one question in mind: could I defend every line of this in an interview?</p>
<p>Specifically:</p>
<ul>
<li>Every tool listed is one you have used in real work.</li>
<li>Every number is one you measured or can explain the basis for.</li>
<li>Every outcome happened.</li>
<li>Nothing has shifted from &quot;I contributed to&quot; to &quot;I built&quot; unless you did build it.</li>
<li>The summary line describes you, not the job ad.</li>
</ul>
<p>If a line fails, change it back. The whole point of this workflow is to present your real experience in the best light, not to manufacture a better candidate.</p>
<p>Save the tailored version with the employer&#39;s name in the filename, keep the master untouched, and send it.</p>
<h2 id="why-this-works"><a class="heading-anchor" href="#why-this-works" aria-label="Link to this section">Why this works</a></h2>
<p>Twenty minutes is short enough to do for every application that matters and long enough to make a visible difference. The assistant does the reading, comparing and drafting, which is where most of the time used to go. You do the judging, which is the part that should never be delegated.</p>
<p>The version of you on the page ends up more accurate, not less. Tailoring done honestly is just editing with a clear audience in mind.</p>
<h2 id="next-step"><a class="heading-anchor" href="#next-step" aria-label="Link to this section">Next step</a></h2>
<p>Take one job ad you are interested in and run only the first two steps. If the mapping shows you meet most of the must-haves, carry on. If it does not, that is useful to know before you spend any more time.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Five question families in UK mid-level data engineering interviews</title>
    <link>https://ishanyash.com/writing/five-questions-mid-level-data-engineering-interviews/</link>
    <guid isPermaLink="true">https://ishanyash.com/writing/five-questions-mid-level-data-engineering-interviews/</guid>
    <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
    <description>The five types of question that come up in UK mid-level data engineering interviews, how to prepare for each, and what a strong answer looks like</description>
    <category>careers</category><category>data-engineering</category><category>interviews</category>
    <content:encoded><![CDATA[<p>Mid-level data engineering interviews in the UK are more predictable than they feel. Most questions fall into five families. Companies phrase and weight them differently, but the underlying ask is the same.</p>
<p>This post covers each family, how to prepare, and what a strong answer looks like. The sample questions are typical, not transcripts from any particular company.</p>
<h2 id="1-sql-on-the-spot"><a class="heading-anchor" href="#1-sql-on-the-spot" aria-label="Link to this section">1. SQL on the spot</a></h2>
<p>Almost every process includes live SQL, either in a shared editor with a real database or in a document where you talk through the query. Either way, the interviewer wants to see that SQL is a tool you reach for without hesitation.</p>
<h3 id="how-to-prepare"><a class="heading-anchor" href="#how-to-prepare" aria-label="Link to this section">How to prepare</a></h3>
<ul>
<li>Practise writing queries by hand, without autocomplete, for a couple of weeks before interviews.</li>
<li>Be fast and correct on joins, GROUP BY with HAVING, window functions, CTEs and date handling.</li>
<li>Be able to explain what happens to row counts when joins fan out.</li>
<li>Know how you would find duplicates, the latest record per key, and gaps in a sequence.</li>
</ul>
<h3 id="sample-question"><a class="heading-anchor" href="#sample-question" aria-label="Link to this section">Sample question</a></h3>
<p>&quot;Given a table of orders with customer_id, order_date and amount, return each customer&#39;s most recent order and the total they have spent.&quot;</p>
<h3 id="strong-answer-outline"><a class="heading-anchor" href="#strong-answer-outline" aria-label="Link to this section">Strong-answer outline</a></h3>
<p>Talk as you write. State your assumptions. Then build the query in steps.</p>
<figure class="code" data-lang="sql"><div class="code-bar"><span>sql</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-sql"><span class="tok-keyword">WITH</span> ranked <span class="tok-keyword">AS</span> (
  <span class="tok-keyword">SELECT</span>
    customer_id,
    order_date,
    amount,
    <span class="tok-keyword">ROW_NUMBER</span>() <span class="tok-keyword">OVER</span> (
      <span class="tok-keyword">PARTITION</span> <span class="tok-keyword">BY</span> customer_id
      <span class="tok-keyword">ORDER</span> <span class="tok-keyword">BY</span> order_date <span class="tok-keyword">DESC</span>
    ) <span class="tok-keyword">AS</span> rn,
    <span class="tok-keyword">SUM</span>(amount) <span class="tok-keyword">OVER</span> (<span class="tok-keyword">PARTITION</span> <span class="tok-keyword">BY</span> customer_id) <span class="tok-keyword">AS</span> total_spent
  <span class="tok-keyword">FROM</span> orders
)
<span class="tok-keyword">SELECT</span> customer_id, order_date, amount, total_spent
<span class="tok-keyword">FROM</span> ranked
<span class="tok-keyword">WHERE</span> rn = <span class="tok-number">1</span>;</code></pre></figure>
<p>Then mention the edge cases unprompted: ties on order_date, null amounts, and whether cancelled orders count. That separates a mid-level answer from a junior one.</p>
<h2 id="2-data-modelling"><a class="heading-anchor" href="#2-data-modelling" aria-label="Link to this section">2. Data modelling</a></h2>
<p>Modelling questions test whether you can turn a business situation into tables that are easy to query and maintain. They are usually conversational.</p>
<h3 id="how-to-prepare-1"><a class="heading-anchor" href="#how-to-prepare-1" aria-label="Link to this section">How to prepare</a></h3>
<ul>
<li>Be fluent in the basics of dimensional modelling: facts, dimensions, grain, surrogate keys, slowly changing dimensions.</li>
<li>Understand when a wide denormalised table is fine and when it is not.</li>
<li>Know the trade-offs between a star schema and a more normalised model in a modern warehouse.</li>
<li>Have a view on how modelling changes with tools like dbt, where models are layered and tested.</li>
</ul>
<h3 id="sample-question-1"><a class="heading-anchor" href="#sample-question-1" aria-label="Link to this section">Sample question</a></h3>
<p>&quot;We run a subscription product. Design the tables an analytics team would use to report on monthly active subscribers, churn and revenue.&quot;</p>
<h3 id="strong-answer-outline-1"><a class="heading-anchor" href="#strong-answer-outline-1" aria-label="Link to this section">Strong-answer outline</a></h3>
<p>Start with the grain. Say what one row of the fact table means. For a subscription product, a daily or monthly subscription-status fact per customer is a sensible start.</p>
<p>Then name the dimensions: customer, plan, date. Explain how you would handle a customer changing plan and whether that history matters. If it does, that is a type 2 slowly changing dimension, and you should say so.</p>
<p>Finish with how the model answers the three questions, and what you would clarify with the analytics team before building.</p>
<h2 id="3-pipeline-design-and-failure-handling"><a class="heading-anchor" href="#3-pipeline-design-and-failure-handling" aria-label="Link to this section">3. Pipeline design and failure handling</a></h2>
<p>This family separates engineers who have run things in production from those who have only built them. Interviewers want to hear how you think about reliability, idempotency, monitoring and recovery.</p>
<h3 id="how-to-prepare-2"><a class="heading-anchor" href="#how-to-prepare-2" aria-label="Link to this section">How to prepare</a></h3>
<ul>
<li>Pick two pipelines you know well and be able to draw them from source to consumer.</li>
<li>For each, know what happens when a source is late, a schema changes, a job runs twice, or a job fails halfway.</li>
<li>Have clear definitions for idempotency, backfill and late-arriving data.</li>
<li>Be comfortable talking about orchestration: dependencies, retries, alerting, SLAs.</li>
</ul>
<h3 id="sample-question-2"><a class="heading-anchor" href="#sample-question-2" aria-label="Link to this section">Sample question</a></h3>
<p>&quot;Design a daily pipeline that loads supplier files into our warehouse. The files sometimes arrive late and are occasionally resent with corrections. How do you make it reliable?&quot;</p>
<h3 id="strong-answer-outline-2"><a class="heading-anchor" href="#strong-answer-outline-2" aria-label="Link to this section">Strong-answer outline</a></h3>
<p>Lay out the stages: landing, validation, staging, transformation, publish. Then address the problems in the question.</p>
<ul>
<li>Late files: do not couple the schedule to an assumed arrival time. Use a file-arrival sensor, and alert if the file has not appeared by the deadline.</li>
<li>Resent files: make the load idempotent. Partition by business date and replace the partition, or merge on a stable key. Keep the raw file so you can reprocess.</li>
<li>Validation: check row counts, schema and key uniqueness before anything reaches the warehouse. Quarantine bad files rather than failing silently.</li>
<li>Observability: log every run, record row counts in and out, and alert on deviations.</li>
</ul>
<p>Mention what you would do on day one versus later. That shows judgement, not just knowledge.</p>
<h2 id="4-the-past-project-deep-dive"><a class="heading-anchor" href="#4-the-past-project-deep-dive" aria-label="Link to this section">4. The past-project deep dive</a></h2>
<p>At some point an interviewer will pick a project from your CV and dig in for twenty minutes or more. They want to know how much of it was really yours, what decisions you made, and what you learned.</p>
<h3 id="how-to-prepare-3"><a class="heading-anchor" href="#how-to-prepare-3" aria-label="Link to this section">How to prepare</a></h3>
<ul>
<li>Choose two or three projects from your CV and prepare each in depth: the business problem, the architecture, your contribution, the hard parts, and what you would do differently.</li>
<li>Be honest about the boundaries of your role. &quot;I built the ingestion layer; a colleague owned the modelling&quot; is a fine answer. Claiming the whole thing and then struggling on detail is not.</li>
<li>Know the numbers on your CV and how you measured them.</li>
</ul>
<h3 id="sample-question-3"><a class="heading-anchor" href="#sample-question-3" aria-label="Link to this section">Sample question</a></h3>
<p>&quot;Tell me about the pipeline rebuild on your CV. What was the original problem and what did you change?&quot;</p>
<h3 id="strong-answer-outline-3"><a class="heading-anchor" href="#strong-answer-outline-3" aria-label="Link to this section">Strong-answer outline</a></h3>
<p>Give the context in two sentences. Then the problem as the business experienced it. Then the decision points: what options you considered, which you chose, and why.</p>
<p>Spend the most time on the hardest part. Interviewers remember specifics. Explain one thing that went wrong and how you handled it.</p>
<p>Close with the result and one thing you would change with hindsight. A candidate who cannot name anything to improve usually has not reflected on the work.</p>
<h2 id="5-behavioural-star-questions"><a class="heading-anchor" href="#5-behavioural-star-questions" aria-label="Link to this section">5. Behavioural STAR questions</a></h2>
<p>UK employers, particularly larger organisations and the public sector, lean heavily on competency questions. They want examples they can score. The STAR format (Situation, Task, Action, Result) exists because it makes scoring easy.</p>
<h3 id="how-to-prepare-4"><a class="heading-anchor" href="#how-to-prepare-4" aria-label="Link to this section">How to prepare</a></h3>
<ul>
<li>Write down six to eight stories from your work. Cover conflict, failure, pressure, influencing without authority, learning quickly, and improving a process.</li>
<li>For each, write a STAR version you can deliver in about two minutes.</li>
<li>Keep the Action section the longest. That is the part about you.</li>
<li>Practise saying them out loud.</li>
</ul>
<h3 id="sample-question-4"><a class="heading-anchor" href="#sample-question-4" aria-label="Link to this section">Sample question</a></h3>
<p>&quot;Tell me about a time you disagreed with a technical decision. What did you do?&quot;</p>
<h3 id="strong-answer-outline-4"><a class="heading-anchor" href="#strong-answer-outline-4" aria-label="Link to this section">Strong-answer outline</a></h3>
<figure class="code" data-lang="markdown"><div class="code-bar"><span>markdown</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-markdown">Situation: a team was choosing between two approaches to a shared transformation layer.
Task: I thought the chosen option would make testing harder and wanted to raise it without derailing the plan.
Action: I wrote up the concern with a small worked example, shared it before the next design review, and proposed trying both on one model. I made clear I would support whichever was chosen.
Result: the team adjusted the approach where testing mattered most and kept the original elsewhere. The compromise held up.</code></pre></figure>
<p>Note the tone. The strong answer is about raising a concern well and accepting the outcome, not about winning.</p>
<h2 id="putting-it-together"><a class="heading-anchor" href="#putting-it-together" aria-label="Link to this section">Putting it together</a></h2>
<p>With a week before an interview, split it roughly like this: two days on SQL, one on modelling, one on pipeline design, one on your own projects, and one on STAR stories. Then rest.</p>
<p>You will not be asked everything. But if you have prepared across all five families, nothing in the room will surprise you.</p>
<h2 id="next-step"><a class="heading-anchor" href="#next-step" aria-label="Link to this section">Next step</a></h2>
<p>Pick one sample question above and answer it out loud, timed. The gap between what you know and what you can say clearly is the thing to close first.</p>
]]></content:encoded>
  </item>
  <item>
    <title>What a UK data engineering CV actually needs</title>
    <link>https://ishanyash.com/writing/uk-data-engineering-cv/</link>
    <guid isPermaLink="true">https://ishanyash.com/writing/uk-data-engineering-cv/</guid>
    <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
    <description>A practical guide to a two-page UK data engineering CV: the summary line, impact bullets, skills order and the conventions recruiters expect</description>
    <category>careers</category><category>data-engineering</category><category>cv</category>
    <content:encoded><![CDATA[<p>Most of the data engineering CVs I see have the same problems. They are too long, they list duties instead of results, and the skills section is a wall of tools in no particular order. None of this is hard to fix. This post covers what a UK data engineering CV needs, section by section, and the mistakes that get CVs skipped.</p>
<h2 id="length-two-pages"><a class="heading-anchor" href="#length-two-pages" aria-label="Link to this section">Length: two pages</a></h2>
<p>Two pages is the norm in the UK for someone with a few years of experience. One page is fine if you are early in your career. Three pages is almost always too many.</p>
<p>Recruiters and hiring managers skim. A long CV does not make you look more experienced. It makes the good parts harder to find.</p>
<p>Ways to get down to two pages:</p>
<ul>
<li>Cut roles older than ten years to a single line each.</li>
<li>Drop degree modules unless you graduated in the last two years.</li>
<li>Remove any bullet that describes a duty everyone in that role has.</li>
<li>Use the space you free up on your last two roles, which are what people read.</li>
</ul>
<h2 id="the-summary-line"><a class="heading-anchor" href="#the-summary-line" aria-label="Link to this section">The summary line</a></h2>
<p>Start with two or three sentences at the top. Not an &quot;objective&quot;. A summary of who you are professionally.</p>
<p>A good summary answers three questions: what you do, what you are strongest at, and what kind of work you want next. Keep it specific.</p>
<p>Weak:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Passionate data professional with a proven track record of delivering results in dynamic environments.</code></pre></figure>
<p>Better:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Data engineer with five years of experience building batch and streaming pipelines on Azure. Strongest in SQL, Python and data modelling for analytics teams. Looking for a senior role where I own the platform end to end.</code></pre></figure>
<p>The second version tells a reader what to expect before they reach the detail. The first could belong to anyone.</p>
<h2 id="impact-bullets-problem-action-result"><a class="heading-anchor" href="#impact-bullets-problem-action-result" aria-label="Link to this section">Impact bullets: problem, action, result</a></h2>
<p>Each bullet under a role should describe something you did that mattered. The simplest structure is problem, action, result.</p>
<ul>
<li>Problem: what was wrong, slow, missing or at risk.</li>
<li>Action: what you built, changed or decided, and the tools you used.</li>
<li>Result: what happened. Use a number if you have a real one.</li>
</ul>
<p>Numbers are useful because they are concrete. But only use numbers you can defend in an interview. If you cut a job&#39;s runtime, say by how much. If you do not know the exact figure, give a defensible range or describe the result in words. A made-up percentage is worse than no percentage.</p>
<h3 id="before-and-after"><a class="heading-anchor" href="#before-and-after" aria-label="Link to this section">Before and after</a></h3>
<p>Before:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">- Responsible for maintaining ETL pipelines and fixing data quality issues.</code></pre></figure>
<p>After:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">- Rebuilt a nightly ETL job that regularly missed its 6am deadline. Moved it from a single Python script to an orchestrated Airflow DAG with task-level retries. The job now finishes before 4am and on-call pages for it have stopped.</code></pre></figure>
<p>The second version is longer, but it tells the reader what the situation was, what you did about it, and what changed. It also shows tools in context, which is far more convincing than a list.</p>
<p>Aim for three to five bullets per recent role and fewer for older ones. Not every bullet needs a number. Every bullet needs a result.</p>
<h2 id="the-skills-section"><a class="heading-anchor" href="#the-skills-section" aria-label="Link to this section">The skills section</a></h2>
<p>The skills section exists so that a person scanning the CV, or a system searching it, can confirm you have the basics. Order it by what UK job ads ask for most, not alphabetically and not by what you enjoy most.</p>
<p>Reading a lot of UK data engineering adverts, the usual order of priority is:</p>
<ol>
<li>SQL</li>
<li>Python</li>
<li>Cloud: Azure and AWS most often, GCP less so</li>
<li>Data modelling: dimensional models, star schemas, slowly changing dimensions</li>
<li>ETL and ELT tooling: dbt, Data Factory, Glue or similar</li>
<li>Orchestration: Airflow, Dagster, Prefect, or the cloud-native equivalent</li>
<li>Databricks and Spark</li>
<li>Everything else: Git, CI/CD, Docker, Terraform, Kafka, testing</li>
</ol>
<p>Group them under short headings so the section stays readable:</p>
<figure class="code" data-lang="text"><div class="code-bar"><span>text</span><button type="button" class="copy" data-copy>copy</button></div><pre><code class="language-text">Languages: SQL (T-SQL, PostgreSQL), Python
Cloud: Azure (Data Factory, Synapse, ADLS), AWS (S3, Glue, Redshift)
Modelling and transformation: dimensional modelling, dbt, Spark on Databricks
Orchestration and delivery: Airflow, Azure DevOps, GitHub Actions, Terraform</code></pre></figure>
<p>Only list tools you could talk about for five minutes. If a tool is on your CV, it is fair game in an interview.</p>
<h2 id="uk-conventions"><a class="heading-anchor" href="#uk-conventions" aria-label="Link to this section">UK conventions</a></h2>
<p>A few things that are normal elsewhere look odd on a UK CV:</p>
<ul>
<li>No photo.</li>
<li>No date of birth, age, marital status or nationality.</li>
<li>No full postal address. City or region is enough.</li>
<li>No &quot;References available on request&quot;. Everyone assumes this.</li>
<li>British spelling: &quot;modelling&quot;, &quot;optimise&quot;, &quot;organisation&quot;.</li>
<li>Month and year for dates. Exact days are not needed.</li>
<li>A PDF named with your name, for example <code>jane-smith-cv.pdf</code>, not <code>CV_final_v3.pdf</code>.</li>
</ul>
<p>Keep the format simple. Single column, standard fonts, no tables for layout, no icons. Multi-column designs often break when parsed by applicant tracking systems, and they rarely look better to a human either.</p>
<h2 id="common-mistakes"><a class="heading-anchor" href="#common-mistakes" aria-label="Link to this section">Common mistakes</a></h2>
<h3 id="listing-duties-instead-of-outcomes"><a class="heading-anchor" href="#listing-duties-instead-of-outcomes" aria-label="Link to this section">Listing duties instead of outcomes</a></h3>
<p>&quot;Responsible for&quot;, &quot;worked on&quot;, &quot;involved in&quot;. These phrases describe a job description, not a person. Replace each one with what you actually did and what it changed.</p>
<h3 id="a-skills-section-that-lists-everything-you-have-ever-touched"><a class="heading-anchor" href="#a-skills-section-that-lists-everything-you-have-ever-touched" aria-label="Link to this section">A skills section that lists everything you have ever touched</a></h3>
<p>Twenty-five tools in a row tells a reader nothing about where you are strong. It also invites interview questions on things you used once, three years ago. Prune it.</p>
<h3 id="no-sign-of-scale"><a class="heading-anchor" href="#no-sign-of-scale" aria-label="Link to this section">No sign of scale</a></h3>
<p>Data engineering is about scale and reliability. Readers want to know roughly how big the data was, how many pipelines you ran, how many people depended on them. You do not need exact figures. &quot;Tens of millions of rows a day&quot; or &quot;around forty scheduled pipelines&quot; gives useful context.</p>
<h3 id="the-same-cv-for-every-role"><a class="heading-anchor" href="#the-same-cv-for-every-role" aria-label="Link to this section">The same CV for every role</a></h3>
<p>A platform-heavy role and an analytics-engineering role want different emphasis. The content stays true; the ordering and the summary line change. Keep a master CV and produce a tailored version for each application.</p>
<h3 id="buzzword-inflation"><a class="heading-anchor" href="#buzzword-inflation" aria-label="Link to this section">Buzzword inflation</a></h3>
<p>&quot;Leveraged cutting-edge technologies to drive business value&quot; means nothing. Say what you built.</p>
<h3 id="burying-recent-work"><a class="heading-anchor" href="#burying-recent-work" aria-label="Link to this section">Burying recent work</a></h3>
<p>Your most recent role is what gets read. If it has two bullets and a role from six years ago has six, swap the attention.</p>
<h2 id="a-quick-checklist"><a class="heading-anchor" href="#a-quick-checklist" aria-label="Link to this section">A quick checklist</a></h2>
<p>Before you send a CV, check:</p>
<ul>
<li>Two pages or fewer.</li>
<li>The summary line is specific to you and the type of role.</li>
<li>Every bullet has an action and a result.</li>
<li>Numbers are real and you can explain how you got them.</li>
<li>Skills are grouped and ordered by relevance.</li>
<li>No photo, date of birth, or &quot;references available on request&quot;.</li>
<li>British spelling throughout.</li>
<li>The file is a PDF with a sensible name.</li>
</ul>
<h2 id="next-step"><a class="heading-anchor" href="#next-step" aria-label="Link to this section">Next step</a></h2>
<p>Take your current CV and rewrite just the top three bullets of your most recent role using problem, action, result. In my experience that one change does more than anything else on this list.</p>
]]></content:encoded>
  </item>
</channel>
</rss>
