{"id":301,"date":"2026-09-12T18:18:20","date_gmt":"2026-09-12T18:18:20","guid":{"rendered":"https:\/\/subashselvaraj.com\/?p=301"},"modified":"2026-09-12T18:55:44","modified_gmt":"2026-09-12T18:55:44","slug":"you-already-know-how-to-code-stop-learning-every-language-from-scratch","status":"publish","type":"post","link":"https:\/\/subashselvaraj.com\/index.php\/2026\/09\/12\/you-already-know-how-to-code-stop-learning-every-language-from-scratch\/","title":{"rendered":"You Already Know How to Code. Stop Learning Every Language From Scratch"},"content":{"rendered":"\n<h2>Cognate.dev, and why experienced developers deserve a better starting point<\/h2>\n\n\n\n<p>Here is a frustration every experienced developer eventually hits: you already know how to program. You have built real things. You understand what a class is, what a promise is, why you would reach for a hash map instead of an array. And yet every time you try to pick up a new language, the tutorial in front of you opens with &#8220;a variable is a container that stores a value.&#8221;<\/p>\n\n\n\n<p>There is a better way to do this. Instead of re-learning programming dressed in new syntax, you need a translation layer \u2014 <em>here is the concept you already know, here is how it is expressed in this language, and here is the handful of ideas that are genuinely new.<\/em> That is the entire gap. Most tutorials don&#8217;t close it because they are not built for people who already know how to code.<\/p>\n\n\n\n<p><strong>Cognate.dev<\/strong> is built for exactly that.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>The idea in one line<\/h3>\n\n\n\n<p>A cognate, linguistically, is a word that shares a root across two languages but shows up in a slightly different form \u2014 &#8220;actual&#8221; in English and &#8220;actual&#8221; in Spanish look almost the same and mean something subtly different. Language learners use cognates as shortcuts: recognize the pattern once, and a huge chunk of new vocabulary stops being new.<\/p>\n\n\n\n<p>Programming languages are full of the exact same thing. A <code>for<\/code> loop is a cognate. A class constructor is a cognate. <code>async<\/code>\/<code>await<\/code> is a cognate \u2014 even in cases (we&#8217;ll get to this) where what&#8217;s happening underneath is completely different. Cognate.dev exists to teach those pairs explicitly, instead of pretending you&#8217;re starting from zero.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>What you actually land on<\/h3>\n\n\n\n<p>Open the site and the landing page says exactly what it&#8217;s for, right in the first line:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><strong>Same brain, new syntax.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p>That&#8217;s not just a tagline, it&#8217;s the entire design constraint. Below it, four short promises, and I want to be honest about each one because they&#8217;re not just marketing copy \u2014 they&#8217;re commitments I had to actually build against:<\/p>\n\n\n\n<ul>\n<li><strong>Compare, don&#8217;t re-learn<\/strong> \u2014 every concept sits next to its JS counterpart. Not &#8220;here&#8217;s a new concept,&#8221; but &#8220;here&#8217;s the JS thing you already know, here&#8217;s its shape over here.&#8221;<\/li>\n\n\n\n<li><strong>Run it, don&#8217;t just read it<\/strong> \u2014 if there&#8217;s a way to actually execute code in the browser for a given language, we use it. No &#8220;trust me, this works.&#8221;<\/li>\n\n\n\n<li><strong>The gaps get flagged<\/strong> \u2014 and this one matters more than people expect.<\/li>\n\n\n\n<li><strong>Nothing to install<\/strong> \u2014 every tutorial is a static page. Open it, start.<\/li>\n<\/ul>\n\n\n\n<p>Scroll past that and you hit the actual point of the homepage: a grid of language tracks. Right now it&#8217;s honest about where things stand \u2014 Python is marked <strong>Live<\/strong>, Rust and Go are <strong>Planned<\/strong>, Java is just an <strong>Idea<\/strong> sitting there as a placeholder. I didn&#8217;t want a landing page that pretends to be more finished than it is. Each card even carries its own accent color, so as more tracks ship, the page will visually feel less like one language and more like a shelf of them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>Why &#8220;the gaps get flagged&#8221; is the part I care about most<\/h3>\n\n\n\n<p>Most comparison-based teaching material has a quiet flaw: it tries to force an analogy onto <em>everything<\/em>, and the moment the analogy breaks, the learner is quietly misled instead of helped.<\/p>\n\n\n\n<p>The Python tutorial \u2014 the first track live on the site \u2014 is built to resist that. It&#8217;s honest, repeatedly, about where the comparison stops working:<\/p>\n\n\n\n<ul>\n<li>Python&#8217;s async\/await <em>looks<\/em> like JS&#8217;s. Same keywords, similar shape. But JS has exactly one concurrency model, always running. Python has three \u2014 <code>asyncio<\/code> for I\/O, <code>threading<\/code>, <code>multiprocessing<\/code> \u2014 because of the Global Interpreter Lock, a thing with no JS analog at all. The tutorial says this outright instead of hand-waving past it.<\/li>\n\n\n\n<li>Decorators and context managers get their own dedicated sections, not because they&#8217;re hard, but because there&#8217;s genuinely no native JS syntax for either \u2014 the closest you can do in JS is a higher-order function, which isn&#8217;t quite the same shape.<\/li>\n\n\n\n<li>Even something as small as Python&#8217;s <code>try\/except\/else\/finally<\/code> gets called out for its <code>else<\/code> clause, which has no slot in JS&#8217;s <code>try\/catch\/finally<\/code> at all.<\/li>\n<\/ul>\n\n\n\n<p>I&#8217;d rather a learner walk away knowing &#8220;this one&#8217;s genuinely new, pay attention&#8221; than have them assume every new language concept has a tidy JS box to fit into.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>It&#8217;s not just reading \u2014 it runs<\/h3>\n\n\n\n<p>The thing I was most stubborn about while building this: static code samples aren&#8217;t enough. If I&#8217;m telling you &#8220;here&#8217;s how Python&#8217;s list comprehension replaces <code>.filter().map()<\/code>,&#8221; you should be able to <em>change the numbers and run it<\/em>, right there, without opening a terminal.<\/p>\n\n\n\n<p>So the Python track runs on <a href=\"https:\/\/pyodide.org\/\">Pyodide<\/a> \u2014 a real CPython interpreter compiled to WebAssembly \u2014 loaded straight from a CDN. There&#8217;s no backend anywhere in this project. Every &#8220;Try it&#8221; box you see across the syntax, data structures, functions, classes, and standard-library sections is executing actual Python in your actual browser tab. The two sections that stay comparison-only (async and data validation with Pydantic) are honest about <em>why<\/em>: those specific runtimes aren&#8217;t something Pyodide is set up to run cleanly in-browser today, so rather than fake it, those sections just don&#8217;t pretend to be interactive.<\/p>\n\n\n\n<p>There&#8217;s also a lightweight quiz after most sections and a sidebar checklist you can tick off as you go. Neither persists anywhere \u2014 no accounts, no backend, no localStorage tracking you across visits. Close the tab and it resets. That was a deliberate trade: I&#8217;d rather the whole thing stay a static file you can fork and deploy in five minutes than bolt on infrastructure just to remember your quiz score.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>What Python-from-JS actually covers<\/h3>\n\n\n\n<p>If you&#8217;re a JS developer and this is your first stop, here&#8217;s the shape of it, section by section:<\/p>\n\n\n\n<ol>\n<li><strong>Syntax speed-run<\/strong> \u2014 indentation instead of braces, f-strings instead of template literals, <code>None<\/code> instead of <code>null<\/code>\/<code>undefined<\/code>, and the truthiness trap (<code>[]<\/code> is falsy in Python, not in JS \u2014 this one gets people every time).<\/li>\n\n\n\n<li><strong>Data structures &amp; comprehensions<\/strong> \u2014 why idiomatic Python reaches for <code>[x for x in y]<\/code> before it reaches for <code>.map()<\/code>, plus generators and lazy iteration.<\/li>\n\n\n\n<li><strong>Functions<\/strong> \u2014 defaults, <code>*args<\/code>\/<code>**kwargs<\/code>, and then the two genuinely new ideas: decorators and context managers, both with a live playground to actually try.<\/li>\n\n\n\n<li><strong>Classes &amp; typing<\/strong> \u2014 explicit <code>self<\/code> instead of implicit <code>this<\/code>, multiple inheritance, and <code>Protocol<\/code> for structural typing \u2014 the closest thing Python has to a TypeScript <code>interface<\/code> used for duck-typed arguments.<\/li>\n\n\n\n<li><strong>The async model<\/strong> \u2014 where it rhymes with JS and where it very much doesn&#8217;t.<\/li>\n\n\n\n<li><strong>Errors, strings &amp; files<\/strong> \u2014 exception handling idioms, <code>pathlib<\/code>, and a tour of a standard library that&#8217;s noticeably richer than what you&#8217;re used to reaching for in Node.<\/li>\n\n\n\n<li><strong>Data validation<\/strong> \u2014 Pydantic, framed directly against <code>zod<\/code>, since that&#8217;s the fastest way for a TS developer to understand what it&#8217;s for.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3>What&#8217;s next<\/h3>\n\n\n\n<p>Python was first because it&#8217;s the most common &#8220;what&#8217;s next&#8221; for a JS developer \u2014 scripting, data work, and increasingly, the layer people build AI tooling on top of. Rust and Go are next, and I think they&#8217;ll actually be <em>more<\/em> interesting to write, not less \u2014 both diverge from JS&#8217;s execution model in ways worth teaching head-on: ownership and borrowing for Rust, goroutines and channels for Go. Java&#8217;s after that.<\/p>\n\n\n\n<p>If the whole premise is right, each new track should get easier to build, not harder. The shape stays the same \u2014 syntax, data structures, functions, typing, concurrency, and an honest accounting of what&#8217;s actually new. Only the words change.<\/p>\n\n\n\n<p><strong>Start here:<\/strong> <a href=\"https:\/\/sesubash.github.io\/cognate.dev\/python-from-js\/\">https:\/\/cognatedev.subashselvaraj.com\/<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cognate.dev, and why experienced developers deserve a better starting point Here is a frustration every experienced developer eventually hits: you already know how to program&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":303,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_mi_skip_tracking":false,"_themeisle_gutenberg_block_has_review":false},"categories":[4,40],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/301"}],"collection":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/comments?post=301"}],"version-history":[{"count":2,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/301\/revisions"}],"predecessor-version":[{"id":304,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/301\/revisions\/304"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/media\/303"}],"wp:attachment":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/media?parent=301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/categories?post=301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/tags?post=301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}