<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Computer Science For Vibe Coders]]></title><description><![CDATA[Short weekly computer science lessons for vibe coders]]></description><link>https://compsciforvibing.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!BQzA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8ca672b-8408-4f12-aafd-37e9a28d3506_1047x1047.jpeg</url><title>Computer Science For Vibe Coders</title><link>https://compsciforvibing.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 17 Aug 2026 12:33:45 GMT</lastBuildDate><atom:link href="https://compsciforvibing.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Noah Hall]]></copyright><language><![CDATA[en-gb]]></language><webMaster><![CDATA[compsciforvibing@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[compsciforvibing@substack.com]]></itunes:email><itunes:name><![CDATA[Noah Hall]]></itunes:name></itunes:owner><itunes:author><![CDATA[Noah Hall]]></itunes:author><googleplay:owner><![CDATA[compsciforvibing@substack.com]]></googleplay:owner><googleplay:email><![CDATA[compsciforvibing@substack.com]]></googleplay:email><googleplay:author><![CDATA[Noah Hall]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Code syntax for vibe coders]]></title><description><![CDATA[And why does it matter? I built a programming language to demonstrate and show how syntax works.]]></description><link>https://compsciforvibing.substack.com/p/code-syntax-for-vibe-coders</link><guid isPermaLink="false">https://compsciforvibing.substack.com/p/code-syntax-for-vibe-coders</guid><dc:creator><![CDATA[Noah Hall]]></dc:creator><pubDate>Sat, 16 May 2026 14:21:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kx89!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>While code might look like text, code is not the same as human languages. Instead, think of code as the representation of logic. A documented version of the logic, which can be turned into data a computer can process.</p><p>The design of code requires insight into what a system does, how a language works, the performance characteristics of a runtime, and features offered by libraries. Languages which are <strong>Turing Complete</strong> are able to compute any logic, yet different languages have different specialisms. A company will use a language based on the labour available, and the niche they operate in. A low power device like a Remarkable uses C++, a low level language which has a fast runtime, but a slow compile time. The software engineer's familiarity with the language and tools affects the readability. When a software engineer is unfamiliar with the language, codebase, architecture, and the tools, they are less able to identify problems with the code.<br><br>Each language has different properties - different ways of writing code. <strong>Code is not magic, it is highly structured. Every line of code has significance, unless it is a comment or a blank line.</strong> Every line does something. Therefore, the easiest way to write reviewable code is to keep it short. Short does not mean to use variable names like "a" or "b" instead of "userEmail" or "fileName", but rather to <strong>write the minimal amount of code to solve a specific problem</strong>. Each language has a different way of solving this problem - a high level language like Python makes it easy to manage collections of data, which makes the code needed to add data to a list minimal. <br><br>Every line of code adds to the maintainable overhead of a project, increases the risk of bugs, security issues, and reduces the ability to understand what the program does.<br><br>Companies tend to standardise on the languages their developers know, even when a niche language may suit the problem space better. Using the same language as the rest of the company<strong> will give a far wider range of experts who are familiar with the best practices rather than other languages</strong>.  </p><p>But then before we get into these practices, let&#8217;s dive into the foundation of programming languages: the syntax. Every language has a different syntax, sometimes very similar, sometimes completely different. Much like animals, programming languages have taxonomy. But in a very human way, branches of programming language families often borrow ideas from completely unrelated languages.</p><h2>Designing a programming language</h2><p>To demonstrate, let&#8217;s design our own programming language. Every example here is part of the Mojie language, a language I created specifically for this blog post (with human brain and hands!)<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. Mojie has a <a href="https://mojie.digital-citizen.no/">playground here</a>, which I suggest you try out as you read the article.  There&#8217;s a link for each example, and the playground actually parses and compiles Mojie into JavaScript, Python, and English so you can compare to languages you&#8217;re familiar to<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. No AI involved, just regular human &#8220;I&#8221;. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kx89!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kx89!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 424w, https://substackcdn.com/image/fetch/$s_!kx89!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 848w, https://substackcdn.com/image/fetch/$s_!kx89!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 1272w, https://substackcdn.com/image/fetch/$s_!kx89!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kx89!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png" width="1456" height="631" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:631,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133691,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/197857179?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kx89!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 424w, https://substackcdn.com/image/fetch/$s_!kx89!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 848w, https://substackcdn.com/image/fetch/$s_!kx89!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 1272w, https://substackcdn.com/image/fetch/$s_!kx89!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e5c728-dc19-43d0-9cf7-f97963c18f84_1908x827.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Relationship between syntax</h3><p>A programming language has rules that define how logic is expressed. Where does a <em>+ </em>symbol go? When are <code>()</code> required? Each piece of syntax has a relation between every other piece: either other syntax is expected, or other syntax is not allowed. The restriction of possible syntax makes it easier for a software engineer to communicate their intended logic to both the computer, and other software engineers.</p><p>Think of it this way: in theory, books could use Wh.aaatEVER GRAMMArrrr they want. But that gets obnoxious, right? In a computer program, it&#8217;s not just obnoxious: it leads to bugs. </p><p>More on that later, but first let&#8217;s dive into our emoji programming language, Mojie.</p><h3>Strings and numbers</h3><p>The fundamentals first: strings. A string is a representation of text. Each character in the string is a visual representation of a number. For example, in ASCII, A is 65. Most people who have studied computer science will remember this, though day-to-day usage is very low. In order to separate strings from the rest of code, languages often use something that looks like quotes: <code>&#8216; &#8220; `</code>.</p><p>We&#8217;re going to use &#129525;, with our text between two just like quotes. Like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#129525;Hello world&#129525;</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#basic_string">Playground link</a></em></p><p>If we want to use two strings together (<em>concatenation), </em>let&#8217;s use a paperclip:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128206;&#129525;Hello&#129525;&#129525;world&#129525;</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#string_append">Playground link</a></em></p><p>Numbers are foundational to most programming languages, so let&#8217;s add them. Numbers are often simply expressed as digits, e.g:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">123</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#basic_number">Playground link</a></em></p><p>No fancy wrapping. But there are some important differences between number types. The above example is an integer (a whole number). A <em>floating number</em> has a decimal place, like so:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">123.99</code></pre></div><p>Different languages handle these differently - in ours, we&#8217;re only going to support integers. </p><h3>Printing and statements</h3><p>Next, we want to be able to output data somehow. Different languages have different ways of doing that, like <em>print</em>, or <em>console.log</em>. We&#8217;re going to make ours use &#128224;. Anything you write after &#128224; will be put on the screen somehow, depending on the runtime. E.g if it&#8217;s in terminal, it will show up there. in the browser, it will show up in the console.</p><p>We can use ours like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128224;&#129525;Hello world&#129525;</code></pre></div><p>To let the parser know that we&#8217;ve finished <em>statement</em>, we&#8217;re going to use &#128721;. Many programming languages use a semi-colon for this. Let&#8217;s add it to our print example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128224;&#129525;Hello world&#129525;&#128721;</code></pre></div><p>Now the compiler will know that once it reaches &#128721;, it should start a new statement.</p><p><em><a href="https://mojie.digital-citizen.no/#hello_world">Playground link</a></em></p><h3>Variables</h3><p>In order to refer to different bits of data, we need to be able to use a name a human can understand. JavaScript uses <em>let, const, and var</em> for this, but in our language, we&#8217;re going to use &#128278;.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128278; x &#128278;10 &#128721;</code></pre></div><p>We need a way to then use those variables. In most languages, you can just use the name you gave. In ours, we&#8217;re going to use &#128264;. When the code runs, &#128264; will tell the computer to look up the value that a variable points to. </p><p>Like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128224;&#128264; x &#128264; &#128721;</code></pre></div><p>will print <code>10</code>, as we set the variable name <code>x</code> to point to the value <code>10</code>.</p><p><em><a href="https://mojie.digital-citizen.no/#variables">Playground link</a></em></p><h3>Conditionals, ifs, thens, and elses</h3><p>Next, we need to be able to compare two values and do different branches of logic if they are the same, or if they are different. These are called conditionals, and normally use <em>if</em> and <em>else</em>.</p><p>In our language, it looks like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128278; x &#128278;10 &#128721;
&#10067; &#128264; x &#128264; 5
    &#128077;&#128224;&#129525;x is equal to  5&#129525;
    &#128078;&#128224;&#129525;x is not equal to 5&#129525;
&#128721;</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#conditional">Playground link</a></em></p><p>Notice that each branch in the conditional <em>doesn&#8217;t</em> end with a &#128721;, only the entire conditional. In our language, a conditional is an <em>expression</em> - a set of logic that returns a value. Therefore we think of the entire conditional block as a single statement, so we only need a &#128721; after the conditional has finished. One side effect of this is that every conditional statement must have both a &#128077; and a &#128078; - a then and an else.</p><p>To visually group logic, we use indentation to make it easier to read. In our conditionals, we indent before the <code>then</code> (&#128077;) and the <code>else</code> (&#128078;). But in our language, whitespace is optional. The above is the same as</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128278; x &#128278;10 &#128721;&#10067; &#128264; x &#128264; 5 &#128077;&#128224;&#129525;x is equal to  5&#129525; &#128078;&#128224;&#129525;x is not equal to 5&#129525;&#128721;</code></pre></div><p>But since we want other people (or generative AI) to read our code, we don&#8217;t write code like this. Be nice to your colleagues!</p><h3>Functions</h3><p>Often, we want to group together bits of logic. We call these functions, routines, methods, or procedures. To make functions reusable, they often take arguments or parameters - bits of data that can be used in that function.</p><p>For example, in our language, we&#8217;ll take an argument called name, and say hi to the name we&#8217;re given.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128295;say hi&#128295;
    &#128203; name &#128203;
    &#128224;&#128206; &#129525;Hi there &#129525; &#128264; name &#128264;
&#128721;</code></pre></div><p>Now we need a way to use this function - otherwise known as calling the function, or invoking the function. We need to separate the arguments, which we&#8217;ll use &#129436; before every argument.. We&#8217;ll use &#129520; to look up the function we want to call:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#129520;say hi&#129520;&#129436;&#129525;noah&#129525; &#128721;
&#129520;say hi&#129520;&#129436;&#129525;tom&#129525; &#128721;</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#function">Playground link</a></em></p><p>Which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi there noah
Hi there tom</code></pre></div><p>Runtimes often include a minimal set of functions. In our language, we include some basic mathematics operations like add, sub, div, multi, and mod.</p><p>We can combine several of these ideas together, like this which combines a function definition with a conditional:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128295;check if noah&#128295;
    &#128203; name &#128203;
    &#10067; &#128264; name &#128264; &#129525;noah&#129525;
        &#128077;&#128224;&#129525;Hi Noah!&#129525;
        &#128078;&#128224;&#129525;You're not Noah&#129525;
&#128721;

&#129520;check if noah&#129520;&#129436;&#129525;noah&#129525; &#128721;
&#129520;check if noah&#129520;&#129436;&#129525;tom&#129525; &#128721;</code></pre></div><p>which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi Noah!
You're not Noah</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#conditional_function">Playground link</a></em></p><h3>Loops, for, while, and recursion</h3><p>What if we want to repeat something multiple times? In most languages, there&#8217;s three ways to do so: 1) for loops, 2) while loops, 3) recursion.</p><p>For-loops are used when you know how many times you might want to run a piece of logic. A variable is used to keep track of how many loops have happened, normally starting at 0. The for loop states how much to increase the variable by each loop, and when to stop.</p><p>This for loop names the variable x, which goes from 0 up to 10, increased by 1.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128257; x &#128257; &#127916; 0 &#127916; &#9995; 10 &#9995; &#128316; 1 &#128316;
    &#128224;&#128264; x &#128264;
&#128721;</code></pre></div><p>which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">0
1
2
3
4
5
6
7
8
9</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#basic_for_loop">Playground link</a></em></p><p>Notice that it didn&#8217;t print 10 - usually for loops will use x &lt; 10 , because when x starts at 0, that would be 10 iterations of the loop.</p><p>What if we want to stop the loop early? Sometimes we want to stop the loop before the variable has reached the number. We&#8217;ll use &#9940; to do that - often known as break , as it breaks the loop.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128257; x &#128257; &#127916; 0 &#127916; &#9995; 10 &#9995; &#128316; 1 &#128316;
    &#10067; &#128264; x &#128264; 5
        &#128077;&#9940;
        &#128078;&#128224;&#128264; x &#128264;
&#128721;

&#128224;&#128206; &#129525;Exited the loop when x was &#129525; &#128264; x &#128264; &#128721;</code></pre></div><p>will print:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">0
1
2
3
4
Exited the loop when x was 5</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#for_loop">Playground link</a></em></p><p>When x was 5, the condition was true, leading to the for-loop breaking.</p><p><em>while</em> loops are often used when there is not a specific end to a loop. We&#8217;ll make our while loop infinitely loop, and call it :loop:. In this case, we&#8217;ll want to break the loop when we reach 10, so we&#8217;ll need to keep track of the variables ourselves. In this case, <em>add</em> is a runtime-defined function which will return the sum of two arguments. Like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128278; x &#128278;0 &#128721;

&#10175;
    &#10067; &#128264; x &#128264; 10
        &#128077;&#9940;
        &#128078;&#128278; x &#128278;&#129520;add&#129520;&#129436;&#128264; x &#128264;&#129436;1
&#128721;

&#128224;&#128206; &#129525;The loop finished when x was: &#129525; &#128264; x &#128264; &#128721;
</code></pre></div><p>which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">The loop finished when x was: 10</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#while_loop">Playground link</a></em></p><p>So far, all our functions and loops have done one thing. What if we want to do multiple things in a single function? In our language, we&#8217;ll use &#129692; to say &#8220;there is another thing to do on the next line&#8221;, like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128295;check if noah&#128295;
    &#128203; name &#128203;
    &#10067; &#128264; name &#128264; &#129525;noah&#129525;
        &#128077;&#128224;&#129525;Hi Noah!&#129525;
        &#128078;&#128224;&#129525;You're not Noah&#129525;&#129692;
    &#128224;&#129525;Yay&#129525;
&#128721;

&#129520;check if noah&#129520;&#129436;&#129525;noah&#129525; &#128721;
&#129520;check if noah&#129520;&#129436;&#129525;tom&#129525; &#128721;</code></pre></div><p>which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi Noah!
Yay
You're not Noah
Yay</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#multiple_statements">Playground link</a></em></p><h3>FizzBuzz</h3><p>A very basic typical test that programmers are given is known as FizzBuzz<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. It&#8217;s simple: for the numbers 0 to 100:</p><ul><li><p>If a number is divisble by 3, print &#8220;Fizz&#8221;</p></li><li><p>If a number is divisble by 5, print &#8220;Buzz&#8221;</p></li><li><p>If a number is divisble by both 3 and 5, print &#8220;FizzBuzz&#8221;</p></li><li><p>Otherwise, print the number</p></li></ul><p>In our language, Mojie, we can implement that with the aid of a helper function that returns a value by &#128233; - this is similar to a break, where it will end the function and return whatever value is given to &#128233;.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128295;print message&#128295;
    &#128203; x &#128203;
    &#128278; remainder when divided by 3 &#128278;&#129520;mod&#129520;&#129436;&#128264; x &#128264;&#129436;3&#129692;
    &#128278; remainder when divided by 5 &#128278;&#129520;mod&#129520;&#129436;&#128264; x &#128264;&#129436;5&#129692;
    &#128278; remainder when divided by 15 &#128278;&#129520;mod&#129520;&#129436;&#128264; x &#128264;&#129436;15&#129692;
    &#10067; &#128264; remainder when divided by 15 &#128264; 0
        &#128077;&#128233; &#129525;FizzBuzz&#129525;
        &#128078;&#129525;do nothing&#129525;&#129692;
    &#10067; &#128264; remainder when divided by 3 &#128264; 0
        &#128077;&#128233; &#129525;Fizz&#129525;
        &#128078;&#129525;do nothing&#129525;&#129692;
    &#10067; &#128264; remainder when divided by 5 &#128264; 0
        &#128077;&#128233; &#129525;Buzz&#129525;
        &#128078;&#129525;do nothing&#129525;&#129692;
    &#128233; &#128264; x &#128264;
&#128721;


&#128257; x &#128257; &#127916; 1 &#127916; &#9995; 101 &#9995; &#128316; 1 &#128316;
    &#128224;&#129520;print message&#129520;&#129436;&#128264; x &#128264;
&#128721;

</code></pre></div><p>which prints:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Jii!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Jii!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 424w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 848w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 1272w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Jii!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png" width="907" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:907,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19370,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/197857179?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8Jii!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 424w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 848w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 1272w, https://substackcdn.com/image/fetch/$s_!8Jii!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13498b32-c736-46f1-98d3-19bf31887ccb_907x431.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><a href="https://mojie.digital-citizen.no/#fizz_buzz">Playground link</a></em></p><p>Finally, recursion: a loop made by a function optionally calling itself:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&#128295;check if noah&#128295;
    &#128203; x &#128203;
    &#128278; next x &#128278;&#129520;add&#129520;&#129436;&#128264; x &#128264;&#129436;1&#129692;
    &#10067; &#128264; next x &#128264; 10
        &#128077;&#128224;&#129525;Finished at 10&#129525;
        &#128078;&#129520;check if noah&#129520;&#129436;&#128264; next x &#128264;
&#128721;

&#129520;check if noah&#129520;&#129436;0 &#128721;</code></pre></div><p>Which prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Finished at 10</code></pre></div><p><em><a href="https://mojie.digital-citizen.no/#recursive_function">Playground link</a></em></p><h2>Overall</h2><p>All the emojis in Mojie are part of the syntax. While many languages use English keywords, like for, if, or while, many also use symbols like <code>{</code>, <code>(</code>, <code>?</code>. The English keywords are there to make it easier for a human reader to understand, but there&#8217;s no requirement for the keywords to be English. Emojis are just as feasible, though not everything that is feasible is wise. Generative AI has a much smaller training base on emoji-based languages, so it&#8217;s not very good at writing Mojie.</p><p>For example:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VEnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VEnb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 424w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 848w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 1272w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VEnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png" width="600" height="155" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:155,&quot;width&quot;:600,&quot;resizeWidth&quot;:600,&quot;bytes&quot;:19170,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/197857179?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VEnb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 424w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 848w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 1272w, https://substackcdn.com/image/fetch/$s_!VEnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb570e262-acc4-4417-9e77-b0209d4f1e44_600x155.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">This is completely wrong! No closing spanner emoji, no opening loudspeaker emoji. And it only defines a function, rather than simply using <em>fax-emoji thread-emoji 5 thread-emoji. </em>Silly.  </figcaption></figure></div><p>The point: code is not the same as human language. Generative AI does not understand code, it merely searches and returns code that looks similar to the surrounding code. Whereas I&#8217;d expect most human software engineers to be able to write small Mojie programs within a day. Keep this in mind when vibe coding - don&#8217;t put too much trust into the <em>artificial</em> intelligence. You, the human, are responsible for the code you produce, regardless of the tool you use!</p><h3>Syntax makes languages deterministic</h3><p>When code runs, it is always the same. Given the same set of data, it will perform the same operations. It is <em>deterministic</em>. There are some languages which allow for <em>undefined behaviour</em>, but on the whole every time code is run, it performs in the same way. Uncertainty or confusion in behaviour leads to bugs, often security bugs. Mojie&#8217;s parser is deterministic. The syntax of programming languages makes them deterministic, in the way the language was designed.</p><p>Generative AI (LLMs) are not deterministic, they are <em>probabilistic</em>. It&#8217;s very rare to get the same output twice, given the same inputs. There is an element of inherent randomness. This is not very easy for debugging or tracing. It&#8217;s hard (or impossible) to be accountable for unpredictable content. However, you, the human, are always accountable regardless which tool you use.</p><p>It&#8217;s important to keep this in mind when you talk to software engineers: code is inherently more predictable than generative AI output. The unpredictable nature of generative AI has an impact on operations. The code it generates might be low risk some percentage of times, but the remaining percent might be high risk. </p><p>Whereas the code generated by Mojie complies with a forced structure: it will be <em>consistent</em>. Consistency is crucial in technical systems. If a bug is consistent, we can fix it. If a bug is inconsistent, it becomes exponentially more difficult to fix. Simply reproducing an inconsistent bug will take more time. It is the role of software engineering to make systems consistent. Even small inconsistencies can lead to severe damage to a system.</p><h3>What I hope you learned</h3><ol><li><p>What language syntax is, and the role each piece of syntax contributes to both the feel, and the form and function of a language.</p></li><li><p>That code is not actually the same as written human languages, it just happens to look similar.</p></li><li><p>Deterministic vs <em>probabilistic</em> impact on software bugs.</p></li></ol><p>I&#8217;d recommend for you to ask your software engineering colleagues:</p><ol><li><p>What programming languages does your workplace use?</p></li><li><p>What is the syntax it uses?</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Computer Science For Vibe Coders! Subscribe for free</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/p/code-syntax-for-vibe-coders?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://compsciforvibing.substack.com/p/code-syntax-for-vibe-coders?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Creating and writing languages is my main hobby. Mojie is uses the codebase for <a href="https://thetechenabler.substack.com/p/choose-the-right-structure-at-the">Tegan</a>, a language I made to have a lot of cool tools. So writing Mojie probably took around 5 hours. No vibing here!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>I&#8217;ll go into data structures in future. All this functionality is trivial to implement if you use the right data structures!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Historically used to separate out those who can write basic code from those who can&#8217;t.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Frontend, backend, mobile, and vibe coding]]></title><description><![CDATA[To be most effective when vibe coding, you need to know some terms to describe what you want to build.]]></description><link>https://compsciforvibing.substack.com/p/frontend-backend-and-mobile</link><guid isPermaLink="false">https://compsciforvibing.substack.com/p/frontend-backend-and-mobile</guid><pubDate>Sat, 09 May 2026 12:18:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!X0VY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be most effective when vibe coding, you need to know some terms to describe what you want to build. Is it a website? An app? Or something else entirely?</p><p>Imagine you're building a house: it's not enough to say &#8220;I want brown things connected by shiny things&#8221;. There needs to be precision: I need 12x4 beams of wood and 6cm nails. It not only helps others understand your goals, but it avoids any confusion when a delivery company drops off brown paper joined by a paperclip instead of the wood and nails you wanted.</p><p>Generative AI tools are pretty good at eventually figuring out what you want, but you save tokens by being direct. Plus, when you want to tell other humans what you made, the more accurate your terminology, the better they&#8217;ll understand. Especially if they're experts!</p><p>Broadly, you probably want to do one of four things:</p><ol><li><p>Create a new and separate website or product.</p></li><li><p>Take inspiration from a website or product that already exists, but do it differently.</p></li><li><p>Modifying something that already exists.</p></li><li><p>Automate a process.</p></li></ol><p>Of these, the easiest are 1 and 2. I'll touch on in the future 3 and 4. But let's imagine you start with no code, and no systems. The world is your oyster. You want to make something new.</p><p>The first questions questions you should ask yourself: what do you want to build? Who do you want to use it? Why do you want it? The better you can answer these questions, the better you&#8217;ll know what to prompt AI. Humans go through the same process<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. </p><p>So, to give you the right terminology: this article is all about the different categories of software projects. To make it simpler, I&#8217;ve grouped them into frontend, backend, and mobile.</p><p>Each has a different benefit, a different reason why you might want to build them. A human software engineer normally specializes in a subset of these, but not all. A chef could adapt to any cuisine, but if they work day to day with Peruvian cuisine, they&#8217;re more likely to know how to cook <em>lomo saltado</em> brilliantly rather than <em>lasagna</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MfUv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MfUv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 424w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 848w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 1272w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MfUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png" width="293" height="422.3949175824176" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2099,&quot;width&quot;:1456,&quot;resizeWidth&quot;:293,&quot;bytes&quot;:5137872,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196838383?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MfUv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 424w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 848w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 1272w, https://substackcdn.com/image/fetch/$s_!MfUv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bf0f79a-a0ec-4049-a97d-5becc03e750f_1794x2586.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Backend costs change as the amount of data they interact with, or the number of users, change</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q44F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q44F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q44F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg" width="319" height="443.66414835164835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2025,&quot;width&quot;:1456,&quot;resizeWidth&quot;:319,&quot;bytes&quot;:1713838,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196838383?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q44F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q44F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43252284-e777-4653-9d83-f729f0449e3d_1848x2570.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Generally speaking, frontend is the cheapest to both create and maintain, while also being the least complex to vibe code<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. I&#8217;d recommend to anyone vibe coding to begin with frontend.</p><h3>Frontend</h3><p><em>aka: client-side, browser code, JavaScript, web apps</em></p><p>Frontend code has several different meanings, but it usually refers to the code loaded in your browser. Servers send this code to your device, and your device runs it in the browser. The fundamental languages involved in frontend are HTML, CSS, and JavaScript<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. </p><p>When making a frontend project, there&#8217;s some some specific concerns to think about. For example, do you want to use it on a computer? Or do you want to use the website on mobile? Probably both, and modern websites are designed with both in mind. Websites are known as &#8220;responsive&#8221; if they are built to handle multiple different screen sizes. They <em>respond</em> to the screen size.</p><p>Frontend code is intentionally restricted. Since browsers run someone else&#8217;s code, your browser needs to act as a safe way to run code with restrictions. These restrictions are good: it makes browsing the web safer. Imagine if visiting a random website had the power to use your camera, microphone, or access files on your device. These require permissions. </p><p>There are additional restrictions that you might not think about, too. For example, a modern browser runs multiple tabs. Each tab has code from a different source, and can run them at the same time safely. We call this <em>sandboxing</em> - each tab is effectively given no information about the other tabs, and therefore can&#8217;t modify code or access data in other tabs. They are able to play in their own sandbox, but not get into their neighbour&#8217;s sandboxes. There are some exceptions, like Chrome Extensions, but generally tabs can&#8217;t interfere with each other.</p><p>Because of the browser restrictions, frontend-only code is typically much safer to create or deliver to users than other types of apps. Frontend code is considerably more straightforward from a software engineering perspective, too. There are still concerns, but they&#8217;re minimized. </p><p>An important thing to keep in mind: since frontend code is sent to the browser, it is possible for anyone to read the source code. For example, if your frontend JavaScript has something like:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const veryImportantPassword = "password123";</code></pre></div><p>Every user of your site will be able to see <code>password123</code>. If your idea requires any kind of password or sensitive data (like user emails), you&#8217;ll probably need a backend to prevent this scenario. Backend code isn&#8217;t accessible by your users.</p><p>Backends and frontends fit naturally together. The majority of websites have both. Frontend code without a backend is often referred to as &#8220;static site&#8221;. Static because the content is always the same.</p><h3>Backend</h3><p><em>aka server code, infrastructure, hosted code</em></p><p>Backend code refers to code that runs on a server, which talks to either other servers, frontends, or mobile and native apps. If the waiters in a restaurant are &#8220;front of house&#8221; (frontend), then the kitchen staff are &#8220;back of house&#8221; (backend). Customers (your users) interact with the waiters, and waiters talk to the kitchen staff. Rarely will a chef come to talk directly to customers without the waiter. It does happen, but it&#8217;s very rare. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X0VY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X0VY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 424w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 848w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 1272w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X0VY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png" width="613" height="341.63466915191054" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:598,&quot;width&quot;:1073,&quot;resizeWidth&quot;:613,&quot;bytes&quot;:95096,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196838383?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!X0VY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 424w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 848w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 1272w, https://substackcdn.com/image/fetch/$s_!X0VY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6ddfa97-ce17-4caf-a013-3ec33cadc8d8_1073x598.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Backend code runs on servers. Servers are powerful computers dedicated to running code all day. </p><p>Many interactions on the frontend of a modern website communicate with a backend. For example, login involves a backend. Writing in Google Docs involves a backend. Messaging a friend involves a backend.</p><p>Storing of data is usually done in a database, which is usually on a backend server. If you use tools like Supabase in the frontend code, there&#8217;s still a backend: it&#8217;s just someone else&#8217;s backend<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>.  A database is a collection of data, normally in a structured format so that it&#8217;s easy to find the data you need. Think of it like a well cared for library: the librarian knows how to find a book very effectively. Once you&#8217;ve got the book, you can read it, you could throw it away, or you could write into it. Databases do the same, and they&#8217;re very very fast. Most big companies will have servers entirely just for databases. </p><p>Servers are very good at serving static files (like HTML, JavaScript, or CSS) to many users at the same time. Since they are static, the same code can be sent to every device. Think of it this way: if you print 100 copies of the same poster and hand them out on the street, it takes a lot less time than making 100 slightly similar posters and handing them out on the street. The time to hand out remains the same (i.e sending data between the two devices), but the time to create and print each separate poster makes the process much slower. But if you&#8217;re trying to give out personalized posters, you&#8217;ll want to take the lower route because it fits your needs.</p><p>A service is considered <em>scalable</em> if it can handle a change in the number of users. Scaling up involves starting more servers. Scaling down turns down servers which are no longer needed. In the case where we need to create, print, and hand out many different posters, scaling up would involve having more people to make the posters, more printers to print the posters, or more people to handle out the posters. While scaling down would involve using less people, or less printers.</p><h3>Mobile</h3><p><em>aka apps, mobile apps, native apps</em></p><p>In some cases, you might want to make a mobile app. Mobile apps come in two different flavours: native apps and webview-based apps. Webview apps are simple to explain: imagine you took a browser (like Chrome or Safari), and turned it into a dedicated app for just one website. That app has some more privileges than a normal website, like storing data on the user&#8217;s device, sending notifications, or deeper integrations with the device, but is otherwise similar to frontend web code. Native apps are written in the native programming languages of either Android or iOS. Native apps are able to use lower level functionality than webviews, often leading to better performance or a better user experience.</p><p>Android and iOS are similar but different. Often, a software engineer would specialize in one, but not both. While many practices are shared, the typical languages and libraries are quite different. There are ways to share code between each, though it&#8217;s done infrequently. iOS talks German, and Android talks Norwegian. While they share a Germanic origin, the culture is different. But a German speaker will typically learn Norwegian quite quickly, and vice versa.</p><p>The complexity involved with mobile apps is higher than browser only code, and getting mobile apps to your users has several steps. I&#8217;ll go into mobile apps in-depth in future, along with native apps.</p><h1>Overall</h1><ul><li><p>Frontend: when you want to make a website users can interact with</p></li><li><p>Backend: when you want to store data, secrets, or give users different data</p></li><li><p>Mobile: when you want an app you can install on your phone.</p></li></ul><h2>Example prompts</h2><p>Here&#8217;s some template prompt examples you might use for each:</p><h3>Frontend</h3><blockquote><p>Make me a static website where a user can calculate the cost of a monthly ticket on Berlin&#8217;s public transport.</p></blockquote><h3>Backend</h3><blockquote><p>Make me an API that allows a user to search a database of receipes.</p></blockquote><h3>Frontend and backend</h3><blockquote><p>Make a website where users can login and store pictures so they can access or share their photo gallery with others.</p></blockquote><h2>Mobile</h2><blockquote><p>Make me a native mobile app that allows me to take notes on Android.</p></blockquote><div><hr></div><h2><strong>What I hoped you learned from this post</strong></h2><ol><li><p>The different places you&#8217;d use frontend, backend, and mobile apps.</p></li><li><p>The different concerns and costs involved in each.</p></li><li><p>What type of app to begin with (hint: frontend is easiest!)</p></li></ol><p>In the next article, I&#8217;ll be going into what exactly code is. How does it work, why does it matter, and how are programming languages different?</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Computer Science For Vibe Coders! Each week I give insight into different aspects of computer science, intended for vibe coders. Subscribe to read along!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/p/frontend-backend-and-mobile?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://compsciforvibing.substack.com/p/frontend-backend-and-mobile?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>If you don&#8217;t know what you&#8217;re building, I&#8217;ll go into the processes and tools for figuring it out in the future.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Human engineers often consider the system they know best to be least complex, because they have the experience and knowledge needed to be most effective there.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>There are many languages which can generate CSS or JavaScript, with the two most popular being Sass (CSS) and TypeScript (JavaScript). </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>In a European company, it&#8217;s important to ensure you have enterprise or legal agreements with any 3rd party companies that store your data due to laws like GDPR or other privacy and security laws.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Computer Science, Software Engineering, and Vibe Coding]]></title><description><![CDATA[Computer Science is the foundation for several different expert jobs, and in the context of vibe coding, software engineering is the most relevant.]]></description><link>https://compsciforvibing.substack.com/p/computer-science-software-engineering</link><guid isPermaLink="false">https://compsciforvibing.substack.com/p/computer-science-software-engineering</guid><dc:creator><![CDATA[Noah Hall]]></dc:creator><pubDate>Sun, 03 May 2026 14:09:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9mn5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Computer Science is the foundation for several different expert jobs, and in the context of vibe coding, software engineering is the most relevant. This post goes into the relationship between CS, software engineering, and vibe coding, and why you should care about software engineering as a vibe coder.</p><h2>Computer Science and software creation</h2><p>Computer Science degrees touch a wide range of topics, and only some of them are particularly relevant to vibe coders using Generative AI to create software. Think about it in terms of mathematics and accounting: while mathematics applies to a wide range of STEM, accounting only needs some very specific parts of maths. </p><p>While computer science is the foundation of software engineering, software engineering itself can be considered the processes and practices used to implement software. These processes and practices have been built up over the recent decades, though there is always constant change in technology. Generative AI is the most recent big change, but there&#8217;s always been changes, often quite big ones. Experienced software engineers have likely gone through multiple big, industry defining changes. </p><p>Vibe coding introduces a distinct change in the industry, but not in terms of technology. The ability to create software has always been available to anyone, but now a larger portion of non-software engineers have the ability to produce code without knowing what it does or how it works. </p><p>Software engineering is there to apply a methodological approach to computer science theory and software delivery, If someone is shipping software via vibe coding, it&#8217;s important they understand the practices enough to avoid risks or negative impact. That&#8217;s the whole premise of this blog series: leveling up knowledge to ensure that we, as a society, mitigate as many possible concerns from vibe coding while helping you achieve your goals.</p><h2>How do people get into software engineering?</h2><p>Historically, there&#8217;s been two routes into software engineering: the academic route and the self-taught route. The academic route typically would set the foundations through computer science theory, while the self-taught route tended to be more hands-on. I myself am self-taught, though I also went into academia. Those using vibe coding tools are actually quite similar to the self-taught category. </p><p>Software engineers who started in academia typically start at the foundations, learning abstract theories. Code is used to reinforce and teach those theories. Meanwhile those who are self taught typically start with code, and they learn abstract theories to reinforce the knowledge they need to unlock more code-based skills. In both cases: code is a means to an end. There is rarely a right or wrong path to take, but they require a different mindset to gain the skills and experience needed to provide value to businesses or academic research.</p><p>I&#8217;ve mapped some of the paths software engineers follow to learn in the image below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9mn5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9mn5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 424w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 848w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 1272w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9mn5!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:673,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9007737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196229356?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9mn5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 424w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 848w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 1272w, https://substackcdn.com/image/fetch/$s_!9mn5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524a8064-da05-4663-94aa-cd54b1e9d793_4000x1848.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While it might seem like Academia and Self-Taught are entirely different paths, they overlap substantially. At about 3 years into the job, the path taken to become a software engineer largely becomes irrelevant. Not completely irrelevant, but nearly unnoticeable in day-to-day work. I expect my software engineers to be able to learn any concept they need to get the job done. The number one skill I see in the most senior software engineers: the ability to learn and adapt to changing needs.</p><p>Vibe coders I&#8217;ve talked to tend to start in a couple of places:</p><ol><li><p>Their company has told them to try out vibe coding</p></li><li><p>They feel curious to try out vibe coding independently, whether for career growth or for interest.</p></li></ol><p>Like most tools, vibe coding is there to fit a use case. Understanding your end goals is vital to developing the skills you need to get there. Ask yourself: why are you curious about vibe coding? What do you want to get out of it? Is there something specific you want to do? What&#8217;s your preferred learning style: hands-on, or theoretical?</p><p>These are the first questions I ask anyone who approaches me about vibe coding, because the answers completely change in which direction I think you should go. If you&#8217;re just curious, the answer is different from if you have a specific goal in mind. To set yourself up for success, you need to reflect on what you want to achieve. </p><h2>Why software engineering?</h2><p>Like most digital industries, computer science has become a fundamental part of our daily lives. On the base level: when was the last time you interacted with a business that didn&#8217;t have a website? Beyond research, software engineering is there to provide business value. The scale of digital infrastructure provides a broader reach than traditional products, for a smaller cost. In the simplest terms: the creation, delivery, and maintenance of software provides businesses value at a lower cost than traditional, non-digital industries. A small team of developers can reach millions of people. </p><p>However, these smaller teams come with risks. The fewer people to maintain a service, the bigger the dependency on core individuals. Establishing healthy software engineering practices help minimize the risk, while providing the team the ability to deliver on business goals. Companies without healthy software engineering practices in place fall into a loop - short term practices risk the long term delivery of software. We call this <em>technical debt</em>. Every software project will have technical debt. Companies trade off <em>short term wins</em> with the long term impact of technical debt.</p><p>Think of it like keeping an apartment clean and maintained. It&#8217;s okay if the apartment has a couple of trash bags prepared and ready to be thrown anyway. But if more trash bags fill up, it affects the quality of life for those living there. It may even attract rodents or insects, which requires substantial remediation. </p><p>Software engineering principles have been established to reduce this impact. Instead of waiting to throw out the trash once there are several bags, throwing away the trash once one bag is filled makes it easier to maintain. </p><p>In other words, following software engineering practices are illustrated by the happy green person with 2 trash bags on the left, vs the unhappy person the right plagued by too much trash, rats, and flies.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KwGH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KwGH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 424w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 848w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 1272w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KwGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png" width="1107" height="616" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:616,&quot;width&quot;:1107,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72354,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196229356?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KwGH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 424w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 848w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 1272w, https://substackcdn.com/image/fetch/$s_!KwGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cbff48d-f58f-47ef-9377-6040ac799df0_1107x616.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">(tongue-in-cheek): I hope these hand drawn illustrations hit a good mix of funny and informative</figcaption></figure></div><p>While it may seem like software engineering might <em>slow down</em> development in the short term, it actually <em>speeds up</em> development in the long term, along with minimizing risk. As we walk through different concepts together, I&#8217;ll be highlighting the practices, theory, and guidelines that particularly apply to vibe coding, so that the vibes you produce &#10024; sparkle &#10024; rather than seem &#128373;&#65039; sus &#128373;&#65039;.</p><h2>What I hoped you learned from this post</h2><ol><li><p>The relationship between computer science and software engineering</p></li><li><p>Why software engineering practices are important</p></li><li><p>How vibe coding fits in with education styles software engineers have followed in the past</p></li><li><p>Self-reflection: why are you interested in vibe coding? What do you want to do with it?</p></li></ol><p>If this left you thinking &#8220;okay, I get it - let&#8217;s get into the juicy stuff&#8221;, then subscribe. The next article will be on Thursday!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://compsciforvibing.substack.com/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/p/computer-science-software-engineering?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://compsciforvibing.substack.com/p/computer-science-software-engineering?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><p>A short intro to me, for those that don&#8217;t know me: I&#8217;m Noah, I work in the biggest news media company in the Nordics. In my day job, I&#8217;m a &#8220;tech enabler&#8221;. In my volunteer roles, I&#8217;m involved with unions and open source. In my hobby projects, I design and build programming languages. I&#8217;ve been coding for over 20 years, and professionally for about 15 years. I&#8217;ve lectured at universities, I&#8217;ve spoken at many conferences, and I&#8217;m an avid writer. My biggest passion is helping people, and helping the world, to the small extent that I can. The topics in this blog series are all ones I&#8217;m deeply passionate about, since it combines my love of helping people with technology. None of these posts use AI anywhere: I hope you enjoy the human approach</p>]]></content:encoded></item><item><title><![CDATA[Announcing: Computer Science for Vibe Coders]]></title><description><![CDATA[There&#8217;s a drastic increase in people without software engineering backgrounds getting into software development via AI tools.]]></description><link>https://compsciforvibing.substack.com/p/announcing-computer-science-for-vibe</link><guid isPermaLink="false">https://compsciforvibing.substack.com/p/announcing-computer-science-for-vibe</guid><dc:creator><![CDATA[Noah Hall]]></dc:creator><pubDate>Sat, 02 May 2026 15:32:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZRiB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://compsciforvibing.substack.com/subscribe?"><span>Subscribe now</span></a></p><p>There&#8217;s a drastic increase in people without software engineering backgrounds getting into software development via AI tools. At work, I&#8217;ve been sharing weekly computer science lessons specifically for that new growing group of people. This blog will share similar lessons, with the goal of getting wider feedback from what <em>you</em> want to hear about or learn.</p><p>Each lesson will come out on Thursday, and I&#8217;ll probably mirror them to LinkedIn for reach. Long term, I&#8217;m planning to create some tests and examinations related to each article.</p><h2>Why is computer science important?</h2><p>When two groups of people meet for the first time, it&#8217;s important to set the context. What does each group want, what do they need, and what do they know? Beyond that, developing a shared glossary makes it easier to understand each other.</p><p>What does &#8220;production&#8221; actually mean? How do we build products? How do we measure the success of a code change? How do we prevent things going wrong?</p><p>All of these are part of the upcoming curriculum.</p><h2>Curriculum</h2><p>I already have posts on:</p><ul><li><p>Intro: what exactly is software engineering, computer science, and how do they relate?</p></li><li><p>Building: how do we build good codebases and products?</p></li><li><p>Performance</p></li><li><p>Security</p></li><li><p>Source control (e.g git)</p></li><li><p>Programming language theory</p></li><li><p>Metrics</p></li><li><p>Workflow management</p></li></ul><p>The curriculum will evolve as the ecosystem around vibe coding changes, and I&#8217;ll try to prioritize lessons that I think will be most valuable.</p><p>Please subscribe, and I&#8217;m really hoping to get feedback on the posts as I go. Here&#8217;s a little drawing from where I&#8217;ll be starting, but I&#8217;m gonna need a bigger piece of paper soon.</p><p>No AI will be used in any of the articles, and each article will be based on my experience as a software engineer of all kinds of levels.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZRiB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZRiB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZRiB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg" width="1456" height="673" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:673,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2478855,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://compsciforvibing.substack.com/i/196227974?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZRiB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZRiB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcbb7bd2-0a03-406b-8dc6-e4cae8b91774_4000x1848.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://compsciforvibing.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Computer Science For Vibe Coders! Subscribe for free to receive new posts</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>