143 iPS Clang Format (Linters) with Travis Jeffery

00:00 0:34:00
Download MP3

01:04 - Travis Jeffery Introduction

01:36 - Clang-format, Clang-Tidy

02:00 - What is a linter?

02:40 - Uses

05:49 - Lining Up Method Perimeters

07:00 - Configuration

07:52 - Integration

08:50 - ClangFormat-Xcode

09:22 - Apple Support for ClangFormat

11:00 - Support for Swift

11:41 - Getting Started

14:13 - Code Style

19:21 - Continuous Integration Workflow

20:48 - Clang-Tidy (Cont’d)

Extra Resources

objClean (Andrew)Swift-Clean (Andrew)Friction Between Programming Professionals and Beginners (Andrew) Help people that are new (Andrew)Hopper (Jaim)Zen and the Art of Motorcycle Maintenance: An Inquiry Into Values by Robert M. Pirsig (Travis)Stash (Travis)A Guide to the Good Life: The Ancient Art of Stoic Joy by William B. Irving (Travis)

Transcript

**[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 iOS developers, providing them with salary and equity upfront. The average iOS developer gets an average of 5-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 a 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 iPhreaks link, you’ll get a $4,000 bonus instead. Finally, if you're not looking for a job but know someone who is, you can refer them on Hired and get a $1,337 bonus as thanks after the job. Go sign up at Hired.com/iphreaks]****JAIM: Hey everybody and welcome to episode 143 of the iPhreaks Show. Today on our panel we have Andrew Madsen. ANDREW: Hello from Salt Lake City. JAIM: My name is Jaim Zuber. I’m not from Salt Lake City. Not yet. Not yet; I’m coming. So here on our show we’ve got Travis Jeffrey. Please tell us a little bit about yourself. TRAVIS: Hi there. I’m flying up from Toronto, Canada so it’s probably cold up there than it is for everyone and I will not be going to Salt Lake City. I work on my own startup right now called Stash which is a personal finance tool. Previously, I worked at company called Segment which is an analytics and customer data hub. Start up and before that I worked at Basecamp, working on their mobile stuff. So yeah. JAIM: Cool. You came on today to talk us about Clang-Format. TRAVIS: Yeah. So, probably talk about two tools— Clang-Format and Clang-Tidy. Clang-format is a formatter. Basically it manipulates wide space. Then, Clang-Tidy is a linter but it can also automatically make the fixes for you as well in some cases. JAIM: For those who don’t know, can you explain what a linter is? TRAVIS: So, linter is basically going to check your code for various things like – for instance, you could check if you’re using modern four loops or if you’re using say, in C++, if you’re using auto or using modern tools. Basically it’s going to checking your code and getting information on that code. Then, in some cases it will also be able to fix those changes automatically for you. ANDREW: So it goes beyond just whether you’re using the right brace style and more like can do some deeper code style analysis? TRAVIS: That’s right. ANDREW: So tell us a little bit about what you’re using these for or why you know about them. TRAVIS: So I’m primarily using Clang-Format since Clang-Tidy is specifically for C++ at least currently and I don’t write too much C++. Well, Clang-Format, it’s really great because first of it supports various languages. It supports C++ and Objective-C and Java Script and Java and Oracle buffers. At this point, I think that’s all them right now. It’s really great for not wasting time talking about maintaining a consistent style— you can just define a style that you want. It supports a lot of options so you can say, “I want the lines to be like 79’s characters.” Or “After a function name, I want a space between the function name and the parenthesis.” Then you can just run Clang-Format on your code and it’s done. You don’t have to mention and code review or anything like that. You just run it. It’s not an issue anymore. I first heard about it at— when someone brought it up on Twitter. They’re like, “Oh someone should write an Xcode plug in for this.” Then I was like, “Oh I’ll do that.” So that’s how I first heard about it and how I first started working with it was when I wrote an X-code plug in for it. JAIM: Okay. So Clang-format itself is used as a command line tool. You pass in a file; it does its things, fixes it or tells you what’s wrong. How does it mark up? Does change it or does it markup things that are not quite right? TRAVIS: Nope. So Clang-Format would just change it for you. Basically you input code and it will output code and that’s it. JAIM: Okay. You’ve sufficiently removed one of the most important times in a software development cycle is fighting over the code formatting, the code style. TRAVIS: Yeah. Exactly. It’s pretty awesome. We just wait so much. Everyone thinks and wants their code to be a beautiful snow flake. But it’s not always the case and we spend a lot of time on it. You just don’t have to think about it anymore. It’s truly nice. At least, maybe we can make a code beautiful on other ways but just not with wide space. JAIM: So you’re using this for Objective-C? TRAVIS: Yeah. JAIM: Okay. How does it work overall? Is it pretty seamless? TRAVIS: It’s pretty nice. It’s pretty seamless. How well it works depends on the language I find. C++ is definitely the strongest because that’s what the clang team is using day-to-day. So obviously there’s a catch on it. They’re going to make that support the best. Objective-C support is pretty good; could be better. It’s not as good as C++ but it’s usable. JAIM:**Okay. Most formatting tools, if you’re doing things like space before a [inaudible] bracket or that’s type thing can do it pretty well. It’s pretty basic, pretty close to what we’re doing like what we’re doing within C code. People have been doing this for decades. Problems I’ve seen with Objective-C code is when we get it around to like block formatting. If you want to line up the message parameters on different line to have the colons line up; does it do that stuff for you?**TRAVIS: Yup. That works. JAIM: Okay. So it comes up real nice. What are the options for that? For lining up the method parameters? TRAVIS: There’s quite a few. There’s— I don’t know how many —that may probably be around 40 or so. There’s things like space before params. There’s things like indent with. One nice thing also as well is rather than having to find each option or having to go through and to find your whole style, initially, you can base your style out of existing styles. For instance, there’s the LLVM style or the WebKit style and you could say— you could just do one-line configuration that says, “Make my style this thing, this LLVM.” Then your code will format to the LLVM. Then you could work of that. Then you can say, “Well the LLVM uses two spaces and I want to use four spaces,” so then you just have to add. Now you have two lines. So that’s nice and— so there are things like Objective-C block indent with Objective-C’s based after property, point or alignment. Each of these had – sometimes has their own option as well like whether the pointer should be to the left or whether to be in the right or whether to be in the middle. JAIM: Okay. How do you do the configuration? Is that a text file? TRAVIS: Yes. So there’s a .Clang-Format file and then typically since this is— you would configure your style per project, you would have this file at the rigid of your project. So it’s basically the same as where your .kit director would be. You just put a long there and that would be that. If you wanted it to have the same style for all your projects, then you could put it on your home directory and then since Clang-Format’s going to go up the hierarchy of your directory until it hit the home directory and then found that file. It’s nice if you’re working on a bunch of different projects on your own. JAIM: Okay that’s cool. Does it have the same conventions that you do with Git? You got your own configuration that you can get highly specific ones to— TRAVIS: Yep. Exactly! Yeah. JAIM: How do you typically integrate this into your work flow? This type of thing is more important when you’re working with a team. So— TRAVIS: Yeah. JAIM: —Yeah you’re arguing but how do you typically work as— make it work—. TRAVIS: So for me— so for me, I typically use my Xcode plugin that I wrote. The way I have it set up is that whenever I hit command S or save the file, then, it will automatically run Clang-Format and format the file. Then I can see what it looks format right there. There’s basically two different ways. There’s— you typically either use editor immigration. There’s a support for EMax, DAM and Sublime and so forth. You typically either use it— your editor like you bind it to a key or something like that or to hook. The other alternative is that you could run it in GitHub whenever you can make your code. Then just have Clang-Format automatically format everything. So, those are basically the two main ways that I’d say. JAIM: Okay. You’ve mentioned your Xcode plugin. What’s the name of that? TRAVIS: It’s not very creative. Its ClangFormat-Xcode is what it is. If you go to github.com/travisjeffrey, that’s Jeffrey, /clangformat— one word— -Xcode. That’s what it is. JAIM: Okay. From this you can install it yourself? TRAVIS: Yep. JAIM: And just bind it to a key? TRAVIS: Yep. There’s an enable format on save option. JAIM: Okay. ANDREW: So I was reading through the documentation for Clang-Format and there’s some mention in there of different integrations or different apps and they talked about using it with Vim and even with BBEdit which I thought was interesting. Then— I guess it support ford is built into Visual Studio. I couldn’t quite tell what they meant there but anyway Visual Studio support it. It surprised me because clang, being Apple led, it’s an open source project and it’s used fairly widely now but it primarily driven by Apple still. TRAVIS: Definitely overall, Clang-Format specifically, I know one of the main guys is a guy from google. There are a couple of guys from Google that are working on the clang tools so I think, maybe that’s one of the reasons. JAIM: Ah okay. So my question was going to be why is there not— other than your plugin which is cool. It surprised— it was going to surprise me that Apple has not just added support for it to Xcode because it seems— TRAVIS:**Yeah. I’ve always wondered that. It’s funny cause the last time that Apple interviewed me, I was a [inaudible] work in there. One of the engineering managers, he saw Clang-Format and that’s why talk to me. I basically asked them the whole time, “Why didn’t you guys build this yourself?” Or “Why didn’t you have this API so it’d make this easier?” But yeah, it’s funny. Yeah, it definitely should be in Xcode. I think that’s why it’s so [inaudible]. I’ve got over 2,000 stars on this. I think the reason for that is just because it just makes total sense that it should be a built-in thing.**ANDREW: Well the next obvious thing though is that it doesn’t seem like there’s any support for Swift. TRAVIS: Right. Nope, not yet. We’ll see. I don’t know. ANDREW: Do you know if anyone’s working on that? TRAVIS: I don’t think they are. Now a lot of people make issues on ClangFormat-Xcode, my plugin about that. So basically for those who decline mailing list and so far not having gotten too big of a response or any indication that things are changing. Like I said, I think part of the reason for that is that the main guys working on this are at Google. So they’re not working with Swift and Apple. So I think that’s part of the reason why. JAIM: So if you wanted to get hacking away and try to get Swift working on like this, how do you proceed? TRAVIS: If you wanted hack on ClangFormat-Xcode? JAIM: Yeah. If you want— no, if you wanted to get Clang-Format to work with Swift, how would you—? TRAVIS:**So you pull down the clang repo. They have a section in tools in there. So the way it works is it basically uses clang’s lexer. It would really be difficult. I think also part of their – huge reason why is that clang’s lexer is built for C-like languages. That’s why I think the other reason why Swift support is uncommon is because that would be really difficult. That’s why the existing languages are C-like, like Java and Java Script. So yeah, you pull down the repo. There’s basically only one interface function in the repo which is this refactor. You can also make a library that uses— it’s called libformat. It is the library part of Clang-Format. Yeah so pull down the clang repo. I think the mailing list is fairly responsive and fairly open to patches, then you would send your patch into the clang dev mailing list and [inaudible], accept it.**ANDREW: Are you going to do it, Jaim? JAIM: Just up for a little project if I move to Salt Lake City. ANDREW: Well maybe we could work on it together when you move here. JAIM: That’d be cool. Yeah. Really how deep it be gone into the Clang-Format code. If you were doing it in C++ do you have some—? TRAVIS: Yeah. Sorry, go ahead. JAIM: Oh yeah. Is there some other compiler meta data you have to deal with to figure out if you’re dealing with a method or a bracket or whatever? TRAVIS: Yes. So it’s all in C++. Basically you’re using a lexer so you get information of what statements you’re looking at or what kind of token you’re looking at. So it’s lexer that’s what you would use. You don’t have access to the whole AST with Clang-Format. JAIM: What is an AST? TRAVIS: The alpha x syntax tree. I— it might use the syntax tree for certain cases where the parts that does not work. I’m not too sure. I know for the most part they just use clang lexer though. JAIM: Okay. Well that’s not cool stuff but it’s a great tool for Objective-C. ANDREW: I’d like to get in maybe a little bit into the topic of code style in general. For people who are new that are listening to this, I think we probably have some people listening to this that have no idea what we’re talking about when we say we’re – Clang-Format is probably about enforcing the code style. Then there are those of us who know exactly what you mean. It’s a really contentious topic but can you just talk a little bit about what code style is and why anybody cares? TRAVIS: So code style— so we can write code and code style is how much wide space you use, like how many spaces you’ve put between things, whether you use underscores. I think it’s just the overall look of your code. But yeah, but I would say the overall look— how you write things, whether – let’s say I have a variable name that is more than one word— do you use underscores to make that readable or do you use camel cases or do you uppercase characters for different words? How long are lines? A bunch of different factors like that. ANDREW: I think it’s interesting because there are points of code style that are obvious like at work we have a code style document. Some of it is— makes sense like name your methods with descriptive names that describe what they do; don’t use abbreviations unless they’re really well understood, that kind of thing. And that makes sense to make your code readable and easy for somebody new to jumping to and figure out. But then some stuff which probably inspires way more heated argument is, should an opening brace be on the same line of the same statement or the next line? Does that really matter? People get along fine with both styles. TRAVIS: Yeah exactly. ANDREW: But—. TRAVIS: Yeah exactly. Sorry. Go ahead. ANDREW: But so I don’t know. I guess for me, though, consistency is important so just to— It doesn’t really matter— I don’t think it really matters whether you put braces on the same line or a new line, whichever you’re used to. But it is helpful when everybody on the team does the same thing. So the code base is not this ugly mishmash of different styles. It’s jarring to go between them. TRAVIS: Yeah exactly. JAIM: So to clarify, if it’s all compiled down to executable, why does it matter about style? Maybe we can talk a little bit more about that. TRAVIS: Number one, I think, is to keep it readable. I guess that would be the biggest thing— I think —is just keep it readable. Don’t let things get too crazy with style that it comes unreadable and can’t understand it, I guess. Also if you’re going between— for instance, let’s say you work on a project with multiple people and you’re going to one part of the code base and it looks one way. Then you go to another part of the code base and you’re like, “Holly molly I— this is totally different,” and there’s almost a context which so not having to deal with that is I think one reason why people set out style guides in companies. JAIM: Yeah. I think that’s a very important point. So maybe if two file and two different standards, now you’re creating a third file; you’re thinking about what standard you’re going to use and not just writing the code. Your brain is going, “Oh wait I do this or should I do that or just keep doing it?” That takes up your attention which you could be using for more important things like designing your code. Even though it seems like something you could just wave away, “Code style, who cares?” It’s compiled anyway. The computer doesn’t care. Codes just meant for humans to read and if thinking about stupid things while you’re trying to write code, you’re wasting your energy. It is important. TRAVIS: Yup. JAIM: To get everyone on the team on the same page and just write your code. You write it. You don’t think about it and save your mental energy for the things that matter. TRAVIS: Yeah. That’s what I really like about these tools— Clang-Format and if you write Go in a Go community, everyone basically uses this tool called Go format. So all Go code looks the same, basically. It’s awesome. You don’t have to spend any time with it. Once you start using a format, you get past caring about it really quickly because you realize the benefits of not thinking about it at all. Not spending any time on it at all. It’s just let someone else do it; just let the computer automate it. Don’t worry about it. JAIM: Yeah and even if you don’t have an automatic tool, you’re doing the stuff and code reviews or pull request like “Oh, wide space here shouldn’t be.” TRAVIS: Yeah. JAIM: That’s a waste. TRAVIS: Yeah. JAIM: So it’s valuable to do it but if you have something automated to do it, that’s much better. TRAVIS: Yeah. It needs— and also these formatters, you don’t have to communicate the style really. Since you could just run the program someone could write in their own beautiful style if they want it. And then – but in the end, it’s going to get formatted automatically by one of these tools. It’s a really nice thing. JAIM: Yeah, and if you keep writing the tool, you automatically get what the style should be. TRAVIS: Yeah. JAIM: Just going to go for it. TRAVIS: Yup. ANDREW: Are you— sorry if we’ve already mentioned this and I forgot —but are you or is anyone you know using Clang-Format for as part of their continuous integration workflow? For example, like if a full request is submitted on GitHub, it’s automatically run through the formatter key. They check for violations and automatically fixed them. I’m not really sure but does anyone do that that you know of? TRAVIS: Yeah. I’ve definitely seen people mentioned that in different places. So yes, there are definitely people doing that. ANDREW: That would be nice to get that set up for some of my projects. JAIM: So how does that work? So if you have it— if you’re running this on your local machine, you can put it in a Git hook or something that just runs it before you do a command— okay that makes sense— so you can do a key binding on your IDE— okay that makes sense— how does this work for your CI system? Do you run it to a check? Does it end up as a separate commit in Git because you push code, their format becomes something else? Do you do a rebase and squash it down – how are people doing this? TRAVIS: It would depend on the company and their project I suppose. It all depends on what they want to do, I suppose. I don’t know if there is one way that everyone’s following but—. JAIM: But it would be a typical one. If there’s one way to do it, what would be the default? TRAVIS:**I’d probably say just put it in different commits so every [inaudible] run Clang-Format on it, make that into a new commit. Then, that’s it.**ANDREW: Okay. We’ve mentioned just at the very beginning but then I haven’t talked about it too much but there’s also Clang-Tidy and you talked about how’s that a linter and seems it can do a little bit more than Clang-Format. Can you talk a little more about that? Then I’m curious if your using that. If that would be something that your plugin supports. TRAVIS: Right. So Clang-Tidy— so it’s a —so Clang-Format is only for manipulating wide space and Clang-Tidy is for manipulating the code. It only supports C++ right now so I’m not using it all that often because I don’t write C++ very often. What it is is basically, instead of style options you have matches. So you can say, if you’re using an old— the old style of four loops that you could change those to the C11 style code and Clang-Tidy could also automatically fix those for you. They have quite a few matches. I think there are 60 of them or checks, I guess. Checks and matches, they call them. ANDREW: Do you create the style configuration for Clang-Tidy in a fairly similar way or— how do you that? Is it a similar file to the way Clang-Format works? TRAVIS: Yes. So you can dump the config to a file and, yeah, it reads it in a similar way. Yup. ANDREW: But seems the fact that it’s C++ only is maybe makes it not so attractive for the people who listen to iPhreaks. TRAVIS: Yeah, exactly. That’s why I don’t use it day-to-day. If you really, some – it would be possible to extend it to Objective-C. Again, this thing was like the people that wrote this, they’ve mostly use C++. So, it was— they don’t have this much motivation to support Objective-C. It’s not too difficult to write your own matchers. They have a really nice tool for building your own matchers— and your own —and the matchers that can fix your code. They have this really nice tool called clang-query which allows you to interactively build matchers. So if someone from the Objective-C community was interested, they could look into that and that’d be very, very cool. JAIM: Do you know of any alternatives to Clang-Tidy and Clang-Format that work with—well for Clang-Tidy or with Objective-C or anything like this for Swift? TRAVIS: Not that I know of. I think Apple’s building some of these tools into Xcode. They’ve built something like, for instance, when there’s the “modernized your Objective-C code”, there was that feature. I think they sometimes build that stuff right into Xcode. I don’t know if Clang-Tidy will eventually support it. I’m not sure. JAIM: Coming in Xcode 10. TRAVIS: That would be nice. ANDREW: Well yeah, I’ll interested to see. I do think that with Swift maybe, there’s a little bit more of – maybe I’m wrong but it seems to me there is— because everybody is just starting out writing it in Xcode and Xcode almost gives you a default style just by the way it auto-completes things and creates the outlet creation feature. There’s maybe a little more consistent style between Swift programmers than there was with Objective-C were everybody came into it in different times and using different tools. Even XCode’s default for Objective-C have changed over the years. But I don’t know if that’s true or not but it seems— perhaps because of that —the need for this kind of tool for Swift is a little bit less. TRAVIS: Yeah. I could see that being the case. I think another thing that why Objective-C style can vary so much is also that you have people that come they look at the language in different ways. Some people look at it as a C and so they’ll write Objective-C like C or—and there are other people that look at it as its own language. Maybe they’ll — because there’s people that come from C and they’ll use underscores for instance. Then there are other people that come from different background, then they’ll use camel cases for instance. So yeah I could definitely see that being inaccurate. ANDREW: I think you’re right. But of course underscores are wrong and camel cases, right? TRAVIS: Exactly. Yup. ANDREW: I wonder if there’s anything that about Clang-Format or Clang-Tidy or similar tools or code style that you think we should cover that we have not covered. TRAVIS: Not really. I guess if people are interested, I guess the only one that I can think of is people working with go-lang then they could check out go format. That’s the other one I could think. ANDREW: What if people want— what if people listening want to start using Clang-Format and just jump in and learn about it, use it for themselves? Where can they go? TRAVIS:**So you could go to the LLVM build site. They have a package on there that includes the Clang-Format binary so you could start there if you wanted. Or you could, using Xcode, you can just download that on my plug in and that would be almost easier. So yeah, [inaudible] plugin and then run the code.**JAIM: I shall note from the— from your page, it’s also available by Alcatraz which is Xcode package manager. TRAVIS: Yup. JAIM: Which I’ve used. TRAVIS: Yup. JAIM: Very simple to download. ANDREW: Maybe that should be the pick. I use Alcatraz and like it. I know Apple doesn’t like it but I do. TRAVIS: Yeah. Well Apple’s getting better and maybe they’ll lend Alcatraz or something someday. That would be asking a lot but –. ANDREW: It would considering that they put in that dialog that comes up every time you update Xcode, “Hey do you want to load this unexpected code bundle?” Obviously their ways of saying ‘get rid of these’. JAIM:**Yeah, it’s good stuff. I wish I was doing more Objective-C. I don’t wish that but I wish I have a tool like Clang-Format and doing mostly Swift. But yes, it’s definitely nice. It would clear some headaches that even if you had a team with, that realize code, [inaudible] important, still you forget things and you have to go through to your code views and pull request. Doing that just takes time but it’s cool.**ANDREW: I’m writing mostly Swift now, too, but I have a pretty big project that’s all in Objective-C that is almost ten years old and has some varying quality of code style and just different styles throughout the code base. It would be nice to clean that up and in unified? So I think I’m going to look into it using Clang-Format to deal with that. JAIM: Nice just right through. TRAVIS: Good stuff. JAIM: Okay. Let’s get the picks. Andrew, what do you have for us? ANDREW: See, I have a few picks today. My first pick is actually quite along the lines of what we’ve talked about but I have an acquaintance here locally that wrote an app called objClean that I think some people have seen. It’s a Mac app that does the same thing as Clang-Format but it’s for Objective-C. And it’s cool because he has a website where you can basically ask him a bunch of questions like a survey and how about your code style and at the end, it spits out a configuration file. So that’s cool but my real pick is he has recently released a new version for Swift called Swift-Clean. It is this kind of solution for Swift. It’s a Mac app, same kind of thing with the survey and you can run your code base through it; have it apply your code style; and I think he’s also got a command line tool so you can integrate with your Xcode build process. So that’s Swift-Clean. My next pick is— well, it’s a two-part pick. It’s an article that I read today called Friction Between Programming Professionals and Beginners. This is a— it’s about some of the problems that beginners encounter when they’re asking questions. When they’re first learning, they’re asking questions particularly on Stack Overflow. I think people can relate to the idea that when you’re a beginner you, often you ask a question and particularly on Stack Overflow, there could be a problem with people immediately filing on you and voting to close your question or commenting on it and basically saying, “Read the documentation,” and just some answers that are not that helpful. But then on the flip side, as a professional or experienced programmer, you know that it could be annoying to see the same beginner-question over and over where they haven’t given you enough information to really answer their question or you can tell that they’re doing the wrong road and they don’t even know it. Anyway, this article is about the both sides of the coin there but I think the overall message is that beginners can do some things to make their questions better and professionals can do some things to be more helpful, more kind and more welcoming to beginners. Along with that, I guess my pick is to take time to help people that are new and to be more understanding. And to remember that when you were new, stuff that seem really trivial to you now was really complicated, so try to put yourself in their shoes. Those are my picks. JAIM:**Very cool. I’m going to have one pick. I don’t think it’s a very novel pick. I think Apple actually featured this app but Hopper app which lets you scan a rate of dates for a flight and pick a good rate. I live in Minneapolis and my sister and her family live in Charleston and it’s really a pain to get there. There’s no direct flights. And tickets are usually 5-600 bucks depending on when you want to go. But I work for myself so I have so much flexibility so if I want to visit, I would always find myself on whatever travel sites, randomly clicking dates around until I find a [inaudible] rate. But with Hopper app, you actually go down and it’ll give you a range of dates and give you the dates that can get a cheap rate. So probably I pay about 4-500 dollars for a ticket to Charleston, but I get a ticket for 200 jut by checking out and leaving on certain days. So I’m pretty happy with the app. It’s well designed. So check our Hopper app.**TRAVIS: That app is really awesome. I’ve actually used it on preparing for a vacation to Japan. Basically, I put in the date that I wanted to go that’s far in the future and it’ll tell you whenever tickets become cheaper. It’ll send you a notification. So if you just thinking about going to some place far in the future, you could put that into the app and it will tell you whenever tickets are on sale or cheaper. So it’s pretty awesome. JAIM: Yeah. It’s a cool feature. It will also tell you these prices may go down or this prices will definitely go up for the next two weeks. So you can buy it now or wait on it. TRAVIS: Yup. JAIM: Plus one. That’s my pick. Travis what are your picks? TRAVIS: So first pick is going to this book called Zen and the Art of Motorcycle Maintenance. It’s this book by this guy named Robert M. Pirsig. It’s a philosophical book. It’s this father and his son go on a motorcycle trip across the states. He started talks about his philosophy and reconciling scientific and artistic ways of thinking and answer the question, “What is quality?” It’s a really awesome book. I basically thought about it almost every day since I’ve read about it like a decade ago. Then, my second pick is the personal finance tool on making called Stash. You can check that already at stash.cool. It will help you see where your money is going, compare how much and where you spend different time periods. So you can see and change, compare and repeat to improve your spending habits. My last pick is another book called A Guide to the Good Life: The Ancient Art of Stoic Joy. This is another philosophical book. It talks about stoicism, which is this philosophy that came about during the Romans. It’s a really— I don’t know — it’s just a great book and dealing with difficult challenges and keeping a good outlook on life. For instance, one thing they talk about is whenever you run up with a challenge, just think about what’s the first thing that could happen. Then once you think about that, you realize that the worst thing is not all that bad so you shouldn’t worry about it. There’s a lot of good stuff there and a lot of good stuff for planning to your life. JAIM:Very cool. Thanks for the picks. Travis, it was great to have you on. We learned a lot about Clang-Format and all that [inaudible] stuff.TRAVIS: Thank you for having me. ANDREW: Thanks Travis. [Hosting and bandwidth provided by the Blue Box Group. Check them out at BlueBox.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]

Sign up for the Newsletter

Join our newsletter and get updates in your inbox. We won’t spam you and we respect your privacy.