<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fauzan</title>
    <description>The latest articles on DEV Community by Fauzan (@grandimam).</description>
    <link>https://dev.to/grandimam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1703522%2F9043df1a-59b1-4ead-8c41-ac086e2cd666.jpg</url>
      <title>DEV Community: Fauzan</title>
      <link>https://dev.to/grandimam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/grandimam"/>
    <language>en</language>
    <item>
      <title>How HackerRank Scores Engineers</title>
      <dc:creator>Fauzan</dc:creator>
      <pubDate>Sat, 11 Jul 2026 18:04:13 +0000</pubDate>
      <link>https://dev.to/grandimam/how-hackerrank-scores-engineers-1cj8</link>
      <guid>https://dev.to/grandimam/how-hackerrank-scores-engineers-1cj8</guid>
      <description>&lt;p&gt;I have been doing my goal-setting, KPIs, and feedback assessments through LLMs. The hardest part was designing the scoring mechanism. When HackerRank open-sourced their &lt;a href="https://github.com/interviewstreet/hiring-agent" rel="noopener noreferrer"&gt;Hiring Agent&lt;/a&gt;, I wanted to understand how they had solved the same problem and what biases their rubric encodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/interviewstreet/hiring-agent" rel="noopener noreferrer"&gt;Hiring Agent&lt;/a&gt; is an LLM-based resume scoring tool that parses a PDF, enriches it with GitHub and blog data, and returns a score. It's straightforward to run — clone the repo, point it at a PDF:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/interviewstreet/hiring-agent
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hiring-agent
&lt;span class="nv"&gt;$ &lt;/span&gt;python3 score.py /examples/java-engineer.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool returns a structured score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;==========================================&lt;/span&gt;
📊 RESUME EVALUATION: Senior Java Engineer
&lt;span class="o"&gt;==========================================&lt;/span&gt;

🎯 OVERALL SCORE: 71.0/100
🌐 Open Source:           12/35
🚀 Self Projects:         18/30
🏢 Production Experience: 25/25
💻 Technical Skills:       8/10

✅ KEY STRENGTHS:
&lt;span class="nt"&gt;------------------------------------------&lt;/span&gt;
  1. Microservices Architecture
  2. Event-Driven Systems
  3. Cloud Technologies
  4. Database Optimization
  5. API Design

🔧 AREAS FOR IMPROVEMENT:
&lt;span class="nt"&gt;------------------------------------------&lt;/span&gt;
  1. Lack of Open Source Contributions
  2. Limited GitHub Activity
  3. No Publicly Available Projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I first provided it with a Senior Java Engineer resume. Though the profile has a near-perfect score on production experience and technical skills, the tool still evaluated the candidate at 71. I wanted to get a deeper understanding of how this tool was doing the scoring:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Resume Parsing
&lt;/h2&gt;

&lt;p&gt;It starts in &lt;code&gt;score.py&lt;/code&gt; where the PDF is handed off to a &lt;code&gt;PDFHandler&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;score.py:251-252&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pdf_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PDFHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;resume_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pdf_handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_json_from_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside extract_json_from_pdf, the PDF is parsed using PyMuPDF and converted to Markdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pdf.py:54-57&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resume_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;to_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Markdown content is then normalised into structured JSON - an internal schema (basics, work, education, skills, projects, awards) that represents the content of the resume. The normalisation step is important as it allows the tool to take in any resume regardless of the layout and represent it into a strict internal format. Now, parsing the resume from PDF to Markdown is not a foolproof step, in case of multi-column sections direct Markdown conversion is unreliable.&lt;/p&gt;

&lt;p&gt;Let's take an example of this resume:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpnee626cmp6be9v8dm5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpnee626cmp6be9v8dm5x.png" alt=" " width="798" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Markdown parser reads left-to-right, so the content is incorrectly extracted as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coding, Framework, Messaging, Database, Observability, Containers, Patterns, Cloud, Java, Python...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How well the LLM recovers from this depends on the model used. A more concrete solution would be to screenshot the resume and let the model parse it directly, rather than converting to Markdown first - similar to how Claude/Codex parses websites. The sections are then extracted individually using specialized prompts, each being an LLM call to the model. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Scoring Criteria
&lt;/h2&gt;

&lt;p&gt;Almost all the intelligence is prompts, available in &lt;code&gt;prompts/templates/&lt;/code&gt; directory. Python is merely used in orchestration and plumbing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"basics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basics.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"education"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"education.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skills.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"projects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"projects.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"awards"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"awards.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"system_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system_message.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"github_project_selection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github_project_selection.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"resume_evaluation_criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resume_evaluation_criteria.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"resume_evaluation_system_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resume_evaluation_system_message.jinja"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;resume_evaluation_system_message.jinja&lt;/code&gt; and &lt;code&gt;resume_evaluation_criteria&lt;/code&gt; help evaluate the scoring. The other prompts are primarily for resume parsing capability. The scoring criteria in &lt;code&gt;resume_evaluation_criteria&lt;/code&gt; is heavily biased towards individuals with open-source projects and contributions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Open Source (0-35 points)&lt;/span&gt;
&lt;span class="gs"&gt;**HIGH SCORES (25-35 points):**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Contributions to popular open source projects (1000+ stars)
&lt;span class="p"&gt;-&lt;/span&gt; Significant contributions to well-known projects
&lt;span class="p"&gt;-&lt;/span&gt; Google Summer of Code (GSoC) participation
&lt;span class="p"&gt;-&lt;/span&gt; Substantial community involvement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are explicit rules that mention what projects are considered open-source and what are not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**CRITICAL RULES:**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Having personal GitHub repositories does NOT constitute open source contribution
&lt;span class="p"&gt;-&lt;/span&gt; True open source contribution means contributing to OTHER people's projects
&lt;span class="p"&gt;-&lt;/span&gt; When GitHub data shows all projects are 'self_project' type, open source score MUST be 10 points or less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And one that interested me most was the following rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**SPECIAL CONSIDERATION FOR STARTUP EXPERIENCE**&lt;/span&gt;: Give extra points for founder roles, co-founder positions, or early-stage engineer roles (first 10-20 employees) at startups, as these demonstrate exceptional initiative, technical leadership, and ability to build products from scratch.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing the Bias
&lt;/h3&gt;

&lt;p&gt;The prompt says to reward founder and early-stage roles. I wanted to know: does it actually? I took the same resume and changed only the job titles. Three versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.grandimam.com/assets/pdfs/java-engineer.pdf" rel="noopener noreferrer"&gt;Senior Java Engineer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.grandimam.com/assets/pdfs/founding-engineer.pdf" rel="noopener noreferrer"&gt;Founding Engineer&lt;/a&gt; - same resume, title swapped&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.grandimam.com/assets/pdfs/co-founder.pdf" rel="noopener noreferrer"&gt;Co-founder / CTO&lt;/a&gt; - same resume, title swapped again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else stayed identical: same skills, same projects, same experience. The only variable was the job title.&lt;/p&gt;

&lt;p&gt;The results were underwhelming. The production score moved from 22 to 23 out of 25 in some iterations. The CTO title landed in the same range. I ran it multiple times with different titles, and the production score consistently sat between 20-23 regardless of what I put.&lt;/p&gt;

&lt;p&gt;This tells two things. First, the LLM is resistant to title changes. Second, the rubric's emphasis on startup roles is more aspiration than enforcement. The prompt says to give extra points, but the model doesn't consistently apply them. A prompt rule is a suggestion, not a guarantee.&lt;/p&gt;

&lt;p&gt;A deeper look into the criteria also rewarded the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; +3-5 points for startup founder/co-founder experience
&lt;span class="p"&gt;-&lt;/span&gt; +2-3 points for early-stage engineer experience (first 10-20 employees at a startup)
&lt;span class="p"&gt;-&lt;/span&gt; +2 points for portfolio website (GitHub URL in basics.url)
&lt;span class="p"&gt;-&lt;/span&gt; +1 point for LinkedIn profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Being a LinkedIn user is worth 1 point. Being a GSoC participant is worth 5. Now, apart from prompts there are rules explicitly coded wherein it checks for repo popularity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;github.py:234&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;repos_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fork&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forks_count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drops forks with fewer than 5 forks, filtering out drive-by forks of popular repos. These are opinions stated as rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The Hiring Agent is a decently-engineered prototype. The problem is someone decided open source is 35% of an engineer's value; four commits is the threshold for "meaningful" contribution. Someone decided a LinkedIn profile is worth exactly 1 point. These are judgment stated as rules.&lt;/p&gt;

&lt;p&gt;This is the same problem I was trying to solve in my own tool. The hard part of LLM-based scoring isn't the model, the parsing, or the pipeline. It's deciding what matters. Once you define it in the prompt, you have made a value judgment and the model will try to enforce it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Caveat
&lt;/h2&gt;

&lt;p&gt;The git history is also interesting. The active development spans 77 days (July 29 to October 15, 2025) followed by a 231-day silence, then a handful of cleanup commits in June 2026 before open-sourcing. The commit patterns look like a burst of internal hackathon or intern work, not a sustained effort.&lt;/p&gt;

&lt;p&gt;This matters because the company that is open-sourcing the project is one of the players in the domain. The criteria defined: open source at 35%, technical skills at 10% feels like someone's first draft and not a thoroughly validated hiring framework. There are inconsistencies also in the project that highlight that these are the rough edges of a prototype, not a production system. This tool must be used with caution as it's a first attempt at LLM-based hiring looks like, before it's been tested against thousands of real candidates and calibrated by recruiting teams. &lt;/p&gt;

</description>
      <category>llm</category>
      <category>hiring</category>
      <category>hackerrank</category>
      <category>ai</category>
    </item>
    <item>
      <title>Repricing of Software Engineering Labor</title>
      <dc:creator>Fauzan</dc:creator>
      <pubDate>Thu, 25 Jun 2026 21:18:21 +0000</pubDate>
      <link>https://dev.to/grandimam/repricing-of-software-engineering-labor-1fnd</link>
      <guid>https://dev.to/grandimam/repricing-of-software-engineering-labor-1fnd</guid>
      <description>&lt;p&gt;I started my career in the late 2010s, and I have had a front-row seat to the growth of the industry that has given me everything: software engineering.&lt;/p&gt;

&lt;p&gt;Looking back over the last decade, I have mixed feelings about some of the calls I made. And I am seeing the same patterns play out again now. So for engineers who are confused about where this is headed and how to navigate it, here is how I think about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generalist SWEs were a product of cheap money
&lt;/h2&gt;

&lt;p&gt;The late 2010s, I saw an huge amount of startup funding, globally. Flipkart, Snapdeal, Jugnoo, and hundreds of others were scaling hard and one hiring pattern I saw was that: everyone wanted generalist software engineers. People who could easily get upto speed across the stack.- backend, frontend, infra, deployment and simply ship.&lt;/p&gt;

&lt;p&gt;Building software was expensive. Automation was still low. Kubernetes had just gone mainstream. Shipping still meant a surprising amount of manual work: SSH-ing into servers, copying artifacts around, running &lt;code&gt;mvn&lt;/code&gt; builds by hand, debugging deployments straight in production, duct-taping infrastructure that today you would never touch.&lt;/p&gt;

&lt;p&gt;Companies fought over engineers who maximized feature throughput. Breadth was a premium, because every extra engineer increased the rate at which software got built. It helped because the money was also free and VCs rewarded growth over efficiency, and hiring software engineers in bulk was the easiest way to spend it.&lt;/p&gt;

&lt;p&gt;Pull up a resume from an engineer who started around that time and you will usually see the same shape: a long list of technologies and frameworks, broad and adaptable, but rarely deep in any one thing. There was no incentive to go deep.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLMs Changed The Dynamics
&lt;/h2&gt;

&lt;p&gt;LLMs did not kill software engineering. It compressed the cost of implementation. The work that got hit first was the work that was already standardized: CRUD apps; API integration and glue code; Framework-heavy backend work; Frontend scaffolding; Standard architectural patterns.&lt;/p&gt;

&lt;p&gt;What used to take a team can now is being done by a 2-member team and AI. That is why implementation-heavy roles are becoming low-leverage work.&lt;/p&gt;

&lt;p&gt;If your main value is stiching systems out of known frameworks and well-understood patterns, you are now competing with AI-assisted developers, technical PMs, founders, and small teams that hit the same outcome with a fraction of the headcount. Some of what feels like an AI correction is just the cheap-money era ending. Both are happening at once, and it is easy to blame all of it on AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repricing of the Middle Layer
&lt;/h2&gt;

&lt;p&gt;I don't think software engineering is disappearing. I think the market is repricing it. For years it rewarded implementation throughput. Engineers that were able to move fast and build stuff are becoming obselete overnight. These are large middle—implementation-heavy generalists whose value was mostly shipping software built from known patterns.&lt;/p&gt;

&lt;p&gt;The distinguished engineers sit above this collapse because their value was never implementation bandwidth in the first place; it was depth, judgment, and ownership. The middle layer never had any moat.&lt;/p&gt;

&lt;p&gt;That is where I see the real identity crisis. A lot of these engineers built genuinely successful careers in a market where implementation itself was scarce. AI took that away almost overnight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expertise is getting more valuable
&lt;/h2&gt;

&lt;p&gt;As implementation gets cheaper, expertise gets more valuable. Not generic expertise. Deep expertise in domains where correctness, latency, safety, or operational complexity dominate.&lt;/p&gt;

&lt;p&gt;Even the senior Java engineer with fifteen or twenty years in isn't valuable because of Java. They are valuable because they have spent years debugging distributed failures, running mission-critical systems, learning failure modes the hard way, and making architectural trade-offs under real production pressure.&lt;/p&gt;

&lt;p&gt;It is not prompting but it's judgment earned through experience, not code generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this goes
&lt;/h2&gt;

&lt;p&gt;Like a lot of people, I have spent time building AI-native tooling myself (&lt;a href="https://github.com/grandimam/barebone" rel="noopener noreferrer"&gt;Barebone&lt;/a&gt;). And ironically, even this layer is crowded already.&lt;/p&gt;

&lt;p&gt;Agent frameworks, orchestration libraries, workflow engines, thin wrappers around foundation models—they are multiplying faster than they can meaningfully differentiate. Calling yourself an "AI engineer" is not going to be a moat.&lt;/p&gt;

&lt;p&gt;I dont think LLMs eliminate engineering. PMs and domain experts can increasingly build prototypes, validate ideas, and ship internal tools with AI-assisted workflows. They are moving into what used to be engineering territory but mostly at the prototype layer.&lt;/p&gt;

&lt;p&gt;Production is a different animal. It still needs engineers who understand reliability, scale, security, performance, observability, and operational trade-offs. The market is not killing the generalist software engineer but it is collapsing the premium for implementation-heavy work and raising the premium for deep expertise and real systems intuition.&lt;/p&gt;

&lt;p&gt;For the first time in a long time, I think the biggest returns in this field come not from knowing a little about everything, but from knowing one hard thing exceptionally well.&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>softwareengineering</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
