Content from 2022-01

Advent Reflections

posted on 2022-01-23 18:00:00

It's been a busy start to 2022. I'm working as an Engineering Manager for the first time and enjoying it but it's been easy for other things to slip through the cracks. For example, I told myself I would write a post on Advent of Code several weeks ago. So I'm sitting down to write about it now before I forget any more details.

Background

This is the second time I've attempted Advent of Code. The first time was in 2020 and I enjoyed it a lot but ran out of gas around day 10. I was pretty distracted with a Flamingo Squad project I can't recall and probably a bit burned out. Both years I've written my solutions in Common Lisp.

Advent is interesting. I get enjoyment from different things on different days. Some problems I just enjoy seeing how much I can optimize Common Lisp, or writing solutions in a few different styles if the problem is simple and seeing the differences in how they are compiled and allocate memory. Other problems I'm much more satisfied by trying to see how "pretty" a solution I can write, either using constraint solving tools like Screamer or a pipeline using threading macros and so on.

I enjoy the social aspect of AoC and having a leaderboard with some mutual friends and coworkers. It's nice to chat about something besides production code with other talented programmers. That said, I have to be pretty careful to avoid judging myself. I have to consciously remind myself that my goal isn't to "win the race" and not worry too much if I struggle to solve a problem elegantly.

Advent 2021

There were two things I wanted to try and do differently this year from last year. The first was just to go as far as I could and not worry about racing. The second was to experiment with literate programming tools and try to do a better job documenting my work.

I think the results were a mixed bag. I got through day 11 so I powered out at around the same point. I mostly worried less about the race but I still cared a lot about finishing each problem on the day it became available and definitely got discouraged once or twice when I didn't like my approach. On the other hand, I had a good time and learned a few things so it's a good investment overall.

Here's the current state of the generated site. You can see I didn't wind up embedding the source for the different functions so it can't properly be called literate but the [function] label (or equivalent) next to all the exported symbols can be clicked to jump to the source on github.

Takeaways

MGL-PAX

I have been meaning to play with mgl-pax for a long time. Like ... probably several years? There are blog posts about it as far back as 2014 and it's been on my radar a long time but I just never seemed to make time for it. Advent seemed like a good opportunity to dive in.

I like the idea of an environment where prose and code are intermingled, so I have a natural attraction to literate programming. This shouldn't surprise you if you've been here before. It also seems important to me that such an environment for authoring programs should be rooted in the development tools and support the prose as a secondary feature (like MGL-PAX) rather than rooted in the prose and supporting the code as a secondary feature (like org-babel). I.e. tangling one or more files to produce my program seems like the wrong way to go to me.

In terms of Advent of Code problems, I'd ideally be able to do the following:

  • Keep the prose and code for a given day/problem in a single file
  • Easily export the entire project with all days to an easily navigated, well designed web page
  • Make it easy to show different versions of the code as well as disassembly or evaluation examples

Editor's Note: The issues I bring up below were resolved before I could ever make a PR or ask the author about them. It seems making PAX more flexible about transcription was in the plans all along.

I think MGL-PAX excels on the first two points and struggles more on the third. It has a feature called transcripts which could plausibly support it but they are an awkward fit. Transcripts allow for including examples that are evaluated when the documentation is generated but there are two issues I have with it:

  1. The results are actually embedded in the source code. The argument for this is that they are parsed and checked to ensure the code and docs don't get out of date. I'm interested in embedding details like disassembly though and things like the memory address will change from run to run. The output could also easily dwarf the code for the function itself so shouldn't be directly embedded. (PAX now supports not checking consistency, allowing me to simply dump the output of a form.)
  2. The second (much more minor) issue is that there isn't a straightforward way to ask the source definition of a function to be embedded in the doc. MGL-PAX assumes that symbols listed in the doc should be an exported part of the public API and links directly to the source on github at the relevant commit. It's a neat bit of hackery but makes more sense in the case of medium-to-large projects rather than Advent of Code exercises. (Similarly, PAX now has a way of adding "includes" via transcript.)

My only remaining concern is that the navigation and transcription functionality is tied to slime and swank. Hopefully I'll have an opportunity to try them with sly soon and can dig in or report it if there are issues.

In the advent project, the site-building and deployment was trivial. Hacking together a way to generate an overview of all solved problems with performance measurements involved some fiddling but I'm happy with the results.

Evolving my style

For a long time, I've been writing small projects in common lisp, writing a handful of tests, and relied only sparingly on libraries. A little alexandria here, a little cl-ppcre there. There's a place for that but I'm ready to try and cobble together the utilities and extensions to the language that I'm comfortable with. For now, that's alexandria, serapeum, iterate, mgl-pax, and try. Clingon, trivia, screamer, and fset wait in the wings for the right problem.

There are plenty of talented lispers around. Two people whose code I've enjoyed reading during advent are death and Steve Losh (aka sjl). They feel like opposites to me if only because sjl has a project dedicated to advent and an assortment of dependencies, macros, and utilities to make advent hacking pleasant. Death by contrast almost always just relies on the language standard and throws his code unceremoniously in a gist. His solutions are often faster than mine but don't sacrifice elegance.

Conclusion

It all boils down to this: I still like lisp, I miss hacking it, and I should read and write more code. My algorithms chops aren't as good as I'd like and I have to make an effort to not get discouraged by my limitations. All the more reason to keep doing advent, even out of season, and learn a few things.

8 Good Games (since 2013)

posted on 2022-01-01 13:40:00

Since Last Time

A long time ago when Norma and I had just started dating and I hadn't ever taught anyone to program, I wrote a post. In it, I talked about some of my favorite games. It was mostly just a list with a little added color here and there. But it's time for an update, and this time I hope to do just a little more than list some favorites. I'm also a little aware of how I weighted things last time. When I wrote Beloved Games, I wanted to make sure the times in my life with the most gaming (middle school and high school) had the bulk of the entries. I also wanted to show that the gaming experiences that had been managing to pull me back into the fold and affect me at that time were small downloadable indies, a relatively new phenomena. Those games offered new experiences more regularly than AAA titles so I also was careful to not include more than one game from a particular genre or series (which were relegated to honorary mentions).

The List

So, what really struck a chord with me in the last 8 years? I'll just list the titles first and then delve into more detailed thoughts and justifications. These are arbitrarily in order of least to most long-term impact on me personally.

The Last of Us

The Last of Us is an incredibly compelling story and one of the best games of its generation. The value it has to me has less to do with the gameplay though, and more to do with the quality of its presentation, the rapport it builds with its cast, and the more serious themes of its plot. In some ways, The Last of Us reminded me of when I first played "Metal Gear Solid". The themes it dealt with were more mature than what I expected of games at that time and it pushed the envelope of how to tell a story in games compared to its contemporaries.

The interesting thing about such games is that they make a big impact at the time of release but wane later. By pushing the medium forward, if you miss them when they came out it becomes notably harder to appreciate their qualities many years down the line when the lessons they teach are internalized by other works in the medium. (The same thing happens in film, of course.)

The reasons I started disconnecting with games in the late aughts and early tens was two fold. For one, I was really starting to grow up. I had a lot of opportunities to do fun things IRL that weren't available to high school me. I was being social more, studying more, working more. I was living more. That focus made it harder to justify lots of time spent on gaming experiences.

The fact that AAA games increasingly were just rehashes of existing series or well-formed genres was just the nail in the coffin. The Last of Us is an amazing title. But it is a continuation of the established mold of "story-driven 3rd person action adventure". That's not to undersell its accomplishments at all, but I think there are limits to how much that can impact me now.

Skate

There isn't a ton to say about Skate. It should've been on the original list and it wasn't. I can clearly remember spending the night at a friend's house in 1999 and his insistence at Blockbuster (really dating myself here) that we rent a skateboarding game. I thought it was the dumbest idea I'd ever heard. Why on earth would that be any fun at all?

Tony Hawk's Pro Skater got me into skateboarding in real life. It is the first ~~physical~~ athletic activity I remember really liking. It was also the first hobby I picked up and really enjoyed despite knowing I wasn't particularly talented at it.

Tony Hawk as a series has always been an arcade game rather than a Sim though. I discovered Thrasher's Skate and Destroy in high school and eventually favored it because it was closer to how I would really want to skate than the mindless combo fodder of THPS which was better for playing with friends.

Skate came out in 2009 and was probably the first PS3 game I was really hype about. That or MGS4. Skate took a great budget and the notion of a Sim skateboarding game and nailed it. I loved the whole series and eventually started playing it more than really skateboarding. Whoops.

Breath of the Wild

What was the first "Open World" game? Do we count GTA 3 and Vice City or do we wait until Assassin's Creed and Skyrim? Is 3rd person perspective required? I realize Elite was a thing but I wasn't alive for that. Breath of the Wild is probably the first so-called open world game that I gave a damn about it and that's the least interesting thing about it to me.

Ocarina of Time feels like the first open-world game that I played and was really captivated by. It comes down to the same crucial thing: an insane dedication to compelling world building. There are tons of open world games that just feel like endless content with no soul, no hidden inner workings, just the result of needing to fill a virtual space rather than a thing that has a logic of its own. In a game like GTA where most people play by just causing chaos and trolling authority in a controlled space that's fine. But in a game like Zelda, it makes all the difference.

I don't remember if I played Breath of the Wild in 2017 or 2018. I never finished the story. I just enjoyed exploring a well-crafted world until I'd had my fill. I don't know that it changed how I thought about games or what they could be. It was just the perfect way to relax and enjoy Hyrule.

Persona 5

Final Fantasy convinced me I liked JRPGs but I never managed to break into the genre more broadly. I really enjoyed FFVIII (my first) and FFX. I never played 1-7 (I know, I know) and started but never finished 9 and 12. It mostly came down to an enjoyable world to explore, an interesting (or at least tolerable) cast, and great art and music. Persona 5 was the first JRPG I managed to play outside Final Fantasy and I think the only reason I didn't finish it is my wife got impatient. I enjoyed watching the rest of her playthrough. One day I'll finish my own.

JRPGs often have an adolescent feel to me and I think it's probably essential that they do. I was a shut-in during high school even though I'm pretty extroverted. I had close friends but still managed to doubt that I'd figure out life: jobs, relationships, a future. JRPGs are great providers of "safe freedom" and a coming of age setting. They build faith that you can figure things out and win, often in a style that suits you.

Persona 5 nails this more than any RPG I can think of. It has incredible art and worldbuilding, an engaging story, and genuinely interesting relationships. It is the only RPG where I've been compelled to micro-optimize whether I study, work, build a friendship, or fight demons after school. How they made it both fun and relaxing, I'm not sure.

Hades

You've probably already heard about Hades. (And most of these games, in fairness.) It won Game of the Year from many publications. It is the first roguelike I have loved. Roguelikes are tricky for me. It's interesting to separate the games on my lists between an attraction for worldbuilding/story vs mechanics/gameplay. While there is definitely a spectrum, games are fairly even dividied as to what the big draw is for me but it is exceedingly rare for me to like a game that doesn't have strong art and storyline to rope me in.

Roguelikes as a genre promise variation from randomly generated elements in a playthrough and multiple ways to win but often struggle to have the same draw for me as games with more linear stories and higher production values. It's hard for randomly generated worlds to have a soul. Call me shallow but there are exactly 3 games on my lists that I would say don't matter to me at all in terms of story and characterization: Mega Man 2, Super Stardust, and Melee.

Lots of indie roguelikes (and metroidvanias too) struggle to not just be fun to play but also compel with their characters and sense of place. Hades brokethrough for me by having a very strong sense of meta-progress across runs, a very engaging story, beautiful art, and an amazing capacity to build enjoyment through more options the longer you play. It's hard to explain but it's magic. I remember saying the same thing about Persona 5 at some point, "It just keeps opening up".

Celeste

I love platformers. The last few years have really driven that home for me. Celeste took me a while to get around to because, well, the art didn't quite impress me. And I was fresh off playing Hollow Knight so my bar was probably a little high. It also didn't have combat and I wondered how the gameplay would develop to keep me engaged without it. That was a foolish mistake.

Celeste is one of the best platformers I have ever played, has a memorable and moving soundtrack, and one of the most thoughtful treatments of mental health in video gaming. It is brutally challenging while also encouraging the player to push onwards. For all its difficulty, kindness is somehow in its design. I am not one of the people who completed all the optional B and C-side content and probably won't be. I am immensely happy I took the time to pick it up.

Hollow Knight

We're really getting into the heavy hitters at this point. I loved Hollow Knight. Really loved it. I've been eagerly awaiting their follow-up game Silksong for the better part of 2 years, clinging to any news at all and hoping for a surprise release announcement constantly.

Hollow Knight is the complete package. A new IP from a formerly unknown developer. Just enough story and lore to have you curiously driving forward while retaining an air of mystery. Absolutely stunning artwork and animation combined with a fresh setting. A beautiful soundtrack to accentuate exploring. A sense of perpetual "opening up" as new mechanics and abilities are unlocked. And most important of all, beautifully tight physics and controls. The kind of game where it "just feels right".

It's been years since I've played it and I regularly entertain thoughts of playing it through again (which I don't really do with games). I'm sure I'll love it for years to come. Here's hoping 2022 is the year for Silksong.

Melee

I ... probably should stop the article now. Melee is a force. I played Super Smash Bros for N64 and Wii in college and really enjoyed it. Few things are better than beating up your friends with Nintendo characters. It's just a fact. But Melee is something else. You can play it the way you play the other smash games. It can be chaos with friends, random items and silly stages full of hazards. Or you can turn off the most chaotic random elements and stages, practice movement with your character, and turn it into possibly the most interesting competitive game I've ever played.

I started playing at the end of 2013 and I haven't stopped. I've traveled out of state with my friend Max to compete in national tournaments. It is the only fighting game I know of that has multiple tournaments with prize pools in the tens of thousands of dollars 20 years after release with no backing from its developer. I am closer to understanding fans of real sports because of how many times, how many seasons, I've watched twitch streams of major tournaments with tens of thousands of other spectators, rooting for pro players I think can break through to the next level of play or conquer their demon.

There are at least three high quality documentaries I can think of off the top of my head chronicling the game's competitive history and the stories of its players. There are countless sets I've loved watching. The melee I see played today has evolved from 2 years ago, which has evolved from 2 years before that, all the way back to when I started playing eight years ago. I have recordings of me playing in 2014 and 2015. I can't express how different they look to when I play now.

When does a game become more than a game? I think it's when the dedicated, long-term efforts of thousands and thousands of people force it to continue to grow and change until it no longer resembles it's humble origins. Every time I think the game has been pushed to its limits and all its secrets have been revealed, I'm proven wrong whether it's at the next tournament or the one after. It won't surprise me if Melee is still being played seriously 20 years from now. And even if it isn't, it's been one hell of a ride. Some good links below if you're interested.

Video Essays:

Documentaries:

Grade A Youtube Content (from entertaining to educational):

One very good recent set:

Compilations and Combo Videos:


Unless otherwise credited all material Creative Commons License by Brit Butler