<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Greg Pabian on Medium]]></title>
        <description><![CDATA[Stories by Greg Pabian on Medium]]></description>
        <link>https://medium.com/@greg-pabian?source=rss-6cd0e048711b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*4Dpg2Lye8cCK4pLmUEJGPg.png</url>
            <title>Stories by Greg Pabian on Medium</title>
            <link>https://medium.com/@greg-pabian?source=rss-6cd0e048711b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 17 Jun 2026 20:07:54 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@greg-pabian/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Why will vibe-coding hurt your primary keys?]]></title>
            <link>https://levelup.gitconnected.com/why-will-vibe-coding-hurt-your-primary-keys-3d0a26240595?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/3d0a26240595</guid>
            <category><![CDATA[database]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Mon, 24 Mar 2025 14:19:17 GMT</pubDate>
            <atom:updated>2025-03-24T14:19:17.938Z</atom:updated>
            <content:encoded><![CDATA[<p>Last week, X (previously Twitter) got my attention on vibe-coding. In layman’s terms, it is about having the LLMs produce and fix code in feedback loops without the user paying attention. What could go wrong, you may ask 😎?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/1*LzKm19GzMZxDtHFtZBeoVA.png" /><figcaption>When in doubt, I ask ChatGPT for unbiased information. Are you surprised it replied with 3/10?</figcaption></figure><p>Later that day, I learned of a non-technical person crafting a product using only LLMs. Hearing they got hacked did not shock me. I even saw a post where someone had overwritten a couple of months of work done by an LLM! They could have averted that whole mess had they known about <em>version control</em> 😂.</p><p>I am incredibly bullish on the LLM trend. Leveraging different LLMs in distinct scenarios is the new literacy. Getting the most out of them requires concrete knowledge. And understanding what you <strong>do not know</strong> is <em>crucial</em>!</p><p>This story shows the pitfalls of vibe-coding with primary keys.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7NiINV9FXMivLh9T" /><figcaption>Photo by <a href="https://unsplash.com/@jayrheike?utm_source=medium&amp;utm_medium=referral">Jay Heike</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>The Task</h3><p>Let’s start with a simple task.</p><p>Imagine we need to build a system for managing monthly passes for a public transport company. We will vibe-code an MVP based on some initial agreement. We will rework the MVP once we have agreed upon additional requirements. I am sure some of you have gone through similar processes many times 🤓.</p><p>If you are interested in my other story regarding a different transport problem, you can take a look here:</p><p><a href="https://levelup.gitconnected.com/engineers-notes-qr-codes-stress-free-travel-d1b6c048b80c">Engineer’s Notes: QR Codes &amp; Stress-Free Travel</a></p><p>I put the following prompt into two distinct LLMs with reasoning. Let’s call them LLM A and LLM B.</p><p><em>I am designing a distributed system for managing monthly passes for a public transport company. Can you prepare the database skeleton using SQL?</em></p><p>LLM A provided primary keys with the <em>serial</em> pseudo type, while the other proposed the <em>integer</em> type with automatic incrementation.</p><pre>-- the response from the LLM A only, edited for brevity<br>CREATE TABLE Customers (<br>    customer_id SERIAL PRIMARY KEY<br>    -- other fields<br>);<br><br>CREATE TABLE MonthlyPasses (<br>    pass_id SERIAL PRIMARY KEY,<br>    customer_id INT NOT NULL,<br>    -- other fields<br>    FOREIGN KEY (customer_id)<br>        REFERENCES Customers(customer_id)<br>);<br><br>CREATE TABLE Transactions (<br>    transaction_id SERIAL PRIMARY KEY,<br>    pass_id INT NOT NULL,<br>    -- other fields<br>    FOREIGN KEY (pass_id)<br>        REFERENCES MonthlyPasses(pass_id)<br>);</pre><p>First of all, what’s the difference? There is no one SQL standard; the language has different flavors! From all the flavors, LLM A implicitly decided to use PostgreSQL, LLM B didn’t, and I chose to be salty about them 😤.</p><p>The serial pseudo type enforces a sequence of natural numbers without zero. However, the Postgres maintainers seem to have deprecated it in favor of the <em>identity columns</em>.</p><p>So, the LLMs proposed solutions with sequenced integers. Do I agree with them?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*OmExH3jA5D5m8CA0" /><figcaption>Photo by <a href="https://unsplash.com/@dpascoa?utm_source=medium&amp;utm_medium=referral">Daniel Páscoa</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>No, I don’t!</p><p>The solutions would work, but they wouldn’t be efficient long-term when the system grows in users and needs to rely on standard properties of distributed systems 🤷‍♂️.</p><h3>Why am I not happy with sequenced integers?</h3><p>Firstly, if someone registers as a user and receives an ID of 1234, they know the company has that many customers. For a public transport company, this might be acceptable. After all, not all customers pay for their monthly passes every month.</p><p>However, knowing the ID of a recently purchased monthly pass might give off the presumed revenue! Access to such information in real-time might not be permissible even for a public transport company.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Gtsq26cHtxcy5CRu" /><figcaption>Photo by <a href="https://unsplash.com/@tinaflour?utm_source=medium&amp;utm_medium=referral">Kristina Flour</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Secondly, someone can peek at previously registered users with sequenced integers as IDs. It usually means accessing data by exploiting vulnerabilities; knowing IDs beforehand makes it easier.</p><p>In my experience, transactions that incremented the sequence but otherwise failed do not restore that sequence during the rollback 🥲! This results in tables full of gaps, where you might think someone has removed some rows, while in reality, they were <em>never</em> there!</p><p>Additionally, you would need to wait for the database to give you the entity ID. If your business logic relies on subsequent operations with that ID, you cannot execute them in parallel.</p><p>For instance, if you register a user, you cannot immediately write their user photo into external storage under a fixed path containing the user ID without knowing it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/468/1*Jkpc5PHPUJ97FTACD7AWmg.png" /><figcaption>A diagram showing user registration. Created using PlantUML.</figcaption></figure><p>What happens if you accidentally send multiple requests with the same request body? Without locking mechanics or additional DB constraints, you could create duplicate users, monthly passes, etc.</p><p>While operating on sequenced numbers, you cannot tell if a particular ID corresponds to a user or a monthly pass because it contains no information. This creates a potential for buggy code, and I’m pretty sure LLMs would not think of this use case.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YkiF9SL_xiyAMWMI" /><figcaption>Photo by <a href="https://unsplash.com/@sammywilliams?utm_source=medium&amp;utm_medium=referral">Sander Sammy</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Furthermore, the sequences are separate from one another. You cannot prove that a monthly pass ID belongs to a particular user if you have both IDs. It might seem like overengineering, but if you can calculate proofs, you could save a lot of requests to the database!</p><p>Lastly, if you had integration tests, the IDs of entities would change upon each run, making debugging hard!</p><p>Before discussing my solutions, I want to highlight the benefits of using sequenced integers 😏.</p><p>They are short and thus easy to remember and copy, and they do not blow up the database indices.</p><h3>My solutions</h3><p>We need to make a rational decision about the chosen solution. We already know what we don’t want and why: <em>sequenced integers</em>. What topics have we not discussed?</p><h4>Idempotent IDs</h4><p>Do we want our IDs to be <em>random</em> or <em>idempotent</em>?</p><p>I usually choose <em>idempotence</em> unless I have a specific reason not to.</p><p>If we derive idempotent IDs from the data that is the source of truth, by definition, the same data sets make up identical IDs. As mentioned, this allows us to allow only one request with the same body, ensures stable tests, and enables parallel operations if they require an ID!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/494/1*iQh871BEM1RyONAlS3dvMw.png" /><figcaption>A diagram showing improved user registration. Created using PlantUML.</figcaption></figure><p>We can create idempotent IDs using hash functions. An example of such an algorithm is SHA-256 or RIPEMD-160. A considerable alternative is the UUIDv5 standard. You should decide based on realistic factors concerning at least collision space and usability. You could use LLM to understand the issues in your use case.</p><p>You must feed the algorithm with stable data, like a string or a buffer.</p><p>If you run an algorithm over a JSON, you must ensure the serializer sorts the properties. An example of a library that enforces stability is json-stable-stringify. You cannot use objects with circular references, and you should always select the minimal subset of the data that fully describes an entity! Please take a look at the exemplary code below.</p><pre>import {<br>    createHash,<br>} from &#39;node:crypto&#39;;<br><br>import stableStringify from &#39;json-stable-stringify&#39;;<br><br>const calculateHashDigest = (obj: unknown): string | null =&gt; {<br>    const s = stableStringify(obj);<br><br>    if (s === undefined) {<br>        return null;<br>    }<br><br>    return createHash(&#39;sha256&#39;)<br>        .update(s)<br>        .digest(&#39;base64url&#39;);<br>};</pre><p>For instance, a user might provide a residence address, but you shouldn’t use that to create an ID. They can change where they live at any time 😏.</p><p>In our case, I would choose <em>idempotence</em> for user and monthly pass IDs. The <em>volatile</em> entities, like transaction IDs, require some randomness.</p><h4>Random IDs</h4><p>If you need random IDs, you can generate a sequence of random bytes of a chosen length. You should determine the length by considering your use case and collision space. Alternatively, you could use UUIDv4.</p><h4>Orderable IDs</h4><p>Do we need to sort the IDs by their creation time? Or can we rely on creation timestamps written to separate columns?</p><p>Let me ponder upon the pros and cons 🤔.</p><p>If we put the creation time into the IDs, each would have to start with a few bytes indicating that time. The number of bytes depends on the chosen precisions (days, minutes, seconds). If we had a creation timestamp column, we could drop it and extract that information from the ID.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/441/1*sTcI_Do-XCgiwjfC4ya5Nw.png" /><figcaption>A visual representation of timestamp-enriched ID. Created using Excalidraw.</figcaption></figure><p>On the other hand, this pattern does not work with idempotence. I could argue that we would expose the timestamp in the ID to the outside world, but I do not see any attack vector unless we write milliseconds in. With milliseconds, we could expose the system to fingerprinting and timing attacks.</p><p>What are the industry standards for orderable IDs?</p><p>I would mention Snowflake ID and UUIDv6. Unlike other solutions, snowflakes are 64-bit integers represented as characters. UUIDv6 binds the timestamp and the machine’s MAC address together.</p><p>In our case, I would consider it for transaction IDs. However, the client should make the final decision 😉.</p><h4>Derived IDs</h4><p>Do we need to derive an ID from another ID? In other words, do we want some entities to hold IDs created from IDs of other entities?</p><p>Imagine two users asking for a monthly pass with the same configuration. If we use only the configuration to calculate idempotent pass IDs, we will have the same ID for two different passes 😑.</p><p>We have two choices:</p><ol><li>Prepend the calculated ID with the user ID and consider the pass ID.</li><li>Calculating the pass ID with the user ID fed into the hash algorithm.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/441/1*ydmp3C2pHavCF6Acx7hRUQ.png" /><figcaption>A visual representation of the first choice (prepending). Created using Excalidraw.</figcaption></figure><p>Let’s discuss the pros and cons of each solution.</p><p>If each pass ID starts with the fixed-length user ID, we don’t need to create another column and index to host the user ID. If we want to fetch passes belonging to a particular user, we can use the index associated with the primary key. We will ask for IDs starting with the user ID.</p><p>Whoever interacts with such a pass ID will immediately know to whom it belongs. Because of the design requirements, we need no additional verification if it belongs to someone 😏.</p><p>On the other hand, such an ID will occupy significantly more space than the regular one, impacting the index size and query speed.</p><p>If we require a user ID when feeding the data to calculate the pass ID, we end up with the normal-length ID. Unlike the previous solution, we have to add a column to track to whom the pass belongs.</p><p>In our case, I would require the input of other stakeholders to reach a decision.</p><h4>UUID</h4><p>You might be confused by the different versions of UUID that I mentioned in this story.</p><p>In general, all UUIDs have 128 bits represented over 36 ASCII characters. It is a design choice, you need to transform 128 bits (16 bytes) into 32 characters using hexadecimal representation. Additionally, we require four hyphens put in fixed places, growing the number of characters to 36.</p><p>For instance, the following string is a random UUIDv4:</p><p><em>27cdda48-f537–4d33–969f-d2877992d567</em></p><p>Different standards reserve different numbers of bits for encoding versions, up to 4 bits.</p><p>You could represent the same amount of information using just 22 characters with the base64url conversion, which makes me not inclined to use it 🙃.</p><p>Subjectively, the most important versions are:</p><ol><li>UUIDv4 — producing a random string,</li><li>UUIDv5 — producing a hash digest,</li><li>UUIDv6 — producing an orderable string from a timestamp and a MAC address.</li></ol><h3>My take</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XVu9S-z-MOC5IoRo" /><figcaption>Photo by <a href="https://unsplash.com/@neonbrand?utm_source=medium&amp;utm_medium=referral">Kenny Eliason</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>What I wrote in this story is not secret knowledge. I showed that there are other viable solutions when it comes to primary keys. If you had known<em> the other options existed</em>, you could have made a different LLM prompt and arrived at results similar to those I proposed 😉.</p><p>Initially, I mentioned that fundamental architectural choices may impact future refactorings. If we built the MVP with sequential integer primary keys, any paradigm changes would take a lot of time.</p><p>For instance, introducing UUID v5 fields would require changing the backend models, fixtures, parsers, and tests, not to mention schema and data migration on all environments. We would also have to change the parsers on the frontend.</p><p>If that sounds easy, you probably did not consider the opportunity costs. Even after the refactoring, the code would not wholly reap the benefits of calculating the UUID immediately on the data 😏.</p><p>If the code waited on the DB to get the entity ID to do something else, you would have to find and parallelize such spots. If the code had a locking mechanism preventing identical requests from creating many entities, you would have to make it obsolete. LLM would not help without the proper context because such code is correct. It is just not required from an architectural standpoint!</p><p>Imagine you must revise a dozen design decisions, eventually requiring rewriting the MVP 🙃.</p><h3>A better prompt</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pv7AvHyhIdTNWDGQ" /><figcaption>Photo by <a href="https://unsplash.com/@courtneycorlew?utm_source=medium&amp;utm_medium=referral">Courtney Corlew</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Can you get better results with a <em>refined</em> prompt? Yes, it doesn’t require much effort, but you must be specific about the requirements. Please check the example below.</p><p><em>I am designing a distributed system for managing monthly passes for a public transport company. Can you prepare the database skeleton using SQL? Ensure the system will scale for tens of thousands of users simultaneously. Avoid data duplication for entire rows. Remove all possible points of congestion and explain your decisions.</em></p><p>I added three sentences that provide adequate context. People without much experience would not ask to remove congestion points, as this requirement is <em>particular</em>. As you can see, informing the LLM that we are building a distributed system is insufficient.</p><pre>-- an exemplary response from the LLM, edited for brevity<br>CREATE TABLE users (<br>    user_id UUID PRIMARY KEY<br>    -- other columns<br>);<br><br>CREATE TABLE monthly_passes (<br>    pass_id UUID PRIMARY KEY,<br>    user_id UUID NOT NULL,<br>    -- other columns<br>    CONSTRAINT fk_user<br>        FOREIGN KEY (user_id)<br>        REFERENCES users(user_id)<br>);<br><br>CREATE TABLE transactions (<br>    transaction_id UUID PRIMARY KEY,<br>    user_id UUID NOT NULL,<br>    pass_id UUID,<br>    -- other columns<br>    CONSTRAINT fk_user_tx<br>        FOREIGN KEY (user_id)<br>        REFERENCES users(user_id),<br>    CONSTRAINT fk_pass_tx<br>        FOREIGN KEY (pass_id)<br>        REFERENCES monthly_passes(pass_id)<br>);</pre><p>You can run it using an LLM of your choice and see the results. In my case, I got three tables for users, monthly passes, and transactions, each with a UUID primary key. The returned rationale made sense, as the LLM stated that multiple nodes can generate such IDs independently 😎.</p><p>I hope you enjoyed reading the story, and it allowed you to see an alternative point of view on the vibe-coding phenomena. If you are interested in the nitty-gritty details of the primary keys, you can check out my other story:</p><p><a href="https://levelup.gitconnected.com/primary-keys-in-distributed-systems-b588bf17472c">Primary Keys in Distributed Systems</a></p><p>Thank you!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3d0a26240595" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/why-will-vibe-coding-hurt-your-primary-keys-3d0a26240595">Why will vibe-coding hurt your primary keys?</a> was originally published in <a href="https://levelup.gitconnected.com">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Engineer’s Notes: Archeological Sites & IT]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/engineers-notes-archeological-sites-it-597162e2d6b5?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/1542/1*F_QRdS2a0neuZU9-U3Wdhg.jpeg" width="1542"></a></p><p class="medium-feed-snippet">A software engineer discussing product design based on his vacation experiences.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/engineers-notes-archeological-sites-it-597162e2d6b5?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/engineers-notes-archeological-sites-it-597162e2d6b5?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/597162e2d6b5</guid>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[user-experience]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Mon, 24 Feb 2025 14:13:12 GMT</pubDate>
            <atom:updated>2025-02-24T14:13:12.620Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Don’t Hesitate to Try Type-safe Pipelines in Node.js!]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/dont-hesitate-to-try-type-safe-pipelines-in-node-js-dd60e0ab430c?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*njeHNKGbP5eTiste" width="5616"></a></p><p class="medium-feed-snippet">Leverage Node.js and TypeScript to ditch procedural programming in favor of behavioral descriptions.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/dont-hesitate-to-try-type-safe-pipelines-in-node-js-dd60e0ab430c?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/dont-hesitate-to-try-type-safe-pipelines-in-node-js-dd60e0ab430c?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/dd60e0ab430c</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Sun, 25 Aug 2024 15:31:47 GMT</pubDate>
            <atom:updated>2024-08-25T15:31:47.814Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Killer Design Patterns: Asynchrony of JavaScript]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/killer-design-patterns-asynchrony-of-javascript-25fc5cafc0fb?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*AQZdZZrgj0E6nYBn" width="3888"></a></p><p class="medium-feed-snippet">Upgrade your architectural skills regarding promises and streams before AI learns it on my story.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/killer-design-patterns-asynchrony-of-javascript-25fc5cafc0fb?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/killer-design-patterns-asynchrony-of-javascript-25fc5cafc0fb?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/25fc5cafc0fb</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Sun, 25 Aug 2024 15:31:41 GMT</pubDate>
            <atom:updated>2024-08-25T15:31:41.029Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How I Ship Faster with TypeScript, Schemata, and Inference]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/how-i-ship-faster-with-typescript-schemata-and-inference-20bd4dd3ff56?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*T2XSqAankrqg0OGN" width="5464"></a></p><p class="medium-feed-snippet">My ideas on faster continuous delivery by using schema libraries with TypeScript inference and LLMs.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/how-i-ship-faster-with-typescript-schemata-and-inference-20bd4dd3ff56?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/how-i-ship-faster-with-typescript-schemata-and-inference-20bd4dd3ff56?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/20bd4dd3ff56</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Tue, 18 Jun 2024 20:01:33 GMT</pubDate>
            <atom:updated>2024-06-20T10:11:01.320Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How I Reduce Type Complexity in TypeScript with 3 Clear-cut Steps]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/how-i-reduce-type-complexity-in-typescript-with-3-clear-cut-steps-00ed42593b30?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*pGrzb_oNH3I9vE2g" width="6000"></a></p><p class="medium-feed-snippet">How to use identity elements, immutable types, and minimal structures to reduce type complexity in TypeScript.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/how-i-reduce-type-complexity-in-typescript-with-3-clear-cut-steps-00ed42593b30?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/how-i-reduce-type-complexity-in-typescript-with-3-clear-cut-steps-00ed42593b30?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/00ed42593b30</guid>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[group-theory]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Sun, 28 Apr 2024 17:30:55 GMT</pubDate>
            <atom:updated>2024-05-06T16:01:45.216Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Will I use the upcoming TypeScript 5.4 features?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/will-i-use-the-upcoming-typescript-5-4-features-1dba0fad0d61?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*6WxbWrskkS5a30lv" width="5184"></a></p><p class="medium-feed-snippet">The musings of an experienced full-stack developer.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/will-i-use-the-upcoming-typescript-5-4-features-1dba0fad0d61?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/will-i-use-the-upcoming-typescript-5-4-features-1dba0fad0d61?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/1dba0fad0d61</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Tue, 20 Feb 2024 23:34:51 GMT</pubDate>
            <atom:updated>2024-02-20T23:34:51.079Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[When instanceof fails]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/when-instanceof-fails-fd25eba6267d?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*NKH0bJ0aWUNYW9-X" width="3405"></a></p><p class="medium-feed-snippet">Navigating and overcoming pitfalls with the instanceof operator and RTTI in JavaScript and TypeScript</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/when-instanceof-fails-fd25eba6267d?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/when-instanceof-fails-fd25eba6267d?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/fd25eba6267d</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Sun, 28 Jan 2024 20:23:39 GMT</pubDate>
            <atom:updated>2024-01-28T20:23:39.582Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Secrets of Type Generation in TypeScript]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/secrets-of-type-generation-in-typescript-5d74c2e9dc56?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*wJVvhqXpYFfUDkWF" width="6000"></a></p><p class="medium-feed-snippet">My learnings about type generation with code generators and TypeScript inference with examples.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/secrets-of-type-generation-in-typescript-5d74c2e9dc56?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/secrets-of-type-generation-in-typescript-5d74c2e9dc56?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/5d74c2e9dc56</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Mon, 20 Nov 2023 03:18:31 GMT</pubDate>
            <atom:updated>2023-11-20T03:18:31.902Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Curious Case of Type Inference in TypeScript]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/the-curious-case-of-type-inference-in-typescript-65d269598494?source=rss-6cd0e048711b------2"><img src="https://cdn-images-1.medium.com/max/2600/0*Ww4Vh2tOuuHsgO5e" width="3008"></a></p><p class="medium-feed-snippet">A case study on extracting parameter types from overloaded functions in TypeScript.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/the-curious-case-of-type-inference-in-typescript-65d269598494?source=rss-6cd0e048711b------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/the-curious-case-of-type-inference-in-typescript-65d269598494?source=rss-6cd0e048711b------2</link>
            <guid isPermaLink="false">https://medium.com/p/65d269598494</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Greg Pabian]]></dc:creator>
            <pubDate>Mon, 09 Oct 2023 03:13:40 GMT</pubDate>
            <atom:updated>2023-10-09T03:13:40.438Z</atom:updated>
        </item>
    </channel>
</rss>