aka Jim Winstead Jr.
Hire me! (click for details)
I am a software developer. After teaching myself to code on Apple II computers in junior high school and building software for our family-owned telecom business, my degree in Computer Science from Harvey Mudd College gave me the grounding for a career in software development where I was able to let my programming freak flag fly: I worked for Knowledge Adventure, an educational/games software company (where I first started leading teams of developers), HomePage.com, an internet startup (where we developed a white-label free web hosting platform), and MySQL Ab (where I led the web development team and then transitioned over to the server development team).
Through this time I was also involved in the open source community. In college, I was involved in the very early days of Linux, and I took over maintenance from Linus of the “root” disk used to install Linux before distributions. While working on websites for Knowledge Adventure, I got involved with the the PHP project, and became a founding member of the PHP Group. I helped set up and maintain some of the collaborative development infrastructure, including the mailing lists and online documentation feedback system. Then at HomePage.com, I contributed work we did related to `mod_perl`, and became a member of the Apache Software Foundation.
After MySQL Ab was acquired by Sun Microsystems (and then further by Oracle), I co-founded Raw Materials Art Supplies, a retail store in downtown Los Angeles which I have been operating as general manager for the last 15 years. I built Scat POS, a point of sale and ecommerce system using PHP and MySQL that we are using to run the business. It has involved a lot of integration work (payment processors, product feeds, shipping), and I automated as much as I could to focus on our artists' needs. This enabled us to build our business from scratch into one of the top independent art supply stores in the country.
I’m primarily looking for individual contributor roles. PHP/MySQL is the core of what I do best, but I'm comfortable with full-stack web development, Linux system administration, C/C++, Docker, and confident in my abilities to jump into any tech stack and get up to speed quickly.
View my LinkedIn profile for some dates and details, and my GitHub profile for some of my open source contributions. Contact me to discuss opportunities.
Second verse, same as the first
A disheartening thing about the job market right now is that it feels very stagnant, and I find myself coming across job listings that I skipped over earlier because it fell outside of the parameters I really need or want, but decide it’s time to just go ahead and apply to it and see what happens.
And then I notice that I actually did apply to it some weeks or months ago, and just never heard anything back.
I interviewed with a company recently that ended up deciding to not hire anyone right now. I am grateful to have gone through the process at least, just getting to flex that muscle of talking to interviewers and doing some technical exercises.
I continue to apply for other positions, riding that rollercoaster, and still somehow retaining some sense of optimism that the right opportunity is around the next bend.
Hits, Flops, and Other Illusions
Hits, Flops, and Other Illusions by Ed Zwick is a Hollywood memoir from one of the creators of thirtysomething and director of films including Glory, The Last Samurai, and Blood Diamond. It’s full of good stories well told, as you might expect, and also liberally sprinkled with writing and directing advice in the form of humorous lists, like “Ten Tips from Long Lunches with Sydney (Lumet).”
More than anything, it left me wanting to watch and re-watch some his films and those of the people he talks about a lot in the book like Denzel Washington. We did watch Glory before I started this and reading Zwick’s behind-the-scenes take on it really helped crystallize for me what I had liked about the film and how those performances came to be. We have The Last Samurai queued up to watch soon.
I also enjoyed how Russell Crowe kept popping up in strange and unexpected ways, which is funnier now that I look at their respective filmographies and see that they haven’t ever actually worked together. That doesn’t seem entirely accidental on Zwick’s part.
I double-checked whether they had worked together using The Oracle of Bacon and I love that it is still around. The list of the “centers of the Hollywood universe” (defined here) is incredible.
So many photos
There are about 1,900 photos in the photo library on this site, but I have almost 25,000 pictures in my iCloud photo library. I need to figure out how to close that gap.
I think mostly what I want to integrate will be many, many more pictures of Wonton.
Until then, enjoy this old picture of a squirrel.
(I also made it so entries with images will use those in the link previews elsewhere. It is another thing that could use refinement, but I am trying to not let the perfect be the enemy of the good when it comes to pushing things along here.)
Dr. Brain Thinking Games: IQ Adventure
Dr. Brain Thinking Games: IQ Adventure was one of first two games produced by Knowledge Adventure based on the earlier Dr. Brain games from Sierra Entertainment. KA and Sierra had wound up under the same corporate umbrella, and the “games group” at Knowledge Adventure that I was part of developed them. Our group handled three projects at the time: IQ Adventure, codename “Dime,” Dr. Brain Thinking Games: Puzzle Madness, codename “Nickel,” and the corporate website, codename “Penny.”
IQ Adventure is a third-person isometric puzzle/adventure game which was written in C++, and we used the networking and graphics library from Blizzard Entertainment (another corporate sibling). I was the lead programmer. We did some strangely ambitious things, one of which is that the game levels weren’t just laid out by hand, but we had a map specification language that was used to generate variations of the levels. Here is an example map that I was able to extract from the files on the CD. I couldn’t tell you how it works, really.
During our early prototyping, we did have a way of building environments by hand to test out artwork and the interface. It was just a mode in the game engine that let you “draw” with terrain tiles or place others into the environment. I remember before the team doing the artwork had created our main character, I prototyped with just a little whirling tornado that moved around so I could work on things like the path-finding algorithm.
The whole game was very data-driven. There was a text dialog system that let you interact with the NPC characters that was HTML-inspired. The animations of Dr. Brain giving you instructions were lip-synced using a tool that Knowledge Adventure had developed for their whole line of titles, which meant it was just audio files and frame timings that drove an eight-frame animation set. All of the puzzles and in-game quizzes were rule-based so they would be different on every playthrough. (Sorry to our QA team!)
Here’s a video I found someone playing through one of the levels (or more, I didn’t watch the whole thing).
The multiplayer was pretty simple but I also don’t remember much of the specifics. You could chat with other players, and because this was aimed at younger users there was a basic attempt at filtering out bad words, and I believe all of the chat was logged and someone from the customer service team was assigned to review it regularly, or maybe only when someone complained.
I wish that I still had the source code for the game and even the original media asset sources. In the released game, they were all rendered down to a 256 color palette because that was how things were at the time. I think it would be fairly straightforward to bring the game up on current platforms. You could probably even do it on WebAssembly or something else cross-platform. Unfortunately all of the filenames get lost when extracting the assets from the CD, so even just sorting them out to build something else with them would be pretty tedious. (Then again, the original game may still just work on a more current version of Windows that can run 32-bit apps, since I don’t think there was anything particularly fancy about it.)
I believe that Puzzle Madness was developed in Acomplish, the in-house proprietary multimedia scripting language that I blogged about earlier.
The third game in the series (from KA) , Dr. Brain Thinking Games: Action Reaction, was a first-person puzzle/shooter, and that was partly funded by Intel in their effort to drive adoption of the Pentium processor. It was developed using the Unreal Engine. The bad guys in that game worked for S.P.O.R.E.: Sinister People Organized Really Efficiently, which still makes me laugh. (I am pretty sure the codename for this one was “Quarter” but I didn’t work on it and left the company while it was being developed.)
Kill It with Fire
Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones) by Marianne Bellotti was recommended to me by a college classmate on a post I made on LinkedIn a while back. (Part of a series of observations about how terrible ZipRecruiter is.)
This book is great, and I would highly recommend it to any software engineer. It’s not only about modernizing software applications, but has a lot of insight into how being a long-lived project is a reasonably likely outcome for any project, and you can save someone in the future from a lot of trouble by making some better decisions up front.
It also leans into the human factors and business realities of how software is developed, something I feel like I have been complaining about here and elsewhere.
Something I had to flag
“We had the chance to review your application and while your experience is impressive, it doesn't align perfectly with what the team is looking for so unfortunately we won't be moving forward with your candidacy.”
I can’t help but feel that I dodged a bullet on this one, because looking for “perfect” alignment from a candidate is a huge red flag.
It is also a really strange thing to say when you put this in your job description:
“P.S. If you don’t tick every box in this ad, please don’t rule yourself out. We take pride in inclusion and hiring incredible human beings with great potential over ticking boxes – so if this role resonates with you, hit that apply button!”
I’m a white guy with an enormous amount of privilege, so whatever. But I hope that Linktree isn’t sending this awful form rejection to the diverse candidates they claim to be trying to include.
The Mountain in the Sea
The Mountain in the Sea by Ray Nayler explores what happens when humans create and encounter other intelligent life here on Earth. There’s an artificial intelligence in the form of an android, created as a Frankenstein’s monster from bits and pieces of the minds of humans but becoming something else, and then an emerging civilization of octopus that appears to have developed a written language. The backdrop is another hyper-capitalist dystopia where automated trawlers staffed by human slaves are scraping the last bits of protein from the oceans.
It’s a richly-drawn world, but the novel feels a little unfulfilling because it doesn’t just tell a complete story. There are a few parallel story lines that really only come together in the last couple of chapters, and clearly there could be a lot more to the story.
This speech by Martha Wells at the annual Jack Williamson Lecture at Eastern New Mexico University in Portales, New Mexico helped me connect some of the themes between The Murderbot Diaries and this novel.
Somebody thought of that
I get a little antsy when all of the posts with images have fallen off the front page of my site. The other day, I took this picture of a rainbow from our window and I had been trying to find something appropriate to say to go along with it, but have not.
Certifiable
Because I am paying for a “LinkedIn Premium” membership during my job search, which has mainly been useful for letting me see who is looking at my profile, I decided to see what other benefits I could wring out of it. Access to their library of online courses was an obvious one to check out, and after a day of going through some lessons on Docker, I am the official holder of a “Docker Foundations Professional Certificate.”
As a software engineer with a fancy degree from a fancy school, the idea of certification feels a little down-market to me. It’s on the other side of that strange divide between computer science and information technology. That line has gotten a lot fuzzier over the years, with “DevOps” trying to give a name to that overlapping space between developer and system administrator.
(Look at me, calling myself an engineer instead of just a developer. Funny that the most prestige seems to have gotten attached to engineer instead of scientist. My fancy degree is in “Computer Science” but I don’t know that I’ve ever seen someone call themselves a computer scientist outside of academia.)
Another time I found myself facing that sort of divide was in high school when I mentioned to a classmate that I was thinking of taking a “shop” class as an elective and they were horrified. I was supposed to be on the college-bound, AP-class-taking trajectory.
Did I learn anything from the training on LinkedIn that I didn’t already know? Not particularly.
Is the certification that I earned on my profile now? Of course.
Now I’ve got my eye on that “Career Essentials in GitHub Professional Certificate.”
System Collapse
System Collapse by Martha Wells is the latest entry in The Murderbot Diaries series. The series is made up of short stories, novellas, and novels, so I always feel awkward referring to the individual components.
Whenever I read the latest Murderbot installment, I am reminded of the story I told a long time ago about how I took offense to another customer at the bookstore describing the book in a series I liked a “popcorn” book. It would be easy to see how I could say the same thing now about the Murderbot books and similarly offend a fan, because calling it a “popcorn” book seems reductive and dismissive.
The series is sort of infamous for strongly connecting to a neurodivergent audience. The main character, whose inner monologue narrates the stories, is non-human but very directly inspired by the author’s own experiences with depression, anxiety and not being neurotypical.
I certainly feel that connection. I have a constant inner monologue that I am very much reminded of by the writing of Murderbot. I’ve never been diagnosed with ASD or ADHD, or even anxiety or depression, but I certainly have self-diagnosed to varying degrees with all of those. I look at information about monotropism and see myself in much the same way that I see myself in Murderbot. It’s not directly me, but has helped improve the context in which I understand myself.
This story, like most of the others, is compact. There is action, but if I think had to describe what it is about I would say it is mostly about Murderbot deciding how to open themselves up to others and connect their own story with theirs. It’s about post-capitalism up against a hyper-capitalist society. It’s about how media informs how we view ourselves.
It is a wonderful series of stories, and this one is no exception.
It will be really interesting to see how the Apple TV+ series based on the series will turn out.
Breaking down the profitability of a online retail sale
I saw a small business owner post on social media somewhere complaining about how hard it was and part of what they complained about was how much they had to pay in sales tax. That is one of those misconceptions that irritates me because the way you have to think about sales tax as a retailer is that it is money you are collecting for the state from your customer, not money that you as the business are paying to the state.
That money you collect for sales tax is never yours, although you may get to hold on to it between the time you collect it from the customer and you submit your monthly (or quarterly) payment to the state.
So you should never, ever, ever include sales tax collected in your sales figures. It’s not really ever your money, and it only seeks to confuse things if you think of it as such.
But that led me to thinking it might be useful to some people to break down an actual sale to an online customer from our store on March 31, 2023. The customer was in Nevada, and they paid us with PayPal. Here’s what it looked like from their perspective:
Quantity | Description | List Price | Discount | Sale Price | Extended |
---|---|---|---|---|---|
2 | 6x12 3/16in MDF Panel | $4.19 | 50% | $2.10 | $4.20 |
1 | 4oz Gloss Waterborne Acrylic Varnish | $13.69 | 30% | $9.58 | $9.58 |
Shipping & Handling | $7.80 | $7.80 | $7.80 | ||
Subtotal | $21.58 | ||||
Tax | $1.80 | ||||
Total | $23.38 |
The MDF panels were sold at a 50% discount, and the extended price on that line is a demonstration of how your method and timing of rounding in calculations can lead to results that may surprise someone. You might think two items that cost $4.19 that are 50% off will cost $4.19 in total, but if your calculation actually looks like: $quantity * ROUND_TO_EVEN($price * $discount)
that will give you a different result than ROUND_TO_EVEN($quantity * $price * $discount)
.
Okay, so our gross revenue for this sale is $21.58. (Remember, don’t count the tax!)
Now I’ll pull back the curtain and reveal our costs:
Quantity | Description | Cost | Extended |
---|---|---|---|
2 | 6x12 3/16in MDF Panel | $1.05 | $2.10 |
1 | 4oz Gloss Waterborne Acrylic Varnish | $5.61 | $5.61 |
Shipping & Handling | $7.80 | $7.80 | |
Subtotal | $15.51 | ||
Transaction Fee | $1.31 | ||
Packaging | $0.87 | ||
Promo Items | $0.50 | ||
Total | $18.19 |
Okay, nothing too shocking there. We did get fortunate and the shipping calculation done our website matched our actual shipping cost exactly.
PayPal collected $1.31 in transaction fees ($0.49 + 3.49% of the full transaction amount - one place where the sales tax does cost us).
We didn’t really account for it on a per-sale basis like this, but I added in the expenses for the box we shipped the order in, and the promotional items (branded pencil and stickers).
So after adding up all of these costs, we ended up with a net profit of $3.39. That’s a net margin of about 16%.
That didn’t all end up in our pockets, of course. We had employees, rent, insurance, other business expenses, and debts to service.
A difference between this and an in-person sale is that the shipping stuff would be a non-issue, of course. Another is that our transaction costs for payments in person were much lower (about 2% on average for cards, or essentially zero for cash).
A larger online sale might have triggered our free shipping, but the per-sale costs (fixed part of transaction fee, the box, the promo items) wouldn’t have taken as much of a bite on a percentage basis.
In conclusion, the margins weren’t great, and without enough scale, the overhead will kill you.
Open source and anxiety triggers
I have been thinking more about bullying in the open source community being a security problem and how part of the process of getting the XZ backdoor into play was playing into the mental health struggles of the original maintainer.
It reminded me of a flawed system that I found having a large impact on my mental health while running our store. Like any diligent small business, we claimed our listings on Yelp and Google and the other major spots where people leave reviews.
I can still feel my stomach dropping when I would get a notification from Yelp that said someone had left a review. Thosee notifications didn’t give the single most critical bit of information: how many stars. Was it going to be a nasty one-star review, or was it someone leaving a wonderful five-star review? No clue! First you have to log in to the Yelp for Business website to see how the rest of your day would feel.
It was the “we need to talk later today” message from your boss that anyone could lob at me at any moment, maybe without even knowing they were doing it.
This was also brought to mind when I read about Daniel Stenberg’s experience with AI-generated security bug reports for curl
and besides the aggravation of the reports being nonsense, I could only imagine that adrenaline spike when the report first comes in.
And bringing this back to something I linked to yesterday, where someone from Microsoft reported an issue with ffmpeg
as “high priority”. Again, I can imagine one of the maintainers reading this request and feeling that adrenaline spike, that anxiety trigger.
It turns out that it wasn’t even a bug in the project, the reporter just didn’t know the right command line options to use. (I will also point out that they also said they were going to provide updates on whether the free support they received worked, but then they never did.)
Maybe the ffpmeg
maintainers and Daniel are good at shrugging this stuff off. I thought I was, but one of the lessons that I learned from running our store is that the effects are cumulative even when individually small, and it is a good idea to figure out how to combat it.
And while there won’t be any simple technical solutions to these human problems in open source, it is very important to make sure whatever tools are being built don’t create these same sorts of anxiety spikes. We need to make sure to build kindness into the tools, whatever they may be.