Featured image of post Fizz Buzz Book with Joel Grus

Fizz Buzz Book with Joel Grus

In this episode, Joel and I discuss his brilliant new book Ten Essays on Fizz Buzz Meditations on Python, mathematics, science, engineering, and design.

Listen

Subscribe

Transcript

[00:11] Tim: Welcome to the 2nd episode of the Into the Hopper podcast. I’m joined by a very special guest who you have almost certainly heard of, perhaps from his 2015 masterpiece Data Science from Scratch published by O’Reilly, his 2016 masterpiece FizzBuzz in TensorFlow published on his blog, his 2017 masterpiece Live Coding Neural Networks on YouTube, his 2018 foray into live coding the Advent of Code, his 2019 masterpiece Data Science from Scratch, 2nd Edition, published by O’Reilly, or his 2020 masterpiece, the FizzBuzz book: Meditations on Python, Mathematics, Science, Engineering, and Design. And if you haven’t heard of him from any of those, maybe you’ve heard of him from his, I don’t know if I’ll call it a masterpiece, @joelgrus account on Twitter, which is a sight to behold.

[01:10] Joel: I can’t believe you didn’t mention the Jupyter Notebooks talk.

[01:14] Tim: Oh, I actually had that on my list. And I think that was also 2018 because I thought something disappeared from 2018. So I added the Advent of Code. But yes, of course, I don’t like notebooks. famously rocking the Jupyter world, which I actually had a response talk to that sadly wasn’t recorded, but everyone should go watch that talk and all these resources except maybe Data Science from Scratch, first edition.

[01:41] Joel: It’s funny, I don’t think of like my life or career in those terms, but I do have this deep feeling inside about gotta stay fresh, gotta produce new content, gotta get known for something new. And so I think your list kind of reinforces that.

[02:01] Tim: And that only goes back to 2015. It doesn’t include your days of being an Excel author and things like that.

[02:07] Joel: I didn’t do much interesting before 2015, so.

[02:10] Tim: Which I think is around when you met me, so there’s something there.

[02:14] Joel: Exactly. We’ll have to do one of those causal diagrams and figure out exactly how it works.

[02:21] Tim: So by day, you are a software engineer, former data scientist, and maybe also manager sometimes now these days?

[02:28] Joel: That’s right. I work at a company called Capital Group, which is a large investment firm, and I lead a small team that’s basically focused on building data and machine learning solutions to business problems. So it’s really sitting at the intersection of software engineering, because we’re actually building systems and doing software engineering, and data science, in that we’re actually coming up with machine learning models to solve problems and training them and collecting datasets and labeling data and all of it. We’re kind of a— you could think of us as a tiny end-to-end data science org or full-stack data science or whatever the trendy term is these days.

[03:02] Tim: You have to call it machine learning engineering if you want to be trending— trendy.

[03:06] Joel: Yeah, I’m hesitant to call it that because it’s much It’s much broader than that. It’s almost like a third what people might call machine learning engineering, a third outright software engineering. Yesterday I was mucking actually with Apache configs, if you can believe it, and then a third more pure data science.

[03:27] Tim: So all these other things you just do on your free time? You write and make videos in your free time?

[03:33] Joel: Those are my hobbies, basically. So I had a kid. So this is really where the causality comes from. My daughter was born in 2011, and before she was born, I spent most of my free time watching TV and reading library books about nothing in particular. And when she was born, I basically turned off the TV and disconnected the cable and tried to spend a little bit more time with her, but there’s really a limit to how much time I can spend with a baby. And so, I kind of replaced my TV and library book habit with a Coursera habit, which eventually became a writing and coding and— I don’t want to say a blogging habit because I write one blog a year. But coding and building things habit.

[04:14] Tim: And I have said on more than one occasion, I wish I could write and speak and make videos like you with the level of both technical competence, but then you have a creative style that is unparalleled in my perspective, not to puff you up too soon in this podcast, but your style is very unique. Is there a someone who’s motivated you there, or is that just how that’s developed in your own work?

[04:42] Joel: So it’s funny, when I was in high school, I did not enjoy writing. I didn’t like English class. When I was in college, I would kind of go out of my way not to take classes that involved term papers or giant essays or things like that. And I really was not into writing. I didn’t think I was particularly good at it, and I didn’t enjoy it. And so my joke is that I’ve had 2 writing teachers in my life. One was LiveJournal. And, you know, from the years, let’s call it 2001 to 2006 or so, I was pretty, I was pretty into LiveJournal, and my circle of friends were all pretty into LiveJournal, and I wrote a lot there. And writing for other people in somewhat long form really, you know, gave me an opportunity to hone my writing style. And I just, I wrote a lot, and that’s sort of where I found my voice as kind of a long-form writer.

And then it kind of faded out. It got bought by a Russian company. Everyone abandoned it. And then Twitter became a thing. And, you know, I went through and like deleted all my old tweets recently. And my early tweets were not interesting. They were boring. They had not much style. And so then Twitter was sort of a learning experience again. Now here’s how I write in very short form. And so I would say between LiveJournal and Twitter, those were sort of the two kind of the 2 writing teachers, if you will, that were most formative on the way that I write.

[06:11] Tim: That’s interesting. I wonder how many writers would attribute Twitter as to helping them become better writers. So back in 2016, you wrote this blog post, FizzBuzz in TensorFlow, which is the story of someone in a job interview asked this classic question of fizzbuzz and implementing it in a unique way by training a neural network. And that post really blew up. And I mean, people still talk about it to this day. And it’s very funny. And if I’m correct, you have people ask you all the time if that was a true story. Isn’t that right?

[06:47] Joel: All the time is an overstatement. But yeah, you know, with some regularity, I get asked that.

[06:53] Tim: So a few months back, you messaged me and said, hey, I’m writing a book on FizzBuzz. I think you’ll like it. You asked me to look at the manuscript, and I started reading and reading and pretty quickly messaged you, this is incredible, I wish I had written it, or something like that, which has become one of your marketing lines for the book. It really has blown me away in the way you combine these subjects. The subtitle is Meditations on Python, Mathematics, Science, Engineering, and Design. It seems to me that when you find books on any one of those topics that try to merge different aspects, they tend to be good at one and maybe passable on the other.

But I think one of your unique contributions in this book, and I guess it’s not totally unique, but I have not seen many other things like it, is you combine those different topics at a very competent level. So you talk about math, but you actually also understand Python and modern Python in particular, and the way Python is used. How did that come to be? I mean, that, I guess, in some ways is just a combination of your last 20 years of your career and interests.

[08:15] Joel: So I wrote this book, Data Science from Scratch. And one of the things— and so the premise of that book is that basically, we’re going to learn data science, but we’re going to learn it by implementing things from first principles in Python. So we’re not going to use NumPy, we’re going to use Python lists as our vectors. And we’re going to implement linear regression by actually writing the code to do linear regression on these arrays that are lists. And we’re going to learn how to do decision trees by actually writing the code to take a dataset and build a decision tree on it and things like that. And the reason that approach resonated with me, there’s kind of 2 reasons. One is, because I was a math person.

I studied math, I went to math grad school, and within mathematics, there’s this kind of aesthetics where you should not use things unless you have proved them and understand them. So you should not be allowed to use a theorem in a class unless the class has already proved that theorem. And for better or for worse, that’s kind of a mindset that stuck with me. The other is that back in, call it probably 2012, when Andrew Ng launched the first machine learning class, which was, I think, one of the very first MOOC, you know, online classes. He did this presentation using kind of gradient descent as the organizing principle for the class and implementing everything in Octave. And Octave has its own set of problems, like it crashes all the time.

But anyway, that approach to learning machine learning really resonated with me as well, and I think I took a lot of influence from that. And so when I sat down to write this book, Data Science from Scratch, I didn’t want to make it a math book, but I somehow needed to include the mathematical concepts in it, you know, in order to explain all the things we were implementing. And so I thought for a long time about how can I best use Python as a language to demonstrate mathematical concepts? And, you know, in the first edition, I did an okay job of this, and for the second edition, I really went through with a very fine-tooth comb and thought about this once more, which is that I want to demonstrate a concept using code, and so how do I need to structure my code in a way that best demonstrates that concept?

And so that’s everything from, you know, which Python idioms do I want to use, how do I want to call my variable names, how do I want to break things into functions? And so writing the second edition of that book involved a lot of very deep pedagogical thought around how do I use code to illustrate these kind of mathematical ideas, and so that’s something where, let’s say, I’ve probably given that particular subject more thought than most people, and as a result of that, you know, I like to think I’m actually pretty good at using Python code to illustrate ideas and to say, here’s the actual code that I want to run, now how am I actually going to structure it so that it’s most readable in the context of between these 2 paragraphs in a book. And that’s a skill that I would say took a lot of practice.

And then, you know, apart from that, I write a lot of Python, so I’m pretty familiar with all the various idioms as well.

[11:27] Tim: I think that’s worth emphasizing again. It’s not just using Python to illustrate math, but it’s using what’s considered to be good idiomatic Python, whether people like it or not. I mean, what you’re doing is the very modern accepted way to do Python. And I remember, so you have these, this video series of live coding a neural network where you show how to implement backpropagation to train a neural network live coded. And you had jokingly said on Twitter a while back, in response to someone’s question about the best way to learn type hinting in Python, that the best way was, or a way was to watch your live coding neural networks talks, which I did. And I was like, oh, Wow, I think I understand this new way that Python is allowing you to think about types. And so you have these videos and books that have a different focus, but then at the same time, I’m learning more about a language that I’ve been using every day for almost 10 years.

[12:28] Joel: That’s one of the curious things about the book and why it’s unusual as a book, right? So, you know, the book’s called 10 Essays on FizzBuzz, and Each essay or chapter is one solution to FizzBuzz, and then, you know, 10 pages of explanation and/or digression and/or thoughts about some aspects of that solution and why it works and what it inspires in me. And, like, I think it’s a really cool book, but it’s also, like, that’s a really weird structure for a technical book, right? You know, most technical books are, this is a book about Python, and you would read it if you want to learn about Python, or this is a book about SQL, and you’d read it if you want to learn about SQL, or this is a book about deep learning and you would read it if you want to learn about deep learning.

But there’s probably not a lot of people out there who are thinking, you know what, I want to learn about FizzBuzz and therefore I’m going to go out and purchase a book or read a book on FizzBuzz. Like, that’s just— it doesn’t work that way. And so I say in the introduction, you know, this is a book that you will probably learn a lot by reading, but it’s not a book that you would read to learn anything in particular. And that makes it kind of strange as a technical book. Like, it’s hard to think of very many technical books that are like that, which is sad because I think it’s a cool idea for a technical book.

[13:45] Tim: If there’s something in particular I think you would read it to learn, I would say it is problem-solving with algorithms, math, and Python is the thing to learn because you’re taking one silly problem that’s given in job interviews And you’re saying, here are 10+ ways to look at this problem. And it helped me as someone who spends a lot of my days solving problems with code, it helped me realize that the one naive solution, or maybe the second solution you get with a little bit more thought, aren’t necessarily the only ways to tackle a problem. And in fact, you have wildly varied solutions from, well, I mean, you start off the book saying one way to solve FizzBuzz is to just naively print these numbers. Actually, I guess it’d be worth stating in case anyone doesn’t know the FizzBuzz problem, would you mind just stating that quickly?

[14:49] Joel: Yeah, so FizzBuzz is the problem where you’re asked to do the following. You need to print the numbers from 1 up to 100. except if the number is divisible by 3, then instead of printing the number, you print fizz. If the number is divisible by 5, instead of printing the number, you print buzz. And if it’s divisible by 15, instead of printing the number, you print fizzbuzz. And so the story goes that this was like a children’s game to teach them about mathematics, where they would sit around in a circle and go around saying the numbers, but substituting fizz or buzz or fizzbuzz as appropriate. And then it became It’s a pretty easy problem to solve if you’re a decent programmer, and so it gets asked in interviews sometimes to weed out people who don’t actually know how to write code. And then because of that, it sort of is known as the stereotypical bad question to ask if you want to check someone, you know, if they meet some lowest common denominator bar.

[15:46] Tim: So you have solutions from Well, I mean, as I said, introducing the book, you could just print all the values and then you, you explain kind of a traditional solution. But then you have solutions that involve things like trigonometry, random number generation, and you conclude the book with the TensorFlow example, a linear algebra example. I mean, there are all kinds of wildly different solutions from a mathematical and algorithmic perspective that I think most of us don’t take the time to think about the possibilities for problems being solved that way. And I mean, in some ways that’s good. These aren’t solutions you would probably want to use in real life, but it helped me think about the breadth of possibilities of solving A pretty simple problem.

[16:44] Joel: Yeah, it’s funny, you know, I never gave the problem itself that much thought until I wrote that blog post. And, you know, when I wrote the blog post, I just chose it because it was such a well-known problem. And then after I wrote that and it went sort of viral, you know, people would ask me questions about it. I gave a few talks about the FizzBuzz in TensorFlow solution. And then somehow this notion of FizzBuzz got stuck in my mind. And occasionally, I’d be thinking about something else, and I would just realize that what I was doing was another way to solve FizzBuzz. And so I started kind of casually collecting a few other solutions. And, you know, I didn’t blog about them because I didn’t want to write— I don’t want to be the guy who writes blog posts about FizzBuzz all the time.

I would tweet about them when I found interesting ones, and someone on Twitter was like, you should write a book about all these. And I thought, well, you know, at that point, I had maybe 4 or 5, and so I had to sit down and think. can I really come up with like a serious number of these and come up with interesting things to say about all of them to kind of make this into a book that people would want to read? So it was a challenge, but it was kind of a fun challenge.

[17:52] Tim: I don’t want to spoil the book by really talking through all the different chapters, but one that I thought was particularly fun was the random number generation one. Would you be interested in describing at a high level how you used random numbers to generate FizzBuzz?

[18:09] Joel: Yeah, so that’s actually one of the, like, of all the solutions in the book, that’s kind of the most— that’s the least me in the sense that I learned about it from a Stack Overflow post, actually. Not the exact details of the solution, but about the idea of doing it, and then the code is my own personal approach to it. But the idea behind it is basically that when you have Random number generation in programming languages most of the time, like in the Python random module, it’s not actually generating random numbers. It’s generating what are called pseudorandom numbers. So they’re actually deterministic starting from some seed. So in Python, you can set a random seed, and then you’ll always get the same sequence of numbers coming out after that.

And then it’s also the case that, you know, in an earlier chapter, we explored this idea that The pattern of the correct FizzBuzz outputs repeats in this cycle of 15. And so if you know 15 correct solutions in a row, then you kind of know all the solutions. And a number of the solutions actually play off this idea of the cycle of 15. But what that means is that if you have a random number generator that can generate the correct 15 random numbers in a row, then you can use draws from that random number generator to quote unquote solve FizzBuzz. And then it’s just a matter of, you know, framing the problem in that way and doing a search across all the random number seeds until you find one that gives you that cycle of 15 that you want.

[19:44] Tim: We take random numbers for granted, but that really shows something about the subtlety of pseudo-random number generation.

[19:53] Joel: It’s a very surprising solution when you read the code, because you think, how could that work? There’s no test for, There’s no ifs, there’s no tests for divisibility, there’s nothing. There’s just a bunch of calls to random.choice. And so the fact that something like that works is pretty surprising on the face of it until you really unpack what’s going on.

[20:12] Tim: Yeah, the structure of repeating after 15 and being related to the factors of the numbers made me wonder if you could come up with some kind of, like group theoretic approach for generating this, which maybe is analogous to what you do in your matrix theory chapter in chapter 9. But I did spend a little time thinking about, could you construct like a group or maybe a group with some extra operation that could— you could just like multiply something by itself and generate the FizzBuzz values?

[20:50] Joel: The closest one in flavor to that is actually probably the itertools solution. I mean, it’s not using group theory per se, but that’s a solution that really most captures that here we have, you know, a generator of order 5 and a generator of order 3, and we’re doing something with them.

[21:11] Tim: That’s a great observation, and that’s a helpful— well, all of those chapters that involve generators are helpful in thinking more deeply about that aspect of Python, which Not everyone does. And actually, to that, something I thought was particularly interesting, really a subsection in chapter 6, you have this little excursus on data modeling. And you, in implementing a solution, you ultimately want to use the Python named tuple type. But you go into these, these little subsections. Why not tuples? Why not dictionaries? Why not classes? Why not data classes, which are a new aspect of Python? And you— this is very Python specific, but you help people think through why might you choose one of these very similar data structures in the Python language?

[22:12] Joel: Yeah. So I mean, when it comes to Python, I’m an ideologue in a lot of ways, and I have very strong opinions about how people should and should not write Python that go pretty far beyond what is considered idiomatic and not idiomatic. I mean, obviously I think people should write Python in idiomatic ways, but my strictures kind of go above and beyond that. So one is that I use named tuples basically wherever I can, and they’re pretty much always my choice for data modeling, unless I have a really good reason not to use them. And so it’s possible that I stacked the deck in their favor a little bit in the book when I discussed that, but, you know, hopefully I was somewhat even-handed and fair, but I like them a lot. The other one is about type annotations, and I love Python and type annotations.

I pretty much won’t write Python without type annotations anymore. There’s probably 2 or 3 examples in the book where I don’t use them, either because it wouldn’t have made the code fit all on one line, you get some pretty narrow constraints in a book form, or else because the type would have been really ugly and not very illuminating. But, you know, when I redid the second edition of Data Science from Scratch, one of the very deliberate decisions I made was to include type annotations everywhere.

And this goes back to the point I made earlier about how I use Python in a pedagogical sense. From my perspective, if I’m using code to illustrate a mathematical concept or some other kind of concept, having the types right there and saying that this function argument is a list of integers is part of the pedagogy. It makes the code more readable and the teaching that much clearer. So that’s the other way in which I put my thumb on the scale.

[24:11] Tim: And one of the other things you do straight from the beginning is write tests for your code, and you share those tests as both a check for yourself in writing this, but also, again, as a pedagogical thing, which I think is a huge aspect of software testing.

[24:26] Joel: You know, you’re right. And that’s actually— that’s my third— well, that’s my third thing. And I did that in the second edition of Data Science from Scratch as well, which was that throughout the book, I sort of weaved you know, much more of an emphasis of we’ve written some code, now let’s test it. And when you’re writing a book, it can be as simple as I’ve written a function, now I want to illustrate how the function gets used. Well, I can just do that using an assert statement and the expected value. And now I’ve both shown you how to use the function and I’ve written a test that it works correctly.

[24:57] Tim: So I think that’s nice. I can’t remember if you used pytest explicitly. I don’t think you did. I think you just wrote tests.

[25:03] Joel: No, I did not use pytest explicitly.

[25:07] Tim: But I do like pytest because it basically allows you to write tests that look like the test that you wrote, which is— this is just simple Python without a bunch of imported things or big nasty classes like you have to do with unittest.

[25:20] Joel: So I agree. And in real life, I use pytest pretty much always. But, you know, in terms of like the flow of a book, I don’t think it would add to, you know, okay, now I’m going to write an actual test function. or I’m going to show running pytest. I think from, again, from a pedagogical point of view, when the goal is to teach things rather than to show how to use pytest, it’s simpler to just use, you know, bare asserts.

[25:46] Tim: Yeah, I think that makes sense. I skimmed through the book and wrote a list of some Python 3 concepts that came up. Testing was one. You use modern Python 3 features like type hinting and the truthiness of values, which can be subtle in Python. You use cProfile to profile some code. You talk about tail recursion, which Python doesn’t optimize for and which can bite you if you expect it to. You have a very helpful section showing how Python list copying, which can also happen with strings, can really bite you if you don’t realize you’re copying. If those lists get too large, that can take an enormous amount of time.

[26:39] Joel: You know, that was another balance that I really tried to strike in the book because one of my pet causes, and I’m sure you’ve heard me go on about this, is why data scientists should really care more about things like software engineering best practices And, you know, things like foundational computer science. And, you know, some people don’t agree with me, but that’s fine. Not everyone has to agree with me, but I think that’s pretty true. And so what I did, you know, obviously I don’t wanna teach an algorithms class in this book, and I don’t want to have to go into, here’s the definition of Big O notation, and everything like that. But throughout the book, I tried to, you know, make a point of, here are some code constructs that are actually very inefficient, and here’s why.

Let’s actually time how long it takes to run them on an input of size 10, 100, 1,000, whatever. And you can see that, like, it scales really badly. And now here are some other, you know, constructs that are much more efficient. Here’s why, and here’s how they scale. So it was kind of, you know, like a sly way of getting some analysis of algorithms type thinking into the book and to get people who may or may not be familiar with those concepts to at least consider them without having to bang them over the head about, you know, here’s what O means, here’s what O means, prove this is O , etc.

[28:01] Tim: Which is great for people who haven’t experienced that to learn how to— I mean, it’s a largely intuitive thing at the end of the day. We usually aren’t sitting down calculating those things in the way you learn in an algorithms class, but being able to think through that is a great skill.

[28:18] Joel: I’m not sure I would agree that it’s intuitive, but it’s a skill you can pick up, right? And, you know, one of the things that I do have in the book is that there’s this notion of code that’s accidentally quadratic. So you’re actually doing something expensive, and you don’t realize it, because it feels like you’ve done something cheap, but based on the way that Python or whatever language has implemented it, it turns out to be, you know, very expensive. And so, like, helping people not to make those kinds of mistakes, I think, is pretty important.

[28:47] Tim: Right. And some of the nice syntactical things in Python really do hide that. I’ve been writing some Go lately, and it’s harder to do that kind of thing and not be aware of it in a language that doesn’t provide you with some of those higher-level syntaxes. I have a few questions from some of your fans on Twitter that I want to get to before we wrap up. One was, was there a solution that you liked but didn’t provide enough material to structure a chapter around?

[29:15] Joel: Yeah, so in the second chapter, which is the canonical solution, the, you know, if-elif-elif-else, so just the way that most people would solve the problem, at the very end there’s a section about what happens if you don’t want to put the if statements in there. And it turns out that you can kind of hide the if statements by using list.index, and it’s actually a really neat trick, and I really like the solution that it gives rise to. But I couldn’t really come up with like a whole nother chapter’s worth of material around what was a pretty small trick. So it’s just sort of a bonus solution in chapter 2.

[29:55] Tim: Something I don’t think you discuss in the book is if you even like fizzbuzz as an interview question. Is this something that you think is useful?

[30:04] Joel: Generally, I would say no. I think it will tell you if a candidate has no business being there. But, but I, but I think if your process is good, you probably should have figured that out already, you know, in some kind of phone interview or phone screen. Um, but, but I think it’s such a well-known problem that, you know, probably most people are just going to be regurgitating an off-the-shelf solution. And to me, that doesn’t tell you much other than whether they know that off-the-shelf solution. I prefer problems that give me more insight into how does this person think algorithmically, how does this person model problems using language constructs, things like that. And now that’s not to say that there aren’t ways to make it an interesting problem. Any problem you can add layers onto it that make it more interesting.

So in the course of doing this book, I came up with this variant where instead of divisible by 3, divisible by 5, divisible by 15, Instead, you want to print the numbers 1 to, say, 1,000, and you print fizz if the number is a perfect square, buzz if the number is a perfect cube, and fizzbuzz if the number is a perfect 6th power. So that’s— it’s only a slightly different problem, but it’s different enough that it’s actually a little bit interesting, right? How do you test if something is a 6th power? Well, it’s not just a modulus operator. You have to think about that a little bit harder. So I think that’s actually a neat variant. Now, is it too much of a math problem and you’re disadvantaging people who are not math people. Maybe it is. I haven’t thought about that either.

But in general, I would never ask FizzBuzz as an interviewing question.

[31:45] Tim: Were any of the solutions a particular favorite of yours?

[31:48] Joel: I would say probably the 2 that are my favorites. One is the itertools solution that uses itertools-cycle. I think there’s just something beautiful and elegant about it. It really— It represents the structure that underlies the problem rather than representing the problem itself. So rather than having to check if something’s divisible by 3, instead we construct something that happens every, you know, every 3 instances. And so it— I like itertools, they’re fun to play with, but also I think that solution is very elegant and I like it. The other one that I like a lot is called Euclid’s solution, and that one actually went through 2 stages.

The original version of that chapter just used math.gcd, so that solution is based on finding the greatest common divisor between a number and 15, which tells you what the FizzBuzz answer should be. Originally, it used math.gcd as the solution at the start of the chapter. At the end, there was a side note saying, here’s Euclid’s algorithm for how you might compute the GCD. After that chapter had been sitting on paper and in my brain for a while, I realized: what if I made the invocation of Euclid’s algorithm part of the solution itself? It turned out that resulted in a very clean, neat-looking solution where it isn’t clear at all why it works. You see it and say, wow, this looks so clean and simple. What is it doing? I have no idea.

And I love that aspect of it. There are other chapters in the book where the solutions are like, I don’t understand what this is doing, but they’re kind of messy. The Euclid one is just very nice.

[33:40] Tim: I think particularly people who have had a little discrete math in the past will really enjoy that one. I think it’s a fun way to remember some of that math. So I want to wrap up and let people know where they can find this book. You have self-published Is that correct?

[33:57] Joel: Yeah. So for now it’s on Leanpub. I couldn’t think of a publisher who publishes weird books like this. So, and also I was feeling lazy and it would be a lot of work to try and find a publisher and I don’t have the mental space to do that. So I just threw it up on Leanpub and people can buy it there if they want. So, but the URL that you can go to is just fizzbuzzbook.com. And that will take you to the book’s page.

[34:26] Tim: And that for now is just in ebook form?

[34:29] Joel: It is just in ebook form. I’ve thought about getting it printed and doing like CreateSpace on Amazon, but I haven’t pulled the trigger and I haven’t invested in that yet. Maybe once I get my taxes finished.

[34:45] Tim: I’ve been, I think, really glowing about this book this whole discussion and on Twitter, but I really do love this book. I didn’t get any kickbacks from Joel for reviewing it for him or promoting it for him, but this is one of the most delightful things I’ve read in a long time. And I thank you, Joel, for writing it, and I hope other people will read it.

[35:04] Joel: Yeah. Well, thanks for all your kind words. I’m glad you enjoyed it. Thanks for your help during the reviewing process. Many of your suggestions made the book a better book.

[35:14] Tim: Where can people find you?

[35:16] Joel: Again, the book is at fizzbuzzbook.com. You can find me on Twitter @joelgrus. That’s J-O-E-L-G-R-U-S. You can see my website at joelgrus.com. I have a blog that gets updated about once a year, and I just updated it about the FizzBuzz book, so it probably won’t be updated again for another year or so. And then I have my own podcast, which Tim has been a guest on multiple times, with Andrew Musselman called Adversarial Learning. You can find that at adversariallearning.com. As part of making this book, I’ve also been putting out a video per chapter called 10 Videos on FizzBuzz. You can find that from my Twitter or search YouTube for 10 Videos on FizzBuzz. They’re pretty good.

Someone who watched the first one told me they had no idea I was such a good actor because I play both the interviewer and the interviewee. And, you know, I asked my daughter, do they seem like different people in the video? And she said, yeah, they seem like different people. So, you know, that’s a— I don’t know that I’m a good actor, but I’m good enough that they seemed like different people. So that’s good.

[36:27] Tim: And I’m Tim Hopper. You can find me @tdhopper on Twitter or tdhopper.com. And I want to thank you all for listening to Into the Hopper Podcast, episode 2.

Feedback