Are you following the Euro, by the way, the football? I'm not a big football fan. I did watch the last half and the extra time and the penalties of the Switzerland game, though, which was very exciting. And I'm not a football fan, but I believe we don't have a great track record at penalties. I think we did exceptionally well in that Switzerland game. I was going to say England winning on penalties is quite the occasion. It's unheard of, right?
Yeah, practically. And we're set up for my adopted country, France, possibly going up against England. Who knows? Although going past Spain... Oh, really? Is that what's next? Well, it's not next. I have no idea what the schedule is. France have to win against Spain, which is a tough one. And England will have to win against, and I'm blanking who their next opponent is. So yeah, there's still steps to go. But it might be a nice, interesting final.
No, I've been watching more Wimbledon than I have football. But I think all the British names are even knocked out of Wimbledon by this point at this stage. So that's a shame. Yeah, the French as well, I believe. Yeah, just the last one dropped out yesterday. And I've been seeing a lot of rain in SW19. Yes, yeah, there has been a lot. In fact, I think I was reading the other day that they were going to
consider reducing the length of some of the matches to try and fit it all in this week. So I don't know whether that's gone ahead or not, but that would be, I think, unprecedented if they do that. But how would they do that? Like up to four games only or super tie breaks? What's the solution there? Yeah, I think tie breaks after two matches were on the table. Oh, wow. Okay. So I don't know what the, sorry, not matches, sorry, two sets. Interesting. Well, let's see how it goes.
But I'm not sure what the conclusion of that was. But you didn't tune into this podcast to learn about football or tennis, I hope, because you're in the wrong place if you have a football and tennis talk. What we can talk about this week is two blog posts, actually. So we published, first of all, a blog post on SWIFT.org about the Ready for SWIFT 6 project that we've been working on this summer. And I won't go into huge detail about that because we've talked about that
at length on this podcast. But there is a blog post there that gives a bit of an overview about what we're doing and how we're representing that data on the package index package pages and things like that. And so that's up on the SWIFT Language blog, if you haven't yet checked out that page or are interested in some of the work that went in behind the scenes on that.
And then the second blog post is one that we published just yesterday, which is about a new expansion to our build infrastructure that we use to do all of our compatibility build testing and documentation building and all of that. So we have, since the beginning, used a mixture of machines because we have Mac machines, which you need for performing
the Apple platform builds, Mac OS, iOS and friends. And we run some Linux builds using Docker on Microsoft Azure, which is kind of separate, but all part of the same build system. And up until quite recently, we've had several Mac mini machines, just kind of bare metal, manually configured Mac mini machines that we've been running on. And they have been,
I mean, they've been amazing. We started off with two Mac minis at the beginning, and they ran the initial set of builds, plus hosted the entire website at that point, didn't they? Yeah. And they were Intel Mac minis, right? Because that was actually quite a bit slower compared to the first M1 Mac mini we got once those came out.
Yeah, we had the most overloaded web server ever when we first launched that build system, because it was trying to serve the web page and constantly process builds in the background. And over time, we have separated that out. The web server is no longer on that infrastructure anymore. That's running in Azure too. And the Mac mini machines became dedicated build machines that do nothing but build packages. And that was great. That was a
great step forward. But of course, there's a couple of restrictions with that. First of all, it's all manually managed. So maintenance each week was making sure that the machines were still stable, because running hundreds and thousands and tens of thousands of builds per week on the same machines can be a source of instability. And making sure they're up to date with updates and all that kind of maintenance stuff that you have to do.
But also, there were some limitations in that system. Because we were running each of those compatibility builds on the same machine as other compatibility builds, there was no kind of isolation between those environments. So we never hit insurmountable problems with this. But it was always a worry that either someone would find some way to break out of the Swift compiler sandbox and be able to do something to the Swift compiler that would disrupt or damage
the machine. And thankfully, we never had that situation either. But again, that was always a worry. But secondly, just build environment isolation is a nice thing to have. To know that your build is not going to be impacted by something that some other build did at some point. So we had a really great system. And don't get me wrong, the system worked incredibly well for years. But it was never ideal. And in a conversation where we were talking to Macstadium
about capacity, we ended up talking about their Orca system. So their Orca system is a Kubernetes system for virtualizing macOS. So I think it's Orchestration... What's the... Do you remember the abbreviation, the acronym? >> For Kubernetes? >> No, for Orca. >> Oh, the acronym. Oh, I'm sorry. No, I don't know. I don't know what Orca... Right, that isn't actually just the whale, is it? >> No, no. Well, I mean, it is a whale. It's VM Orchestration with Kubernetes on Apple.
So they have this orchestration system for automating the creation and deletion of virtual machines on native Mac hardware in a kind of automated way. And so we ended up talking about that system with them and whether we could switch to an ephemeral build system, which is that every single build that we attempt gets a completely fresh VM, starts the VM up,
executes the build, and shuts the VM down at the end of it. And that gives us total predictability because you're starting from the same exact place on every image every single time because the changes are not persisted back to the image. And it also gives us complete isolation, both from the impacts of other builds doing things to affect this build, but also of malicious builds. They would have to not only break out of the Swift compiler, but they would have to break
out of a virtual machine as well, which I think is almost impossible. Never say anything security wise is impossible, right? But I think it's as good as. Yeah, absolutely. And I think one huge advantage, which we didn't have to do it often, but sometimes we had to run builds in the actual environment. And that was always, you know, it meant to SSH into one of the builders, pick the
right one, check out stuff there. And, you know, you always sort of kind of worried, well, is this going to be different because I'm now doing it in a different directory than normally? You know, it's this here, we can just spin up the exact same copy of a machine, connect to it and run the build just as it normally would. And you can have really high confidence that you're actually looking at the same thing and debugging the same thing.
And that's just a big help. But I think if you ask me what's the biggest advantage is beyond, you know, the maintenance that you already talked about, this debugging is actually our capacity management, because we now have the situation where every machine in the cluster can run any build. And previously, that was not the case. Every physical Mac that we had set up had a specific macOS version, and then one or two Xcode versions. I think that's sort of the maximum
we ran with. But we sort of had to configure them in certain ways. And not every Xcode version can run on every macOS version. So we had to be, we had to choose what we deploy. And we never had a great mix where every Swift version was equally available across all machines. There was always one machine that was handling, like two Swift versions, where the other two were only handling one version. And you can imagine if lots of builds are coming in, that one machine will be struggling
while the other two are underutilized. And that's great right now, because as soon as something shows up that needs building, any machine can participate. And not only that, it also means that in case we need more capacity, it's really easy to just add it in general, and it'll benefit all Swift versions. So we never need to worry about specifically setting up certain Swift versions and their availability anymore. And that's just a huge relief. And you see the benefit as we
right now do our Swift 6 reprocessing. So over the summer, we're continuously hitting the system with lots and lots of builds of a very specific Swift version. We can just run full throttle, and we don't need to tweak anything about our setup. Like previously, we put up a couple of extra Swift 6 builders to help us deal with that immense backlog as soon as the new Swift 6 version came out. Now we don't have to, we just have everything available and we can just run with it.
And that's just a huge relief. And that situation was quite extreme at times. Sometimes we needed three different host operating systems to run four different versions of Xcode. So at one point, we were running Monterey, Aventura, and Sonoma, with Monterey running one Xcode version, Sonoma running one Xcode version, and Aventura running two. I think that was when we were running five,
six and above. So yeah, it was never even load. And now as part of this Orca system, we get to, on a job by job basis, say, let's spawn a Swift 5.7 build system, or let's spawn a Swift 5.10 build system. And it comes up in a remarkably short amount of time. I did a little testing
for the blog post as I was writing it. And the average time to spawn one of these VMs is three seconds, or in fact, under three seconds, it was like 2.8, 2.9 seconds, which I mean, I know it's not actually booting the machine, it's all saved state and it's just restoring that state into memory. But still, that is an impressive amount of time to have a fully usable, not container,
but virtual machine running macOS. Yeah, I mean, I think they're sort of very similar because, you know, on macOS, if you run Docker, you're actually running a virtual machine. On Linux, it's a bit different, but just in terms of how you use it, if you're not familiar with Kubernetes and Orca is sort of a flavor of Kubernetes, I've not actually used pure, if you will, Kubernetes. But you can think of it just as if you were running a, or spinning up a
Docker container here. That's effectively what we're doing, except it's Mac machines that are coming up and all the rest really behaves pretty much like that. And as my understanding is also like the Orca commands you run and the output you get is effectively like Kubernetes. So if you're familiar with Kubernetes, Orca will be really familiar to you, I believe. It's a really nice system. And we should talk a little bit about the hardware that's running as well, because the
Mac minis that we had previously have had a little upgrade. And we're now running on... They've bucked up, yeah. Yeah, they certainly have in style too. We're now running on Mac Studio machines. So we're actually running M1 Mac Studio machines, but with M1 Ultra chips in them and 128 gig of RAM each. So what that actually means is because there is a limitation on all virtualization on Mac, and that is that Apple have a limitation of no more than two virtual instances of Mac OS
running on a machine simultaneously. So what we're doing is we're splitting those Mac Studio machines straight down the middle with 10 cores per VM and 64 gig of memory per VM, which is still an enormous amount for a Swift compiler package. Even the largest packages are not going to run out of memory on our new VM based system. So yeah, and we have eight of those Mac Studio machines
for a total of a terabyte of memory, which is kind of mind-blowing. And I think 160 cores of CPU processing, which gives us a total concurrency of 16 builds running at the same time. Yeah. And that's, as I said, the real shame that we can't boost that up a little higher. Yes. If anyone from Apple is listening, please drop us a kind word with whoever is responsible for that saying that we would really appreciate it because it's actually, it's worth talking
about that for a second. We are able to, especially when we're doing these Swift 6 processing runs where we fill up the backlog with a hundred thousand jobs ready to process, we are able to saturate our cluster with work to do for more than seven days of processing time. You know, we queue up a hundred thousand jobs and it takes about seven days to clear that backlog.
And we had a look at the underlying CPU usage during that seven day period. And the underlying CPU usage was averaging out between 30 and 40% across the entire Mac Studio cluster. If we were able to spawn more VMs within our cluster, like more VMs per host, then we could even that out and drastically make our build environment more efficient.
Because the build process has several stages. The build process is a Git checkout and then a Swift compile, and then a documentation build, possibly if your package author opts in, and then uploading that documentation to S3 and then reporting back results before kind of finishing the build. And there are periods in that build process where the CPU is not very busy. So during the clone and
during the documentation upload at the end, the CPU is effectively sitting idle. If we could have more virtual machines per node, we could even that CPU out significantly on the hosts and get more work done with the same amount of hardware, which would be something that we'd love to do. So I'm fairly confident the person responsible for that decision is not listening, but just in case they are. - Send us the secret user defaults command to disable that limit. - Or send us the secret user
defaults command, yeah. I'm sure if you disable system integrity, whatever, you could probably find a way to make it work, but that is not what we're doing. We are faithfully following the license agreement that we agreed to. So the good news is that we've been doing quite a bit of testing with this system before we put it live. And we ran a lot of the early Swift6, ready for Swift6 build queues with this cluster before we switched over our production workload
onto that as well. And it has just been an absolute dream to work with. There was a little bit of software development that we needed to do to get it all working. We need to write a fairly small piece of software that orchestrates the cluster, basically. So it reads incoming jobs that it needs to process, decides which VM type to spawn, spawns the VM, SSHs into it, executes the build commands, and then at the end shuts that machine down
and reallocates the resources back to the cluster. But apart from that, it's been fairly easy. I don't think we needed in the end any changes to our builder tool. Is that right, Sven? No, in fact, what made it a bit more complicated, I think, was that for a time, we actually ran both because we always had builds coming in. So it was really hard. It wasn't really practical to say, well, we're not going to process builds for a few days while we sort this out.
So the way we set this up, that we actually ran both systems at the same time. And you can imagine that's a bit more complicated because it's a very different way of bringing up jobs, because one machine has a GitLab runner permanently running that picks up the jobs, and the runner knows exactly what machine it's on. In the other case, the machine is ephemeral, so there's nothing running to pick up jobs. So something else needs to do that. And we sort of
had to move the logic that sits in the runner into this orchestrator and driver. And at the same time, not pull out the old one. So we needed to do both things at the same time while we were transitioning over. And that was the fiddly bit that also worked out quite well. So after we figured out how to do that, that really allowed us to take our time in transitioning over and making sure it works as we expected. Because in a system like that, you don't really want to go back and
forth, right? You don't want to transition too fast and then realize, "Whoa, whoa, whoa, hold on, this isn't actually working." And there were a couple of cases where it did not quite work out all right in our first attempt. And we needed to sort of stop processing for a bit and redo some things. This was mainly about our stuff where we didn't report the results back properly or the
queues didn't see the build failure. So they thought that we're actually okay. And stuff like little fiddly bits that get wrong when you... I mean, everyone who's ever set up a CI system knows exactly what I'm talking about, right? You think you have it running, then you send the job to CI, everything's green. And then you look at the logs and you see, "Oh, it actually failed." And you didn't catch the last build result and that sort of stuff. And when you run lots of builds,
you kind of don't want to get that wrong. And that was the fiddly part. - Not content with setting up our own CI for our tests, we decided to set up CI for the entire package ecosystem. - Yeah, well, actually, we're not, we're just running builds. I mean, we're never going to run tests. I'm going to say that here now, but just the builds is fun sometimes. - Exactly. So I think it's a great upgrade of our both capability and also the kind of stability and isolation of our build
environment. I sleep completely at ease these days with knowing that there's zero risk of waking up to a build machine which has been compromised. - Yeah, that's actually a good final point maybe to raise because one of the issues we did occasionally see that was a problem with the old system was when one of our builders fell over and
it was a specific Swift version that was only served by one builder. It could actually happen that our queue filled up with those builds and then we wouldn't actually continue processing. And that's actually something that can't happen anymore. And that's, I think, the key thing that we're actually gaining operationally apart from all the maintenance stuff and debugging that really, you know, a couple of times caused trouble with the old system.
- So we'd like to say a huge thank you to Max Stadium. They have been supporting this project since the beginning. And if they have a very generous open source program actually, which is available to any open source project, which is if you require a Mac mini or something like that for your project, if GitHub Actions are no longer cutting it for what you need to do in terms of CI, they offer an open source program to provide
that kind of resource for free. And we'll put a link in the show notes to that. But also, obviously, it's a little bit of a different situation having a few Mac minis to eight Mac studios, but they continue to support us by making this possible. So, you know, not to go into the full details of it, but this would not be possible without their support. So thank you so much for
everything you've done for us. And more importantly than the supply of the resources is every single conversation we've had with them has been met with, well, let's figure out a way to do this. So when we started talking about ephemeral builds, it wasn't a case of, well, are we actually going to be able to keep this within a sensible budget, but just how are we going to do it? Is it
going to be the best solution? And I've kind of worked from there. So I can't say enough good stuff about actually both Mac Stadium and Azure, they are both exceptionally accommodating with every request that we've made to them. Yeah, absolutely. Huge, huge. Thank you. All right. Right. There's another piece of news while we were talking about the build system. Maybe that's something worth highlighting right now. Because this week we crossed a nice threshold and that's
10% of all packages are now opting into host documentation on the Swift package index. And I, I was sort of tracking this number. So I saw it coming. There's been a really interesting increase recently in a number of packages opting in like new packages, the ratio is quite high.
Well, higher than 10%. I mean, that's obviously how we're catching up starting from zero. But I sort of was thinking back when we rolled out documentation hosting, I thought, well, you know, getting a couple of percent would be nice, you know, like maybe a couple of hundred packages. And now we're, we've crossed the 750 mark and the 10% mark. That's actually quite extraordinary how many authors are actively opting in because this is not something we are doing right. Every package
author needs to add this SPI.yaml file to their repository. I mean, it's not a huge change, but it is something you actually need to be doing and be looking at. It takes a git commit. Yeah. That's the thing. Yeah. Anything that requires any kind of git commit is asking the package author to do something that they probably weren't expecting to do. So no, it is not an onerous procedure by any means, but it is something that takes action rather than a passive process. Yeah. Yeah, absolutely.
One thing that I was curious about when you told me this stat during the week was whether it has changed recently and in terms of, because obviously when we first launched the package index, we didn't have documentation hosting. And so I have a little quiz question for you based on the fact of we added into our package, our add a package process, a little call to action at the end, which is to let package authors know that they can host their documentation
with us and link to the documentation that we have on how to do that. And so what I did is I did a little filtered query to say what the percentage of packages that have adopted our documentation system in the last year was. What would you say the percentage of packages, given it's 10% overall, if it's packaged in the last year, what do you think we're at? Well, I'm slightly cheating because I do track the number of new packages, you know, that number.
So I, but you know, I, that's this from memory, I'd say maybe 25%. No, it's not quite that. It's 16, just over 16%. There are 306 packages in the last year that have added documentation as part of it. Although that number is slightly skewed, I think skewed lower because of the way that our rename process works. So we track when people rename their packages within our organization. And we also track moving packages from one
organization to another on GitHub. And every time we detect a rename, that actually shows up in our kind of stats as a removal and an addition of a package. And so there are potentially some double counted packages there because of that process. But I don't think that would, I don't think it's enough to be statistically significant. Yeah, I'm certainly probably biased because just the recent, like recent weeks, it was 30%.
It's been really high, the ratio of adoption. I'm not sure why that is. Maybe it's WWDC was a documentation thing or something, or maybe I don't know, but it's been noticeable, the uptick in the ratio. I think it's, I love the fact that we're so high on hosted documentation. I think that's, it's great to see. And it's great to see so many package authors putting the time and effort into creating documented packages. Yeah, absolutely. Yeah. Let's do some package recommendations, shall we?
Let's go. Do you want to start us off? All right, I shall do so. My first package is a package I absolutely love. It's called Swift Testing Revolutionary by Koki Miki. And I just love this. When I first saw Swift Testing, I was really excited about this Swift Testing package. And we've now seen the introduction at WWDC. I just love testing. I mean, I spend a lot of time in tests, so anything in that area really gets me excited. But I also knew looking at our test suite, just in the main project,
we have 766 tests. And obviously, that's just tests. That's not even just assertions. That's way more. I thought, well, that's going to be a while until we actually use that extensively, right? Because you're not going to dive in and adopt that, cross the board and make all those changes. But then I saw this amazing tool last week. It was announced on the Swift forums. And it's a tool, like a build tool that you can add to your package, like the new build tool thing
that you can trigger in Xcode or via the Swift Package Manager. Or you can use it as a command line utility. And what it does, it rewrites your tests to the new Swift testing syntax. And what that means is it adds the @Suite annotation, converts your test class to a struct, or optionally leaves it as a class. You can configure that. It adds the @Test annotations to each of your test functions. And it converts your XCT test assert calls to the new #expect
expression. And that is an amazing time saver. And I actually tried this out in our repository with the 766 tests. So this is like, it's so fast. At first I thought, well, it probably didn't do anything because it just finished in like less than half a second. And it rewrote all the tests. Now in our test suite, it isn't working perfectly. And I'll explain why in a second. But in a plain case where we were using an XCTest case as the base class, it converted the tests perfectly.
And they ran and they passed. And it was excellent. It was just no notes. It just worked. The problem it has is with cases where we use a different base class. And that's where we have snapshot tests or database tests where we inherit from our own class and then use objects of that class in the tests. And because it converts that, and I didn't fiddle with any, I just used the default setting and converted it to a struct. So it converted it to a struct.
And then obviously that lost all the inheritance and the tests didn't compile because they didn't know about the DB or the app properties. It just didn't exist on the struct. But that's really simple to fix. Perhaps even just by using that other mechanism and making it a class with an absolute annotation or just fixing it up. I mean, that's trivial. The main thing is that rewrites all the tests and adds the @test annotation and it converts all your asserts.
And that's the big thing because that's hundreds and hundreds of lines of changes that we just save. It's amazing. Yeah. This is not a tool that you're going to need to run as part of a build process or anything that's going to need to be, that the output is going to need to be perfect for fixing up a few edge cases after the tool has run. It's a perfectly acceptable way of running this tool. And because once you've run it, you've run it and that's it,
it's converted, it's done. So yeah, what a great tool. I hadn't seen this. So that was fascinating hearing about that. Great. Yeah. It's really nice. And obviously you can do it file by file. So it's like, I'm really looking forward to this because I really want to use some of the new stuff. And obviously that's all predicated by actually moving over. And if this allows us to move us over fast, that's super exciting because it'll open up Swift testing much, much sooner than I
would have thought it would. I must admit, I had wondered whether we would ever actually migrate to it because of the fact that we have so many tests already. I thought maybe we would approach it in the case of, well, if you're writing new tests, then you write them in Swift testing. But I'm very happy to hear that that won't be necessary. Yeah. Well, I hope we'll see what happens, but I'm really, just this short test showed me it's probably quite viable. I'm not,
yeah, I'm just really hopeful. Did you check that the result of the conversion process was not to XCT assert true to make sure all the tests pass? No, it's actually quite remarkable because like, yeah, I know you're joking, but like, for instance, it rewrites an XCTest assert where equals where you have A comma B, it converts that into a hash expect A equals equals B. So it, I mean, obviously uses Swift syntax to actually understand your test syntax and intelligently
rewrites that. So you get a lot of mileage out of this. Just if all it did was rewrite the assert macros, the exert, you know, well, they're actually macros in the original Objective-C, I think in Swift their functions, but these, I still, in my head, I still think of them like as macros. They, it's just, if it just rewrote those, that would already be a huge time-saver because that's obviously the most lines in that diff is the asserts and then
tests, you know, the individual tests. And then I think we have like maybe 15 test classes. So if, even if it didn't, those that would be trivial, right? 15 things you can, you can manually convert it's the others that are important and those, those seem to be coming across really well. Right. So yeah, big thumbs up. So from a brand new package like that one to my first recommendation this week, which is to, for a package that has been around for seven
years. And it's actually a package we use in the Swift package index. And it's by far not a new package, but it is one that received a major version upgrade this week. And it is Soto by, well, the Soto project is the official organization name, but it's primarily written by Adam Fowler. And I was looking through packages and there were actually a huge number of new packages this week. But this one, the major version struck me because it is a full conversion to away from event loops
and into a Swift concurrency. So that's a great step forward for the package. But I should also, I should also explain what the package does for those people not familiar with it. It is a Swift language SDK for all of the Amazon web services APIs. So Amazon are constantly adding and changing their APIs, I'm sure. And this effectively is guaranteed to always be up to date with those because it is kind of generated from their API definitions. So this is very
unlikely to be used from like an iPhone app or anything like that, or a watch OS app. I don't, I don't start up EC2 instances from my watch very often. But it's certainly if you're doing any kind of server side Swift, then this will likely be already in your project. And so it's worth a note when it does something significant, like upgrade itself completely from event loops to
Swift concurrency. And I just thought that I looked through, I was actually kind of surprised that in the 40 something episodes of this podcast so far that we hadn't yet talked about Soton. And I thought it was time. Oh, we haven't. That's, that's interesting. I checked the show notes and it's not there yet. Have you also checked its old name because there was a rename it was called something AWS
kit or something before. Oh, I don't know whether I did. I don't quite recall its original name, but obviously it was called something AWS and that that needed to be changed when AWS introduced their own. We have nothing in our, in our list of packages that we've talked about on the podcast
that mentions either AWS or Soto. So remarkably I don't know how we haven't talked about it because it is, it is one of those packages that I thought would definitely be on this list, but it's, but it's not anyway, worth a mention Soto by Adam Fowler for all of your AWS needs. So my second pick is called Swift sessions by Alessio Rubicini. And that's also a package I saw on the Swift forums. And Alessio also points to an introductory blog post, which explains this
package in a little more detail. And there was a really nice line in that, in that blog post, it says, so this package is about Swift sessions. It's about session, so-called session types, which is apparently like a computer science concept. And he writes, this is a concept. If you've never heard about session types, that's normal. This is a concept born and explored in recent decades. This is where I expected like weeks or months, but he says decades. So
we, I certainly missed it in recent decades. I'd never heard about session types. It's new to me too. Well, there you go. We, we kind of missed it in recent decades. The, the blog post does a really nice job explaining what it is. Nonetheless, it is, it seems like a complicated topic, but in a nutshell, what it does, it is using type checking to, to assert or implement a message exchange and make sure that the bits line up like the parts line up. So imagine you have a side A, and this
is sort of taken from the blog post. You have a side A that sends an integer across the wire, then expects to get a bool back, and then the communication ends. So that's side A, sending int, getting bool, and then end. And side B has, has the, the message receiving an int,
sending a bool, and then it ends. And you can see how these line up, right? Sort of like, you know, imagine like saw teeth in a, in a gear cogs and they sort of, you know, you have the exact right alignment of sending, receiving int, sending and receiving bool, and then both expect to end. And this is something that, that this package allows you to encode in the
type system. So at compile time, it'll be ensured that your messages line up and, and, you know, the, the orders also, and not just the types line up, but the, the order, the sequence order of your message exchange is, is asserted at compile time. And that, that seems like a really nice guarantee to have, you know, and this package makes that possible. One note, if you use this, you, you probably want to make heavy use of type aliases and use type inference, because
otherwise you will get hurt by all the pointy angle brackets in the type signatures. It has lots of, lots of those going on, as you might imagine. But it's one of these cases where the type system really opens up opportunities or possibilities to use the compiler to check things for you that, that weren't possible before. And I find that really interesting to see these kind of new packages pop up that, that make use of these things. That's great. So there you go. That's
Swift Sessions by Alessio Rubicini. My final package for this time is a package called Tabula by António Pedro Marques. And this is, well, it's a package. Let me tell you the stuff. Let me start with what the package does, and then I'll tell you why I picked it. The package is a spreadsheet
reader and writer. So you can combine it with another package called CoreXLSX by a core office organization, which actually looks from the author information, it looks like it was written by Max Desiatov, who is now at Apple and who, but before that had his fingers in all sorts of open source packages. And the combination of them allow you to read and write data from spreadsheets. So that in itself is the kind of thing, this is, you know, it's fairly niche
things I want to do. Not every application is going to want to read and write spreadsheet files or Excel files. But it reminded me of a project that is both probably the very worst code I ever wrote as a developer, but also in its own way, the best code that I ever wrote as a developer. So this is way back in the 16-bit era when I was working for a software company that wrote HR software, so job evaluation and kind of pay modeling software and that kind of thing.
And we had this job evaluation system where you would put definitions of roles into this system. And then as a team of management consultants that we had in the company would work out within that business, what were the important aspects of that role that made it more responsible and made it effectively a ranking of jobs from low to high across an organization. And it was used in lots of equal pay disputes and things like that, where you could prove that the job requires this rather
than the person doing it requiring something. So it was a great piece of software, but the management consultants who came up with the rules on a company by company basis determined what was important in that company. What they did was they loved using Excel spreadsheets to basically make these rules. And what we would then have to do is take those Excel spreadsheets and convert them into code. And that was okay. I mean, it was never terrible work, but it was fairly tedious work.
And it was also prone to mistakes. So when you're reading from an Excel spreadsheet with an extremely complicated formula behind it, the potential for errors there is very high.
So we did lots of testing to make sure we got it right and that kind of stuff. And when we were moving this to work on the web, because originally this was just desktop software, we came up with this idea that actually maybe we should just open the Excel spreadsheets, poke a value in, let Excel do the calculation and read the value out of the other side of it
every time we needed to do these calculations. So one of the first pieces of web software that I ever wrote was a 16-bit Visual Basic COM component, which was a component object model, I think it was, that allowed Visual Basic to interact with ASP, not ASP.NET, just ASP, which was the original Microsoft scripting language, very primitive web scripting language that was, but it could call out to a COM component that then executed a command line
16-bit Delphi application that could read and write the Excel spreadsheet. So it would poke a number into the Excel spreadsheet, read the number out back out of the Excel spreadsheet and leave a file on disk that the COM component then picked up and sent back to the database and stored in the database. So you too can build your own Excel Rube Goldberg machine with Tabular. - And that's how it was done back in those days.
- I mean, that was it. And what was incredible was you'd look at the processes running on this web server and to see, you know, 14 different copies of Excel all in memory doing calculations as the web server fielded requests. And the reason I say it was both the worst, I think it's quite obvious why I'm saying it's the worst bit of software I ever wrote. But the reason it was the best bit of software I ever wrote was because it worked flawlessly
for years and there was never a problem with it. It never got it wrong, it just worked perfectly. - Exactly. - And we can't ask for much more than that, right? - It is sometimes extraordinary to what lengths organizations go to, especially banks. I worked at a few banks. They'll get a system running once and then they'll go to extraordinary lengths to
keep that system running, no matter the cost. They'll just build anything around it to just keep that one system going that managed to get this thing running in the first place and just keep chugging away with it. It's sometimes quite remarkable. - Exactly. But yeah, I mean, it was great. And who knows, maybe it's still running today. I don't think it is, but who knows? So I think we should probably wrap it up there, I think.
And we will be back in three weeks with another episode with some more packages for you to have a look at and news from the Swift Package Index. But until then, I will say see you in a few weeks. See you next time. Bye bye.
