Software You Can Love 2024
A tech conference trip report
Wednesday, 2 October 2024In May of this year I traveled to Milan to attend Software You Can Love, a conference organized by Loris Cro of the Zig Software Foundation. It was my first time at a tech conference like this, and I’m really glad I went. In this post I’ll share my experience going to the conference and traveling around Italy.
Why I decided to go
At some point in 2020 I discovered Zig, “a general-purpose programming language and toolchain for maintaining robust, optimal and reusable software.” The project resonated with me, and the more I learned about it the more impressed I became. Zig is full of great ideas, driven by excellent leadership, steady execution, and an inspiring mission. In 2021 I started supporting the Zig Software Foundation, the 501(c)(3) non-profit that funds Zig development with remarkable transparency.
The Zig community isn’t just about a programming language – they also care about building software in a thoughtful way that respects the user. ZSF’s VP of Community Loris Cro articulated that in the 2021 blog post “Playing the open source game,” where he coined the phrase “software you can love.” That became the name of the first Zig-focused conference, held in Milan in 2021. There was another in Vancouver in 2022, and I watched recordings of talks from both of them, but didn’t attend in person.
This year, SYCL was in back in Milan. It branched out to be less focused on Zig, and more on systems programming in general. They also invited speakers from the Roc programming language community. At first, I figured I’d watch the recordings again. But then I thought – why not just go? It would take some work to plan, but it would be an opportunity to meet a lot of people and get more involved in the Zig community. It would also be a chance to visit Italy for the first time. So I bought my ticket.
Planning the trip
There was a lot to plan, because I also wanted to travel around Italy after the conference, visit a friend in Amsterdam, fly back to Canada, and attend my five-year reunion at the University of Waterloo. In the end, it involved five flights, twelve train rides, and many metro trips – the most traveling I’ve ever done compressed in three weeks!
I mostly stayed in Airbnbs, and that worked out well. Lately there seems to be a lot of criticism of Airbnb over high cleaning fees, excessive checkout tasks, and just not being worth it anymore. But in Milan, I got an Airbnb in walking distance to both conference venues and it was only 700 USD for six days – a much better deal than hotels I looked at. The room was really nice and it felt like an authentic experience of living in Milan.
But to balance things out, I decided to get a hotel for my stay in Florence. While it was great in the end, their website used every dark pattern in the book (Only one room left, hurry, book now!) and was completely broken when I tried to view my booking afterwards. I also realized it didn’t have a generous cancelation policy like my Airbnbs – which, for one of them, I ended up needing. After talking to my parents about the trip, they decided they wanted to come too, and meet up with me in Rome after the conference. So I canceled that Airbnb and got a bigger one for all of us.
Apart from the travel and places to stay, there wasn’t too much more to plan. I still had an Osprey Farpoint 40 L backpack from my last trip to Europe five years ago, so I packed everything in that. I got an Airalo eSIM for Europe with 5 GB of data. My T-Mobile plan’s Wi-Fi texting and calling worked using the other eSIM as “Wi-Fi,” so I could still get SMS 2FA messages anywhere without roaming. I was confused about plugs at first, since Italy has Types C, F, and L, but it turns out that a Europlug fits in nearly all of them1, so I got a pack of three Europlug adapters for $4. One last thing I did before leaving was get a credit card with no foreign transaction fees (most charge 3%).
Arriving in Milan
On Sunday I flew Air Canada from SFO to YUL to MXP, arriving Monday morning at 10 a.m. local time. I took the Malpensa Express to Milano Bovisa, accidentally paying twice at the turnstile where you tap your credit card. On the train ride I was struck by all the vibrant colors – lots of green grass, yellow buildings, and red-orange roof tiles.
I checked into my Airbnb and then went exploring to try and fight off the jet lag. One of the first places I came across was the Arco della Pace:
I continued walking around Parco Sempione for the next hour. Later on, I met up with some other conference attendees. One of them was easy to find because he was wearing a Zig T-Shirt. We got some food and then went to Piazza Gae Aulenti, a pedestrian square (really a circle) surrounded by skyscrapers. From there we could also see the Bosco Verticale, a pair of buildings covered in almost 17,000 trees, shrubs, and other plants. We got ice cream2 nearby and sat talking until it started to get dark. I took the metro back to my apartment and fell asleep quickly.
Day 0: Workshops
The optional workshops were on Tuesday at UNAHOTELS Scandinavia. There was “Intro to 2D gamedev with Mach Engine” by Stephen Gutekanst, and “Learn how to build C/C++ projects with Zig” by Andrew Kelley. I hadn’t done any game development in a long time but it sounded like fun, so I chose to attend that one.
It was small, which made it easy for anyone to participate and ask questions. Stephen gave an overview of how modern game programming works, in particular talking about the entity–component–system (ECS) architecture and graphics APIs such as Vulkan and Metal. I read about ECS a long time ago but never used it. I hadn’t realized that a big part of it is the query engine – it’s almost like a specialized database. On graphics APIs, my takeaway is that they’ve become very complicated because to use the GPU efficiently, you need to prepare as much information in advance as possible. Abstracting over multiple low level APIs is difficult; the main contender for that is WebGPU, which has implementations in Chromium (Dawn) and Firefox (wgpu). Mach currently uses Dawn, but they’re working on a Zig implementation of WebGPU called sysgpu. They’re also interested in one day writing shaders in directly in Zig with the SPIR-V backend rather than WGSL.
In the second part of the workshop, we followed along with hexops/sycl24 to build a basic app using Mach. There wasn’t enough time to build much of a game, but this seems like a good starting point. Stephen also talked more generally about game development, and how you have to think about the whole game: not just graphics, but design, mechanics, music, characters, storyline, etc. It doesn’t matter how good the code is if the game isn’t fun.
In the evening, I got supper with some others at Mercato Centrale, a lively market-style food court right by the Milano Centrale railway station. The pizza buying method there was interesting: you point out how big a piece you want and they cut it with scissors and weigh it. I met two new people at my table, Malcolm and Diego, and ended up hanging out with them for most of the rest of the conference.
Day 1: Social tinkering
Wednesday was the first day of the main conference. It was in the same hotel again, and we had two rooms. The first room was for socializing and hacking on the programmable badge using MicroZig. The badge was a pretty cool and unique part of the conference. It has a 32-bit ARM CPU, 160×128 LCD screen, speaker, several buttons and LEDs, D-pad, light sensor, and battery. Following along with ZigEmbeddedGroup/sycl-badge, we were able to emulate the badge in the browser and flash our code onto the device.
I didn’t finish anything interesting myself, but it was fun trying other out people’s creations. And I met a lot of Zig contributors! Many I had only known as usernames on GitHub before. Among them were Loris Cro (kristoff-it), Martin Wickham (SpexGuy), Jakub Konka (kubkon), Auguste Rame (SuperAuguste), Stevie Hryciw (hryx), and King Butcher (kprotty).
The second room was for lightning talks. They were pretty informal – anyone could sign up for one on a spreadsheet, and they weren’t recorded. If I ever did a talk at a conference, I’d want to try doing one of these first. The talks were scheduled every thirty minutes, so you couldn’t attend all of them unless you stayed there all day (and we were encouraged to move around and try different things). I attended King’s talk on compression, Techatrix’s talk on ZLS, Agus’s talk on Roc’s record builders, and Loris’s talk on Zine.
I got lunch at a nearby restaurant with people from TigerBeetle, one of the few companies already using Zig in production. At the end of the day, I and most other attendees went to BhangraBar near Arco della Pace, where you could buy a drink for €15 and then eat as much as you want at the buffet. It was technically aperitivo but it was filling enough to be supper for me.
Day 2: Systems programming
The next two days of the conference were held in a movie theatre: Cinema CityLife Anteo. The CityLife district is quite modern looking compared to the surrounding area – it looks as though an architect had a lot of fun with it. There are lots of shops and food options, which was convenient for getting lunch or a quick espresso in between talks.
The talks on Thursday were focused on systems programming. The SYCL community uses a more expansive definition of systems programming than I was previously used to. In “Making systems programming accessible” from Systems Distributed 2023, Andrew Kelley defined it as a way of modeling software development that recognizes the bottom layer API that’s available to you. In other words, systems programming is not a category of what you’re working on, but an approach you can apply to any software project.
There were six talks: three in the morning and three in the afternoon. Here are the links to the recordings on YouTube:
- “Hybrid-level programming” by Richard Feldman
- “Data-oriented design revisited” by Matthew Lugg
- “Linking can be fast (if you cheat)” by Brendan Hansknecht
- “A Python command line parser you can love” by Anthon van der Neut
- “Nea: A webserver that never allocates” by Folkert de Vries
- “Defeating the optimizer” by Martin Wickham
My favorite was the last one, “Defeating the optimizer.” Jokingly presenting it as “FooCorp orientation,” Martin walked through C++ examples that seem easy to optimize but in fact stump the optimizer. In each case the “easy” optimization rested on assumptions that the compiler is not allowed to make. The compiler is allowed to assume that programs do not contain undefined behavior – without this the optimizer would be completely hamstrung. But it is still easily defeated by issues such as aliasing, escaping, and clobbering. I had already learned most of these topics before, but it was a great refresher.
The meals on Day 2 did not disappoint either. For lunch, I had spaghetti with cherry tomatoes and burrata at Meatball Family in the CityLife food court. For supper, I had rigatoni ragu at a restaurant near Arco della Pace called La Posteria di Nonna Papera. Andrew Kelley joined our group, so I got the chance to meet him and chat about Zig.
Day 3: Software you can love
Day 3 was much like Day 2, except the theme was broader and less technical. This was the day to talk about the art of building software you can love. Here are the links to the recordings on YouTube:
- “Biodigital jazz!” by Joran Dirk Greef
- “The role of social interaction in language ecosystems” by Edoardo Vacchi
- “Step back, dive deep” by Samarth Hattangady
- “Types and other techniques as an accessibility tool for the ADHD brain” by Michael Newton
- “Maps and yellow pages” by Motiejus Jakštys
- “Maintaining your love for passion projects” by Josh Wolfe
I enjoyed all the talks. At the end of “Biodigital jazz!”, I asked Joran how widely applicable Tiger Style could be for non–mission-critical software. Because of that, one of his colleagues afterwards gave me a copy of TigerBeetle on a 3.5 inch floppy disk. It’s a fun souvenir from the conference. I’m old enough to remember computers having floppy disk drives, but too young to have ever used them.
In the evening, I joined a large group to get supper at a restaurant in Chinatown called Xian. Ordering and paying was chaotic because there were so many of us and the waiters didn’t speak English. A Chinese couple at nearby table helped translate, and made us laugh when they asked if we were a summer camp. Afterwards, we wandered around and got ice cream, and then ended the night with drinks at Carlsberg Øl.
Seregno
On the Saturday following the conference, Loris invited everyone to his hometown of Seregno which is just a 20 minute train ride outside Milan. I joined a few others to get lunch and then take the train, but the station was so packed that we missed it and had to wait for the next train an hour later. There was no rush to get there at a certain time, so it wasn’t too stressful.
Seregno is a lovely walkable town. When we got there, we walked over to an ice cream place named L’Albero dei Gelati. Loris had set high expectations, encouraging us to try the ice cream in CityLife shops to get a calibrated sense of a 7/10 so that we could properly appreciate the 10/10. They had many flavors, apparently all made with fresh ingredients. But they seemed puzzled when the person in front me asked for vanilla, which I found kind of funny. I got a medium cone with coffee, strawberry, and pistachio, and it was the best ice cream I had during the trip.
We hung out in the courtyard across the street for a few hours, and then Loris took us to a pizza place called Pane e Olio. This was also the best pizza I had during the entire trip. I got the verace, which was like Margherita except the mozzarella was made from buffalo milk. It was extremely thin and baked to perfection. Like most other places, it was served as an individual pie that you had to slice yourself.
After that we went to Old Station Pub, conveniently located right beside the train station so we could take the last train back to Milan. I took an earlier one around 10:00 p.m. and made my way back to my apartment in the rain.
Venice
On Sunday, I got up at 6:00 a.m. to take an early train to Venice. It was a smooth and comfortable ride in business class, which only cost a few euros more than economy. Once I arrived, I left my backpack at a luggage storage place and then set off exploring. I had no plan other than wandering around.
On Loris’s recommendation, I had lunch at the Ristorante Levante. This was another one of my favorite meals. One thing I noticed about restaurants in Italy, including this one, was that water is never included for free (they will ask, “Still or sparkling?”), but bread often is. There is never butter for the bread, but olive oil is usually available if you ask.
After walking around for around five hours, I headed back to the railway station to catch the train to Florence. Even though it was a short visit, I’m glad I got the chance to see Venice. Milan, Venice, and Florence form a triangle where each trip takes about two and a half hours, so it wasn’t exactly on the way to Florence, but it wasn’t in the opposite direction either.
Florence
I arrived in Florence on Sunday evening in the pouring rain. I had no umbrella, so I was completely soaked by the time I got to the Hotel Torre Guelfa, where I stayed for the next two nights. It was a really nice hotel.
Florence is so small that I was able to get everywhere I wanted by walking. It felt like going into a time machine, with all the Medieval and Renaissance buildings and narrow cobblestone streets. The historical architecture was everywhere, not interspersed with anything newer looking as in Milan and Rome, at least in the parts I visited. I didn’t go inside the Cathedral of Santa Maria del Fiore because the line was so long, but I did visit the Cappelle Medicee, the Basilica of Santa Croce, and the Ponte Vecchio.
On Monday I had a traditional Florentine thick soup for lunch at Le Cappelle Medicee Restorante. Their bread was my favorite of the whole trip – I can still remember the taste but don’t know how to describe it. For supper, I went to Ristorante Totò and had ravioli with butter and sage, which was also great.
Rome
On Tuesday, I checked out of my hotel and took a train to Rome. I met my parents in Roma Termini, who had just arrived there after flying to FCO. We had booked an Airbnb in the Prati neighborhood, west of the Tiber and very close to Vatican City.
There was a lot to see in Rome. We went to see the Vatican, the Pantheon, the Trevi Fountain, the Roman Forum, the Palatine Hill, and the Colosseum. It was very cool seeing all these ancient structures in person. There were a lot of other people, especially in the Vatican, so I can only imagine how packed these places must get in peak tourist season later in the summer.
My favorite meal in Rome was the simple cacio e pepe, which translates to “cheese and pepper.” We got it at a restaurant named Cacio e Pepe on the northern edge of the Prati neighborhood. After that, we got dessert at Gelateria La Romana, which was almost as good as the place in Seregno.
Conclusion
Going to SYCL 2024 was a great experience. It was much more enjoyable than watching recordings of talks by myself, and I got to meet a lot of like-minded people. It was also a great opportunity for me to travel and try lots of Italian food. If you’re interested in a more detailed report on the conference talks, I recommend checking out Max Pagani’s blog post. Echoing his closing thoughts, I’d like to thank Loris and everyone else who made the conference happen, and I look forward to the next one!
- It’s surprisingly hard to find consistent information about this online. After some research, here’s what I found. The CEE-7 standard published by the IECEE specifies a number of sockets and plugs with 4.8 mm pins centered 19 mm apart. CEE-7/1 is a socket that has largely been phased out because it is ungrounded, though it can still be found in older homes. CEE-7/2 is the plug that fits into it. CEE-7/3 and CEE-7/4, better known as Schuko or Type F, add grounding contacts. CEE-7/16 Alternative II, better known as the Europlug, is a hexagonal plug designed to fit into many different sockets using 4 mm pins that converge slightly inwards. “Type C” is ambiguous but usually refers to the Europlug or the CEE-7/1 socket, since there’s no such thing as a Europlug socket, and CEE-7/2 is so rare. Type L sockets take three 4 mm pins across 19 mm (10 A) or three 5 mm pins across 26 mm (16 A); the Europlug fits into the 10 A but not the 16 A Type L. ↩︎
- In North America people call Italian-style ice cream gelato, but I noticed that Italians speaking English seem to just call it ice cream. I guess for them there is no need to distinguish, and saying gelato would feel like leaving it untranslated. ↩︎