ZAMM is now a fork of Cline that currently does nothing at all other than log all Anthropic API calls made to LangWatch.
When I started ZAMM, I wanted to make something for, well, the masses. You know, something that would ideally be useful for a lot of people other than myself, or at least something that would eventually be useful for someone other than myself. But now I’m embracing the idea of making a “home-cooked” app for myself. I am “the masses.” Even if no one else ends up using my custom tooling, every little bit I do to make my own automated life better is part of the story of how AI software development got to enter everyone’s lives — first through the hands of professionals such as myself, before surely percolating through society to eventually one day allow amateurs and even non-coders to home-cook an app to their hearts’ content. I get to experience firsthand the unfolding of this historical event in my little corner of the world.
I’m home-cooking Cline like this because I like having a good mental model of what the software development tools I’m using are doing under the hood. There is a lot of magic involved here with LLMs that even intepretability researchers have trouble explaining. That’s okay. But what present-day software development tools are doing on top of that magic is very much not magic, and I really want to peer underneath the hood to at least see how this not-magic works. Of course, I can just look at the prompt generation logic in the source code — but that doesn’t give quite as complete of a picture as simply observing the entirety of the final completed prompt. Show me what information my hardy little LLM is seeing or not seeing, so that I can better be aware of what context I need to provide it for it to do its job well.
I did the same thing to bolt.diy. As usual, my contributions to the open-source project were denied. In this case, user file edits were a janky feature that never completely worked in the first place. Any file edits you made would be saved in-memory and sent to the AI with your next chat message. But once you refreshed your browser, all edits would be lost unless the AI had happened to edit the same file you edited. As janky as this feature may have been, it had stopped working entirely by the time I cloned the repo. It turns out somebody made a merge commit that appears to have accidentally prevented the user edit data from being sent to the LLM, meaning that the LLM would be completely unaware of user edits even without a browser refresh. All the code to generate the diffs to send to the LLM were still there, they were simply vestigial code paths that were no longer being invoked. I made a quick fix to restore functionality to where it was before the mistaken merge commit, but because this functionality is shoddy, the maintainers apparently preferred it to remain completely broken instead of half-broken while they worked on a proper solution. Fair enough, it’s their repo. But between the product quality issues and the fact that it’s restricted to doing operations in the browser, bolt.diy seems a worse candidate for forking than Cline.
I’m honestly surprised that this functionality doesn’t already exist in these projects. How do these developers debug what is going on without being able to see exactly what their LLMs are doing? I don’t mean this in a negative manner of “They’re doing software development wrong,” because they’re clearly doing just fine debugging the way they’re currently debugging. Maybe it’s just that we think very differently, and my debugging tends to depend on observability. That would explain why my first projects right after I learned about LangChain back in 2023 were about recording LLM actions and visualizing them to see just what is going on and why. To me, these seemed like obviously necessary infrastructure to have on hand, but now I see that they’re merely necessary for me to develop efficiently.
Reflections on The Ceremony
The Ceremony was the most personal piece of writing I’d ever done in my life, so naturally I shared it with almost everyone I felt close to.
I shared it with friends. Their reactions spanned the entire spectrum from not even bothering to read it, to vibing with specific parts of it, to one person even feeling like they “consumed something that’s good for [their] soul.” It’s been interesting and sometimes surprising to see how much of which parts resonated with which folks.
I shared it with my sister. She didn’t really connect with it at all except for the last part about my mom. I didn’t share it with my parents because they can’t really read that much English, and besides they’d only get concerned about me ingesting poison.
I shared it with the other folks at The Ceremony. One, person said they couldn’t wait to read it. Two, people read it and lauded me for my contribution. Three, silence. It was as if The Ceremony knew exactly what I needed: just enough praise to finally get that sense of recognition I’ve been looking for my entire adult life, without it being so overwhelming that it would go straight to my ego, for something that I felt truly proud of because I had put both love and effort into it. It may not seem like much of an audience reaction for me to feel so strongly about, but I put in more of my love and care into that piece than I did into my entire stint in tertiary education, so I think it’s fair that it emotionally impacts me in this way more than my tertiary education did.
See, going through college felt like I was placed on a conveyor belt moving at a constant speed. I would be told to jump at regular intervals, and then after jumping, I’d be told “You jumped 1.2 standard deviations higher than the mean! Congratulations, that’s an A-!” or perhaps “You jumped 0.1 standard deviations below the mean. That’s a B. Try harder next time!” After four years, I finally reached the end of the conveyor belt, where I was unceremoniously dropped off as this guy hands each of us graduates a piece of paper and shoos us along, “Thank you, thank you, congratulations, thank you, next! Next!” (Not literally, that’s just how it feels in retrospect. Maybe it says more about me than it does the schooling process, but I couldn’t give a shit about the commencement speeches.) Praise was meaningless when heaped on something I wasn’t proud of myself for. As a good friend of mine says, maybe having to do a thesis for my master’s would’ve done me some good. Then again, even that would’ve probably been just another hurdle for me to leap through, except that it would’ve been a bigger and nastier one than the rest.
Some things have already changed:
-
The Fellow from The Conversation reached out to me and we have been having another interesting conversation. They pointed out that I had also taken offense during The Conversation and not just them, which I realized was true; I simply didn’t notice as much of myself at the time than I did them. Our behaviors seem to have triggered each other when we mapped the other’s actions to someone we knew from our past: for them, it was apparently overbearingly academic family members, and for me, a Flat Earther who was at some point my closest friend in Seattle. As for the actual topic of the previous Conversation, that no longer even seemed to me like the most interesting thing to talk about. I am simultaneously titillated yet mildly infuriated by their conversational style, which has me continually asking “What exactly do you mean?” and “How do you know?”
Their aloof mysticism fittingly resembles in many ways this video they sent me on “Secret Passage Theory.” The video is weird enough that I’m like, Okay I like where this is going, hit me with something loopy but grounded, like the delayed-choice quantum eraser experiment. But it always remains just vague enough to be unfalsifiable… and so I’m left wondering if the creator of this video has self-induced schizophrenia. Another friend of mine said the video reminded them of LLM hallucinations.
In my opinion, the high production value of the video makes it worth a watch regardless. It is a delectable treat that nails a certain vibe, even if you don’t believe that vibe yourself. Likewise, the cogent language used in The Fellow’s continued conversation makes it feel like a worthwhile conversation to engage in, even if I am unable to derive any personally useful metaphysical truths from it.
-
I apologized to my mom for my outburst, despite her lack of an apology to me for the childhood trauma. To be honest, I think part of that was to show myself that I’m better than her, that unlike her, I could apologize and be sorry without being apologized to first. I think that’s also a decent chunk of my motivation for learning Khmer: I can do better than my mom who spent 30 years living in the US and still doesn’t speak great English.
-
Individual conversations about our past happened in my family. I’d sent the piece to my sister, implicitly expecting her to simply find it interesting without saying anything to anyone. Instead, she talked to my dad without me realizing, and my dad called me asking me to forgive him and mom. I felt uncomfortable because I’ve never had my dad try to earnestly ask for my forgiveness before and I wasn’t prepared to be that vulnerable with him, so I sort of just shook him off with “Nah nah, it’s all right, whatever.” I felt really uncomfortable afterwards, as if I’d shared too much with the world and now change was happening that I never expected to happen.
I initially felt bad about casting my mother in a bad light for the whole world to see, but I felt better after knowing that a friend of mine with a similar upbringing could also relate to parts of that experience. I guess, as Liza says, I spoke my truth from a place of love, and sometimes it’s okay if that loving truth causes someone else to lose a bit of face.
-
Liza and I are still lovers, but are no longer in a formal relationship, which I’ll elaborate on more in a later section.
The Ceremony already feels dated, as much a product of its time as it was a product of me. Even in a literary sense, I can already see some of the ways I could’ve worded things better. But it’s a snapshot of me at a particular moment of time, and I feel like keeping it that way for now.
In the aftermath of it, I felt vulnerable like I’d never felt vulnerable before. There’s something incredibly vulnerable about letting the entire world witness my best, my very, very best. I’ve written and edited my other blog posts to a suitable degree of satisfaction, but on those ones I knew I could always do better. I held nothing back for this piece, and that meant I couldn’t do any better. This was it, this was me on display. Any critiques of it could easily feel like a critique of me; of course I knew that wasn’t the case, but it could feel like that. I reminded myself that if it got critiqued, it was because I’d finally put up something worthy of critique. And so it was:
-
The most common critique was that it was way too long. I totally acknowledge its length, but at the same time, one of my favorite works of writing on the internet is Meditations on Moloch, which is insanely long, and I suppose I enjoy taking after Scott Alexander in this regards.
That being said, I’ve been hearing this feedback ever since the blog started, so it is a useful bit of information to know in case I ever want greater mass appeal. I don’t plan on changing this aspect of my writing anytime soon because publishing more often just doesn’t feel like my style. But, I did create what I call “digestibles” — small chunks of a blog post (like this) that link back to the main post, but are small enough to be digested relatively easily.
This also allows me to link to specific topics without necessarily bringing the whole intimidating blog post into view. For example, if I want to let someone know about my software development thought process, I can now simply link them to “Sample Software Development Thought Process” without bringing in the rest of the off-topic rants.
-
There was a critique that I could’ve used “medicine” much more instead of “poison.” That’s true, but I still feel that “poison” better fits the sense of absurd mystique I wanted to convey, and though it might have been medicine for my soul, I want to respect how it was most certainly poison for my body.
-
There was a critique that the most interesting thing was not the Ceremony or the lessons learned, but how it serves as an insight into my inner life, and this friend felt that I had missed this point in my writing. I had in fact realized that this was an incredibly personal piece of writing, and I still feel that it would be obvious already without the sacrilegious act of centering myself explicitly in a piece that’s meant to be an ode of devotion to the Ceremony.
-
There was a critique that if I had submitted this to Hacker News with the title “Why I stopped using Rust” and added a little tidbit saying “And that’s why!” in the paragraph about programming, I would’ve gotten major attention and also gotten to troll everyone who read through that whole story just because they fell for the clickbait. It absolutely sounds like a great marketing strategy, but again it feels like it cheapens out the sanctity I tried to imbue it with.
-
There was a critique that one line in particular — “The whole experience was truly nothing more than a profundity simulator, a dazzling spectacle that ultimately does nil for your life” — was written in such an authoritative manner, without any qualifiers, and towards the end of the whole post as well, that it sounded as if that was the conclusion I took away from it all. This was the complete opposite of what I’d intended the reader to walk away with, so I left a comment explaining it as such. Normally, I would have no qualms about editing any other blog post after the fact, but in this case the rest of the piece was so authentically me at that particular snapshot in time that editing it feels like an inauthentic papering over of my current flaws as a writer.
There was one more uncritical observation someone made, which was that all the bodily purging seemed to viscerally ground the inebriated participant in a way that seemed fitting for the holistic theme of “seeking out one’s humanity in full.” In other words, both the profane bodily functions and the sacred mental journeys served to provide a complete and unified human experience instead of the usual mind-body distinction we make on ourselves.
Even though I personally wouldn’t choose to implement most of these suggestions even if I got to go back in time with the benefit of hindsight, I still greatly appreciate being shown these alternate visions of what the piece could’ve been. These art interactions may not have belonged inside the art object proper because it was meant to be a deeply personal contribution to the Ceremony, but they nevertheless greatly enrich my own understanding and appreciation of the art object.
And I have to say, I am ultimately unreservedly proud of it. Yeah, I tried hard, but that doesn’t mean I need to accept the label of a “try-hard.” Yeah, I’m not a professional writer, but that doesn’t mean I can’t be proud of doing what I did as a hobbyist writer. Yeah, I’m proud of it, even if it got zero comments and zero upvotes from strangers who weren’t already predisposed to look favorably at my writing. This is the first time I’ve created art I’m proud of and felt vulnerable about, and I’m proud of having taken that step. If bits and pieces of an observer’s soul could be stuck to the art object upon art contact, then this art object most definitely has an entire chunk of my soul embedded in it when I released it for the whole world to see, and I’m proud of having successfully embedded my soul in there. It is uniquely me, and that’s why different friends and even family members resonated with it in the different ways they resonate with me, and other friends failed to resonate with it because these sides of me have historically not been how we’ve connected as friends.
I am happy that I got to play around a little with the medium of digital text. The part where it says “allowing you to relive the XX of XX XXXX” is dynamically updated every day to reflect the present date in your time zone. Once 2027 rolls around, that paragraph will also include a little reference to how I wrote these words long before my dear Reader reads them. After all, why shouldn’t you be able to communicate simultaneously to different readers from different time periods? I like being self-aware about it because that’s my style, but you can also be subtle and unnoticeable about it if you’d like. Oh, and if the human population ticks up to 9 billion at some point in my life, that information can easily be encoded into the overall website. That way, this specific piece of writing can access said data from the website and update its own text without needing manual intervention. It feels like a document that’s been written and finished, but finished in a magically dynamic manner, like the Marauder’s Map in Harry Potter that was plotted just once but thereafter self-updates. I mean, I guess that’s how all released software is, but there’s something that feels special to me about doing that with hypertext that looks just like regular text.
Artistic license
The story wasn’t 100% true the way it was told. It’s perhaps 98% true. For example, I found out afterwards that the shaman seems to have actually considered each night to be its own ceremony. But I found that out after the fact, and so it was true to my perspective as an unreliable narrator at the time to have experienced The Ceremony as one big thing split across three nights.
There are also actual factual inaccuracies that deviate from how I lived it. During the first night, the kaleidoscopic visions actually came before the whole visiting every corner of the fractal sequence, but it felt harder to slot in at the beginning of that night’s narrative than at the end. Likewise, that sequence during the first night where Liza left me did happen, but when it happened that night I accepted it because I immediately got the feeling that this relationship wasn’t meant to last forever. (Because I now have the power to access emotions engendered during The Ceremony, this made the eventual actual breakup with Liza easier to accept.) I did resist the idea of breaking up, but that came the night after The Ceremony already ended, when Liza first broached that topic while sober, albeit for other stated reasons at the time. The resolution to that idea, the realization that there’s no use holding onto a dead husk of a relationship, came the morning after that. But narratively, I felt it made more sense to merge those disparate events into a single fluid one in the story, because it did not seem like a strong enough theme to survive the separation across “First Night” and “Epilogue.” Elmossy may have been a strong running theme in my personal life, but not quite so much within the confines of the story.
I did these rearrangements for narrative purposes because I felt that the exact ordering of events was a minor detail compared to what the events meant to me. Different pieces of writing serve different purposes; this was not meant to be a historical document concerned primarily with factual accuracy, but a piece aimed at getting my lived experience across in an authentic manner, and I felt that those goals could be much better achieved via minor alterations to factual truth. I now understand this to be artistic license: the right and responsibility to bend the truth in order to convey what you mean to convey by the art object, without contributing negatively to the overall balance of misinformation in the world. That is, discerning readers should not come away from this mislead about its factual veracity in a way that actually matters. I’ve heard a friend criticize the Chernobyl miniseries because it contained plenty of inaccuracies, but I personally feel that the amount of artistic license used was appropriate, and anyone deeply interested in the event due to the miniseries would naturally want to find out more about it and in the process naturally discover where art deviates from truth.
The Things They Carried is a war memoir that carries this to the extreme. It is composed entirely of false stories inspired by the author’s time in Vietnam, as if he were an LLM trained firsthand on real Vietnam War stories and thereafter generated an entire book of fiction on fake Vietnam War stories that evoke every bit of emotion the real stories would’ve evoked, but without sacrificing anyone’s anonymity in the process. But the author explicitly called this out in the book itself, so that no historian would mistakenly use this as a primary source for what literally happened, as opposed to the kind of things that literally happened.
I’ve now documented on this blog an example of the thought process that goes into coding an unexpectedly complicated feature up, or debugging a weird bug. I’m really happy that I’m also documenting my own writing process and the thoughts that go into it. It is quite like me to enjoy self-aware observation of my own actions and my own motives for those actions. I think there is value too in documenting such things for those who will never experience them, and for those who do regularly experience them but wish to compare their own processes and outputs to mine. Raising the waterline for the understanding of the craft will help lift all boats in the craft, and one way to contribute to the synthesization that leads to such understanding is by adding more data points to the pool.
Breaking up with Liza
Liza and I ended our formal relationship nearly a month ago. We’re still lovers, in the sense that we still naturally have love for each other in our hearts. That’s one thing we both realized from the Ceremony: we both can still remember and access the parts of us that loved our exes once upon a time. And why shouldn’t we honor that? So long as it does not detract from our present lives, why should it be a negative thing for there to be more love in the world rather than less? I suppose one answer to that may be that higher levels of love often come with higher levels of jealousy, and then you’re getting into utilitarianism and trying to compare how many units of love is worth one unit of jealousy. But Liza and I aren’t particularly jealous individuals, so the common stigma around exes doesn’t really resonate with us.
We may still be lovers in a certain sense, but we are no longer boyfriend-girlfriend. In the very beginning of the breakup, there were no practical differences to be found for this distinction. She told me she felt like we were naturally headed towards diverging paths for reasons unbeknownst to her, to a point where we were no longer going to be boyfriend-girlfriend. Those words had felt abstract when she first told them to me in the most loving tone possible. I’d taken the “girlfriend” label seriously in the beginning of our relationship, when I would proudly use it as a shorthand to communicate with others that they should also take us seriously. Now after close to three years of a formal relationship, I’ve grown much more secure and was willing to perhaps try experimenting with our own labels. So maybe she’s unable to explore these inner feelings of divergence right now, but we’ll naturally cross that bridge when we get to it. Except, that bridge was reached in a matter of days.
For context, we’ve been renting two separate homes in Siem Reap because that way, we could each have our own space during the day while reconnecting again every night. We could afford this arrangement because rent is only $200 a month per person, and we’re not deriving our income from working a local job getting paid under $300 a month as a college graduate. (Compare that to my time in Seattle, when rent was $1,900 for a single bedroom Wallingford apartment back in 2018 or so.) In any case, Liza wanted a night alone, which was unusual but certainly not something I minded at all. That turned into two nights and then three nights alone, without meaningful time spent together during the day either. I realized I didn’t actually want this. I’d romanticized the situation when I was discussing it romantically with Liza, but now I realized that labels aside, I didn’t actually want us to drift apart.
Did she just trick me into giving up the “boyfriend” label so that she could have an excuse to stop caring about me altogether? But I hadn’t agreed to that yet — I thought that was something we were going to discuss further when we reached that point! Flashbacks of my previous breakup came to mind, how a phase change in our communication had immediately manifested itself as soon as we’d agreed we were going to end the romantic part of the relationship. Ah, but that was not the case here. I think I’m much better at introspection and communication now than I was before, and Liza likewise is much better at communicating with me than my previous ex was. I could have the “boyfriend” label if I wanted it — it’s not like Liza particularly cared about it either — but the process of divergence was underway, and soon the label would no longer reflect underlying reality very well.
I see. I started talking to some close friends to help me process this divergence. Why did Liza want this? If she wants to explore a certain path in life, why can’t I just be a supportive background boyfriend while she does so? Even Liza couldn’t answer that question, but my friends could: there’s a certain level of dedication that’s implicitly required simply by virtue of being in a relationship. Even if the relationship isn’t the top thing on your mind, just the fact that it exists in the background means that you have to do things like regularly acknowledge your lover’s existence every now and then. That can still be mentally taxing if what you want is to go completely immerse yourself in the exploration of some other corner of the universe.
That explanation satisfied me when I heard it, but what was even more important was Liza’s reminder that digging into her psyche is not going to give me the emotional resolution I want. There’s always going to be a deeper reason Why: Why does she feel the need to dive completely into this path she’s on? What specifically about that causes her to feel this way? So on and so forth. These may be interesting and even useful questions for her to find out the answers to, but if I am not already at peace with myself and her, further answers are simply going to engender further questions. First find peace and acceptance within yourself, and then help your lover dig, if she so chooses to.
So I did. I let the label float away, and it was liberating to see that we could still love each other freely outside of a defined structure. I slowly increased the number of friends that I told about this development, just naturally dropping it in the next time I talked with each of them. They offered their condolences, and I thanked them — but I realized that I was feeling sad simply because of the constant onslaught of everyone expecting me to feel sad. I didn’t need to feel sad about this. I could feel however I naturally felt about it. So Liza and I weren’t sleeping together every night anymore, but we were still letting our love flow freely between us on a regular basis. Life was good.
We continued to drift apart. She had told me in the beginning of this breakup process that I was looking for some solid ground, but she can’t give me what I’m looking for because she’s water. I realized that was true.
I recalled how I initially stumbled on moral relativism myself. I no longer believed in Christianity and it’s Objective Moral Truth, but I still implicitly believed that there must be some Objective Moral Truth out there, even if I didn’t know what it was because it no longer came inside of a neat and tidy Holy Bible. I tried to do on a personal level what Hilbert tried to do for mathematics: create some sort of solid moral foundation upon which I could build all higher-level moral truths on. But as I hammered a pole deep, deep into the ground, I suddenly realized that I was building on a tiny asteroid floating through space, and at some point every further attempt to drive the pole deeper into the ground is simply going to spin the asteroid around faster instead of making the foundation any more secure.
I realized now I was doing something similar with love. I was drowning, but I found land. I crawled onto the ground and laid there, which gave me a great sense of safety and security. I tried to stand up, expecting the solid ground to support my weight, but instead the whole thing flips over and I get to find out that I was actually laying on a plank that was resting on nothing more than an ocean of water. But I’ve learned to float now. I don’t need the plank to feel safe anymore. I would greatly appreciate having Liza in my life, but I don’t actually need her for my life to be okay. I saw that this breakup was necessary for my personal growth, that I would not have encountered this realization at this point in my life without the catalyst of the breakup.
This was not personal growth that I would’ve chosen for myself. Even now, losing a great relationship in exchange for personal growth doesn’t sound like a great trade to me. And so, I realized there was no space for me to have any say in where this relationship went. Liza’s first instinct upon the first sign of trouble was always to say, maybe this isn’t going to work out. She may not have intended to send an ultimatum — she was just honestly evaluating her own avoidant feelings about a given situation — but each time something like that occurs, it is effectively an ultimatum all the same. And when such a “take it or leave it” ultimatum is in effect, there is no space for the other person’s preferences to be included, except insofar as they prefer “take it” to “leave it.”
There are various mathematical ways to describe the amount of power a voting member has in a scenario where votes have disproportionate power (think US elections where each state has a different number of electoral votes to cast for president). You could measure voting power by the probability that the vote affects the outcome, or you could measure voting power instead by the number of sequences where that vote ends up being the pivotal one that changes the outcome. If you always vote a certain way, then you actually don’t hold that much power, because your vote never actually becomes the pivotal one that affects the outcome. (This is one potential argument for why it may have been rational for a pro-Palestinian to vote against the Democrats this last election despite the Republicans being far worse for Palestine, because if the Democrats always have your vote then they actually don’t need to listen to you at all. I disagree with the argument because I think insurrectionist Trump trumped every other argument, but I think it was a sound one to make.) I never voted against the relationship, so I never demonstrated any real power in where the relationship goes. Just like with work-life balance, if you get a relationship at all, then you get the relationship that you’re willing to put up with.
This doesn’t mean that voting “no” on the relationship would’ve been the right choice for my past self. Liza would’ve said “no” too, because she was being true to herself and me about her feelings. If we were going to be entering any kind of relationship at all, it was going to be one that we knew from the outset might not last. I would be reminded of this through her occasional worries that she might have to leave me one day and that it’ll hurt me (paraphrased, because I don’t remember her exact words, only the sentiment), and I in turn would reassure her that it was okay, that I didn’t see why future potentialities had to affect our love in the moment.
As for me, I had said “yes” because I was also being true to myself and her about my feelings. Years of dating in Seattle had shown me how hard love was to come by for me, and a long-term girlfriend always felt like a distant abstraction that I could only ever wonder about from afar. How do people just start dating and then fall in love with each other? How can two lovers transition from initial infatuation to disagreements and arguments? I got the first question answered by my previous ex, and the second one (and many more) answered by Liza. I see now that disagreements are an ordinary part of figuring out how two different personalities can comfortably merge their lives together, how discussions can naturally get emotionally charged when they involve someone you’re emotionally deep with, and how none of this implies a lack of love. I see now that a lack of disagreement is in fact not at all a great barometer for how well the relationship is going; it can be a useful indicator in some ways, but it is only one of many such indicators. Most importantly, love no longer feels like something strange and out of reach, but something that I too have been welcome to experience and observe firsthand.
I honestly feel more whole now having known what it feels like to have a steady girlfriend. For me personally, it truly is better to have loved and lost than never to have loved at all. I feel vindicated in confirming that I was in fact previously missing out on a major human experience; people who deny that are probably not people who ever had to experience unending crushing loneliness. I feel vindicated in having suspected all along that having a partner as wonderful as Liza would make life so much better than being single. I feel vindcated in ignoring online advice about how the only reason otherwise decent guys can’t get girls must be because they’re misogynists; if Liza, who has ranted to me countless times about “men bad,” doesn’t think I’m a misogynist, then I feel pretty good about not being a misogynist.
I feel vindicated in giving up on real-life advice to go out of my way to do this and do that, because girls like this and girls like that. “Buff up,” they said. I’m reasonably fit, but I naturally have a slim frame. With consistent strong effort, I can thicken up enough for it to be slightly noticeable, but I’ll slim right back down once I relax my routine a bit. “Spread your legs out like a man when you sit” (aka manspreading), they said. Maybe this too is because I’m skinny, because it’s usually just more comfortable for me to sit cross-legged. “Dress well and pay attention to the latest fashion trends,” they said. I can follow simple explicit rules like “Don’t mix black with brown” if I really tried, but I hate having to think about what I wear, and I can’t do things I hate on a daily basis for very long unless I’m being paid a lot for it. These were all advice I’ve received from both men and women, and these were all things I’ve tried for some time with no discernable effects — A/B testing that produces a 50% increase from zero dates per month was still going to be zero.
Nor do Liza and I think that any of this dating advice would’ve attracted Liza any harder when I did finally meet her; in fact, she thought the fashion advice I got was horrid. Maybe all of the above is good advice for attracting some women, but even then, motivation to get a partner is different from motivation to keep a partner. It feels artificial and unsustainable to go out of my way to do something just to attract someone when I know I can’t keep not being myself for decades. (I know, I know, “Just be yourself.” Well, if me being myself was attractive to a lot of women, I wouldn’t be needing such advice in the first place, would I?) I’d felt that way before too, but now I know for sure that my failure to get a girlfriend wasn’t simply due to not doing enough of the advice that others gave me. Now that I too know something rather than nothing, I shalln’t be gaslit by well-intentioned friends anymore.
Liza went on a solo road trip to Kep, Kampot, and the last I spoke to her, Phnom Penh. We were doing video calls every night, then we sent each other loving texts every night, then we started messaging each other more and more sporadically until we’ve stopped messaging each other at all the last week unless something comes up — just the way we usually are with our distant friends. The process of gradual divergence has gone pretty smoothly, and I’ve been doing surprisingly fine, all things considered. The contrast between this and my previous breakup really drills home for me the importance of romantic aftercare at the end of a relationship. I think part of what makes this aftercare so good is that we have permission to keep each other’s love in our hearts, as opposed to the pop culture conception of a breakup where you had better get a move on and, if necessary, violently rip the other person out of your heart even if that sends chunks of your own flesh flying off in the process.
It has been hard at times, of course. There were times when I felt ashamed that I still needed Liza, like I wasn’t moving on as well as I should’ve been. The shame went away once I realized that’s what it was. I needed Liza, but she wasn’t there for me, and I was still okay. I don’t need Liza to be okay. There were times when I felt a bit mad at Liza even though I couldn’t figure out what I even wanted her to apologize for, until I realized that I was simply feeling hurt and that I could give myself space to feel hurt without needing to blame anyone for the hurt. There were times when I felt sad, but the sadness was like the bitter richness of dark chocolate. It was a healing kind of sad, not the sadness of despair but the sadness of growing up and realizing that you couldn’t have stayed a kid forever. There were times when I felt lonely, but I now know what it feels like to be deeply loved by someone, and I can return to those moments when I felt that love. I now know what it feels like to deeply love someone, and if I can deeply love them, I can deeply love myself. I can take the love I feel for her — which I know to be the purest, highest-quality love that Amos can conjure up — and bestow it upon myself, to love and be loved, because I now have access to both sides of the equation. Liza completed me, and now I complete myself.
Liza called me on the day of our third anniversary together to tell me that she loved me. It was sweet, but characteristic of her recent pattern of hot and cold: so hot that for a moment it feels like we’re right back in it, and then the cold of complete radio silence afterwards. Gosh, what is she feeling, what does she want? I must know so that I know what to do in response! But as a friend advised, “Don’t project your own needs onto her.” What are my needs, and what am I going to do about them? You know what, I don’t need this amount of uncertainty in my life right now. Instead of blaming the unpleasant feeling of uncertainty on Liza and her actions and her unknown intentions, I can choose to reduce the uncertainty I feel anytime I want. I’m going to manage my emotions in this way and respond to Liza in that way when she calls. I can always change that protocol as needed, but for now this plan provides the requisite amount of certainty I want for myself regardless of Liza.
I wouldn’t get into this sort of relationship again because I now value stability in my life more than I do experiencing a real romantic relationship, but the reverse was true three years ago and therefore my decision-making was different as well. I am now the kind of person who can say no to a relationship with Liza because I have been the kind of person who could only say yes to a relationship with her. I have no regrets, and I will forever be grateful we had the time together that we did, even if we will never again be the other person’s primary lover.
I get why there’s sometimes a need for the “rip them out of your heart” or “block your ex” breakups. Sometimes, an ex doesn’t respect your wishes and instead abuses all remaining avenues of communication to try their darndest to get you back. But maybe it doesn’t always need to be that way, and I feel like “Maybe it doesn’t always need to be that way” has been our relationship in general, as weird as that may have continually seemed to the normies. (Watching the movie Closer with a friend recently also similarly expanded my conception of relationships — love often comes with honesty, but maybe it doesn’t always need to be that way.) Our relationship started well, continued well, and it has now ended well. Must we view it, as is common in Cambodia and America, as a “failed” relationship that “wasted” three years of our lives? Just because something was meant to be doesn’t mean it was meant to be forever.
Early on, I think in the first week or two after we met, Liza told me about the movie 500 Days of Summer. I watched it then, and I watched it again this last week. I know I like meta, but sometimes life feels a little too on the nose about it. How did I just live through a real-life version of that movie, but better, and with explicit forewarning and everything? That’s so meta. But of course, there’s always a rational explanation. It was a decently popular movie about a decently common phenomenon, so it’s no wonder that Liza watched it. It resonated with her, so of course she’d tell me about it, and of course it is unsurprising that a girl that feels like Summer’s narrative arc makes a lot of sense would end up behaving in some ways similar to Summer.
It makes complete sense, and yet it still feels like a winking synchronicity from the spirits that be, much like how the last full-time job I had was a fully remote and time zone-agnostic one that finally gave me the financial courage to leave the US and travel around the world until I met Liza, at which point I was promptly fired from the job so that I could properly spend all my time and attention getting to know Liza in those crucial early stages of our relationship. The job had fulfilled its purpose in moving the plot forward, so it was time for it to leave the scene. Or, much like how Liza herself (along with a whole group of friends that I have only met because I stayed in Cambodia because of Liza) helped me undergo a personal growth spurt that feels bigger than all the personal growth I went through in Seattle, until I was finally ready to go to the Ceremony and publish a piece marking the solidification of my personal identity, at which point she promptly started breaking up with me. Perhaps that “Secret Passage Theory” guy was onto something after all! (But in all seriousness, even if such synchronicities are real rather than mere statistically probable phenomenon, I don’t know about making any life decisions based on them. Don’t break the fourth wall!)
When we first met, Liza held up a tangerine she took from her fridge and told me, “This is Gary. Gary is important to the plot. He will appear again in a later scene.” She said that right before she peeled Gary and ate him. Well, true to her words, the spirit of Gary has reappeared in this essay. I’ll say the same is true of Liza as well: She’s still important to the plot and will reappear in some subsequent scenes, but for now at least she is completely out of the picture of my personal life.
Reflections on a year ago
I reread my inaugural blog post announcing the release of ZAMM v0.1.0 from over a year ago. Oh my, what a year it has been!
Developments in AI Coding
There’s no persistence of conversations (the API calls are logged, but I haven’t yet had time to actually create a conversation model in the database, execute the relevant SQL transactions in Rust, and display it all on Svelte)
That’s actually exactly the kind of thing that Cline has gotten pretty good at these days with the Claude Sonnet 3.7 model. Sure, it may cost a buck or two for that to happen, but in my opinion it’s totally worth saving on the mental overhead.
There’s not even the functionality around editing files and running terminal commands that v0.0.5 of ZAMM had
Finally, the current release of ZAMM has all that and so much more, simply by building on top of all the hard work others have put into Cline…
But when I had first briefly tried Cline, I believe in the summer of 2023, it didn’t handle terminal output properly. Even something like pip install
, if it took a long time with a lot of packages, would result in the context window being exceeded, presumably because Cline captured all of the output to stdout
without trying to render it like a terminal emulator would. Lesson learned: forking what appears to be a project with shitty functionality might still be a better bet than rolling your own project with non-existent functionality.
Until this gets automated away, I don’t know if I’ll feel like working on any other side projects because I’ll just keep running into the same old boring problems that make up 90+% of programming work on large projects.
I have gotten more interested in side projects lately — but it is also precisely because vibe coding is so much more possible now. I’m elated that thet dream is coming true, even if it’s not by my own hands!
As for the animations I put in: Wow. I would love to reuse that UI someday.
Overengineering
I have instead come to better understand what I’ve made not as a cutting-edge AI tool (in which case it’s a total failure that fails to push any boundaries at all), but as an artistic concept piece.
And honestly, I should’ve left it at that. But I kept figuring that continuing on the current path would be better than a complete rewrite where you’d end up running into the same problems anyways. Despite month after month of evidence to the contrary, I kept minimizing the complexity of editing files and running terminal commands. I look now at the 30,000 lines of TypeScript code for Cline (50% more than the 20,000 lines of code I wrote for ZAMM), and I can see how utterly hopeless my situation was. Cline has all this embodied knowledge for how to get an LLM to do the things you want it to do, and it still doesn’t get to the “real” meat and potatoes of what I want ZAMM to do. I could easily have spent years recreating the man-years of work that has surely been put into Cline at this point, and still not started doing what I wanted to do with ZAMM. I’m glad I finally gave up when I did, but damn!
It’s not hard, it’s just drudgery.
I would rephrase that to be: “It’s not hard, it’s just overengineering.” Damn, I can’t believe that word wasn’t deeply in my vocabulary until very recently. That whole section of the blog post reeks of overengineering. I’m glad my current business partner was a former CTO. (I started trying to build a software business with a friend this month.) As he explains it, engineers are like carpenters who want to build a nice work table before they start a project, except that they can easily get lost in building the nice work table without ever actually building the project they were meant to build.
Man, I can’t believe none of my friends I sent that blog post to told me “Bro, you’re obviously overengineering the hell out of things.” Ah, but it may be because I said at the end:
After all, if it’s overengineered, it’s only because I built out the infrastructure for the app I dreamed of, not the app I have today.
No, Amos! That’s exactly what someone would say if they’re badly overengineering something! Nooooo!!! I feel as if I am watching a train wreck unfold in slow motion, except that the train wreck is of my past year and I am of course unable to do anything about it.
I think this is perhaps because my friends and I have probably only ever seen the overly under-engineered side of things. Like when I worked on Google Duo, legend had it that it started out as a demo at some internal hackathon event. Some exec liked it and wanted to make it a real product. The engineers were like, “Okay, so since that was just a demo, let’s build it properly from scratch, right?” And the exec was like, “Nah man, let’s just get this to market!” And so, by the time I got to work there, MainActivity.java
had ballooned to thousands upon thousands of lines of code that should’ve really been refactored into lots of smaller modules. There was one guy who was responsible for client app code quality, and everybody outside of the client team (which included me, because I was on the backend metrics team that naturally touched all parts of the stack) had to submit our changelists (or CL’s, the Google version of a pull request) for review by the code quality dude.
And so a typical week for me would go like this:
- Monday: I finish and assign a CL to him for review. I message him with a link to the CL.
- Tuesday: I ping him to review my CL. He responds at the end of the day after I’ve already left, asking me to send the CL to him.
- Wednesday: I come in and see his message. I’m just thinking, Dude, literally just scroll up 10 pixels on the chat window and look at the link I sent you. But whatever, I copy-paste my own message to him again.
- Thursday: He thanks me for sending him the link and says he will get to it. I suppose there’s no need for further reminders today.
- Friday: He finally reviews my CL with some comments. I quickly make the suggested changes, and send it back to him for review. He does not respond for the rest of the day, leaving us to repeat this dance again the next week.
I remember at various points, I would have four CL’s piled up on top of one another, all waiting for his review, all taking weeks if not over a month to finally land. I would keep my direct manager appraised of the situation, of course, but he would always tell me defeatedly that the client team was swamped and we simply had to wait our turn as our metrics optimization work was non-urgent.
The client team boss was always talking about their growing code debt, and how one day they’ll have to simply declare code bankruptcy and rewrite the whole app from scratch. I suppose code “debt” is actually a pretty good analogy after all — you’re taking on some “debt” in return for short-term gains, but this debt incurs “interest” by continually slowing your team down ever so slightly until the debt is finally repaid via a proper refactor. Well, in Duo’s case, the client team boss got his promotions and jumped ship to Facebook before he ever had to deal with the fallout of unsustainable code debt. I suppose code bankruptcy was finally achieved by the shutting down of the whole damn app.
Anyways, that’s the kind of crap that I saw a lot of, and so I figured, for my own personal projects, I would do things right no matter how long they took, because slow is smooth and smooth is fast. Well, as it turns out, there is such a thing as going way too far in the other direction, and I’ve finally learned that it is called “overengineering.” I’d had this idea before that “overengineering” was incompetent engineers using complicated abstractions where simpler ones would do, like the Enterprise Edition of “Hello World.” What I did not realize was that overengineering is context-dependent and can occur even when you’re using all the right abstractions in your code. Is setting up mypy
for type-checking a good idea? Sure, it can definitely be a good idea in the right context, but if you find yourself spending hours configuring mypy
to run on an existing repo for what was meant to be a weekend hacking project, then you’re overengineering.
Interestingly, my former CTO pal says that this is where unrealistic deadlines can come in handy. Sure, they’re unrealistic, so don’t beat yourself up for not meeting them — but they serve as a good tool to cut down on overengineering. It no longer makes sense to work on a lot of things if your goal is to finish an MVP by the end of the week — and ZAMM at that stage could’ve definitely used an MVP instead of all the developer infrastructure I built around a lack of MVP.
Australia
I made another digestible for my shitty software interview experience. As my CTO friend tells me, one question I could have asked was, “I understand that the interview is over, but may I ask what sort of answers you were looking for?” Despite the prickly attitude of the interviewer, I actually still am more curious about the answer to this question than I am tempted to tell him to fuck off.
I also made digestibles for the Australian housing market and the Australian visa process.
I also realize that such gatekeeping is hardly a problem unique to Australia, and I recognize that Cambodia has its own set of institutional problems.
Well, I am really glad we moved back to Cambodia. This past year of personal growth would not have happened without being in close proximity to our close friends in Siem Reap. And personally, it does feel a lot more meaningful to experience the problems of Cambodia than those of Australia — though of course I recognize that there are plenty of others for whom the exact opposite is true.
Discuss on Lemmy or below: