SIGAVDI #53: Tamale Edition

Hello friends,

I'm on my mom's back porch on a sunny Sunday in Knoxville. Last night I spent a solid 6 hours dancing and socializing at my favorite club night. Today I feel pleasantly fatigued and a bit languid.

A minute ago I looked up one of my old blog articles and was struck by how much of an asshole I used to be. When I started blogging I was strongly influenced by the tone of early popular blogs, which were mostly White Men Having Smug Opinions About Things. I guess I thought: ah, this must be how you make a name for yourself: have loud Hot Takes about everything, and criticize the writing of people with a bigger following until someone takes notice of you.

At first I thought this was just a stage everyone passes through. But as I think about it more I wonder if it's a patriarchy pattern. Something something hero's journey, something something Luke Skywalker, something something kill your father-figure.

Joseph Campbell is an interesting read but boy oh boy, dude had a one-track mind. I've read Hero with 1,000 Faces, and listened to his famous interview series with Bill Moyers. And what came across was less that the same archetypes are repeated over and over, and more that Campbell had one big idea and found ways to see it everywhere.

Hm, this is a cautionary tale when it comes to me and my obsession with seeing processes. Also, I just criticized the pattern of tearing down an old guy by tearing down an old guy 😂

I still have lots of opinions, albeit with lower confidence. Hm, actually, let me quote the article I just linked:

The loudest, most bombastic engineer states their case with certainty, and that shuts down discussion. Other people either assume the loudmouth knows best, or don’t want to stick out their neck and risk criticism and shame. This is especially true if the loudmouth is senior, or there is any other power differential.

Diverse members of your team may be less likely to have experienced the collegial, open debate environment, and may feel uncertain of their position. This means you might not hear their ideas. Given the extensive research that shows diverse teams make smarter decisions, this is tragic.

Even if someone does have the courage to push back, in practice the original speaker isn’t likely to be holding their opinion as loosely as they think. Having stated their case, they are anchored to it and will look for evidence that confirms it and reject anything contradictory. It is a natural tendency to want to win the argument and be the smartest person in the room.


Once upon a time, Cardboard Tube Swordplay (CTS) wasn't considered a legitimate sport. If people had heard of it at all they generally sneered at it. If it appeared in popular culture at all it was usually as the butt of jokes.

One way or another, the early CTS players (“tubies”) found each other. They recognized kindred spirits and started having meetups and even conventions. Slowly, painfully, and with many arguments they hammered out the sport we all know and love today.

Where once there was just a vague, amorphous area of overlapping interest, the tubies created boundaries and categories. They created the classes of competition – longtube, paper towel, packing tube, etc., along with standardized tube gauges. They came up with quantified ways to rate and rank competitors. They agreed on safety regulations. They composed the Rites of Challenge. Leagues were formed. Eventually, twelve recognized Tube Masters gathered together and authored The Way of the Tube (WotT), which defined (among other things) the path of tube ascendancy: how a novice must apprentice to a series of masters before finally confronting the Cardboard Gauntlet.

By defining boundaries of what was and was not CTS, the tubies conferred legitimacy on themselves. When outsiders would make uneducated claims about tubies being “a bunch of kids beating each other over the heads with foam swords”, the CTS community was able to push back and tell them that, actually, headstrikes are banned, duels are carefully refereed, and styrofoam is never involved. Steadily the sport gained recognition and serious coverage.

A generation passed, and a funny thing happened. What was once a sport for nerds and weirdos became a pop culture phenomenon. Where once a novice could spend months searching for a Tube Master to train them, now thousands of YouTube videos offered “how to” tutorials. Accelerated training “tubecamps” sprang up all over the world.

A new breed of tubies arose: ones who had never faced the tubie stigma; had never been derisively told to pick up a “real sport”.

And these nu-tubies showed no respect or even gratefulness to the old guard. They scorned the apprenticeship system. They made stupid mistakes and created unnecessary drama that never would have happened if they had just adhered to the Rites of Challenge. They introduced outlandish new elements such as pool noodles.

Many established CTS authorities questioned whether this new guard were even “real tubies” at all. Some elders, including several of the WotT authors, began pushing for a tubie certification program. They created cults of personality, recruiting impressionable younger tubies searching for a sense of identity, teaching them to sneer at “damp tubies” for being insufficiently disciplined.

The free-thinking youngsters, in response, accused the old-timers of “gatekeeping”. They pointed out that some CTS traditions such as the Cardboard Gauntlet were more like hazing rituals, which discouraged prospective players. They noted that the old guard seemed to all come from the same socioeconomic background and questioned whether toxic CTS culture was keeping the sport from becoming more diverse.

More importantly, they asked, wasn't CTS originally supposed to be about having fun, not about parsing rule manuals?

The elders replied: This kind of fun is serious business. We created this game out of chaos. We painfully won our recognition, the recognition that you now enjoy. This is our game, and you can't play it if you don't play it right.


What I'm grateful for this week: The DJs, staff, and everyone who attends my local goth/industrial night. It's an inspiring, cathartic, restorative experience every time I go, and I've met so many wonderful friends through it.

What meetup I'm going to this week: well I'm off to St. Louis on Wednesday, but I might be able to make KnoxvilleJS. I haven't been to that one yet.

Let's see how I did:

  • ✔ Get two me-authored RubyTapas episodes ready for the team. Done. Two more episodes on async are moving forward into production.
  • ✔ Get another episode of The Cache Flush out. Done, and you can find it here
  • ✔ Keep working out on a daily basis. Maybe not every day, but I get a few five-mile runs and a night of dancing in, so ima call that a win
  • ✔ Edit that video about building chatbots in Ruby. Done! I'm excited to move forward into publishing and marketing this one.

This week:

  • Livestream with Jess, since I'll be in St. Louis
  • Pre-sell and get started marketing the chatbots video.
  • Book a Rubber Duck Session or two. Want me to sit down with you and talk code, architecture, career, or other? Get in touch!
  • Pick a first business metric to track and figure out how to track it.
  • Book summer camp(s) for the kids

 

That's plenty for today. Thanks for reading, and stay in touch!

Featured Video Play Icon

Test-Driven Re-implementation with Josh Thompson

Yesterday Josh Thompson, one of my Rubber Duck Session clients, proposed a novel idea for deliberately practicing coding skills: take a popular open-source project with a good test suite, delete a class, and re-implement the class using only the tests as a guide. Then, compare and contrast our implementation with the original!

I suggested the Rake codebase, and this video is an unedited recording of the session. Enjoy!

SIGAVDI #52: Grit Fritters Edition

Hello friends,

I am mildly out-of-sorts as I write this. The front of my favorite local dive appears to have fallen off, complicating my afternoon plans of meeting my mom there. Entropy is everywhere!


What dismays me about technology is this: not the machine itself but the way its architecture echoes outward, imposing a grid of quantification on everything it touches.

This article about life in Silicon Valley is powerful and a bit painful. I keep saying, you can’t do this shit 8-12 hours a day and not have it warp your outlook.


A programmer spends thirty years in the industry, and one day they designs a beautifully simple and elegant programming language. Or API. Then they go on the conference circuit pointing out the virtues of simplicity, and bemoaning why other developers can’t just keep things simple.

What’s omitted: It took them thirty years to figure out what was “the simplest thing that could possibly work”.

The simplest step isn’t always the easiest step, because simplicity comes from wisdom. Sometimes the most accessible first step is to do the thing you know is overcomplicated, but you don’t yet have the perspective needed to simplify it. Once it’s in use, you’ll start to see where to pare it down.

Example: I kicked off a Patreon recently. I made the tiers too elaborate. I knew I was making them too elaborate. But I couldn’t figure out what to drop and what to keep.

Now that it’s been up for a few weeks, I’m getting a much better idea of what makes sense for the tiers, and I’ll be simplifying it soon.

Example: I usually don’t figure out what the “core idea” of one my talks is until I’ve given it at least three times. Then one day it finally dawns on me what I’m really getting at, and I reorganize the talk to emphasize that core idea.

“Do the simplest thing that could possibly work”. “Minimum viable product”. These concepts are supposed to be enablers of action, but sometimes they are obstacles. We often start out jumbled full of thoughts and only later do we realize which one was central and which ones were peripheral.

Sometimes the most expedient step to take is to start with elaborated complexity, and give yourself license to pare down instead of add.


Last night I went to my first fashion show ever and it was amazing. It was a celebration of embodiment and of the endless conversation-with-past-and-future that is art. I highly recommend attending one if you ever have the opportunity.

More broadly, I strongly endorse adopting the strategy of defaulting to “yes, please” when someone recommends or invites you to something you’ve never done before. I don’t think I realized just how much I’d internalized the philosophy of “oh that’s not the kind of thing I do” until I started deliberately saying “yes” to new experiences.

The problem with “that’s not my kind of thing” is that eventually, you stop seeing other possibilities at all. They become part of the background noise. They become the restaurant you’ve passed so many times that you never think of trying it out.


Let's see how I did:

  • ✔ Book May travel. Done! Off to St. Louis again in a week and a half, look forward to more livestreams of Jess and I yelling at computers! 😂
  • ✔ Update my website. Done! I'm really happy with this accomplishment, for the first time my site actually reflects everything I do.
  • ✔ Invite a half-dozen new RubyTapas guest chefs. More than done! Lots of great new guests coming up…
  • ❌ Go through my stupid mail. Well, I went through all my email. The snowdrift of snail-mail continues to accumulate.
  • ✔ Push consulting paperwork forward. Done.

Bonus points:

  • Catch up on RubyTapas tasks. Done. Intros and promos and edits and tagging, oh my!

This week:

  • Get two me-authored RubyTapas episodes ready for the team. We need to fill some gaps in the schedule, and I have some episodes on async processing just waiting to be written and recorded…
  • Get another episode of The Cache Flush out.
  • Keep working out on a daily basis.
  • Edit that video about building chatbots in Ruby.
  • Ugh can we just leave it at that for now? I want a win.

Until next time… thanks for reading, and feel free to reply!

SIGAVDI #51: Ninja Bomb Edition

Hello friends,

First off, if you got another duplicate SIGAVDI recently I apologize. I have now indefinitely disabled the automatic RSS-to-email rule in Drip, because they can’t seem to reliably record the fact that a given entry has already been sent out.

I’m writing this from Phat Bites in Nashville, which is a wonderfully funky little cafe and I recommend it. Have them pick a sandwich for you.

I’m in Nasvhille because I spent the last few days at deliver:Agile, which is apparently the “more tech-focused Agile conference”. This still makes me wonder what they talk about at all the OTHER Agile conferences, but I’m sure I’ll find out one of these years.

I opted to speak at deliver:Agile even though it conflicted with RailsConf in part because I’m making a deliberate effort to swim in bigger ponds. One of the things I really appreciated about this conference is that I didn’t meet anyone who seemed like they’d be likely to call themselves “a Java programmer” or “a Ruby programmer”, etc.. Most of the attendees were developers, but as a crowd everyone seemed to be more focused on value and results than on specific technologies. It was refreshing.

People to pay more attention to, post-deliver:Agile, an incomplete list:

I also got to meet Rebecca Wirfs-Brock in person 🤩🤩🤩


Random thought while running today: there are some things you just can’t do solo.

I remember being a young programmer and reading about Agile practices and getting all excited and wanting to “be agile” even though my team wasn’t. And the fact is, I could and did do some of the techniques associated with Agile, like TDD. And they were quite helpful. But I wasn’t “being Agile”, I was just using TDD.

I have no doubt that individuals like me practicing Agile-associated techniques were one of the factors that eventually caused many organizations to “go agile”. At the same time, I’ll bet the same phenomenon also fed the fallacy that Agile just meant adding those techniques to your repertoire.

The same goes for making a sociotechnical system resilient: by definition you can’t do it solo.

There is a qualitative difference between the numbers one and two. Everything after that is quantitative, but two is important.

For where two or three are gathered in my name, there I am with them.

— Matthew 18:20


I’ve been reflecting on just how much of my life has been ruled by anxiety. I don’t think I ever really understood how large a role it played because it was the air I breathed. It took experiencing periods of a week or more without anxiety for me to really start to see it.

I’ve often said I like the person I am when I drink, better than the one I am sober, and there’s a simple reason for that: alcohol turns off my anxiety. I make choices based on what I actually want rather than based on what I’m anxious about.

Fear is unavoidable, but short-lived. Either the scary thing happens or it doesn’t. Either I do the thing I’m afraid of or I retreat to safety.

Anxiety is long-acting poison. A holdover from when the longer we roamed the tall grass the higher the probability we’d be attacked by a tiger.

Tasting anxiety-free life for even a week is like tasting sushi for the first time. My standards are permanently raised. I don’t have to live with this fist in my guts? Sign me up.


OK, let’s see how I did.

  • ✔ Prep to speak at Deliver:Agile in a week. Done. I put a solid couple days of work into updating the No Return talk, and I’m pretty happy with the edits.

  • ✔ Finish landing page/video for Flawless Ruby YES! I finally finished it!!! Go check it out and buy my shit 😁

  • ❌ Edit video on building chatbots in Ruby. Nope, but I shouldn’t have carried this forward in the first place. That was way too much to expect in a week.

  • ❌Nail down my first part-time contracting gig. Jess pointed out that “nail down” is not a thing I can actually do on my own. The best I can hope for is “push forward”, which is exactly what I did.

  • ❌ Start coding in earnest on That One Side Project I keep flaking on. Again, this was overcommitting so I don’t feel bad about not touching it.

  • ✔ Post another episode of The Cache Flush. Go check it out and subscribe

Bonus points:

This week’s meetup: Knox.Net

(This is something new… lately I’ve been making an effort to choose a new meetup to attend every week that I’m in town. I think I’m going to start explicitly listing the meetup I pick in SIGAVDI so I actually remember.)

For the rest of this week and next week…

  • Book May travel.

  • Update my website. This past week it really started to bug me that I don’t actually have a homepage that lists all the stuff I do: speaking, consulting, screencasting, writing, podcasting, etc.

  • Invite a half-dozen new RubyTapas guest chefs (I’m always looking for more, hint hint… if you have something to say to this audience, jab that “reply” button!)

  • Go through my stupid mail. There is enough stacked up that it is a Task.

  • Push consulting paperwork forward. I forgot how much lead time there was in this game…

  • I think I’m going to leave the last couple of slots open because I feel like something important is going to occur to me later.

And that’s it for today. As always, thanks for reading and please reply!!!

Cheers,

Avdi

SIGAVDI #50: Apple Cider Edition

Hello friends,

I’m writing this from Harrisburg, Pennsylvania. I spent the weekend with my kids down the road in York, and today I’m headed back to Knoxville.

One of my daughters asked me why I go to so many conferences, including one over her birthday. The temptation when a kid asks a question like this is to say “I have to”. But the truth is, I don’t have to. There’s very little we have to do. Some choices just have greater consequences than others. (And the consequences vary unevenly based on our circumstances/privileges.)

So I told her the truth: I choose to go to conferences. I choose partly because it helps with my work, and partly because I get to see old friends and meet new ones. But most of all, I go because I get to help people and sometimes change lives. I don’t just imagine this to be the case; I have countless emails and postcards and personal conversations to confirm it. I have a ministry, and my software conference presence is part of it.

I also choose my children. I choose to use my frequent flier miles and credit card points and income to fly up to see them for weekends, because summer break is just too long to wait, and because I can.

My children are not having the childhood I planned and tried to build for them. With changing circumstances, I have reconsidered many of the values I once took for granted.

I used to tell myself (and everyone else) a story about doing everything out of responsibility and obligation. Everything I did was because it needed to be done. There was no personal calling. There was little choice. It was an easy story to tell: there I was, virtuously bearing up under great responsibility, plodding forwards in the only way open to me.

I don’t know what my kids are going to think of me as they grow into adults. One thing I hope they see me model now, though, is agency. I want them to learn from me that people don’t act from opaque “have tos”. No matter what story we may tell ourselves about constraints and obligations. We choose, either consciously or unconsciously. And then we must acknowledge our choices and their consequences, and move forward.


At a conference recently someone asked me: as a Rubyist, what do I think of the Go language? I said: “ uh… it exists.”

There is an expectation in tech circles that if you want to be a serious tech power player, you have to have a hot take on everything. Microservices? Old hat. Serverless? New hotness. Ruby? Not interesting anymore. JavaScript? being ruined by featuritis.

There are people who spend their days on Reddit and Hacker News delivering hot takes on every technology, idea, or opinion that comes down the pipe. Sometimes I feel the need to remind junior devs that if that’s where they are getting their perspective, they are getting their point of view from a self-selecting subset of technologists who have nothing better to do than Have Opinions On The Internet all day.

My hot take on hot takes? As a software developer it’s important to know that technologies exist, and at least a vague sense of where they fit into the ecosystem. Beyond that, you do not need to have opinions. You do not have to have a “take” in order to be a serious player.

Stories, though. Stories are another, uh, story. By all means collect stories! And tell them at every opportunity.

Just don’t mistake stories for universal truths. Every story has a context.


OK, let’s see how I did.

  • ✔ Visit the kids over Easter/Passsover.

  • ❌ Finish landing page/video for Flawless Ruby But! I made some solid progress. All that’s left is to edit the video I made for it.

  • ❌ Edit video on building chatbots in Ruby. No movement.

  • ❌ Nail down my first part-time contracting gig. I’m a lot closer but I haven’t signed contracts quite yet. Contracts are tedious, yo.

  • ❌Start coding in earnest on That One Side Project I keep flaking on. Sigh.

  • ❌ Post another episode of The Cache Flush. Maybe I’ll get this done before it’s time to get on the plane.

Bonus points (stuff I did that wasn’t on the list):

  • ✔ Attend a users group meeting. I went to the local JS group for the first time and had a great time afterwards over beers. I even recorded some more interviews for The Cache Flush!

  • ✔ Clear out my !@%*ing work inbox. There were some things in there that were really stressing me out too.

  • ✔ Help my friend Amy with her upcoming RailsConf talk, which you should definitely go see if you are attending RailsConf. (This sort of thing is one of the reasons I started a Patreon – I’d love to spend more of my time just helping boost new voices in software.)

  • ✔ Mooch some boilerplate contract templates from a friend and customize them for my upcoming consulting clients. This was more work than I expected.

  • ✔ Get started mentoring a friend in how I run RubyTapas.

  • ✔ All the usual RubyTapas editing, copywriting, script review meetings, etc. Word-tier and higher Patreon supporters saw some new behind-the-scenes videos this week!

Yep, another week of carrying the list forward from last week. Ah well, they can’t all be hyperproductive. This week:

  • Prep to speak at Deliver:Agile in a week.

  • Finish landing page/video for Flawless Ruby

  • Edit video on building chatbots in Ruby.

  • Nail down my first part-time contracting gig.

  • Start coding in earnest on That One Side Project I keep flaking on.

  • Post another episode of The Cache Flush.

Wish me luck!

SIGAVDI #49 – Space Vodka Edition

Hello friends,

I can’t brain today and I’m not sure why. I haven’t drunk much alcohol in the last few days, I have received more than adequate cuddles, and I slept way in this morning. Maybe it’s the weather? I’m writing this on the porch in the windy sun between two storm systems.

Read More

SIGAVDI #48 – Smoking Goat Edition

Hello friends,

This week I've been thinking about the tension between catching errors at compile time and catching them at runtime. On the surface level this one seems like a no-brainer: the early you catch a problem, the better.

But in my [mumblemumble] years of static-language experience, what I observed was that the more you focus on pushing all errors into the the realm of static compile-time verification, the more catastrophic and difficult-to-debug the runtime errors become. And there are always runtime errors. Even after you've eliminated null from your programming language.

The resilience engineering community has a counter-intuitive approach: instead of trying to eliminate errors early, actively cause them in production. Then learn how to tweak your sociotechnical systems so that they gracefully handle failure and mitigate damage.

Someone will always object: this is not an either/or. Let's eliminate as many errors as possible at compile time, and make the runtime errors easier to handle as well!

In practice, these seem not to be two dials you can turn up simultaneously. Gracefulness at runtime and static verifiability are design forces in partial tension with each other.

Is this such a surprise? It's just the oak and the reed again. The more rigidly we structure things the more jagged they are when they crack.

I know where I fall, now. I am an oak learning to be a reed. My life is falling forwards. My eyes hurt and my new glasses aren't here yet and my neck hurts because my spine is fucked up and my hand hurts because my ulnar nerve is impinged and parts of my business are failing or falling behind and my kids are far away from me and I probably don't have enough money to get through next month and two more boards in my deck have cracked and the mail is stacking up and once… once upon a time I believed I was going to get my whole house in order before I moved forwards.

No more. My house will never be in order and everything will always be falling apart and this is fine. Because there's beauty in the breakdown but more importantly, there's new order and new life and new happy coincidences. There's new love and new vistas and new collaborations and new restaurants to try with new friends and nothing is ever the right solution forever. Thank goodness.


The big news this week is that I finally started a Patreon. It's still a work in progress. My favorite bright idea was to make a lot of the tier benefits be about sponsoring other people rather than about getting rewards for yourself. I hope this resonates with patrons.

In the process of kicking off the Patreon, I repurposed the name of a now-defunct microblog I used to write and created a new Slack workspace called “Padding Bits”. If you like SIGAVDI but wish it was more real-time (and even more interactive!), you can now join in the fun for as little as a buck a month 😀


Let's see how I did:

  • ✔ Play Super Smash Brothers with the children who are presently interrupting the writing of this email. Done! Granted this one was kind of a gimme.

  • ❌Create a landing page for Flawless Ruby I did put in a lot of work on this one, including shooting some video for it, but it's not quite there yet.

  • ❌ Edit video on building chatbots in Ruby. Nope.

  • ✔ Launch my Patreon because why the hell not. Yes!

  • ❌ Migrate off of Drip for mailing list hosting because they are a total garbage fire since their acquisition. This was overly ambitious but I DID start a Convert Kit trial. They've been the front-runner all along, and when I found out they have Patreon integration they became even more attractive.
  • Bonus accomplishment: learn about the Kuberdoobers with Jessica!

This week's goals:

  • Attend DevopsDays/ServerlessDays/MapCamp Atlanta and learn whatever it has to teach me.
  • Finish landing page/video for Flawless Ruby

  • Edit video on building chatbots in Ruby

  • Evaluate Convert Kit.
  • Nail down my first part-time contracting gig. (I'm still interested in talking to potential clients!)
  • Start coding in earnest on That One Side Project I keep flaking on. Because I really, really need to write code.

As always, thanks for reading!

SIGAVDI #47 – Pear Pizza Edition

Hello friends,

It's been a couple of weeks. Since last Tuesday I've been in St. Louis. Jessica and I paired on some Docker & Kubernetes stuff. It was highly educational.

And we went to the symphony.

And the art museum.

But mostly we ate really good food.

Some of it highbrow.

Some of it less so.

That is an authentic St. Louis “slinger“, a $6.50 pile of sloppy late-night goodness.


A mistake I have made over and over again: thinking of life in terms of forks in the road. Big choices on which everything hinges.

The truth is, there are few choices in life that can’t be a “yes, and…” with some creativity. And most choices can be amended.

Just move. Direction is always adjustable.


I’m thinking of starting a Patreon (just do it, Avdi! Direction is always adjustable!). I’m trying to figure out what rewards to offer subscribers. Thoughts? It can’t be anything that adds a significant amount of work to my weeks.

I should print stickers. Everybody likes stickers, right?


I find myself badly wanting to sit down and code lately. It’s been so long since that was a central part of my day. This urge was one of the motivations for soliciting new consulting clients. Ironically, one of my first gigs may be more about video production than coding (more on that soon, hopefully).

A lot of it is just that I miss the relative simplicity of making shit work instead of deciding what shit needs to be done.

I’m also thinking of doing a talk on communicating technical ideas. I spend a lot of my time these days coaching other people on how to do that.


I’m really struggling with my goals this week. There are a lot of possibilities. Let’s talk about the last two weeks first.

  • ✔ Stream/record some kind of collab with Janelle Klein. Done. It’s probably not going to see the light of day, but it set us up for future recordings.

  • ✔ Finalize my new working arrangement with Cohere. Done. Not in the way that I had anticipated, but I made a decision for the time being and it’s time to move forward with other plans for now.

  • ✔ Get to a tentative agreement on a consulting gig. Done! This was a stretch goal but it happened 🙂

  • ✔ Nail down April travel plans. Done. I’m spending more time traveling than home this month. This is fine.

  • ❌Clean up the weight room and do some lifting. Nope. But! I ran and lifted here in St. Louis!

  • ✔ Sundry RubyTapas and Rubber Duck meetings and related work.

  • ✔ Attend a new meetup Done! Well, sort of. My original plans fell through (who schedules a meetup for 6PM?!) but I made it back to the Knoxville Devops meetup.

  • ✔ Attend some part of Big Ears Festival. YES! Janelle and I caught Max Jaffe doing interesting drum things, and later attended the poetry slam finals which were fantastic.


What am I doing this week?

  • Play Super Smash Brothers with the children who are presently interrupting the writing of this email.

  • Create a landing page for Flawless Ruby

  • Edit video on building chatbots in Ruby

  • Launch my Patreon because why the hell not

  • Migrate off of Drip for mailing list hosting because they are a total garbage fire since their acquisition.