I've finally resumed progress on a major update to Weather Now. I finished everything except the user interface way back in April, but between summer, Cassie, and everything else, I paused.
At least, until last week, when something clicked in my head, and I started writing again. As my dad would say, I broke the code's back.
It turns out, the APIs really work well, and I'm getting used to .NET Blazor, so I'm actually getting things done. The only downside applies to Cassie, who will probably only get 90 minutes of walks today instead of the two hours or so she got on summer Saturdays.
We've just completed Sprint 50 at my day job, which included upgrading our codebase to .NET 6 and adding a much-desired feature to our administration tools. Plus, we wrote code to analyze 500,000 emails from a public dataset for stress testing one of our product's features. Not bad for a six-day sprint.
The sun is out, and while I don't hear a lot of birds singing, I do see a lot of squirrels gathering walnuts from the tree across the street. It's also an unseasonably warm 7°C at Inner Drive Technology World Headquarters, going up to 10°C today and 12°C by Thursday. So Cassie and I will head to the dog park in just a few minutes.
First, though, just a couple things of note:
And with that, Cassie has some running around to do.
Having a day off with no real responsibilities gives me the space to take care of some niggling projects I've put off for a while. First, I finished updating a document for the Apollo Chorus that lists every sit and stand cue and every score marking for our Messiah performances. That took about 8 hours altogether.
I also updated my main NuGet packages to .NET 6. As a nice bonus, because of a quirk in how .NET assemblies get versioned, today's release is version 4.2.8000. (I kept the previous release active just in case someone needs it for an existing .NET 5 project.)
Oh, and I've got a pot of stew going that should finish in about an hour. I made a lot of it. I hope it freezes all right. Good thing I have tons of Mason jars. It looked like this at 3½ hours:
Today is the 50th anniversary of DB Cooper jumping out of a hijacked airplane into the wilds of Washington State. It's also the day I will try to get a Covid-19 booster shot, since I have nothing scheduled for tomorrow that I'd have to cancel if I wind up sleeping all day while my immune system tries to beat the crap out of some spike proteins in my arm.
Meanwhile, for reasons passing understanding (at least if you have a good grasp of economics), President Biden's approval ratings have declined even though last week had fewer new unemployment claims than any week in my lifetime. (He's still more popular than the last guy, though.)
In other news:
Any moment now, my third DevOps build in the last hour will complete. I've had to run all three builds with full tests because I don't always write perfect code the first time. But this is exactly why I have a DevOps build pipeline with lots of tests.
I've spent today alternately upgrading my code base for my real job to .NET 6.0, and preparing for the Apollo Chorus performances of Händel's Messiah on December 11th and 12th.
Cassie, for her part, enjoys when I work from home, even if we haven't spent a lot of time outside today because (a) I've had a lot to do and (b) it rained from 11am to just about now.
So, as I wait for the .NET 6 update to build and deploy on our dev/test CI/CD instance (I think I set the new environments on our app services correctly), I have a few things to read:
OK, the build has...well, crap. I didn't set the environment correctly after all.
Update: Fixed the build bit. And the rain stopped. But the test platform is the wrong version. FFS.
Update: Well, I have to pick something up from a store before 6, so I'll come back to this task later.
Update: Even though I've had 4 tiny commits of minor things that broke with the .NET 6 upgrade, this hasn't gone poorly. Kudos to Microsoft for providing a straightforward upgrade path.
The software release yesterday that I thought might be exciting turned out to be fairly boring, which was a relief. Today I'm looking through an ancient data set of emails sent to and from some white-collar criminals, which is annoying only because there are millions and I have to write some parsing tools for them.
So while I'm decompressing the data set, I'll amuse myself with these articles, from least to most frightening:
Whee! WinZip has finished decompressing all 517,000 files. Now to write a parser...
It's 22:20 on the last day of my sprint, and I have finally completed the refactoring project I started at the beginning of the sprint. And...bing! "Azure DevOps [Build Succeeded]" email. Whew!
Tomorrow we'll have a boring release of last sprint's code, since it has sat quietly in our Production Build pipeline just waiting for me to push it to the Production Deploy pipeline for two weeks.
Sometimes this happens. Both the (delayed) release tomorrow and the refactoring this sprint solve two major problems that prevented us from moving forward on development. But wow, until I cracked the nut on this code, it was not easy.
I had to pause the really tricky refactoring I worked on yesterday because we discovered a new performance issue that obscured an old throttling issue. It took me most of the morning to find the performance bottleneck, but after removing it a process went from 270 seconds to 80. Then I started looking into getting the 80 down to, say, 0.8, and discovered that because we're using an API limit with a request limit (180 requests in 15 minutes), I put in a 5-second delay between requests.
So now I've got all this to read...someday:
Finally, the economics of workers vs employers has taken an odd turn as job applicants have started simply ghosting interviewers. But, as Slate says, "employers have been doing this to workers for years, and their hand-wringing didn’t start until the tables were turned."
Cassie has bugged me for the last hour, even though we went out two hours ago. I assume she wants dinner. I will take care of that presently.
Remy Porter, owner of the hilarious blog The Daily WTF, responded to Facebook's catastrophic BGP update by pointing out how software actually gets made:
IT in general, and software in specific, is a rather bizarre field in terms of how skills work. If, for example, you wanted to get good at basketball, you might practice free-throws. As you practice, you'd expect the number of free-throws you make to gradually increase. It'll never be 100%, but the error rate will decline, the success rate will increase. Big-name players can expect a 90% success rate, and on average a professional player can expect about an 80% success rate, at least according to this article. I don't actually know anything about basketball.
But my ignorance aside, I want you to imagine writing a non-trivial block of code and having it compile, run, and pass its tests on the first try. Now, imagine doing that 80% of the time.
It's a joke in our industry, right? It's a joke that's so overplayed that perhaps it should join "It's hard to exit VIM" in the bin of jokes that needs a break. But why is this experience so universal? Why do we have a moment of panic when our code just works the first time, and we wonder what we screwed up?
It's because we already know the truth of software development: effing up is actually your job.
You absolutely don't get a choice. Effing up is your job. You're going to watch your program crash. You're going to make a simple change and watch all the tests go from green to red. That semicolon you forgot is going to break the build. And you will stare at one line of code for six hours, silently screaming, WHY DON'T YOU WORK?
Yep. And still, we do it every day.