Hi, I’m Steve. I’m a VP of Engineering in the XBOX team at Microsoft, focusing on commerce, apps, personalization, and working on ways to create the best experience for gamers. Even with all the things I’ve done in the past, this has to be the coolest job I ever had.
My Spotify is all over the place, from Death Metal (Opeth, Lamb of God), to 80s/90s J-Pop (Yuming, Imai Maki, Anri, Speed, Chemistry), and more recently to Taylor Swift, and classic jazz.
I was into hardcode rap (e.g. DMX, Ruff Ryders), but when Office Space came out, I realized I was the Michael Bolton character, and I pivoted.
In my day job I’m using a mix of C#, C++, TypeScript, and Python. Of course, I used to hand code all of this, but today GitHub Copilot is my primary coding partner, and I use it to write code in all of those languages. Still, I’m a firm believe in “trust but verify” — like when I look at piece of generated code and ask “wouldn’t it be better if you did it this other way?” and it comes back with “you’re absolutely right!”. Ugh, then why didn’t you do it that way in the first place!?
At Intuit I was mostly using using Kotlin, and some Java. I would say Kotlin is my favorite language of any I’ve used on a daily basis — I’m impressed that they were able to make a language that was expressive enough to make you highly productive, while still making it highly readable and fun to write.
I went back to C# to re-create XSP (the engine powering this site), but after using Kotlin I found C# to be a little clunky. Maybe it’s all the semicolons, but also the lambda syntax in C# which isn’t as nice as the trailing lambda syntax in Kotlin.
In the more distant past I’ve written apps with HyperTalk, Pascal, C, x86 and 6502 assembler, BASIC, plus 4GLs such as dBase, and 4th Dimension. I also wrote code for a IBM VM/XA mainframe for a few years using COBOL and Easytrieve.
I do ... but I’m a bit rusty. I used to be fluent in Spanish (Castilian aka. Standard Spanish), and conversational in Japanese. But along the way I’ve learned French, Welsh, Italian, Portugese, plus some Cantonese and Mandarin (which I can understand better than I can speak).
I’m currently doing Spanish and Japanese in Duolingo, then I’m moving on to Mandarin to improve that, and adding Hindi. I’ve found I can learn two languages at a time as long as they’re not similar. That was a mistake I made before when I was learning Spanish, Portugese, and Italian at the same time, and found I was getting the vocabulary all mixed up in my head.
As a computer guy, I’ve always been fascinated with the syntax and etymology of spoken languages, and how they provide a window into the mindset of different cultures. I find Japanese particularly interesting in this regard — the whole language works like LEGOs, and they have verb conjugation that would require extra words in English. For example a verb like okiru (起きる — to wake up), but if you conjugate with -nikui (にくい — “hard to do something”), you get okinikui (起きにくい — “(it is) hard to wake up”. Such an interesting language. Japanese also adapts words for “sound convenience” (to make words easier to say), which is also a big thing in Welsh. I’m such a nerd.
I was doing XML in the very early days, even before it came to be used in web services. In 1997 I was working on a few shareware Windows applications, and wanted them to exchange data. I started out with a text format based on Microsoft’s Regedit text format (similar to YAML), but it had limitations. Then I found XML, but I couldn't find any parsers, so I wrote my own. About a year later I was interviewing at Dell, and they wanted to use XML to re-do the Dell Europe website. I was the first person they’d talked to that had even heard of XML.
I ended up writing a scripting language called XSP where the scripts themselves were written in XML. We then used that to support Dell.com in Europe in 22 countries. XSP had an interesting content inheritance model that let you manage a large number of countries but only localizing what you wanted to. This was very popular with the business, and in 1999 we rolled it out to support the website globally in 85 countries.
I have an updated version of that script engine on my GitHub. And in the spirit of “eating your own dogfood”, this site was built with that engine. The original engine did quite a bit more, but this version is orders of magnitude faster (this page executed in 7.288ms) ... The benefit of 25 years advancement in technology (and my ability, I guess).
Proof: this is the unstyled output of the page script
More proof: this is the execution trace.
Also, did you notice what happens when you refresh the page? Just in case you didn’t think there was a script running the page 😉
One fun thing about XSP ... In late 1998 I showed what I was working on to some folks at Microsoft, as I was encountering a lot of stress bugs in MSXML.DLL (the parser/XSL processor I was using at that time). They were giving each other furtive glances, and one said “is this that XSP?”. “No, he made his own!”. It turned out there was effort inside Microsoft to create their own XSP to replace Classic ASP, where they were basically adding XSL constructs to Classic ASP. We got connected, and I showed the XSP team what I was working on. I don’t know exactly what happened next, but about a month later they scrapped what they were doing, and ASP.NET was born.
There were quite a few similarities — the idea of creating an intermediate hierarchy of nodes, then rendering it. In XSP that was an intermediate XML document, and in ASP.NET 1.0 it was the Control hierarchy. XSP also created a hierarchical trace so you could see what it was doing, and where, and ASP.NET 1.0 had basically the same thing.
One thing ASP.NET 1.0 didn’t do was borrow XSP’s functional override mechanism. In XSP script support inheritance, so when you are building up a webpage, you can override a base method to change the content in a section on a page. This enables the base page to act like an overridable template. There was no easy way to do this in ASP.NET 1.0, but ASP.NET 2.0 introduced Master Pages that let you achieve the same thing. Of course, XSP had been doing that for 7 years by then!
Execution time: 7.288ms