2025 Retrospective

I know we're well into 2026, but I wanted to document some of my salient experiences from 2025. Maybe it's more for my memory than anything, but I had some brief motivation to write things down and wanted to capitalize on that.

Demystifying CSS Specificity

For awhile I had an inkling of an idea to do a talk that dives deep into CSS Specificity. You see, a long time ago, I was a wee intern at Workiva and one of the senior engineers gave a presentation about CSS from the ground up. I've always prided myself in being a bit more competent at CSS than your average dev, but at this formative time in my career this engineer's presentation took my understanding from CSS as a "throw styles at the wall until it looks right" tool, to better understanding the underlying mechanics.

So I decided 2025 was my year to give a similar, condensed version of this type of presentation a shot. I called it "Demystifying CSS Specificity" and gave it a fun wizard theme 🧙 Since the internal conference at my company can contain people of varying levels of technical ability, I started off with the basics of CSS 101 to get everyone on a similar playing field. It was a good place to start because it reminded everyone of the terminology we'd be referencing often. My favorite section of this was going over the anatomy of a CSS rule, highlighting what a selector, declaration, property, and value are.

During my preparation I realized that what I wanted to present wasn't actually CSS Specificity, but rather the full CSS Cascade (You know, the "C" in CSS), of which Specificity is just a part. The Cascade is what takes all the CSS rules from all applicable stylesheets and decides which of those to apply. This is the fun part of teaching where you end up learning more just by preparing. I learned and taught about the 5 steps of the Cascade algorithm:

  1. Relevance
  2. Origin and importance
  3. Specificity
  4. Scoping proximity
  5. Order of appearance

I'm not going to go over them here, but MDN has great reading material about the Cascade and also how Specificity works.

True to my talk title, I spent the most time on Specificity, and even included a fun (for me at least) quiz where I presented 2 competing CSS Rules and asked the audience to figure out which had higher specificity based on the calculation methods I'd described previously.

Overall, it was a great refresher for me for things I knew, and I learned a lot of new info along the way. Specifically about CSS Layers. Which helped, a month later when I...

New Project

...was temporarily put on a new project at work with a new team. I had a rare opportunity (at least at my job) to kickstart a brand new project. I was tasked with ramping up a team somewhat unfamiliar with frontend dev, and building out the roots of the site. It had been awhile since I'd built a new site from scratch, so this was an awesome opportunity to see what the latest and greatest stable frameworks were out there to use.

I don't think I'd previously had the chance to decide a tech stack at the onset of a project. Good grief, it's a lot of pressure. I went back and forth on frameworks on various decisions, including:

  • Next.js or Vite? The project didn't really need SSR, but I decided to go with Next.js in case it ever did, plus it was a platform I was familiar with and comes with a lot of things ready to go for you
  • CSS Modules or Tailwind? More on this in a bit, but people seem to really love Tailwind and I hadn't yet tried it out
  • Shadcn or Mantine or Material or DYI or...? So many choices for component libraries. Ultimately landed on Shadcn

Those were the ones I waffled about the most, I'd say. In retrospect, I recalled something Kent Dodds said at React Conf (more on that in a bit) when comparing all of the frameworks and options available today, and that is that there's really not a bad option. A lot of the tools available would be able to achieve the project goals.

A small regret from I had was not making a decision earlier about CSS. I really wasn't sold on Tailwind yet, so I decided to start with a hybrid approach allowing CSS Modules w/ SCSS and Tailwind. Over time this started to make our component library unwieldy and inconsistent, however. So we eventually made the call to only use Tailwind and convert the rest of the SCSS components to Tailwind. This just made sense, since we were already using Shadcn, which uses Tailwind by default. Tailwind took some getting used to, but over time I generally grew to like it. It just feels fast when writing components and it's great having it all self-contained. I'm still not a fan of long, icky classNames though, and though there are some tools that help with that, I never felt like it truly addressed the issue. Despite that, I did find myself reaching for it personal project soon after.

Oh, and I mentioned CSS Layers in the previous section. I really didn't know about them until this project, and it came in very handy because Tailwind heavily leverages layers to control how styles get applied and which are easily overrideable. While we were moving away from CSS Modules it also helped deal with some weird cases where the two were conflicting.

Anyway, I spent my time on the team building out the core of the application, its main layout, and some baseline components that would be used across the site. Aside from feature work, a lot of the rest of my time was spent advising, planning, teaching, and more. Overall it was an awesome experience and I felt that it helped me grow a lot in a short amount of time. It's motivated me to have an increase in confidence in my technical skills and ability to take on new challenges.

React Conf

For a long time I've wanted to go to an out-of-town tech conference, specifically React Conf. I've been to various conferences over the years in town, but never got to enjoy a full travel+conference experience. Well, React Conf 2025 was that opportunity for me! It was another eye-opening 2025 experience for me. I got to see what sorts of new tech was being worked on in the frontend React world, interact with other devs from around the world, and learn about React & web features I was not fully up-to-date on. I enjoyed my time and left motivated to start using some of the new features that were announced!

LLMania

Lastly, I don't think it's a proper 2025 retrospective unless we mention the "AI" fuss reaching critical mass during the year. I'm definitely a self-ascribed slow adopter but it served impossible to avoid, especially given the widespread "executive encouragement". Looking over the course of the year, I went from just using Copilot to make quick inline suggestions and asking it questions, to trying out Cline to develop full features, and finally landing at Claude Code in the terminal to do similarly, but a bit better.

There's not much I can say that hasn't already been said... These things churn out code fast. I try to adopt sort of a senior engineer / junior engineer relationship with it--I give the prompt, it proposes a plan, I make suggestions/corrections, then I say go. It does the thing, probably makes some mistakes, I explain what's wrong and what to correct (or just fix it myself if that's faster), and on, until it's done. But wait, it's not done. I own all of this code. So I review all the code that I'm about to be responsible for in the Pull Request stage to make sure I'm happy with it.

It's really resulted in doing a lot more code reading than code writing over the last year, for better or worse. Some decent code is inevitably produced, but seeing unvetted and sloppy or hacky or overly verbose code in Pull Requests can admittedly get a bit draining. I also feel like it takes some of the satisfaction out of the trial & error learning and repetition that develop what we call "experience" long term. Part of me wonders if the incoming generation of devs is losing out on some of that. I only feel comfortable using LLMs to write code because I know I can vet whether or not it's giving good output or not. What happens for a dev that doesn't understand what's happening?

I don't know what the long-term effects will be, but I definitely think about that a lot these days.

Wrap up

2026 is well underway at this point, but I'm looking forward to another eventful year. Outside of my career, I hope to have some personal passion projects to write about in the future 🙂