<?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: Farzan Hajian</title>
    <description>The latest articles on DEV Community by Farzan Hajian (@farzanhajian).</description>
    <link>https://dev.to/farzanhajian</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%2F782328%2F435f3274-5a9f-4c54-a090-2150eeea51d2.jpg</url>
      <title>DEV Community: Farzan Hajian</title>
      <link>https://dev.to/farzanhajian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farzanhajian"/>
    <language>en</language>
    <item>
      <title>It All Started with "I Want a Compiler for..."</title>
      <dc:creator>Farzan Hajian</dc:creator>
      <pubDate>Sun, 19 Jul 2026 09:28:32 +0000</pubDate>
      <link>https://dev.to/farzanhajian/it-all-started-with-i-want-a-compiler-for-3kol</link>
      <guid>https://dev.to/farzanhajian/it-all-started-with-i-want-a-compiler-for-3kol</guid>
      <description>&lt;p&gt;&lt;em&gt;Building a programming language with an AI coding agent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;June 10, 2026&lt;/strong&gt;, driven by my long-standing passion for compilers and programming languages—and curious to see how far AI coding tools could take me—I opened OpenAI Codex and wrote a single prompt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I want a compiler for a programming language written in Go..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The rest of the prompt described a compiler that would generate Windows x64 binaries from a tiny programming language supporting arithmetic, variables, a handwritten recursive descent parser, &lt;code&gt;print()&lt;/code&gt;, and &lt;code&gt;if/else&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The AI replied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I'll build this as a small Go compiler project from scratch: lexer,&lt;br&gt;
recursive descent parser, basic semantic checks, and Windows x64&lt;br&gt;
executable output..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was the beginning of &lt;strong&gt;FNL (Farzan's Neat Language)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Compiler construction has fascinated me for many years. I have read books, watched talks, experimented with parser theory, and always wanted to build a compiler of my own. This project was less about creating a production language and more about exploring one of my favorite areas of computer science practically.&lt;/p&gt;

&lt;p&gt;Looking back, I thought I was starting a coding project.&lt;/p&gt;

&lt;p&gt;What I was really starting was a journey into programming language design.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Wrote the Code. I Designed the Language.
&lt;/h2&gt;

&lt;p&gt;One point is worth making from the beginning. I did &lt;strong&gt;not&lt;/strong&gt; write the compiler. Every line of Go code was generated by the AI. That does &lt;strong&gt;not&lt;/strong&gt; mean I was a passive requester.&lt;/p&gt;

&lt;p&gt;Throughout the project, I acted as the architect, language designer, reviewer, tester, and ultimately the person responsible for every engineering decision. I was not simply asking the AI to generate code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I was making engineering decisions&lt;/strong&gt;, and that was the interesting part.&lt;/p&gt;

&lt;p&gt;The AI proposed implementations, challenged my ideas, suggested alternatives, and occasionally made assumptions of its own. Sometimes I accepted them. Sometimes I rejected them. Quite often, we spent considerably more time discussing a feature than implementing it.&lt;/p&gt;

&lt;p&gt;The AI implemented the compiler.&lt;/p&gt;

&lt;p&gt;I designed the language and directed its evolution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Learning a Compiler by Building One
&lt;/h2&gt;

&lt;p&gt;From the beginning, I deliberately constrained the project.&lt;/p&gt;

&lt;p&gt;I specifically asked for a handwritten recursive descent parser because I wanted a compiler whose code I could comfortably read and understand. Parser generators are powerful, but they were not what I wanted to learn from.&lt;/p&gt;

&lt;p&gt;Very quickly, I discovered that implementing the compiler was not the hardest part. &lt;strong&gt;Designing the language was&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Strings sounded like an easy feature until we started discussing them.&lt;/p&gt;

&lt;p&gt;Should they be ASCII, UTF-8, UTF-16, or UTF-32?&lt;/p&gt;

&lt;p&gt;Should string length mean bytes or Unicode code points?&lt;/p&gt;

&lt;p&gt;Should comparisons be locale-aware?&lt;/p&gt;

&lt;p&gt;Then came conversions.&lt;/p&gt;

&lt;p&gt;Should assigning an &lt;code&gt;int&lt;/code&gt; to a &lt;code&gt;double&lt;/code&gt; happen automatically?&lt;/p&gt;

&lt;p&gt;Should &lt;code&gt;"123"&lt;/code&gt; become an integer?&lt;/p&gt;

&lt;p&gt;How far should implicit conversions go before convenience becomes surprising behaviour?&lt;/p&gt;

&lt;p&gt;None of these questions has a universally correct answer. Every decision simplifies one aspect of the language while complicating another.&lt;/p&gt;

&lt;p&gt;Fortunately, FNL is still young. I do not have to worry about backward compatibility yet, so I can revisit earlier decisions whenever I discover a better design.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Compiler Became My Laboratory
&lt;/h2&gt;

&lt;p&gt;Eventually, I stopped testing the compiler with isolated snippets and started writing real programs in FNL.&lt;/p&gt;

&lt;p&gt;The repository now includes a Hello World program, a Fibonacci sequence generator, a square root calculator, a π approximation, and a simple guessing game.&lt;/p&gt;

&lt;p&gt;Those programs became much more than examples. &lt;strong&gt;They became the language's first users&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Almost every one of them revealed something missing.&lt;/p&gt;

&lt;p&gt;While writing Fibonacci, I realised I needed &lt;code&gt;break&lt;/code&gt; and &lt;code&gt;exit()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While writing the guessing game, I discovered there was no random number generator, which later became &lt;code&gt;math_random()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Later, I accidentally declared a variable named &lt;code&gt;signed&lt;/code&gt; instead of &lt;code&gt;sign&lt;/code&gt;. FNL accepted it, but the generated C backend failed because &lt;code&gt;signed&lt;/code&gt; is a C keyword. Instead of leaking C restrictions into FNL, I introduced symbol mangling so backend names became independent from source names.&lt;/p&gt;

&lt;p&gt;Over time, I realised that I did not really get to know my language while designing it. &lt;strong&gt;I got to know it while writing software with it&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  "You Cheated."
&lt;/h2&gt;

&lt;p&gt;One of the funniest moments came early in the project.&lt;/p&gt;

&lt;p&gt;I asked the AI to generate Windows executables.&lt;/p&gt;

&lt;p&gt;Instead of generating machine code directly, it quietly decided that the compiler should &lt;strong&gt;transpile&lt;/strong&gt; FNL code to C11 and then invoke a C compiler.&lt;/p&gt;

&lt;p&gt;My first reaction was simple.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You cheated."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After thinking about it, I realised it was a sensible engineering&lt;br&gt;
decision.&lt;/p&gt;

&lt;p&gt;The interesting part of this project was never the instruction encoding.&lt;/p&gt;

&lt;p&gt;It was language design, lexing, parsing, semantic analysis, symbol resolution, and code generation.&lt;/p&gt;

&lt;p&gt;Delegating the final machine code generation to mature C compilers allowed me to focus on the parts I wanted to understand.&lt;/p&gt;

&lt;p&gt;Today, FNL supports MSVC, GCC, and Clang backends and can also emit LLVM IR directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  More Than a Code Generator
&lt;/h2&gt;

&lt;p&gt;Before starting this project, I thought AI would mainly save me from writing code.&lt;/p&gt;

&lt;p&gt;It certainly did.&lt;/p&gt;

&lt;p&gt;But that turned out to be only a small part of the story.&lt;/p&gt;

&lt;p&gt;The AI did not teach me compiler design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I learned compiler design by building a compiler with the AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Knowledge mattered throughout the project.&lt;/p&gt;

&lt;p&gt;Without understanding compiler concepts, I would not have known to ask for a recursive descent parser, question a design proposal, recognise a flawed trade-off, or steer the language in a particular direction.&lt;/p&gt;

&lt;p&gt;The AI accelerated the implementation dramatically. &lt;strong&gt;It never replaced engineering judgement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If anything, this project convinced me that expertise becomes even more valuable when an AI can implement ideas almost instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where FNL Goes Next
&lt;/h2&gt;

&lt;p&gt;FNL is still a small language.&lt;/p&gt;

&lt;p&gt;There is plenty left to build.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Functions&lt;/li&gt;
&lt;li&gt;  Structs and user-defined types&lt;/li&gt;
&lt;li&gt;  Arrays&lt;/li&gt;
&lt;li&gt;  A richer standard library&lt;/li&gt;
&lt;li&gt;  A built-in linter&lt;/li&gt;
&lt;li&gt;  Better debugging support&lt;/li&gt;
&lt;li&gt;  File I/O&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One day, I also hope to reach the milestone many language designers dream about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bootstrapping.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing the FNL compiler in FNL itself.&lt;/p&gt;

&lt;p&gt;There is still a long way to go before that becomes realistic, but it gives the project a clear direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I started this project because compilers have always fascinated me.&lt;/p&gt;

&lt;p&gt;I expected to learn about lexers, parsers, ASTs, semantic analysis, and code generation.&lt;/p&gt;

&lt;p&gt;I did not expect to spend so much time thinking about Unicode, type conversions, debugger design, standard library architecture, symbol mangling, and language philosophy.&lt;/p&gt;

&lt;p&gt;Looking back, the biggest lesson was not technical.&lt;/p&gt;

&lt;p&gt;It was that AI works best as an implementation partner, not a replacement for understanding.&lt;/p&gt;

&lt;p&gt;The compiler may have been written by AI.&lt;/p&gt;

&lt;p&gt;The language was shaped one engineering decision at a time.&lt;/p&gt;

&lt;p&gt;If you are interested in compilers or language design, I hope you find FNL as enjoyable to follow as I found it to build. The source code and example programs are available in the project's Git repository, and I would be happy to hear your thoughts or suggestions.&lt;/p&gt;

&lt;p&gt;If this project sparked your curiosity, you're welcome to explore &lt;a href="https://github.com/farzanhajian/fnl/" rel="noopener noreferrer"&gt;the source code on GitHub&lt;/a&gt;. The repository contains everything related to FNL, including the compiler itself, the example programs, and the design notes that document its evolution.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;examples&lt;/code&gt; folder contains sample FNL programs, while &lt;code&gt;PROJECT_NOTES.md&lt;/code&gt; covers the technical aspects of the compiler, including the language's reference grammar in both BNF and EBNF notations. If you're interested in how many of the design decisions came about, &lt;code&gt;FNL_R_AND_D.md&lt;/code&gt; is a journal generated from my conversations with the AI throughout the project.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programminglanguages</category>
      <category>softwareengineering</category>
      <category>compilerdesign</category>
    </item>
    <item>
      <title>No, You Don’t Become a Senior Developer Just by Writing More Code</title>
      <dc:creator>Farzan Hajian</dc:creator>
      <pubDate>Fri, 07 Nov 2025 14:13:07 +0000</pubDate>
      <link>https://dev.to/farzanhajian/no-you-dont-become-a-senior-developer-just-by-writing-more-code-h62</link>
      <guid>https://dev.to/farzanhajian/no-you-dont-become-a-senior-developer-just-by-writing-more-code-h62</guid>
      <description>&lt;p&gt;Looking back on my journey as a software developer, I can see how much my approach to work and my way of thinking have evolved. When I started, I believed that becoming a senior developer was all about writing more code, mastering frameworks, and knowing every technical detail. Over time, I realized that while technical skill is essential, it’s only part of the story. True growth comes from how you think, communicate, and approach problems — understanding people, systems, and business, not just syntax.&lt;/p&gt;

&lt;h3&gt;
  
  
  Communication Is More Than Talking Tech
&lt;/h3&gt;

&lt;p&gt;One of the biggest shifts I noticed as I progressed in my career was a change in how I communicate. Early on, I used to talk mostly in technical language, assuming everyone would follow along. I quickly realized that this approach didn’t work with non-technical people, such as clients, stakeholders, or team members from other domains.&lt;/p&gt;

&lt;p&gt;Over time, I learned that the key is not expecting others to adapt to my language, but adapting my language to bridge the gap between the technical and non-technical worlds. Now, I can translate complex technical ideas into terms that make sense to clients and stakeholders, and also bring their perspectives back to the team in a way that helps us make better decisions. Bridging these two worlds has made my work far more effective and impactful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seeing the Bigger Picture
&lt;/h3&gt;

&lt;p&gt;As I gained experience, I realized that being a senior developer isn’t just about completing the tasks in front of you. Early in my career, I focused almost exclusively on the work assigned to me. Over time, I began asking myself questions like: Could this new feature break existing functionality? Did this user story conflict with an older one?&lt;/p&gt;

&lt;p&gt;This broader perspective also extends beyond the technical side. I started considering the business impact of my work. Every feature isn’t just code; it’s a solution created for users and a step toward solving a larger business problem. Understanding that my role isn’t just to implement tasks, but to ensure user satisfaction and business value, has fundamentally changed how I approach development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making a Meaningful Impact
&lt;/h3&gt;

&lt;p&gt;With experience comes trust. Over time, I noticed that colleagues and clients began coming to me for guidance — not just on technical problems, but also on decisions and challenges that go beyond code. Being a senior developer isn’t about simply doing what you’re told; it’s about contributing useful opinions, questioning assumptions, and guiding others toward better solutions.&lt;/p&gt;

&lt;p&gt;One of the most rewarding aspects of this role is being able to spot what others might overlook. Even clients who are experts in their domain can miss niche conditions or edge cases. I’ve found myself reminding clients about these subtle details, helping them avoid pitfalls before they arise. Making this kind of impact — on the team, the project, and even the client — is one of the defining aspects of senior-level work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solving Problems, Not Chasing Trends
&lt;/h3&gt;

&lt;p&gt;Another shift I noticed as I grew was in how I approach problem-solving. Early in my career, I often felt pressure to use the latest frameworks or technologies simply because they were “modern.” Over time, I realized that solving the problem effectively is far more important than following trends.&lt;/p&gt;

&lt;p&gt;Sometimes the best solution is a simple desktop application, even in an era dominated by cloud services and microservices. Legacy systems aren’t outdated just because they aren’t flashy; they often support the parts of the business that generate real value. Understanding when to embrace new technologies — and when to rely on proven approaches — is a key part of being a senior developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing Thoughts
&lt;/h3&gt;

&lt;p&gt;Finally, one of the most important lessons I’ve learned is the value of self-awareness. As a senior developer, you come to understand what you know — and what you don’t. Early on, I used to try to learn everything at once, thinking that I needed to master every technology or concept. Now, I’ve realized that it’s not about knowing everything from the start; it’s about knowing how to learn what’s needed, when it’s needed.&lt;/p&gt;

&lt;p&gt;This awareness brings confidence and focus. It allows you to tackle challenges methodically, seek help when appropriate, and continue growing without feeling overwhelmed. Self-awareness, combined with experience and judgment, is what enables a senior developer to be both effective and reliable.&lt;/p&gt;

&lt;p&gt;Becoming a senior developer is a journey — one that’s shaped not by code alone, but by the way you think, communicate, and approach challenges. I’d love to hear your experiences and reflections on growth in software development.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>codinglife</category>
      <category>growthmindset</category>
      <category>seniordeveloper</category>
    </item>
  </channel>
</rss>
