[{"data":1,"prerenderedAt":438},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fread-the-source":204,"\u002Fblog\u002Fread-the-source-surround":433},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":121,"authors":206,"badge":212,"body":214,"date":422,"description":423,"extension":424,"image":425,"meta":428,"navigation":429,"path":122,"seo":430,"status":431,"stem":123,"__hash__":432},"posts\u002F2.blog\u002F20251010.read-the-source.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"Development",{"type":215,"value":216,"toc":410},"minimark",[217,229,232,237,240,243,246,250,253,260,273,279,282,285,289,292,295,298,301,304,308,311,317,323,329,332,336,339,365,368,372,375,378,381,385,388,391,395,398,401,404,407],[218,219,220,221,228],"p",{},"I wasted three hours last week fighting with a ",[222,223,227],"a",{"href":224,"rel":225},"https:\u002F\u002Fstrandsagents.com\u002F",[226],"nofollow","Strands"," hook that \"wasn't working right.\" The tutorial said to do X, the Stack Overflow answer said to do Y, and my code was doing neither. Finally, in frustration, I asked Claude and it just directly looked in the module source code.",[218,230,231],{},"This keeps happening. We reach for the filtered interpretation - the blog post, the video tutorial, the Medium article - when the actual source is sitting right there, written by people who understand it deeply and have every incentive to teach it clearly.",[233,234,236],"h2",{"id":235},"the-tutorial-tax","The Tutorial Tax",[218,238,239],{},"Here's the thing about most technical tutorials: they're written by someone who just learned the thing themselves. They're filtering their incomplete understanding through their specific use case, adding their own interpretations, and often getting crucial details wrong.",[218,241,242],{},"The academic equivalent is even worse. Someone writes a groundbreaking paper on transformer architecture. It's freely available, written by the researchers themselves, with all the context and reasoning. But instead of reading that 12-page paper, we watch a 10-minute YouTube video where someone who read the paper explains it to us, adding their own confusion along the way.",[218,244,245],{},"We're learning through telephone. Every degree of separation adds noise and removes signal.",[233,247,249],{"id":248},"working-backwards-to-primary-sources","Working Backwards to Primary Sources",[218,251,252],{},"So I think one of the advantages of using Claude is that it can read the source code directly.",[218,254,255,259],{},[256,257,258],"strong",{},"Find the primary source",":",[261,262,263,267,270],"ul",{},[264,265,266],"li",{},"OAuth 2.0 spec from the IETF (the people who designed it)",[264,268,269],{},"GitHub's OAuth documentation (the people who implemented it)",[264,271,272],{},"The library source code!",[218,274,275,278],{},[256,276,277],{},"Skip everything else initially",": If you see a tutorial, use that as a signal of what source code and documentation to read. Those come later if I need specific implementation examples, but they're supplements, not starting points.",[218,280,281],{},"This approach feels harder at first. Specs and official docs are dense. They're comprehensive. They assume a certain level of knowledge. But here's what I've learned over 25 years: that initial difficulty saves exponential time later.",[218,283,284],{},"The spec tells me why things work the way they do. The official docs tell me the intended use case. The source code shows me exactly what's happening. When I hit a problem, I know where to look because I understand the foundation.",[233,286,288],{"id":287},"the-rtfm-renaissance","The RTFM Renaissance",[218,290,291],{},"\"Read The Fucking Manual\" got a bad reputation. It became a dismissive way to shut down questions. But the underlying principle is sound: the manual exists for a reason.",[218,293,294],{},"Modern documentation is often excellent. The Rust book is a masterclass in teaching a complex language. The Anthropic API documentation (yes, I work with Claude a lot) is clear about capabilities and limitations.",[218,296,297],{},"These aren't dusty PDF manuals written by technical writers who never used the product. These are living documents, maintained by the teams building the tools, updated constantly, with examples and explanations written for developers like us.",[218,299,300],{},"When the Nuxt team releases a new feature, they document it. When the Vue team changes reactivity behavior, they explain why. When a library author adds a method, they describe the use case. This is first-hand knowledge from the people who made the decisions.",[218,302,303],{},"Compare that to a blog post from twelve months ago that might be outdated, might have misunderstood the feature, and definitely doesn't have the context of why things are designed that way.",[233,305,307],{"id":306},"the-three-tier-source-hierarchy","The Three-Tier Source Hierarchy",[218,309,310],{},"Not all sources are equal. When I need to learn something, I work through this hierarchy:",[218,312,313,316],{},[256,314,315],{},"Tier 1 - The Creators",": Official documentation, academic papers from the researchers, technical specifications from the standards bodies, source code comments from the library authors. This is as close as you can get to understanding the original intent.",[218,318,319,322],{},[256,320,321],{},"Tier 2 - Curated Interpretation",": Official tutorials, first-party examples, documentation from the team that built it. Still authoritative, but one step removed from the core design decisions.",[218,324,325,328],{},[256,326,327],{},"Tier 3 - Community Knowledge",": Blog posts, Stack Overflow answers, third-party tutorials, YouTube videos. Useful for specific problems and alternative perspectives, but never the starting point.",[218,330,331],{},"The pattern: start at Tier 1, drop to Tier 2 for practical examples, only hit Tier 3 when you need to see how others solved specific edge cases.",[233,333,335],{"id":334},"what-this-looks-like-in-practice","What This Looks Like in Practice",[218,337,338],{},"I wanted to understand how MCP (Model Context Protocol) works. The pattern:",[340,341,342,356,359,362],"ol",{},[264,343,344,345,350,351],{},"Read the ",[222,346,349],{"href":347,"rel":348},"https:\u002F\u002Fspec.modelcontextprotocol.io\u002F",[226],"specification"," written by Anthropic ",[222,352,355],{"href":353,"rel":354},"https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fmodel-context-protocol",[226],"who designed it",[264,357,358],{},"Study the TypeScript SDK source code to see the actual implementation",[264,360,361],{},"Look at official example servers to see intended patterns",[264,363,364],{},"Only then look at community implementations to see creative approaches",[218,366,367],{},"Another example: when TypeScript 5.0 added decorators, I didn't search for \"TypeScript decorators tutorial.\" I read the TypeScript release notes, read the decorator proposal, and looked at the test cases in the TypeScript repo. Done. No confusion about which decorator syntax, no outdated patterns, no wondering if the tutorial is correct.",[233,369,371],{"id":370},"the-compound-effect","The Compound Effect",[218,373,374],{},"This approach compounds. When you learn from primary sources, you build a mental model of how things actually work. The next time you encounter that library, framework, or pattern, you understand it at a deeper level.",[218,376,377],{},"You also get better at reading dense technical material. Specs become easier. Academic papers become approachable. Source code becomes readable. These are skills that multiply across every technology you touch.",[218,379,380],{},"And crucially: you learn to trust yourself. You don't need someone to interpret the documentation for you. You can read it, understand it, and implement it directly. That independence is worth far more than saving an hour on a tutorial.",[233,382,384],{"id":383},"when-to-break-the-rule","When to Break the Rule",[218,386,387],{},"I'm not absolutist about this. Sometimes you need a tutorial. Sometimes a blog post explains the context that makes everything click. Sometimes a Stack Overflow answer saves hours of debugging.",[218,389,390],{},"But those should be supplements to primary sources, not replacements for them. Read the docs first, then find the tutorial that fills in your specific gap. Read the paper first, then watch the explainer video. Understand the source first, then see how others applied it.",[233,392,394],{"id":393},"the-bottom-line","The Bottom Line",[218,396,397],{},"This is the pattern I keep coming back to: learn from the people closest to the source. The library authors want you to succeed. The researchers want you to understand. The spec writers want you to implement correctly.",[218,399,400],{},"They've done the work of distilling complex topics into documentation. They've anticipated your questions, provided examples, and likely explained the reasoning.",[218,402,403],{},"All we have to do is read it.",[218,405,406],{},"Next time you're about to search for a tutorial, try this instead: open the official docs. Read the getting started guide. Look at the API reference. Read the source code if you need to. Give the people who built the thing a chance to teach it to you directly.",[218,408,409],{},"You might be surprised how much clearer everything becomes when you cut out the middleman.",{"title":411,"searchDepth":412,"depth":412,"links":413},"",2,[414,415,416,417,418,419,420,421],{"id":235,"depth":412,"text":236},{"id":248,"depth":412,"text":249},{"id":287,"depth":412,"text":288},{"id":306,"depth":412,"text":307},{"id":334,"depth":412,"text":335},{"id":370,"depth":412,"text":371},{"id":383,"depth":412,"text":384},{"id":393,"depth":412,"text":394},"2025-10-10","Stop learning from tutorials. Start with the people who actually want to teach you - the library authors, researchers, and spec writers.","md",{"src":426,"alt":427},"\u002Fimages\u002Fblog\u002F20251011-0330-read-the-source.png","A developer's workspace from a cinematic side angle showing two monitors side by side, the left monitor displaying an open manual with \"The F***ing Manual\" visible at the top, the right monitor showing clean source code being actively written, with a glowing golden light connecting the two screens. A notepad with \"Notes\" written on it lies between the monitors, bathed in warm light. Faded, scattered papers and a dimmed tablet showing blog posts lie pushed to the far edges in shadow. Dramatic lighting with warm spotlight on the two monitors and notepad, cool blue ambient light in the background. Photo realistic, professional photography quality, 8k detail, shallow depth of field focusing on the connected monitors, cinematic color grading with teal and orange tones.",{},true,{"title":121,"description":423},"published","5HyXQUtjhn33upFP4RoCYEv1PCL7Svc5vBv8qkjL2D0",[434,436],{"title":117,"path":118,"stem":119,"description":435,"status":431,"children":-1},"How building tools for Last Epoch lets me combine software development, gaming, and guilt-free relaxation into one satisfying loop.",{"title":125,"path":126,"stem":127,"description":437,"status":431,"children":-1},"AI capabilities are advancing faster than we can internalize. Here's why the next phase of development will look radically different.",1776221196452]