What I learned after 2 weeks using Claude Code - a writer's perspective
TechWriting

What I learned after 2 weeks using Claude Code - a writer's perspective


A Brief Foreword

This topic is fraught with danger for a human writer who does not use generative AI for writing, and one who considers himself a generally ethical person. I feel the need to justify why I decided to wade into the world of Claude Code before I get to my hot takes.  

First, and most importantly to me, I have a constant desire to see clearly how things work, what they are, what they mean. AI and its infinite variations are an important thing for humans to understand as clearly as possible. And for me, jumping into a topic and learning by doing is the only real way to understand it. So to satisfy this important need, I couldn’t see myself continuing to read nonsensical posts about both sides of the “AI will end the world” and “AI will save the world” debate. It just wasn’t doing the subject justice, no matter how cleverly worded The Atlantic’s articles might be.

Second, I looked into the electrical output of a casual vibe coder doing a weekend project - it came out to about the same amount of power per day as running a load of laundry in my washing machine. And that’s assuming I used Claude code all day every day, which of course I didn’t. So for the environmentalist in my head, this isn’t perfect, but it could be worse. And yes I know that half of the argument against GenAI tools is the massive environmental cost of electricity for the initial training - but I’m just a small user and that ship has sailed, so I can’t do much about it now aside from crusading against training future models, and I’ve yet to decide if/how that’s what I believe I should do.

Third, I’m an engineer. There’s a whole side of me that’s completely fascinated by what I found in this deep dive, and even a part of me that wanted to join the excitement of the tech bros who spend their time making lame LinkedIn posts about how amazing these tools are. (Spoiler, they’re liars but they’re not totally lying, if that makes sense). Using and understanding a beautiful machine is the most romanticized part of being an engineer, and claude code was no different. It’s a beautiful machine - that doesn’t mean it’s not destructive, problematic, and evil, but it’s undeniably beautiful.

image

And finally, but perhaps most importantly, I refuse to join the rest of the world in completely trashing nuance in favor of a bold, dramatic stance for or against something. Maybe some topics lend themselves to this kind of split, and maybe after I have the nuances I’ll have a solidly pro or con stance, but based on my current level of knowledge AI isn’t one of those topics for me right now. And even if it were, the act of disregarding nuance just to hurry up and reach a click-worthy opinion is blatantly destructive to humanity (evidence: America) and therefore not something I’m into.

I’m starting to think that generative AI can be split into two categories (and probably more once I understand more nuances): 1. GenAI that is used to communicate with humans (evil, icky) and 2. GenAI that is used to communicate with machines (maybe makes sense). Maybe this is simplistic, but I absolutely didn’t feel the same qualms about using genAI to make code as I do about people using it to “write” words that I, another human, am supposed to read. Why? I don’t know, but it just doesn’t feel wrong to use genAI to translate my human words into code. It’s translating them into code and then back into words that feels like it defeats what it means to be human and communicte properly with other humans.

Nuance is critical and rare these days. And to get the nuance of this new world of vibe coding, I needed to be a part of it.

Building an App with Claude

TLDR: I deep dive into the world of vibe coding by making a research and (human-only) writing app for myself. Hopefully it will be clarifying for my fellow non-coders and entertaining for the technical folks. ​

If it helps, hink of this article like a vice news piece. I’m going undercover, trying to blend in with a group so well they entrust me with their secrets and I can tell a story from inside the fence. AI in all its forms is too complex for me to have a split opinion about. Clearly, Generative AI replacing human writing, art, music, or whatever is despicable. No arguments exist that make me think differently about that. But what about genAI’s proficiency at coding? Or generating protein structure candidates? I don’t know how I feel about those because code and protein structures aren’t meaningful to me. I read a piece recently that claimed coders love genAI and coding tools because it takes away the drudgery part of their jobs (writing code) to let them focus on the creative and fun part (creating and dating programs, functions, concepts, etc). But in writing, the opposite is true - the writing and the fun part, the creation of wha you want to write, are literally inseparable. I can’t get my thoughts to make sense until I write them down: that’s why I write in the first place. Outsourcing that by definition means outsourcing thinking. There’s a mismatch there, and it sucks.

I love to deep dive things when I really want to understand them clearly. That’s what the Myopic is. Lately I’ve been fascinated by all the massive buzz and discourse about vibe coding, all the doom predictions and utopic counter-visions flying around like bullets. It occurred to me that I’m pretty much the perfect candidate to be taken in by the dream of vibe coding. I’m technical enough to do some damage, but I’ve never written more than a few lines of python that one time I took a Udemy course (15% completed as of 2022, the last time I visited the page). I also have that scourge of technical people everywhere, the ultimate over confidence building degree that had led endless realms of people to think they can do shit they can’t - an MBA.

And so I became, at least for this experiment, a vibe coder.

I decided to try out Claude Code because it’s making more waves than the other apps, and since they’re all mega-polluting and run by varying levels of assholes I figured I might as well experiment with the best one. (Sorry to the environment, as I’m sure I used the equivalent of ten households worth of electricity or something like that during this experiment, but I just had to understand. Will find a way to make it up to you).

A note to the AI haters or skeptics - I’m one of you. I promise. But this is a particular work of my brain - I might be the most ardent user of the “devils advocate” method there is. I make decisions by fully inhabiting both sides, pretending I’ve made each decision and living it until I hit a wall or it feels right. This is no different - I’m diving in because I can’t understand otherwise. I love nuances, and in a world that can no longer tolerate nuances, that’s sometimes bothersome to people. But this will be a nuanced subject to matter what you believe, and I’m going in to figure out the nuances. So for this project, if it sounds like I’m becoming a AI fanboy, it’s because I kind of am inhabiting that state of mind for a while. (Insert quote about how the mark of an enlightened mind is to embrace an idea without accepting it here).

So. If I’m gonna vibe code something. It might as well be useful to me.

I landed on building a research and writing app that basically brings together all my favorite parts of the 100+ note taking and writing apps I’ve used over the years. The idea was to have one hub where I can bring in all my research (books, articles, podcasts, whatever) into one place, link it together, and easily use it for my research-based writing. It’s like a spider web to catch all my sources in one place, then use them to write my articles. There will be no AI writing involved, and the app will have strict guard rails to make it as difficult as possible for any user to use it to create AI generated writing. The point is for this app to help my brain learn and synthesize information, turn it into original writing, and do it all as frictionlessly as possible. It’ll be somewhere between Obsidian and Apple Notes, with some of my favorite features from Scrivener and Goodnotes tossed in. Plus I wanted to have a way to write nicely formatted Wordpress blog drafts offline and maybe even publish them straight from the app.

I know it’s not an earth-shattering program but I don’t really mind. I can make an app that ends up sucking ass for my own use if I want. It doesn’t have to sell a million copies. Plus if Claude Code fails me, I’ve lost nothing. And I’m not using anything that’s original IP to build this app as far as I’m aware, so it seems fine. This is just a coding class project.

I decided it would be called Dave’s Ultimate Research App (DURA). Then I googled what dura meant and I found out it often refers to the dura mater, the hard shell that protects your brain. I immediately realized that was sick as hell for a research and writing app and the resulting wave inspiration basically turned me into a hyper focused vibe coding bot for the next week or so. I was so focused I forgot to take my adderall. Go figure.

I installed Claude Code using my Mac’s terminal and felt like I’d basically become a character in Hackers overnight.

I’m no coder but I’m still an engineer, so I took what I believed to be a methodical approach. I told Claude I wanted to make a research and writing app for Mac and iOS, and I listed a bunch of the features I wanted. I told Claude to research features that would be useful in this kind of app make me a roadmap file I could read through. I went back and forth to make the roadmap into something that made sense to me (as you’ll see I didn’t exactly follow it - I basically ran rampant over the roadmap like a squirrel who also forgot its adderall, adding features willy nilly as they occurred to me, but I think my instincts were good in at least making a roadmap even if I had no clue how to follow it).

Anyway, once the roadmap was made I told Claude to start building that shit. At first my process was: 1. Go to Claude web and tell it I wanted a super detailed prompt I could paste into Claude Code that would get me the results I wanted. I had Claude quiz me on what I wanted to define the features they way I imagined a good Product Manager might, then I took the output prompt and pasted into Claude code. I told Claude code to ask questions along the way too, and this was educational if for no other reason than it taught me how freaking fast a session’s worth of tokens from my $20 Claude plan could be burned through when you give Opus a 500-line prompt.

I also, in my attempts to be the Perfect Vibe Coder, told Claude to spend inordinate amounts of time on documentation. I’m still unsure how useful this was, but I’ve stuck with it because it helps me. As I built the first draft of DURA, Claude was forced to make countless updates to the roadmap, to Claude.md (the file that tells Claude how to best serve its inexperienced and relentless master, aka me), a history file where all the stuff I made it do did would be recorded for posterity to laugh at, and more. Maybe I’ll have it do a documentation of all the documentation next.

image

Sreenshot - I’m currently drafting this article on a plane in the DURA mobile app I vibe coded in 4 days, with sync to my Mac and everything

Then we started building. Scaffolding actually, as Claude called it. I told Claude to act like I was an inexperienced programmer who needed details explained, and to give explanations for every step it took before it took them. Although this mostly led to me pressing Enter a million times to accept Claude’s next action without having a clue what it meant, it also gave me a little bit of context about what Claude (and presumably, a human coder) has to do when creating a program like this.

We worked in cycles. In the beginning I kept using Claude web to help guide my prompts to Claude code, but I quickly realized this didn’t really help the more complex the code got. If you plotted my usage on a curve it would have been increasing exponentially, and after some research (link) I learned that longer prompts, as well as long Claude.md and roadmap documents, are a contributor to this. Just like I assume human coders probably hate reading and writing documentation, Claude makes its manager pay if you make it read too much (This is an uninformed and weak joke, forgive me if it sucks. Add dumb joke forgiveness to Reader.md)

After a few cycles I had a program I could actually open on my Mac. Claude started with the basics, setting up a document viewer with a few other features I told it to put in that I thought would be simple but turned out not to be (spoiler, that seems to be how programming works. Heck that’s how all engineering works). I had it put in a few features to import articles, thinking I’d be able to just copy in all my notes from other apps and away we go.

A note on what I actually “did” when vibe coding this app. I mentioned earlier the prompting cycle I used in the beginning - this was typically effective, if slow, and I quickly learned that Claude Code worked well if I told it to ask me clarifying questions along the way to define my requirements. It did this extremely well, asking to-the-point questions based on the competing or similar apps I had it research. My “work” entailed creating the prompt for the next phase, answering Claude’s questions, and hitting Return about twenty times while Claude created code and did its magic.

Claude certainly sounds confident. And I can’t say I’ve figured out a reason to think it shouldn’t be (more on that in my conclusion).

I was able to improve the workflow a lot as I went. I learned about how to best use Claude.md, which is a file that Claude alwasy scans before starting work to see what the user’s preferences are. I also had it make more concise and clear roadmap files as the roadmap actually became clear to me, and I learned that the “simple prompt and followup questions based on Claude Code’s research” was pretty darn effective, and I dropped the extra step of having other Claude make prompots for me. I told Claude to tear apart my ideas and challenge them all the time, and for the most part that seems to have at least avoided the cringey “You’re so great, Elon” vibes of the other chat agents I’ve seen.

And now, a side note. Obviously, using Generative AI to replace human creativity in any way is reprehensible no matter how you slice or justify it. But even if you could justify it morally, there’s a serious technical limitation (the way I understand it, which is to say on a very basic level) that makes the “quality” of such “writing” difficult to judge - namely, that the quality of writing is in the eye of the human reader. That means it’s not possible to have AI “perfect” writing because there’s no definition of perfect, or even of “good enough.”

That’s not true with code. Perfect code is as difficult to make as perfect anything, I would assume, but there’s a clear and definitive test for when code is “good enough” - it compiles and does the functions it’s supposed to do. Even if it accomplishes them in weird ways and isn’t efficient and isn’t secure, code that compiles and runs has attained a provable and measurable level of “good enough-ness”. So that gives even someone like me a way to evaluate the quality of Claude’s coding - does this app basically do what I vibe-coded it to do?

I did a bunch of tests. Claude did a bunch of tests. Claude told me to do a bunch of tests which I obediently did (who’s the boss now, human?!?). There were a few bugs here and there, but the biggest burden of solving them was the fact that I had to put them into cogent words or send Claude a screenshot to figure it out for itself. Invariably, it did.

Now I don’t know how impressed to be by this, to be totally honest. But I am impressed despite not knowing in any way how hard these coding tasks actually are for a human. Claude made me a bug-free MVP of my product in about 3 days, and could have done so in 1 if I’d sprung for the Max plan instead of running out of credits every 5 hours. Every small feature I had it add worked pretty much flawlessly the first try 75% of the time. Some of the more complex features I put in didn’t fare so well, often requiring 5-6 rounds of prompts, coding, and testing to get right. But still…

image

Above: a screenshot of the DURA Mac app about 1 week into the project, which also happens to be where I’m writing this article as we speak. I’ve added way too many features in 1 week to name, and it’s been pretty fun testing them out and then complaining to my code-bot about them only to have them solved 10 minutes later.

In 1 week, I have an app that’s stable enough to write this longform article on, with images, dumb jokes, and everything. It’s built on a lot of existing frameworks, sure, but it’s also got about 18,000 lines of new code (according to Claude) supporting it at this point (I know this isn’t something to brag about, but that’s a lot of places for something small to go wrong…). Some of the cool features include Podcast snippets (takes text from a podcast and saves it for later reference), wikilinks with a knowledge map (the map doesn’t quite work becuase I don’t quite understand what it is supposed to look like, but Obsidian users sure seem to love the feature), and Cloud sync with my iphone and ipad versions of the app. I can even hand markup PDF’s on my ipad and view the notes on my mac, while adding typed inline annotations on the same PDF.

It all might sound pretty basic to you program-users out there, but each feature was build individually through a cycle of prompting-Claudeing-testing-reprompting-retesting that would take from 15 minutes to 2 hours. Of course that time doesn’t mean I was actually working hard on this program. Far from it. For the most part I was thinking of a million other zany features to throw Claude’s way to see if I could break it. And that’s how I learned how coding can be a fun and creative activity - especially when you don’t even have to do any of the hard part.

So I’m not working hard as a newly minted vibe coder. There are of course challenges I can see - to do this really well, like on a professional level, I think there’s still a ton of knowledge you’d need to get optimal results. An experienced programmer would know what order to build features in, how to set themselves up now for minimized changes later, all those engineering type decisions that undoubtedly apply to good software engineering just as much as they do to mechanical engineering. But all that being said… My vibe coded program kind of works.

Is it potentially not secure? Yeah, that seems likely. I can tell Claude all day to make my program safe, but how am I supposed to verify it succeeded without knowing what I’m doing? Well the answer is I’d hire a true expert if this was every going to be run on anything but my old macbook, but still, you can imagine some less responsible and perfect vibe coder than me pushing out programs with no regard to checking the results of Claude’s safety measures - or neglecting to even spend the tokens to have Claude work on security at all.

Is it potentially written like a third-grader with triple the lines of code needed to get hte job done? This also seems extremely likely, or at least possible. And again, I have no way to verify it. So maybe my computer’s using a little more memory and processor power to run DURA than it would if an expert had built it. I’m stuck with whatever Claude gives me, and that’s a heck of a lot of trust to have in a bot I’ve only just met. (Coder?!? I just met her!)

So, what do i think about vibe coding now?

I learned a ton during this experiment. Here’s the list, but I could go on and on.

  • I was right - it would have been utterly impossible to get any nuance on this topic without doing this exercise. My 10 loads of laundry worth of electricity usage were worth it in my book

  • The contextless world of the news makes it impossible to decide if these tools like Claude are good at coding or not. Hype-filled tech bros tell you they’re gonna save the world, news outlets tell you they’re not that useful, finance bros tell you they’re gonna take 90% of jobs and that that’s actually a good thing. After my experiment, I’ve decided that tools like Claude code are firmly in the “good at coding” camp, and that the tech bros aren’t lying when they say an experienced programmer with this tool has superpowers. I was able to make a functional app in 2 weeks or less, and that was without having done it before. So by that definition, Claude is good as SHIT. You can vibe code a dozen proof-of-concept apps in a week if you want. It’s knowing the right way to structure them for important things like scaling to a mass market that requires more knowledge, and I now personally believe the tool will be capable of solving that level of problem in a short amount of time.

  • I now think of Claude code as just another level of technical abstraction. Basic programming languages abstract computer code into human-readable characters and language, and in the same way, claude code abstracts that codea way into actual common english. You still have to set the goal, explain it clearly, and constantly monitor for going off track. So in the end, what gets built is still determined by the goal of the user - and by their interpretation of how to reach that goal. If you let a chatbot decide what to build and how to decide it’s succeeded, then by that definition claude code can succeed more times than not. But if you want it to read your mind, well, it’s obviously not there yet. But neither are human coders

  • Programming with Claude doesn’t feel anywhere near as evil (in an of itself) as writing a book with it would. Maybe that’s why coders seem to be the ones so enthusiastic about this tool - it gets rid of the writing. The key difference is that for a coder, the repetetive writing of colons and brackets and for loops or whatever is the tedious part, and therefore is good to outsource. The reason so many people, namely readers and writers, can’t grasp this is that the reading and writing are the parts that are actually enjoyable to humans, and so outsourcing that work makes absolutely no sense. The disconnect is real, but unfortunately those with the skills to keep building LLM’s are the ones in favor of them.

  • This tech is cool (to some people, in limited applications, and with massive downstream implications), but it’s not worth ruining the world over. I don’t think this needs further elaboration

I’d love to hear what you think about this article. Do you think my evaluation was fair? Anything dumb or disagreeable? Let me know in the comments! Cheers,Dave