Show Notes
Thank you RailsClips Kickstarter Backers!
02:27 - Andrea Magnorsky Introduction
- GitHub
- Blog
- [YouTube] Andrea Magnorsky: The Tools that Shape Us
- BatCat Games
- Blog
- @roundcrisis (Andreaâs Game-Related Twitter Account)
02:56 - âWhat Game Developers Know That Business Devs Can Benefit Fromâ
- Going From Enterprise => Professional Game Dev
- Andrew OâConnor, co-founder of BatCat Games
- XSplit (Xbox Comparison)
08:28 - Curiosity and Motivation
09:10 - Is game development more approachable than in the past?
10:12 - Learning New Skills and Coding Practices to Write Games
- Unlearning to Be Clean
- Game Loop
- Levels of Code:
- Low-Level Code
- Intermediate Layer
- Scripts and Game Play
15:45 - Performance and Iterations
- [YouTube] Andrea Magnorsky: The Tools that Shape Us
- Testing
- Iteration Speed
- âBenevolent Dictator + Youâ
20:45 - Making Games Inviting
- FUN
23:11 - Techniques to Cope with State
24:16 - Releasing and Deadlines (Business Issues Between Developers and Management)
28:30 - Testing
- Property Testing
30:45 - Writing Aspects of Games (Stories, Artwork, etc.)
32:22 - Why F#?
38:44 - Pair Programming or Agile Techniques in Game Dev?
- âStupid Courage/Braveryâ
42:22 - Teaching Game Development (Game Jams)
44:39 - Onikira: Demon Killer
Picks
[Vimeo] Carina C. Zona: Schemas for the Real World (Avdi)
Maryville, Tennessee (Avdi)
Monodraw (Jessica)
Elizabeth Naramore: Uncomfortable (Jessica)
ambient_spec (Coraline)
Cosmic Encounter (Coraline)
Ready Player One by Ernest Cline (Chuck)
Mastery by Robert Greene (Chuck)
Dixit (Andrea)
Michael Bernstein: Know Your Types (Andrea)
[Vimeo] Philip Potter: Generative testing with clojure.test.check (Andrea)
Maryville, Tennessee (Avdi)
Monodraw (Jessica)
Elizabeth Naramore: Uncomfortable (Jessica)
ambient_spec (Coraline)
Cosmic Encounter (Coraline)
Ready Player One by Ernest Cline (Chuck)
Mastery by Robert Greene (Chuck)
Dixit (Andrea)
Michael Bernstein: Know Your Types (Andrea)
[Vimeo] Philip Potter: Generative testing with clojure.test.check (Andrea)
Special Guest: Andrea Magnorsky.
Transcript
ANDREA:
Oh wow!
CHUCK:
[Chuckles] It is.
ANDREA:
That is a horrifying unicorn-cat.
[This episode is sponsored by Hired.com. Every week on Hired, they run an auction where over a thousand tech companies in San Francisco, New York, and L.A. bid on Ruby developers, providing them with salary and equity upfront. The average Ruby developer gets an average of 5 to 15 introductory offers and an average salary offer of $130,000 a year. Users can either accept an offer and go right into interviewing with the company or deny them without any continuing obligations. Itâs totally free for users. And when youâre hired, they also give you a $2,000 signing bonus as a thank you for using them. But if you use the Ruby Rogues link, youâll get a $4,000 bonus instead. Finally, if youâre not looking for a job and know someone who is, you can refer them to Hired and get a $1,337 bonus if they accept a job. Go sign up at Hired.com/RubyRogues.]
[This episode is sponsored by Codeship.com. Donât you wish you could simply deploy your code every time your tests pass? Wouldnât it be nice if it were tied into a nice continuous integration system? Thatâs Codeship. They run your code. If all your tests pass, they deploy your code automatically. For fuss-free continuous delivery, check them out at Codeship.com, continuous delivery made simple.]
[This episode is sponsored by Rackspace. Are you looking for a place to host your latest creation? Want terrific support, high performance all backed by the largest open source cloud? What if you could try it for free? Try out Rackspace at RubyRogues.com/Rackspace and get a $300 credit over six months. Thatâs $50 per month at RubyRogues.com/Rackspace.]
[Snap is a hosted CI and continuous delivery that is simple and intuitive. Snapâs deployment pipelines deliver fast feedback and can push healthy builds to multiple environments automatically or on demand. Snap integrates deeply with GitHub and has great support for different languages, data stores, and testing frameworks. Snap deploys your application to cloud services like Heroku, Digital Ocean, AWS, and many more. Try Snap for free. Sign up at SnapCI.com/RubyRogues.]
CHUCK:
Hey everybody and welcome to episode 201 of the Ruby Rogues podcast. This week on our panel, we have Jessica Kerr.
JESSICA:
Good morning.
CHUCK:
Coraline Ada Ehmke.
CORALINE:
Hi there.
CHUCK:
Avdi Grimm.
AVDI:
Hello from Tennessee.
JESSICA:
Yay!
CHUCK:
Iâm Charles Max Wood from DevChat.tv. Big thanks to everybody who backed my Kickstarter campaign. It funded. So, we should be getting Ruby on Rails video done here soon. We also have a special guest this week, and that is Andrea Magnorsky.
ANDREA:
Yay, hello. Hi.
CHUCK:
Did I destroy your name?
ANDREA:
No, no, you said it right.
CHUCK:
Awesome. Do you want to introduce yourself really quickly?
ANDREA:
Sure. Iâm Andrea, and Iâm the cofounder for BatCat Games, a games company out of the Republic of Ireland. And Iâm also a developer. Iâve been in enterprise and [not in] enterprise for a long time.
CHUCK:
Awesome.
JESSICA:
So AndreaâŠ
CHUCK:
I was just going to say, somebody named this show âWhat Game Developers Know that Business Devs Could Benefit Fromâ.
ANDREA:
Yeah. It wasnât me.
[Laughter]
JESSICA:
No, that was me because Iâm kind of fascinated by all the things like event-driven programming that games have been doing for a long time. Theyâve had to worry about performance, about minimizing network bandwidth, and about really fast iterative development for longer than we have. Itâs like games have problems that weâve been able to ignore on the business side but now the business software is reaching a point where we need to stop ignoring those problems, too.
ANDREA:
Yeah, that makes sense.
CHUCK:
Oh, come on. Iâm agile.
[Laughter]
ANDREA:
I think thereâs a lot of innovation thatâs been happening in games for a long time and that not a lot of it is very public because, well there is a certain level of secrecy in game development historically. And now, thereâs a lot more indies that weâre all allowed to, well, we can do whatever we want, really. So, I guess thereâs way more openness. So, there are some historical reasons why that might be not well known. I think the main thing that I kind of, I donât know, noticeably noticed, [god], is thatâŠ
JESSICA:
[Chuckles]
ANDREA:
[Chuckles] Yeah, I know. Itâs like, words jumbled in my brain. I don't know. The main thing for me coming from enterprise into professional game dev has been the fast iteration. And itâs crushingly fast, that you have to do. The networking, not so much because weâre working on PC single-player games. So, we donât really do any networking events. There are different architectures I guess. Nothing like what Iâve seen in enterprise. So, I guess this is just different. I donât know if thereâs anything. Iâm sure thereâs something to learn. But I donât know if there are clear, concise lessons. Itâs more like I think everyone should do a few games just to think in a bit more real-time kind of way. Yeah, thatâs my spiel anyway.
CORALINE:
Iâm curious, Andrea, how you got started doing games, especially coming out of the enterprise.
ANDREA:
Boredom? [Chuckles]
CHUCK:
[Laughs]
ANDREA:
Brutal honestyâŠ
CHUCK:
[Laughs] Iâm sorry.
ANDREA:
[Laughs] No, IâŠ
CHUCK:
Thatâs awesome.
ANDREA:
[Laughs] It was really a combination of personal life change and just the right thing at the right time. I started playing with making little games a year before we started the company, about a year, maybe a year and a half before we started the company. And it felt really different. It was like, okay for the first time in a long time I have no idea whatâs going on here. And everything I do is counterintuitive. So, I really, really enjoyed that part of it. So, when it was time to move away from where I was working, then the options were some job doing similar things to what Iâd done before, some other job where I got more money where I was doing things that Iâd done before, and some other job that was just boring. And then itâs like, âHey, start your own company and make games,â which is completely crazy. And I went obviously for the completely crazy one. That made sense.
JESSICA:
Where did that idea come from?
ANDREA:
Well, my partner, the other founder of BatCat, Andrew and myself, weâve kind of been talking about it, âMaybe we should doâŠâ You know, when you start with someone and youâre there and youâre like, âHey, wouldnât it be great if we had [inaudible] company?â âYeah, yeah, sure, keep dreaming,â kind of thing, maybe in the very distant future. But then at some point it turned from a crazy idea to something that could actually happen. I donât really, it was very natural. I donât remember really exactly the steps.
JESSICA:
Did you start with an inspiration? Did you know what game you wanted to make when you started?
ANDREA:
Actually, it was more like we were working on a hobby game. Actually Andrew was doing most of it and I got more curious and curious about what he was doing. And he was working on this game. And it was, âOh, Iâm just adding particles.â And I was like, âOh, whatâs this particles things?â âOh, well you know, with shaders.â âOh, whatâs this shaders thing?â So, anything he mentioned sounded just really interesting and very real-time and cool. So, you learn things all the time. And he kept working on it. And then basically, I joined in. And we released the game on XBLIG, which is what used to be the Xbox Live Indie something. And we released it there and it actually did pretty well from a⊠it was a good game, ish. And we got good reviews from people. It got exciting, basically. So, it was more like a slow, organic little project that grew into something else.
When we turned into a company we released that game into PC. So, we did, we added, we made it better and we released it in PC. And then after that, we started working on the game weâre working on now. And thatâs been taking a long while. So, there was no, âBim! I know, weâll do this!â It was more like, âOh, okay.â Itâs like everything games I think is very iterative. And you might have 50 million âBim!â ideas and actually the one that got you started is nothing like what you got at the end.
CORALINE:
Andrea, it sounds like youâre really driven by curiosity now. How does that contrast to what was motivating you in previous jobs?
ANDREA:
Actually, kind of similar. For me, programming is something that I just love. I canât imagine not doing any code, basically. And anytime I move jobs itâs because, or I change what I was doing, was because, okay, there must be a better way. Itâs been kind of driven by whatâs interesting to do and how can we do it better. And so, I think even though it sounds crazy, maybe itâs not that crazy, and I think you just hit on the spot as to why.
JESSICA:
Is game development now much more approachable from a hobbyist perspective, from something you can do in your spare time, than it used to be?
ANDREA:
Absolutely. Itâs so easy right now. I think itâs never been easier. Even when we started a few years ago, three or four years ago, only a few engines were open source or they were somewhat cheap or whatever. But now, Unity which is a pretty good way to start is free. Unreal is free or you can, you donât have to pay much. Thereâs a bunch of different open source engines like MonoGame and Duality. And a lot of JavaScript ones that I sadly donât know all that well, where you can actually just play with them and then go all the way to release if thatâs what you want. So, anybody that likes games can just do it with their computer. So, even some people, I heard of people coding their own games on their phones and releasing from their phones, which is kind of cool. So, totally approachable.
CHUCK:
So, we are kind of comparing game development, business development. Have you found that you had to learn new skills or new coding practices to write games that you donât necessarily have to have or do in business development?
ANDREA:
You know, itâs funny. The thing that is hardest is I like writing clean code, or cleaner code. And in games, you just need to get there as soon as you can. And youâve got to learn to take shortcuts. And that is just strange to say, but thatâs what I found. It goes from [inaudible] to you should write super clean code that is always, itâs going to be there for a few years so you have to be thoughtful about the side-effects of writing this. Where in games, it just seems like itâs like, okay, get it done first. If we need it for longer, if weâre going to leave it there, we can always clean it up. So, thatâs one strange skill to have to unlearn, to be clean.
The other one I thought you also need to learn loads. You need to learn math or relearn math. There is the game engine architectures are different to what weâve seen. Probably the closest you can get to is MVC in certain aspects, when you compare to something like a component-based engine. But the constant update is a thing that it really switches your brain, or that I had to⊠it caught me a lot at the start. I donât know if that makes a lot of sense to people that havenât done game development. So, if you want, I can explain more. I donât know.
JESSICA:
I would love for you to explain more.
ANDREA:
Okay. So, what you have in a game is a continuous loop. And that means that every 60 milliseconds, something will happen to your code. So, when you write code, for example youâre writing character code. And you have a character and youâre just doing some logic for it. You have to think that whatever code you wrote, it will run really quickly. And something, the loop, there is no reactive⊠no user will go and click on update, or add customer or whatever. The game will run on its own. It will react. Itâs not reactive. Itâs just real-time. Itâs there, always. So, thatâs from the point of view how you think about each component.
But at the same time, when you have the engine, what you have is an engine that has the big game loop. And the engine will go and update all these components that are like little bits of logic that you can put in different game objects. So, the idea is that, say you have a hundred components. Some of them might be for your game UI. Some of them might be for some characters, backgrounds. All those hundreds of components generally will update in some order. Sometimes you can control that order and sometimes you canât. But they will all update [inaudible]. Now, 60 milliseconds, 60 milliseconds, 60 milliseconds. So yeah, that part [inaudible].
JESSICA:
So, even if the user is not interacting with the game, the game is interacting with itself?
ANDREA:
[Exactly]. Oh, you know that when you, say you pause the game, sometimes you see that the characters keep doing stuff. Sometimes thatâs on purpose and sometimes itâs like a âfeatureâ and Iâm doing air quotes.
CHUCK:
[Laughs]
ANDREA:
So, itâs a feature that actually the game developer didnât want to go and write more code to have to pause the game, so maybe look cool, I donât know. [Chuckles]
CHUCK:
When I was in QA, I would always tell the developers sarcastically, âOh, so itâs a feature.â Because they insisted it wasnât a bug.
ANDREA:
[Laughs] Yeah.
CHUCK:
So, I get that.
ANDREA:
You know, itâs a bit more to, I think⊠again I can only speak from my own experience. I feel like in games you get close to the metal in a lot of ways because, well okay, you have several levels of code. So, you need very performant code but also you need very high level that changes all the time kind of code. And so, the low-level code that is performant, thatâs code that you need to look at very well but generally, will look ugly because itâs performant code. So, youâre trying to [multi-try] whatever you can. Youâre trying to be efficient with your animation runtimes and everything like that.
Then you have an intermediate layer that is like systems that the game needs. So, it could be something like, I donât know, a score system or something like that. And those kinds of systems, they do need to be clean. And they would kind of be enterprise-level, you can test this kind of code. I donât want to, see, it sounds like Iâm dissing enterprise where I donât think thatâs really fair. So, if we go back to games, if youâre doing something, a game system, score, health, whatever else thatâs working at that level, itâs game-specific. But it needs to work really well throughout the game. You can test that. You can write really nice code. And it doesnât need to be that performant. So, you can still improve, try to improve readability rather than performance.
And then you have a third layer of code on how the code feels and goes. And thatâs scripts and gameplay. So, thatâs all the game that basically, when you kick that ball, if the ball will go that way and it turns green when it touches the dragon, or something like that. So, itâs very, it changes all the time. Itâs probably really messy. Itâs not performant at all. Or, you donât look at the performance of that so much. I hope that kind of makes sense. So, stop me when I stop making sense because I really donât know.
JESSICA:
In your talk, your F# tools that shape you talk which weâll link in the show notes, you mentioned that you donât worry about performance while youâre iterating in your scripts. And just now, you said you donât try to make your scripts clean, where it sounds like by âenterpriseâ you mean focus on readability, really clean code, as opposed to games where in your other layers youâre either worried about performance so itâs ugly or your worried about super-fast iterations, so you donât try to make it clean.
ANDREA:
Yeah, yeah, totally. And the weird thing is with F# where I do a lot of scripting in it, I actually find that Iâve been now iterating on trying to make that process a little bit better. And the code is turning up actually quite nice, or nicer. Initially, it was F# but it was very imperative style. But I think I got a little bit, with a little of experience, I got a little bit better at writing code I guess. And that turned the code a little bit better. And you can start writing little abstractions, like oh actually I donât have to check 58 nodes here. I can just use a little thing here and make it read as it goes, as opposed to have to do a lot of error checking and the game will blow up. So yeah, totally what you just said.
CORALINE:
How important is automated testing in your process, and is it even possible?
ANDREA:
I was obsessed with this, particularly at the start of the company. I wanted to test everything. I was like, it must be possible. And it is possible to test the performance side of it sometimes. You can do some testing there. You can test the systems asset that I talked about, those three imaginary layers. This is the way I see it. I havenât seen it anywhere else. So, you can test up to that layer. So, you can test systems and the engine a little bit.
But the scripts, you can test them but itâs just pointless, because it just changes too much and it gets in your way. So, you wind up not maintaining the tests. And also, itâs really hard to do because youâre trying to do something like pixel comparison. So, you want to go end-to-end, take a screen, shoot up the game. Say you click somewhere and then you take another screen, shoot up the game, and that is just not specific enough. It doesnât test what you want and itâs a lot of work to get right. So, it winds up not being a good idea, at least for the games weâve done so far.
JESSICA:
In your talk you mentioned something about having a lot of tests, at least example tests, getting in the way of change. And that seems to be a theme of how do we make this so we can just change it super-fast and donât make it clean because we might throw it away in a few minutes. How fast are your iterations?
ANDREA:
Well, see at the script level weâre talking about minutes. [Chuckles] like literally, you do something, change it, change it, change it. Then you go away for a few days, maybe you come back, change it, change it, change it. Then itâs generally a burst of activity for a few weeks that it just changes all the time. And then it rests for a while. Then is generally [inaudible] times. Or, maybe you have to redo certain areas.
JESSICA:
How do you know when itâs right?
ANDREA:
[Laughs]
JESSICA:
Who makes these decisions? Do you have a product owner who comes along and says, âOh yes, that is what it should do.â
ANDREA:
[Laughs] We actually had, very early in the project we realized that design by committee is just not going to float. So, one of us is the decision maker for all design decisions. And basically, this person listens but doesnât necessarily act⊠Iâm like, âNo, but you should totally do this.â Itâs like, âYeah, no. Itâs not going to be a gigantic red cat, Andrea.â
JESSICA:
[Laughs]
ANDREA:
We talked about cats. Just one or two. Itâs good. But 50 is not okay. [Laughs] So yeah, there is a benevolent dictator there. And do you know what? Even when youâre doing your small bits, you canât go and ask everything of course, because that would be just really boring. But even when youâre doing things, itâs very much about your own experience playing games that really comes and takes over. So, thatâs why itâs so important that game developers actually play games and that they play games of the similar types of the types youâre developing right now.
Iâve been playing fighting games only basically for the last two years, just because weâre doing this. You can wind up going, âOh, I wonder how they do it in DMC in that level four, when I donât know, youâre floating in that broken building?â Having those kind of references in your brain and being able to talk to other people on your team about them and how they feel and how youâre going to get maybe that same feel but in a completely different context in your own game, itâs really important. So, I guess the straight answer to your question would be benevolent dictator plus you playing similar games for a while.
AVDI:
I have a question about the difference between, in focus, between making games and making business software. In business software thereâs kind of an assumption that somebody needs this software. So, thereâs a certain amount of leeway for having a crappy user experience because somebody needs it. So, theyâre going to have to use it. And maybe if itâs really, really bad theyâll look for something else. But other than that, they need it so theyâre going to have to deal with it. And itâs like thatâs not nearly as much, thatâs not a real issue with a game. Do you spend a lot of time thinking about how to make the program inviting?
ANDREA:
Oh god, yeah. This is a saturated market. In every platform, you have this problem, particularly mobile. You have this problem of you want to play a game, go search with games with cats and you get 58 million games about cats in your mobile. And probably you [will like] none of them. So, when you add that to the question that you just asked, oh yeah. And the game is supposed to be fun, right? Try to get fun as a condition of satisfaction. Must be fun. [Chuckles] What does that mean? Itâs like, oh, that kick feels amazing. And you feel super powerful. Okay. So, itâs actually really, really, really hard. And yes, thatâs actually most of the work of [inaudible] and game designers. So, totally spot on.
JESSICA:
Man, I want to add that as a requirement to my next project, or current project.
ANDREA:
[Chuckles]
JESSICA:
Must be fun.
CHUCK:
[Laughs]
ANDREA:
You know, the things that wind up being the funnest to play, they not always are the funnest to work in. [Chuckles] This is a caveat of game development. Itâs really fun and rewarding in that youâre making a game and that you have immediate feedback. But some of the problems you have are pretty tough, because you have so much state everywhere. Basically, a game is a gigantic state machine. So, your brain hurts sometimes, a lot. Youâre constrained by hardware from people that you have no idea what hardware they will have. And they get very, very angry if you donât fix their problem, even though they donât tell you what their problem really is. So you know, just make sure that you know what youâre signing up for. But you know if you want to come and work for us for free, or I mean for cat hugs.
JESSICA:
[Laughs]
ANDREA:
We will welcome you, Jessica. You can work remotely even, for cat hugs again. I can send you my cat. He can give you a hug. You send it back.
JESSICA:
Okay.
AVDI:
What kind of techniques do you use to cope with all that state, from a programming perspective?
ANDREA:
I think part of it is the game engine, because you work in components. But also, the other thing is you actually deal with a lot of state. I donât have a great way to⊠there are some classes, and we work in C# and F# for the scripts. But some of the most painful things to work with, I have found good ways, ways that Iâm happy with, that I look at the code and go like, âYou know what? Iâm happy with this.â So basically, with difficulty.
Iâm always open to suggestions. And if you want to dig at some code, I can send you some, because again, you have also the pressure of time. Weâve been working on this game for about two years now and we have to release. We have a deadline. And that deadline is not going to move. And it has to be done. So, basically if it works, you can live with it, kind of. Okay, it depends a little bit. You donât have a lot of leeway. I canât go off and experiment on these few problems for three months. I need to solve it right now.
CHUCK:
You know this is something that I think we donât see as much in the business world. It depends on the company youâre working for, sure. But most of the time youâre working for a company, unless youâre in a startup that is pretty stable. And if you donât make your deadline because the deadline is really just a made-up arbitrary date that the management came up with, sometimes they took input from people who actually know how software is made.
But where youâre out there independently building a game, if you donât release on time, if you donât meet the commitments on Steam or whatever system that youâre putting them out in and you fail to meet the expectations of your audience then you have real business issues. And I think a lot of times developers, they donât understand a lot of the business constraints, and vice versa, the management doesnât understand the development constraints. And so, you get this mismatch where you donât really see that with the indie game developers because they know what they have to do and they generally know when they have to have it done.
ANDREA:
Well, actually knowing, itâs kind of more of a feeling. You donât have the, âOh, itâs the 13th of May,â or some date like that. Itâs more like, if we donât release again in a month, weâre going to start either losing users or we wonât get any new ones.
CHUCK:
Right.
ANDREA:
And that pressure is absolutely real. Our game is on Early Access at the moment. And we went live on that on either the 14 or 17th of November. And every time we do an update, we get a huge bump of users. And people giving us not only money, which is great because it helps us actually finish the game, but also feedback. And they have problems and they have great suggestions. Some of the stuff we just didnât think about. And itâs like, âHey, why donât you put a light here and I can see stuff,â that we thought it was really obvious that that was there, or something like that. So, I
think some of that is really good. But I actually am not sure it helps you write better software. At the same time, you innovate when youâre under pressure. You can, itâs a very strange balance to have that thing of, you have a real deadline that you can move a tiny bit. You have a range, but that range is not, âOh, a year more.â Itâs more like, âOkay, have two weeks more, tops.â
CHUCK:
Yeah.
ANDREA:
Or youâll run out of money. [Chuckles]
CHUCK:
I think the main point I was trying to make was that usually in a business setting, the people who are looking at those constraints where weâre going to lose users, et cetera, are different from the people who are making the software. And in your case, it looks like itâs the same people. Youâre building the game and youâre looking at the repercussions of missing your deadline.
ANDREA:
Yeah. Well, the things like weâre a team of, at the moment weâre five and a half people. And I say half because we have a part-time. Itâs not a very short person.
CHUCK:
[Laughs]
ANDREA:
Or like we killed someone and we just have half. [Chuckles] So, he helps with some user testing. But five people to run the business, make plans, design the game, build the game, [inaudible] the game. Trust me, itâs not a lot of people.
CHUCK:
Mmhmm.
ANDREA:
And itâs a huge game. So, I kind of think that actually gives you a lot of power, because that contact is direct. You actually have to respond to the communication from people. When something goes wrong, you get the, âBoo. This doesnât work.â And when something goes right, also people go like, âOh, thank you. This rocks my world.â So, there is something to be said for being there for the people. And I think most developers would greatly benefit from that experience. Not for all the time, because it is very time consuming. But I think itâs a valuable lesson as a developer to actually own up and be responsible for what youâve done.
CORALINE:
How do you think business-oriented software could implement a similar sort of fast user feedback loop?
ANDREA:
Mm. Things like, then you get politics involved. See, we donât have politics because itâs our thing. But when you get, Iâm imagining someone like Citibank suddenly deciding to apply this and it scares me a lot.
[Chuckles]
ANDREA:
You know what I mean? [Chuckles] Itâs like, they would put metrics. Oh, how many customer requests did they answer? I donât know. I donât know how to answer your question without feeling like Iâm doing something wrong, killing kitties in a river or something like that. It just feels like slightly dirty. Maybe Iâm wrong. I donât know.
CHUCK:
Iâm wondering too, in game development. Do you test your code? I donât mean like playing the game to see if it works, but actually writing unit tests and stuff.
ANDREA:
Oh, yeah, yeah. As I mentioned before, we do test. Sorry, we test [inaudible]. But we do unit testing and integration testing and property testing up to systems code. So, some of the performance âbased code has some unit testing, some integration testing, where itâs possible and it makes sense. Some bits are just too close to the hardware to be able to replicate reliably and it needs some user testing. But at the system level, the tests are easy to write. And we have quite a few of those. I think weâre over a thousand, maybe more. And then at the scripts level we have none. We used to have some, but they stopped us. So, we just got rid of them. Because they are constantly tested and exercised by actual users.
JESSICA:
You have property tests at the system level. You talked about those in your talk and I found it really interesting how you use FsCheck.
ANDREA:
Mmhmm.
JESSICA:
Can you talk about some of the invariants that you test?
ANDREA:
Yeah, we kind of use property testing rather naively. So, some of our systems have very obvious properties, like when you increase the score, the score should go up.
JESSICA:
[Chuckles]
ANDREA:
But itâs really obvious. But the things like within a score system you have all these weird multipliers and it depends on a playerâs points. It depends on how many points you have from, thereâs rank on the fighting. And it could be that maybe youâve done something stupid which is likely because weâre human, and you wind up decreasing your score as you play. So, what we [inaudible] is basically with that, one of the properties of the score system is score increases when you increase. And this is your maximum score. Sorry, and this is your current score. Then another one is like, the score is not negative. Itâs like, you want to know that those systems do at least that bit okay, that no matter what changes you make to your ranks and whatever, that still works at it should. And itâs really easy to do with property testing, and with unit testing actually kind of hard. It will be way more setup. You wouldnât think of all the edge cases. So, itâs kind of naĂŻve but itâs actually caught quite a few bugs as is.
CHUCK:
The thing that I think scares me the most if I were to write a game are the areas that Iâm not really good at or donât understand. So for example, artwork or I think I could come up with an okay story, but I donât know if itâs an okay storyline for a game as opposed to say a short story or a novel. How do you address those?
ANDREA:
Well actually, there is a lot of ways to. There are all these different kinds of games. So, say for example you are not very good at art. But you could do all generated art. You can do real-time art stuff. So, you could just do shaders or geometrical shapes. Then if youâre thinking about story, you can use something like Twine or Fungus. Those are tools that allow for storytelling kind of games. So, there is a plethora of tools that you can now use.
And also, itâs like the styles of games weâre seeing, itâs more and more diverse. Maybe 20 years ago, 10 years ago, there was like, oh, platformers, first-person shooters, RPGs, racing. And now there is just all these diversity of stuff. Like a friend of ours here, he made just a game about breathing. Like, not breeding like chickens. Itâs like you breathe [inhales] like that. And basically, now the game has been reviewed as it helps with anxiety, because it regulates your breathing. So, I think actually your limitation, whatever your limitation you think you have, you can use them to your advantage to create an amazing experience. So, I hope that answers your question.
CHUCK:
Mm.
JESSICA:
Andrea, this is mostly a Ruby podcast. And I would love if you could tell our listeners something about F# and whatâs interesting about it, and why we might want to learn it.
ANDREA:
Ooh, sure. I knew this was a Ruby⊠actually I did do some Ruby a long time ago. And I kind of really like the language. I nearly went that way instead of going .NET. So, we might have been talking regardless, if that was an alternative reality. Anyway, why F#? See, I really like about F# that itâs a concise language. I love the type system that it has. I know that if you were coming from Ruby, why would you love it? Because I know you like [inaudible].
JESSICA:
F# was the first functional language that I ever learned. And it really taught me functional programming in a way that wasnât painful. It makes it easy to think about things like functional composition. And you learn pattern matching and data decomposition in a way that just makes your life easier instead of making your life harder. F# is also super accessible. You can âbrew installâ it and it works just fine on the Mac. And itâs got a REPL so itâs super easy to just play around with. Iâve used it back in the day when F# was the only functional language I knew anything about. There were times when I got stuck on a problem and I was having trouble thinking it through in Java, I went and wrote it in F# in just a few lines because itâs super concise. And it totally flowed better that way. And then I went and translated that into about 200 lines of Java. But it passed the tests.
So, F# is a great language thatâs at your fingertips. And it can help you think in new ways.
ANDREA:
That is true. And there are three things that are kind of close to Ruby, I think. Or, I felt the same equally welcome in Ruby and in the F# community. I remember this was, I donât know, 2008 maybe. I remember in Ireland there was a small Ruby Ireland group. And I went there and everyone was friendly and was trying to teach me stuff. I started using F# and I got a very similar welcome of, âHey, if you have any problems, just ask.â So, thereâs a great community.
The other thing that we have is that itâs an open source language. [Inaudible] started with Microsoft but itâs now owned by the community so much so that we have the F# Software Foundation. And that actually [has worked] towards the language I guess, thatâs the word. Another good thing about it is because itâs on .NET, you have all the libraries you need. Okay, thatâs not so Ruby-esque. But if itâs not in F#, itâs definite in C# you can do it. And yeah, everything that Jessica said totally.
And the best thing also is that we have type providers. Type providers, theyâre really cool. The language itself is beautiful. But type providers is an F# 3.0 feature. And what it can do is ideally, okay, the definition is you can get types provided to you and with that you can do a bunch of stuff. But a concrete example of that is you can grab some JSON or XML, do three lines of code, and with that you get type information, i.e. for example you got a CSV file and you got it through FSharp.Data, you can get access to that information through the column name. And that column name actually has a type. If you want, you can make it be formatted in a particular way. And if youâre dealing with data that is just a really handy and beautiful feature.
JESSICA:
Question.
ANDREA:
Yeah?
JESSICA:
Does that mean that in the F# REPL, like in the F# command line, you can make a web service call and get back some JSON and from that get autocompleteâŠ
ANDREA:
Oh yeah.
JESSICA:
When youâre saying, what is in here?
ANDREA:
Mmhmm. You can create an F#⊠probably you donât want to do it in the REPL so you can get autocomplete. But if youâre doing it on F# script which is like one file, and if youâre doing it either in Visual Studio or Xamarin Studio⊠Xamarin Studio is on Mac and Linux and also available on Windows, I donât know if itâs Linux actually. It might be [inaudible], but definitely Mac. You get Intellisense on dot. Say your CSV has, how many ponies did you have when you were a kid? So, you will be like, file <dot> how many ponies blahblah <dot> and you will get all the type information there. So, it could be four or maybe some float. How did you have 4.5 ponies, we donât want to know. But, you know.
JESSICA:
Awesome. So, itâs like the best of types that help you explore what you have without having to, all the overhead of creating them.
ANDREA:
Yes, absolutely. The type [inference] on this language is beautiful. And so, you could type without actually, you could write your code without thinking too much about types. But you have the safety of types. And so, I donât know how Ruby, the community, perceives types. So, I donât know how to talk about it in the correct language, basically. But if weâre talking just straight types literature, weâre talking about a lot of type safety for a little bit of effort.
CORALINE:
Types are definitely coming to Ruby in one shape or another. Matz is starting to hint about that for Ruby 3.0.
JESSICA:
Really?
ANDREA:
I didnât know. Thatâs awesome.
CORALINE:
The implementation details are non-existent at this point and thereâs a lot of theorizing about exactly what thatâs going to mean and exactly what itâs going to look like. But it is something that is definitely on his mind.
ANDREA:
That is really cool. I think itâs slowly coming some way top plenty of the languages. Like you know that guy, Ambrose, he has Typed Clojure. And his talk was very, very interesting. Trying to bring types to dynamic languages, that could be something.
JESSICA:
Yeah. I really like having the option of writing something dynamic in a dynamic language while stuff is changing all the time, and then going back and adding type guarantees and type explanations, the documentation that the types provide, later after itâs solidified a bit.
ANDREA:
Yeah. That seems like the sweet spot.
JESSICA:
Agree.
ANDREA:
Generally, Iâm a static type kind of person. But I can, I do know you move faster without them, at least at the start.
CORALINE:
Iâm curious if you do any pair programming or any of the other agile techniques when youâre doing games. Or is it very much very person working on their own piece and trying to go as fast as possible?
ANDREA:
It depends on the task. Some things are, I know a lot more about something and some of the other guys would know really well some other part. And this is something that we have to do that combines the two. And in that case, we would probably pair. Or anything that is just really complex, we would try to pair because itâs like, maybe Iâll do it and completely forget how it works. And the code would be, itâs like, âWhat did you do with these matrices here? Did you really need to do this?â It might come to [inaudible].
In general, we donât need to particularly lately, because weâre not code complete. So, we havenât been needing to do that lately. But weâve done it. Itâs very useful. Although maybe itâs pairing in the sense that Iâd like to think of pairing. Itâs more of a knowledge transfer pairing than a, âLetâs work on this together,â kind of pairing that weâre doing, which I think is somewhat awkward.
CORALINE:
Thatâs kind of where I was going. I was wondering if thereâs a siloing problem where one person knows exactly how this part of the game works. Another person knows how this other piece of the game works. And youâre limited in your ability to make changes or make fixes to an area thatâs someone elseâs expertise.
ANDREA:
I like to call it âstupid courageâ. So, when you need to work on something that youâve never worked before, you just go and do it and hope for the best. Or if youâre stuck, you just basically say, âListen, Iâm stuck.â Thatâs also the good thing about a very small team. Itâs like, you go and try your best and either break everything, but the things like, because again you have the [big game], when it breaks itâs not like, âOh surprise. It became broke three months ago.â Itâs like, âSurprise the game just broke and you break it for everybody.â [Chuckles] So, you have to fix it right now. So, itâs good that you do that. But also, everybody gets affected by your, as I call it, âstupid braveryâ. Thatâs a joke, by the way. I donât call it generally stupid bravery. But I think it...
CHUCK:
Yeah, better.
ANDREA:
[Inaudible] the message of it better. [Chuckles]
CHUCK:
Yeah, I like the idea behind it.
JESSICA:
Is that what Facebook calls move fast and break things?
ANDREA:
Yeah. The good thing is that we donât have 10 bazillion users screaming at us. [Laughs]
JESSICA:
Yet.
ANDREA:
We wonât push the broken game intentionally, at least.
JESSICA:
Oh yeah, because you said in your talk something about, if you get a null in here you donât throw an exception because we donât throw exceptions, because that would break the game.
ANDREA:
Yeah. Yeah, so itâs weird. The things like, I think in enterprise or something like that, or in not games, weâre used to being able to throw exceptions. You can actually say, âNo, this is definitely not cool and weâre not going to do this.â Where in the game, you kind of need to keep going forward as much as you can. The only reason why you would really stop the game and break it is because you canât render. All the other things, you should show them as errors and warnings or feeble asserts or whatever. But you generally donât throw exceptions. This is something particular to games. And actually, if you go and check something like the MonoGame code, youâll see a lot of assertions like this. Because youâre trying to basically make sure that the user never gets, youâre not playing Age of Empires and suddenly, âOops. Hello. It seems like youâre not able to render the castle. Iâm going to stop your game now.â Even though you didnât even notice there was a castle. So yeah, no exceptions.
JESSICA:
Yeah, so silent or relatively silent error-handling. That is different.
ANDREA:
Yeah.
JESSICA:
I have one more question, and that is you do some teaching of game development right? At game jams?
ANDREA:
Oh, well we do game jams. And Iâve been sneaking in F# [chuckles] tutorials in every one of them lately. If Iâm there, an F# tutorial is running.
JESSICA:
What is a game jam?
ANDREA:
So, a game jam is like a hackathon. Itâs exactly like a hackathon. So, itâs like you have a start time and an end time. And in that time, you need to make a game. We give you a theme, like eternal or something like that. And then you have between eight and 12 hours to finish a game from the start.
So, start to finish a game in that time. So, yeah.
JESSICA:
Do people work in teams?
ANDREA:
Yeah. They can work on their own, in teams, they can choose a platform, whatever they want to do it in. And basically at the end, we reserve an hour or two and people go and play each otherâs games. So, at the end itâs all kind of manic because everyone is playing each otherâs games. And in one of these you learn a lot. So, they are really, really great. And theyâre really fun, too.
JESSICA:
That sounds like a lot more fun than a hackathon. I would much rather make a game in a weekend than a website. [Laughter]
CHUCK:
Yeah.
ANDREA:
Yeah, and also there are prizes, but they tend to be a card game or something small that you want something because itâs kind of cool. But itâs more about the prize is making it, being part of it itself. Rather than in hackathons, it tends to be like, âOh, Iâm the best. Yeah.â Where this is more of like, âHey, weâre together and we built this cool thing. Yeah.â And everyone says yes.
CORALIENE:
Andrea, what are new developments that youâre super excited about in terms of games and game technology?
ANDREA:
Ooh. [Chuckles] Itâs funny. The thing that Iâm most excited about from a technology point of view lately is the fact that you can cure Alzheimerâs. I know this is not programming related. But Iâm like, how is this even possible? So, Iâm slightly getting excited about biology a little bit and the fact that we can do Star Trek stuff for real. [Chuckles] I know this is not games. But I like to live as well.
JESSICA:
Thatâs awesome.
CHUCK:
My last question is how do we find the games that youâre writing?
ANDREA:
Oh. Okay, thatâs super easy. You go to Steam, the PC gaming platform.
CHUCK:
Mmhmm.
ANDREA:
Probably the biggest one. And you search for âOnikira: Demon Killerâ. And then youâll find our game. Itâs there at the moment. You can go and play it. Actually a big update is coming up, probably will be there on Friday. We have it in QA or whatever that means right now. That means that we tell a bunch of friends, âHey, go and play it. Itâs on Steam in this [inaudible].â So, thatâs coming, one new level, one new enemy. Or two, I donât remember. And a bunch of bug fixes.
CHUCK:
Very cool.
JESSICA:
Itâs sufficient to search for âdemon killerâ by the way. However, do you need an Xbox controller? Well, you definitely need a Windows machine.
ANDREA:
Yes.
JESSICA:
Which is limiting for some people. Fortunately, my kids have Windows machines. And do you need an Xbox controller? Because I [inaudible].
ANDREA:
Oh yeah, actually thatâs one of the changes, that we have keyboard mappings that are the ones for⊠basically we went around and checked and DMC had some keyboard mappings that are standard for DMC. And so, we used those. But in this update coming on Friday-ish, you can remap the keys and you can see what the current ones are. So, you donât need it. And to support, you can actually play the game without the controller. But now youâll be able to see what those keys are. [Chuckles]
JESSICA:
Oh, thatâs great, because I was just smashing buttons. [Laughs]
ANDREA:
[Chuckles] Youâre like, âAh, something happened.â But things like, with a controller, the game is particularly if youâre not used to this type of game, with a controller the game just flows better. Itâs more obvious about what you want to do. And a controller, I donât know. You can get one for, I donât know, $30 or so? And it makes a lot of games way better. I was not a believer until I got one. And I was like, âIâm an idiot. I should have [inaudible] got a controller before.â Because itâs more fluid to certain games, you know.
CHUCK:
What is DMC?
ANDREA:
Sorry, itâs Devil May Cry. Itâs a game that has been going on for years. DMC 1, 2, 3, and 4. And arguably, 3 or 4 are the best, if you like 3 or 4. Then after that, they decided to make it all awkward and they released âDmC: Devil May Cryâ, which should have been DMC 5. But then everyone hated that one. [Inaudible] you know, typical saga story. But anyway, good game. Itâs a really good game.
DMC, Bayonetta, are kind of classics of fighting games.
CHUCK:
Yeah, now Iâm going to have listeners emailing me telling me Iâm not living right because I didnât know what it was.
ANDREA:
[Chuckles] No, no. Sorry. You know the way you have certain context. ItâsâŠ
CHUCK:
Yeah, no.
ANDREA:
I should have beenâŠ
CHUCK:
I totally understand. I just know that some of our listeners are hardcore game people.
JESSICA:
And others of us also had no idea what DMC meant.
CHUCK:
[Laughs]
ANDREA:
Thatâs awesome that you have an audience that is so varied. I like that.
JESSICA:
Yes.
CHUCK:
Yeah. Alright. Well, letâs go ahead and do the picks. Avdi, we havenât had you on for a while. You ready with some picks?
AVDI:
Sure. Letâs see. I think first off, Iâm going to pick a talk that I might have picked before. Iâm not sure. This is a talk that I first saw back in 2011, 2012 and itâs been kind of ongoing since then. The talk is called âSchemas for the Real Worldâ. Itâs by Carina Zona. And she did it originally at a GoGaRuCo that I was at. And sheâs been delivering updated versions in the years since then, adding new examples and stuff.
And if you havenât watched this talk, any of the revisions of this talk, you absolutely have to go and watch it. It is, itâs just terribly important. The subject matter is something that Iâve been reflecting on a lot lately, which is that as programmers we play a large and growing role in constructing reality for a lot of the world. And particularly the topic that sheâs talking about is the schemas that we use for our data. But this really applies to just the way we model things in general, and the ideas that we include when we model things very rigidly. So, if you havenât seen this talk, âSchemas for the Real Worldâ, do yourself a favor. Go watch it right now.
I will also pick a place. I will pick Maryville, Tennessee. This is the town that weâve moved to, as you heard in the intros as my first broadcast from Tennessee. And we moved here so that we could be in the mountains. [Inaudible] a town nearby, as long as it had a gas station and a Walmart. But Iâve been really, really thrilled to find out that the town that I live now 18 minutes away from has just a remarkable array of meat stuff, has one of the nicest coffee houses I think Iâve ever been in, and some really nice shops and craft beer markets. And thereâs at least one local brewery. Iâm very, very excited to be living here and Iâve only just started to explore it. So, Maryville, Tennessee is my other pick. And thatâs it for me.
CHUCK:
Awesome. Jessica, what are your picks?
JESSICA:
I have great picks today. Okay, okay. I have the new favorite program on the Mac. Itâs called Monodraw. And itâs so amazing. Itâs a diagraming program, but all your diagrams are ASCII art.
CHUCK:
[Chuckles] Oh, nice.
JESSICA:
So, you could draw the little [inaudible]. You can connect them with the little arrows. You can put the text in them. You could fill them with smiley faces if you want. You can move them around and diagram your flow. And then cut and paste it into your commit message.
CHUCK:
Awesome.
JESSICA:
Or in the comments, but I donât believe in comments. I think you should put it in your commit message, because that never lies. This has, in a couple of cases, changed the way we programmed. Because it was so easy to just draw a very simple diagram. It doesnât let you draw complicated ones. Thatâs a good thing. And yeah, conveys information super-fast. I could paste it into Slack. I donât even have to make an image. Everyone can edit it because itâs ASCII.
My second pick is a blogpost that I read this morning. It is by Elizabeth Naramore. And itâs about being uncomfortable. If you are part of an open source community or any community that you care about and you want this project to continue rather than just serve your own interests, I highly recommend the post. The basic theme is if something you say makes someone else uncomfortable, thatâs not wrong but it is detrimental to your community, because any community thatâs going to be bigger than you is not about you. Itâs about everyone else who might be part of it. And if they feel uncomfortable, theyâre not going to complain most of the time. The complaints are precious and you should appreciate those. Usually, theyâre just going to go somewhere else, kind of like playing a game I guess. If you want someone to help with your open source product, it better be fun. Those are my picks.
CHUCK:
Cool. Coraline, what are your picks?
CORALINE:
I have a couple today. The first is a little toy project called AmbientSpec. Basically, it turns longrunning RSpec or Minitest specs into ambient music. You get sweet sounds from passing examples and very subtle gongs to indicate failing tests. You wonât hear anything unless youâre test suite runs longer than five seconds, because silence is the most pleasing sound of all. And an interesting [story] about this little gem is that there was a woman named Wendy Beth who submitted her first ever open source pull request [inaudible] for Minitest. And she actually met Ryan Davis who writes Minitest and maintains it at a conference last month. And he was able to help her with the [end] duration. And that was a great first open source experience for her that made the gem a lot nicer. So, thatâs it for the first one.
Magic:
The Gathering has cited Cosmic Encounter as being incredibly influential in the design of the games that he has made. So, itâs [inaudible] fun. Three to [inaudible] players, takes a couple of hours, and is really, really great gameplay.
CHUCK:
Awesome. Alright, Iâve got a couple of picks. The first one is a book that I know has been picked on the show before but I just read it and I thought it was terrific. Itâs called âReady Player Oneâ. Itâs just a fun book. If you played any of those games from the 80s, itâs just a lot of fun to read.
The second book that Iâm going to pick has also been picked on the show before. I have to say that Iâve been listening to it on Audible and it was a little bit hard for me to get into, just because the content seemed to be different from what I expected. But I stuck through it and Iâve really started enjoying it. Itâs called âMasteryâ. I forget who itâs by. But weâll put the link in the show notes. And so, it talks about the different levels of mastery and the different ways that people become masters at their craft. And it is a terrific book. So yeah, Iâll pick that. I think it was picked by Katrina Owen and David Brady in the past. I think thatâs all the picks I have for today. Andrea, what are your picks?
ANDREA:
Okay. I think Iâll start with the board game. And this one is called Dixit. And Iâll add it to the show notes. And itâs basically a game where you have to, itâs about⊠you get a picture, like a big card that has this beautiful art. And you have to say a word that kind of⊠okay, the game is a little bit more complex than that. But basically, you have to say a word that explains that image. And other people have to put similar cards that say what you just said, but with different images. Itâs really hard to explain but really [wonderful] to play. The rules are simple, even though I just managed to completely destroy the explanation of it. And itâs [inaudible] [the family] and anyone. It doesnât take forever. I really love board games. But this one got me hooked into playing board games more often.
And then another one that I thought maybe you guys would enjoy is a talk by, I donât remember his name. Mike Bernstein. Itâs a talk on GoGaRuCo last year called âKnow your Typesâ. And Iâm going to add a link to the show notes. Itâs basically a talk about types. And itâs funny because itâs also for a Ruby audience, I think. So, I really like talks by this guy. Heâs very inspiring and I hope you will enjoy it, too.
So, Iâd also like to add a talk by Philip Potter on property testing. He gave it last year I think at some Clojure conference. I think it might have been Clojure Conf. And I added the link there. So, I hope you enjoy that. I hope you like it as much as I did.
JESSICA:
Sweet. Thank you.
CHUCK:
Alright. Well, I should have asked this before. But if people want to follow you or get involved in game development, I guess those are two different resources, but do you have some recommendations for it?
ANDREA:
To follow me, Twitter is probably your best bet. Iâm @silverspoon. And when it comes to learning or doing game stuff, I think starting off by going to game jams is the best advice I can probably give you. There are game jams online, not online, all the time. Just search game jams and you shall find. [Chuckles] I donât know. Weâre going to [inaudible] which is one specific type of game jam. But there is one probably every week in different parts of the world. So, Iâd say thatâs my advice. Make all the games you can.
CHUCK:
Alright, cool. Well, thanks for coming.
ANDREA:
Thanks for the invite. I really enjoyed it.
CHUCK:
Alright. Well, weâllâŠ
JESSICA:
Yes, thank you.
CHUCK:
Weâll wrap up the show. Weâll catch everyone next week.
[This episode is sponsored by WatchMeCode. Ruby and JavaScript go together like peanut butter and jelly. Have you been looking for regular high-quality video screencasts on building JavaScript done by someone who really understands JavaScript? Derick Baileyâs videos cover many of the topics we talk about on JavaScript Jabber and Ruby Rogues and are up on the latest tools and tricks youâll need to write great JavaScript. He covers language fundamentals so thereâs plenty for everyone. Looking over the catalogue, I got really excited and canât wait to watch them all. Go check them out at RubyRogues.com/WatchMeCode.]
[This episode is sponsored by MadGlory. Youâve been building software for a long time and sometimes itâs get a little overwhelming. Work piles up, hiring sucks, and itâs hard to get projects out the door. Check out MadGlory. Theyâre a small shop with experience shipping big products. Theyâre smart, dedicated, will augment your team and work as hard as you do. Find them online at MadGlory.com or on Twitter at MadGlory.]
[Hosting and bandwidth provided by the Blue Box Group. Check them out at Blubox.net.]
[Bandwidth for this segment is provided by CacheFly, the worldâs fastest CDN. Deliver your content fast with CacheFly. Visit CacheFly.com to learn more.]
[Would you like to join a conversation with the Rogues and their guests? Want to support the show? We have a forum that allows you to join the conversation and support the show at the same time. You can sign up at RubyRogues.com/Parley.]

201 RR Game Development with Andrea Magnorsky
0:00
Playback Speed: