How and when did you get into programming? And into iOS?
I was interested at quite an early age (probably because my dad was into computers, although I don't think he knew anything about programming), but didn't know how or what to learn really. There were a couple of ill fated and short lived attempts in my early teens that were limited to what my local library had, a "teach yourself C++ in 10 minutes" book. Then when I was 16 my school got a new IT teacher. He decided to replace the IT A level with Computing where they taught us Python, so I got really lucky there. On the off chance you're reading this, I really owe you Mr Justice.
I started teaching myself iOS development a short time after. Partially to help me get into uni, but the main reason I was particularly interested in iOS dev was it felt like the first time I could make something and the people I knew (and ones I didn't) would care about it. The early days of the app store were pretty exciting too. Although this was all fairly hypothetical because I didn't have a macbook. I ended up learning Objective-C from a book before I had any means to write it (from "Programming in Objective-C" by Stephen Kochan). I eventually was able to get a crappy second hand macbook on ebay that would turn itself off randomly all the time.
It was quite surprising how much I could hit the ground running then, I didn't expect just reading a book without actually being able to write any Obj-C to be that useful, but it was better than I expected. I still didn't have an iOS device at this point, so people at my school were able to play some of the games I made before I could on an actual iOS device, it was weird. I also remember struggling with some things and educational resources weren't as abundant as they are now, so a guy I met on a 3D modeling forum helped me quite a bit too. Hayden, I owe you one too.
Then when I got to uni I was pretty shocked when it seemed like nearly everyone's dad was a software engineer. It was very eye opening, before that I'd had some delusions of a lot more social mobility existing than actually does since I was benefiting from it. But even without that advantage, I was really lucky with the people that helped me. I hope it's easier now... It was also a popular topic of conversation that I didn't own a smartphone (honestly at this point even meeting people that owned them was unusually to me), especially as someone that was doing a lot of iOS development. I did eventually get an iPad sometime toward the end of first year, but it was another 3 years before I got my first iPhone.
After uni I applied for all sorts of software developer positions and then through interviewing found that iOS was overwhelmingly what I was best at and enjoyed the most, which I should have realised earlier tbh given how much of it I was doing.
Wow, that is some serious dedication. I don't think I would be able to learn without running the code and seeing the results..
Haha, I'm still surprised it worked! I don't think I've read a book so carefully in my life before or since. I was lucky that Objective-C clicked for me in a way that a lot of other languages didn't. I was quite determined, at that time in my life I was really determined that if I failed to achieve anything, no one would ever be able to blame me. It wasn't healthy and I'm definitely nicer to myself now.
You getting the first iOS job was prior to Swift being released, I guess? What was the interview process like back then?
Swift 1 was out, but I don't remember any companies using it or asking for it. Interviews were pretty similar to how they are now to be honest, with the obvious difference that it was all in Objective-C. For example, I interviewed at SwiftKey, the first stage was a hackerrank type test, and then the onsite interviews involved pair programming and wipeboard programming and general iOS technical questions. You run out of space quickly writing Objective-C on a wipeboard. It's a real shame I didn't get that job; the feedback I got was that I was in strong consideration, but they went with someone with more experience...and this was for a graduate role. They got bought by Microsoft a few months later.
I was at first confused by the "SwiftKey" name but then remembered.. hey it's the keyboard! Remember using it a long time ago 😃 What was then your journey to DuckDuckGo? The interview there was also similar to the other ones?
So my first job was at a really small startup that stayed around 20 people the entire time I was there. The less said about that job the better. It was...bad. It was at least fairly technically interesting, at least relative to a CRUD app. I used to joke that my job was cloning Whatsapp. I'm not sure this was the original plan, but I ended up being pretty much the sole iOS developer there, since the other person there ended up mostly working on backend stuff. Having that level of responsibility in my first job was a very mixed experience. It would have been nice in a better environment. I was there for almost exactly two years, then there was a small gap before I started working at Deliveroo. I was there for 2 and something years.
My time there was mixed for reasons I won't go into, but I really enjoyed working with a lot more people. The people were definitely the best part of that job. The iOS app itself wasn't very interesting so I ended up doing quite a few different things. By the end I was probably writing more backend stuff (Ruby and Go) than iOS stuff. I enjoyed being able to do that. I did a tiny bit of android and web stuff too. A lot of my time there was spent on the "Growth Exploration" team, a small team focused on small experiments. We were also who you came to if you needed something done fast that another team had told you it would take 3 months to do properly. Our unofficial slogan was "Every day's a hack day". That was an interesting team, although the main challenges were political rather than technical. I also spent quite a lot of time on interviewing stuff at Deliveroo, that was a great growth opportunity for me. I liked being in a reasonably large company but that was relatively young, it meant there was lots of things like that I could do, but also it generally didn't feel like everything would burn down if I didn't do them.
I left Deliveroo August last year. They put me (and everyone else at my level and the level below) at risk of redundancy. In the end I wasn't made redundant, but it's what lead to me getting the DuckDuckGo job. I tweeted about the redundancy, and Zbig, one our our recruiters messaged me. I still remember my initial reaction to him was "Oh wow, that's one of the few places I'd actually be proud to work!". The interview process for DuckDuckGo is quite unusual. It's pretty long, but I didn't ever have to program in front of someone or ever really feel like I was being quizzed or put on the spot. That was really nice. It was also paid, which was nice! The emphasis was mostly on take home assignments, they were long, but they did at least feel relevant to the job, which is rarer than it should be. If I hadn't been going through a redundancy process, I'm not sure I would have had the time for the process to be honest.
The small experiments part sounds really nice! Were the take home assignments focused on the stuff DuckDuckGo uses in their iOS app like WKWebView and similar?
So the first stage is a project scoping exercise, and then after that it's a tech design, and then implementing the tech design so it all depends on what your propose, but the topic is relevant to what we do. It was a quite interesting assignment compared to most, I was very glad I didn't have to make an app that reads any JSON and then puts it in a table view. The scoping and tech design templates are based on the templates we use internally too.
Yeah the JSON -> TableView is a classic 😃 On the other hand that used to be pretty common task and maybe still is 😬 Can you just briefly describe what project scoping means in general?
I don't want to give too much away about it, but it's basically a project plan. We give you a problem and it's up to you how best to solve it, what features the result should have, what that will involve technically, and how you'll measure success, that sort of thing.
Understood! What is the size of the iOS team at DuckDuckGo? Just for a perspective.
When I joined it was only two, with me being the third. Someone else joined shortly after, but since then we haven't hired anyone, although we are still trying to hire. It usually feels like 6 people though because of the macOS developers.
Got it. Let's talk dinosaurs. They figure in a few of your projects which I will get to, but I am curious.. Why dinosaurs?
haha, you know, I don't really know how it happened. I really love most animals, so I do like dinosaurs but I wouldn't say I had a particular affinity for them. I feel like I'm completely destroying people's perception of me by saying that. I think it first started with a joke game idea in uni called "Dinosaurs with Cities on Their Backs", which gradually became less and less of a joke over time, and increasingly became something I actually wanted to make and really cared about. A group of us did start (I think in 2nd year), but it never really got anywhere (although I currently have an iOS game in progress that I'm just messing around with that's related). On that initial project I was set to do all the art because I was the only one us with any 3D modeling experience. I've always found 3D modeling to be really slow. It would have been a lot of work in any medium, but I definitely find analog sculpting easier and faster (I got as far as a modeled and textured Pentaceratops, and a partially modeled Amargasaur). Because of that project, I'd ended up learning a decent amount about the different types of dinosaurs, and the phylogentic relationships between them.
Then in fourth year we had probably the most interesting module of my degree: "Evolution of Complexity". It was mostly about genetic algorithms. The whole thing was super interesting, although the bottom line was essentially "if you have a problem that you're thinking of using a genetic algorithm to solve, there's probably a lot better options". This would be important later. This course also briefly covered the topic of creature generation. This is something I'd always been interested in, partially I think because Spore came out at a fairly formative age for me, and partially because it's a perfect intersection of my creative, animal, and technical interests. If there was only one problem I was going to work on for the rest of my life, it would be creature generation (well, assuming for some reason all of the world's actual problems had been solved). I think also in general I've been keen to find ways to make making digital art easier, partially because at the time I had game dev aspirations that couldn't be achieved by just one person, but also just because I think 3D modelling is still a PITA.
Then shortly after uni I attended the ProcJam talks where I had an idea on how to approach procedural creature generation that I hadn't seen before. It was partially inspired by one of the talks that essentially boiled down to "we tried to use a genetic algorithm, but it didn't really work out". This was quite a big lightbulb moment for me, before this I just sort of assumed people knew something that I didn't, or that like any research topic a bunch of very smart people had spent a very long time on it, so what could I possible do? But realistically it's not an area that gets much academic research, and then most other attempts are usually for video games, with quite specific requirements and time constraints. So long story short, this all lead me to an idea, and given my previous dinosaur research, I knew enough about them to know the scope of what I was getting myself into by picking dinosaurs as the target output, and it felt like a reasonably constrained scope whilst still being interesting. And who knows, maybe one day I could use my work in Dinosaurs With Cities on Their Backs.
Thats super cool and super hard to grasp for me 😃 I remember playing Spore a bit but I think I never got far in that game. So the "big lighbulb moment" was something that inspired the "tinySAUR GENERATOR"? Is it possible to describe the overview how it works to someone who has never touched procedural generation? Is it some coded rules that act on random seed?
The tinySAUR GENERATOR is something I did later, but it is related. That basically is how the tinysaur generator works; it was deliberately very simple so that I might actually finish it! It's arguably 8 different generators joined together, for different types of dinosaur (although they all use the same colourer). It really is just a whole bunch of hand written rules glued together, like pick an arm, choose a spine fin length, generate a head texture pattern, that kind of thing. I made it as an offshoot off the project the lightbulb moment inspired ("THE DINOSAUR GENERATOR"), just because I wanted to finish something, and as an excuse to take part in PROC JAM.
So the original lightbulb moment was essentially "wait, why are we trying to generate known output with genetic algorithms starting from nothing?". We usually already know what we want the creatures we're trying to generate to look like, so why don't we at least give the genetic algorithm a head start? And then when it comes to dinosaurs, I thought the scope isn't so large, I'm not sure I need any kind of optimization method at all. This all lead me to what I'd call a "parameterized anatomy" approach. To be honest, the whole idea feels obvious typing it out like this, the real lightbulb moment was just having any amount of self confidence that this was something I could contribute to.
So I'd say there's a spectrum of methods to generate creatures: on one end you have things like Karl Simm's creatures, things that often use genetic algorithms, and are very unconstrained. Sort of maximum flexibility, but the hardest version of the problem. And on the other end you have really constrained things, like when you just have hard coded rules glued together (like everything is the same base mesh and you just swap out horns, fins, stuff like that). The latter isn't super interesting, so it's easy to be drawn to the former, but what really interests me is exploring the space in the middle, which I think is really underexplored.
So that's where my "paramatised anatomy" approach fits in. You basically define a hard coded slightly abstract structure (e.g. a skeleton, rather than a fully fledged base mesh), and then define rules on how that structure can vary, e.g. add a parameter that controls the spine length, or the hip angle. The idea being that this abstract representation can be used to represent any one of your target creatures (in my case dinosaurs), depending on the parameters, and then you can generate a mesh from there (although I'm way off that part).
I think there's other cool things about this approach, but I could talk about this all day.
I have tried to read and watch a bit on genetic algorithms and procedural generation.. But cannot say I really understand much 😃 I am curious, are there uses for procedural generation outside games?
It does get used for other things in media, like landscapes in films, but outside of that I don't think it gets used much, but really you can use it for anything! I did a project for a hackday at work called "Daily Dax". Our mascot, the duck, is called Dax, so I thought it would be fun to procedurally generate alternative ducks, with different colour schemes, beaks, fashion accessories, etc. I've seen projects where people procedurally generated cross stitch designs and then made them in real life. I remember leaning about one project to procedurally generate more efficient airplane wing shapes!
I really like the idea of proc gen being an assistive tool, rather than using it just to generate final output. So if I was trying to design a monster for a film, I could use a procedural monster generator for inspiration, and then take the output of that and add my own flair to it. Sometimes I do that for colour schemes for web designs and stuff, I'll use a colour palette generator, and then tweak my favorite result a bit to better suit what I want. In theory I could procedurally generate my home furniture layout. Which reminds me, I have a friend that built a chair generator (https://twitter.com/furniture_gen). In theory I could use that like pinterest to help me pick out a kind of chair I like.
Eventually I want to try using it for educational content, like procedurally generated dinosaur phylogentic trees. I could get people to generate their own dinosaur, and then tell them where it might have lived, what it might have eaten, etc.
These are great examples! Are there articles/videos/books you would recommend to people interested either in procedural generation or genetic algorithms?
This video by Kate Compton from PROCJAM 2015 might be a good starting point. If I remember correctly it includes an explanation of genetic algorithms, as well as a lot of other things: https://youtube.com/watch?v=_C9u5r5bLDA&t=1011s And then watching other videos from the PROCJAM channel might be helpful.
redblobgames.com by Amit Patel isn't solely focus on proc gen, but has some relevant things like map generation. I particularly rate them for just some of the clearest and easiest to understand tutorials I've even seen.
And then there's Seeds, the PROCJAM zine which could be a great place to look for ideas and inspiration procjam.com/seeds/ . This is probably the best starting point if you care less immediately about how to make something, and you just want to know what proc gen is and what's possible, since it gets all kinds of submissions. PROCJAM also has some tutorials: procjam.com/tutorials/
L systems are always a cool thing to read about as well (which are often used to make plants), although it can get a bit too "formal computer sciency" to be particularly accessible. Likewise for wave function collapse.
After that, it probably depends on what specific area someone is interested in. There tends to be a lot more resources for things like landscape or map generation, than something like creature generation. I really wish there was more tbh, there's been some great work to change that (e.g. PROCJAM), but for something as interesting as it is, it's surprising there aren't more books on it. Maybe I should try and write one! I like the idea of a book with no cohesive theme other than "the coolest proc gen things I could think of". The fact that most of it gets done for games and then once the game is released is never seen again probably doesn't help. I dream of the Spore creature creator being open source one day!
Yea, maybe the studios aren't even aware that someone would be interested. I think seeing the procedural generation behind No Man's Sky would also be pretty cool, since it has creatures, planets and more.
We actually know quite a bit about how No Man's Sky generation works, quite a few of the people that worked on it have given talks, e.g. these ones at GDC: https://youtube.com/watch?v=sCRzxEEcO2Y https://youtube.com/watch?v=C9RyEiEzMiU https://youtube.com/watch?v=vcEA41eBOGs I'm pretty sure there's more out there too. This might be a good thing to check out for the previous question too! I really like one of them where they go through a bunch of things they tried for terrain generation, it's a great example of how things don't just magically work first time, people don't just magically know what to do immediately, but you have to try things and experiment. I think seeing their ideation process might also help people think about how they'd approach a proc gen problem they want to try and work on. It's a real shame the games industry doesn't share more technology though, I wish we had something to build on rather than starting from scratch with each game. We at least know how this works conceptually, but game dev just doesn't have the same culture as app dev when it comes to things like sharing frameworks and stuff. I guess I get it, a proc gen creature generator is more of a competitive advantage to a game company than a snapshot testing framework is to an app, and the benefits of sharing it are probably less, but still I can dream!
That's awesome! Honestly I just assumed that the developers behind No Man's Sky are quite secretive and did not even try to find any of this stuff.
To return to iOS.. You have a magic wand and can change one thing about iOS development. What?
That's a really tough question, I think my answer would change depending on the day you asked me. Lately I've really been wishing all the apple frameworks were open source. I'm not sure what I was doing that really made me wish that, I think I wanted to make a custom assertion failure produce a breakpoint in an arbitrary location, like how XCTAssert takes a file and line as optional parameters. I don't know if that would be possible for me to do, but if I could have looked at the source for XCTAssert, maybe I could have found out.
There's a lot of other things I'd change too, like I'm envious that we're tied to a lot of apple stuff when e.g. backend doesn't have to worry about it so much. That said, it does narrow the scope of what we need to know, so I'm not sure I'd want to change that, it just might make me feel better about job security.
Then a fairly obvious non tech thing is the lack of underrepresented people, there's been a lot of times when I've really felt like the odd one out. To some degree that can be useful and can help me carve out a niche, but in practice has probably lead me to doing a lot of stereotypical glue work, which is less than ideal.
A final thing is changing iOS teams' relationships with the rest of the companies. It seems like it's really common for mobile teams to feel really unappreciated or misunderstood, often for good reason (I won't mention any personal examples I've experienced, but I can just imagine some ex colleagues laughing if they read this). It's not like you can't work on this problem, but whilst I have a magic wand... That also reminds me of a source of that friction I've encountered: I wish we could have continuous delivery of releases. In the past people have thought we were obstructionist as a team for saying we couldn't, but we really are limited with what we can do there.
That sounds like a lot of things, but on the whole I'm pretty happy with things though. I've thought about doing something else before and was doing a lot more fullstack work at my last job, but at the moment I'm happy (at least in terms of the tech). I really like Swift, and I like the nice mix of things we get to do compared to web (I'm not sure what to call it, but "mobile backend" is more of a thing than "web backend").
To move away from procedural generation and iOS.. What do you do to relax?
I'm supposed to be able to relax?! I am pretty bad at relaxing because I get bored super easily, I always like to be making something. I love animals though, so I try to make sure I go for a walk every day, and then don't come back until I've seen at least one squirrel, cool bird, or dog. Other than that, I don't know if it relaxes me, but I use guitar as a big emotional release and play nearly every day. If anyone has a video call with me it's usually one of the first things they comment on because there's an unknown number of guitars in the background. I honestly couldn't give you an exact figure...I want to say 14? I try not to think about it too hard...
Fair 😁 I have no idea how I would respond to this question..
Thanks so much for taking the time! Do you want to give someone or something a shoutout?
Thanks for having me! So it's not iOS or career related so much, but I want to give a shoutout to The Good Law Project. I don't think they do anything outside of the UK, but they do a variety of things "to protect the interests of the public" (e.g. challenging government corruption and attempts at eroding human rights). It's not their primary focus, and yet it currently feels like possible the organisation most directly fighting for the rights of trans people at the moment in the UK.