For our holiday episode we’re joined by Tim Wood, founder and CTO of The Omni Group. Tim talks about serving as a resource, educator, and toolmaker for our dozen-ish engineers.
Tim also talks about Omni’s frameworks, saving the Mac world from Y2K, soccer fandom, and pottery.
You can find Tim on Twitter @tjw.
Note: we’re taking a little break after this episode. The next one is scheduled for January 9.
Happy holidays!
Some other people, places, and things mentioned:
- OmniOutliner
- OmniPlan
- OmniGraffle
- OmniFocus
- Ken Case
- Tim Ekl
- Jim Correia
- WebDAV
- Apache
- NSCountedSet
- Subversion
- CVS
- Y2K
- NeXTSTEP
- Git
- Jenkins
- ARC
- Daniel Jalkut
- Swift-Evolution
- The Record episode with Tim Wood
- Go
- Kotlin
- Rust
- Rose Orchard
- Chris Parrish
- Seattle Sounders
- Emerald City Supporters
- Craig Hockenberry
- Seward Park Clay Studio
- Lake Washington
- Gus Mueller
Brent Simmons: You're listening to The Omni Show. Get to know the people and stories behind The Omni Group's award-winning productivity apps for Mac and iOS. Music.
[MUSIC PLAYS]
Brent Simmons: I'm your host, Brent Simmons. This is our special holiday episode and we got you a gift. In the studio with me today is Tim Wood, CTO of The Omni Group. Tim is also one of the founders of The Omni Group. Say hello, Tim.
Tim Wood: Hello, Tim.
Brent: So Tim, what actually do you do here?
Tim: Well, I am the CTO, which means I head up all the engineering efforts that are going on for our Mac and iOS products.
Brent: I hear that Omni Group is 100% engineers, nothing else. Is that true?
Tim: Well, no, not really. We have a large department of support people, documentation, all sorts of other jobs in the company that are super important to keeping the products going and our customers supported.
Brent: About how many engineers do we have?
Tim: It depends upon if you count me and Ken; I think about a little over a dozen.
Brent: Oh, okay. That's roughly three people-ish per app. That's some pretty efficient engineering we've got going on here. How do we manage that?
Tim: Well, it doesn't divide up quite that evenly. Some products have more engineers than others but—
Brent: I assume that changes over time too, of course.
Tim: Sure. Yeah. A lot of it is we have really great people working here. We have frameworks that we have built up over decades now that we're able to leverage and take advantage of.
Brent: So the various apps then, obviously, must share a certain amount of code. What are some of those kinds of things?
Tim: Well, there's everything from our preferences, inspectors, basic things like XML parsing and parsing dates, and just a wide gamut of utilities that apps tend to need and...
Brent: As I recall, because I used to do some engineering here, I dimly remember. There are even some larger things. For instance, the outline view used in OmniOutliner is used also in OmniPlan?
Tim: Correct.
Brent: And is it used in Graffle at all?
Tim: It is not. It used to be used in OmniFocus, but now it's just Plan and Outliner.
Brent: All right. So that's a bit bigger even than in utility, right? That outline view is [crosstalk]
Tim: That's a large chunk of code, yes. Particularly for OmniOutliner, we have a motto of any piece of your app that is just core to it, you need to be able to fix bugs in it. So you know, Apple has an outline view and we do use that in a variety of places, but the outline view on Outliner is central to the app and we need to be able to customize it and fix every little detail.
Brent: This is the trade off of course, right?
Tim: Of course.
Brent: If you don't have the... if you just used NSOutlineView from Apple, you'd have that quick thing, hey, we've got an outline for you, didn't have to write it. You're not responsible for it either. But if you wanna be able to customize it, fix every single part of it, that's a whole lot of work.
Tim: Yeah, you're taking on the responsibility, but you get all the benefits of that as well.
Brent: How was the decision made, aside from that because that's an obvious case. If it's core to the app, it has to be in a framework. It has to be written by us. How is the decision made for other pieces of code, whether they end up in frameworks or app specific?
Tim: It varies. I mean, I think there's some pieces that it's fairly obvious that it's gonna be reused but it's really easy to jump the gun there and stick something in a framework and it never gets reused. We try to write things within the context of one application, not worry too much about making it completely general and then if the need arises, move it out to a framework and make it a little more configurable.
Brent: In general that's been a win? I do look to some parts where I'm like, "I see that there's a lot of configuration options." For instance, with the inspector framework.
Tim: Oh yeah. I know.
Brent: Because they are kind of different in each app?
Tim: Yeah, the inspector framework, some of that is... Over the years tastes have changed on how inspectors should work. They should be floating panels, they should be embedded, they should have tabs, they should stack up the different slices, and so over time that framework has evolved to handle all those different tastes and how interfaces should be laid out and it can end up where one of our apps has moved forward with adopting a new look and then the other one hasn't yet, and particularly in that framework I think we've got some work to do to clean out old ways of doing things.
Brent: But as always, that work has to be done carefully cause anytime you touch framework that every app [crosstalk]. Yeah there's always a chance for regression.
Tim: Right.
Brent: How do you balance that kind of, we need to move forward, we need to ship with maintaining this kind of code? Because say someone does that work? That doesn't necessarily make us money directly.
Tim: Yeah, it doesn't make us money directly, but it does mean that we have less friction going forward. So we try to... As a product approaches a release, it goes off on a branch and is a little more isolated from destabilizing changes.
Brent: So the branch, it branches all the frameworks that it uses at the same time?
Tim: Correct, yeah.
Brent: I see. Okay.
Tim: And then often after a major release is when we go back and say, okay, we... You know during the course of the major release we logged these bugs of things, technical debt, things that we wish we could have fixed in the frameworks that made it harder to get our work done, but we don't want to go breaking working code without having the time to find and fix as many regressions as possible.
Brent: Right.
Tim: So after a major release, there's often a period where we're doing some cleanup of things that can use it.
Brent: Does anyone know the frameworks as well as you do?
Tim: Uh, probably Ken.
Brent: Ken, yeah. Alright.
Tim: And certainly other people know parts of the frameworks better than I do. Like the syncing engine from OmniFocus was something that I did the first version of it a decade or more ago, I don't even remember. But now Tim Ekl and Jim Correia, I think, know that better than I do.
Brent: Oh, okay. And that particular bit of code is OmniFocus only, right?
Tim: Correct.
Brent: Because everything else is document based and that's —
Tim: Right.
Brent: Individual item based I guess. Right? So in the original version, was that also done over WebDAV with little files and baselining and stuff?
Tim: Yeah. At the time, I don't remember, let's see, it was called iDisk I think at the time. Apple had a WebDAV service that came with your iDisk or MobileMe or whatever it was called at the time, which made it really easy for users to get set up with that. Over the years that has gone away and so it's been more challenging for users to get a WebDAV server set up, which is part of the reason that we have our sync service.
Brent: Oh, okay. At the time that seemed like the smart way to go. Everyone has free WebDAV server. Why not?
Tim: Yeah, exactly.
Brent: I always find this interesting because I've done a fair amount of syncing work on things in the past, and the way I've always done it, there's some API up in the cloud that's connected to a SQL database of some kind and never in a million years would I have considered doing what you guys did, and yet somehow you made it work. Is there some kind of locking or something you can do with a WebDAV thing? Because I imagine different clients writing to the same essentially database in the cloud at the same time is a problem.
Tim: The WebDAV specification does have locking and a wide variety of other things that are sparsely implemented or not implemented at all.
Brent: Great.
Tim: Yeah, so our approach has been to use the bare minimum of WebDAV, just being able to PUT, GET, DELETE files, rename stuff and build a system that doesn't depend upon the full breadth of the WebDAV spec, because it... I don't even know that Apache implements everything and certainly iDisk at the time didn't implement all of WebDAV.
Brent: Okay. Well, I mean, WebDAV's fairly new. It's only been around 20 years or so.
Tim: Yeah, yeah.
Brent: We couldn't exist [crosstalk]
Tim: Just a baby.
Brent: Yeah, it's amazing though. I still just... I'm still just amazed that that works and not only that, it works so well. But it's perfect because people can set up their own WebDAV system and have their own syncing. Some people absolutely require that apparently so...
Tim: These days companies, they can set up a WebDAV server internally or a lot of NAS devices that people have in their homes have a built in WebDAV server.
Brent: Oh, okay. You read every commit message?
Tim: To varying levels of detail. I certainly scan—
Brent: It's not always a close reading.
Tim: Yeah, no I scan through them all and look through things that I know are likely to be problem areas in more detail, and you know...
Brent: I... And this goes back to frameworks too: When I was in engineering I would do something and occasionally get an email from you saying, “hey, you know, this is already in a framework.”
Tim: Yup.
Brent: I'm like, oh, really? Of course, I think to myself, I could have spent a whole lot of time looking through the frameworks to discover that somewhere or I could have just written it. So I just wrote it.
Tim: Yeah, I mean, sometimes if you're looking for an array category method, it's easy to go find that, you know where to look.
Brent: Sure. Right. It'll be one of two places maybe. Yeah.
Tim: But there are... There definitely are utilities that are more difficult to track down. That's one thing where I can spot. Oh hey, I see you're trying to accomplish some task, and I know that there's already a bit of work over here that you can take advantage of. Yeah.
Brent: A big part of your job is just that kind of being a resource, being an educational person, a teacher.
Tim: Yeah, exactly.
Brent: Tool. Yeah. Right. Remember another email I got from you once.
Tim: Uh oh.
Brent: I thought I knew Foundation super well, and then one day I implemented NSCountedSet. Not knowing that NSCountedSet existed. I was just blown away. NSCountedSet? I'd never, ever, ever run across that.
Tim: Yeah, there's a few things out in the frameworks that you don't use very often, but yeah, they're nice to have.
Brent: Yeah. Yeah. No kidding. So we had a bit of excitement. I think it was just as we were recording, it was just yesterday. As you're listening to it, it was two months ago because we are recording in October, but we hit commit number 320,000 in our Subversion repository and that commit was snagged by...
Tim: Tim Ekl.
Brent: Of course it was, because he has a thing about that. We suspect he has a script or something that—
Tim: It's a little suspicious.
Brent: Yeah, right. That's just weird. I mean he was even... I think he was home sick even and he still managed to do it. I don't know. That guy.
Tim: He did get a few a people pinging him from the office to let them know it was coming up.
Brent: No. Sure. Right. Of course. We all get very excited for him. Well, we won't let that happen again. Well, we probably will because we'll have no choice. Tim will outfox us one way or the other. So that 320,000 commits in a Subversion repository. That's going back a few years.
Tim: Yeah, it goes back before Subversion was the thing, our repository was imported from an ancient CVS repository from our consulting days, some 25-ish years ago,
Brent: Now I've heard it said that Omni single-handedly saved the world from the Y2K disaster. Was that true?
Tim: Sure. Yeah. Why not?
Brent: What did we do?
Tim: Well, one of the projects we worked on back in the consulting days was going through NeXTSTEP — that was owned by Apple at this point — and just looking through the source for potential Y2K issues. A lot of reading source and trying to reason about whether something was a problem or not.
Brent: In the end was there much that had to be changed?
Tim: I don't think there was much at all, yeah.
Brent: Yeah sure. Did NSDate exist? NSCalendar date maybe?
Tim: There certainly was a... Yeah, it was NSDate at that point. NSCaledarDate as well.
Brent: Yeah.
Tim: Yeah.
Brent: Which is now gone.
Tim: That's good.
Brent: Smartly though.
Tim: Yeah, that's fine.
Brent: We're okay with that. Yeah. So our Macs didn't blow up when the year 2000 hit, so...
Tim: I don't remember any real problems of note.
Brent: Everybody listening, you have Omni to thank for that, if you were a Mac user at the time. So Subversion, 320,000 commits, previously in CVS. Do we have any plans or thoughts about moving to Git because that is so much the standard these days.
Tim: Yeah, we occasionally look at it, and we've been looking at it again. One of the issues we have is just the magnitude of our repository has been a problem in the past, both the number of files, the large binary files—
Brent: And we have everything essentially— [crosstalk]
Tim: Right now it's all one big cluster [crosstalk]. So part of that, we're thinking about how can we split it up into smaller repositories? Do we want to preserve history going back 25 years? There's a whole laundry list of what things we need to consider, what things will change, and what things will get better.
Brent: Yeah, sure.
Tim: Certainly there'll be a ton of benefit by doing it, but...
Brent: Then there's the confusion, I suppose, of submodules and everybody would have to learn all this new stuff.
Tim: Yeah.
Brent: ...if we went down that route.
Tim: There's sub modules and sub trees and...
Brent: Yeah. I don't even know.
Tim: No. Tim Ekl knows which ones we're wanting to use.
Brent: All commits will be by Tim Ekl because he'll be the only one who understand the system.
Tim: You know there will be no round numbered commits then, so...
Brent: Oh, that's right. It's all those weird identifiers, right?
Tim: Yeah.
Brent: Boy, you think Tim would be against this.
Tim: I don't understand.
Brent: So you have to deal with infrastructure, build servers, that kind of thing.
Tim: Yeah, I tend to do most of the maintenance of our general build scripts. There's a whole bunch of other stuff that goes on for pushing a release, signing releases for TestFlight and Mac App Store and thankfully other people mostly can handle that, but we have a section in our server room which was full of Mac Pros that just sit there and do our builds. I tend to keep those running and on the versions of the OS that we need and our... I think our build automation stuff predates... certainly Xcode bots, whatever they're... Xcode Server bots—
Brent: Oh right, sure, yeah. Nothing I haven't used but...
Tim: Predates Jenkins and all that. So again, it's another one of these things where it does what we need. It isn't as general as it could be but...
Brent: It works. We have a... What's it called? OmniAutoBuild, which is a little app that monitors these yells at us when things don't build.
Tim: Right.
Brent: Yeah.
Tim: Turns red.
Brent: Now that I'm in marketing, I never launched that app, because it can't possibly be my fault.
Tim: No.
Brent: But in the past it certainly has been, any number of times. Remember I was doing ARC conversions on some frameworks used by OmniOutliner, and went through and did that and I was quite happy with it, and broke the OmniOutliner iOS build. And I think that was because, while I did the conversions for the Mac versions of the frameworks, I didn't set the right stuff for the iOS versions because it didn't occur to me or—
Tim: And Xcode’s not super helpful about noticing that you're converting a file to ARC, but that file is part of multiple targets and...
Brent: Right?
Tim: Yeah.
Brent: Yeah. So I definitely broke those builds. Anyway, that's my disgraceful past. Now I'm in marketing! We have a bunch of listener questions. You know, normally in the show at this point I'd say, "What'd you do before Omni? How'd you get here? Answered a Craigslist ad or whatever." But you were born here. So you're a founder. You started it because you wanted to do a company with your friends, essentially, right?
Tim: Yeah. Yeah.
Brent: Yeah, right. And then look what happened. All this.
Tim: Terrible.
Brent: Yeah. Listener questions, though. We have Daniel Jalkut, and he's curious about your involvement with the Swift evolution process. He wonders if you're still actively involved and how you feel about the direction Swift is heading in.
Tim: Well, I had one Swift proposal that I picked up just as a... I think it was marked as a beginner bug in their database, and sort of shepherded it through. It was a very small change and involved a lot of discussion, which I think is good, but it was really quite a bit of effort. My hat is off to the people that shepherd larger proposals through the evolution process.
Brent: Everybody has opinions. Everything needs discussion.
Tim: Yeah, yeah.
Brent: Yeah, sure.
Tim: These days my contributions are more in finding edge cases that confuse or crash the compiler, which for better or worse, I tend to have some facility at doing that.
Brent: Are these in a certain area?
Tim: Mostly they've been in OmniJS, our JavaScript automation framework for Mac and iOS apps, or recently in OmniFocus for the Web, the back end server for that. Both of those ended up using a fair bit of the generic support in Swift and all sorts of protocols and various arrangements that eventually produce interesting results.
Brent: So what do you think about the direction Swift in general? Are you pretty happy with the language? You like where it's going?
Tim: Yeah, in general, I'm pretty happy with it. It's like any tool. It's not perfect for every use. We still have a large code base of Objective-C and I'm always looking at new languages a little, looking aside at them thinking, huh, how's that going over there? But...
Brent: Last time I interviewed you for a podcast, which I have done before, me and Chris Parrish interviewed you for The Record. That was some years ago. I think Go was interesting you at the time.
Tim: Yeah, I did a little bit with that and we have a little bit of production Go code running all... Our push service from OmniFocus is written in Go and is working just fine. Written by Tim Ekl.
Brent: Now you're looking Kotlin? Rust?
Tim: Rust, I think is... It has a lot of things that are in the same spirit as Swift, but even more so. Really my looking at it is not super in-depth at this point because I have plenty to do, really.
Brent: Right, right. Of course. Daniel Jalkut also wonders, since we're moving into a Swift world, and we're doing less and less of Objective-C, well you're a person who's been writing Objective-C longer than most Objective-C developers, it's fair to say. Is it just a tool that's going away or do you feel some emotion about kind of slowly saying goodbye to this language that you've done so much in, and that has served you so well?
Tim: I'm not super sentimental about it, no.
Brent: Yeah.
Tim: I think it's more, thinking about how are we going to move forward if we want to move more code over to Swift or should we even... Code that works is... There's no given reason that it has to be moved to a new language.
Brent: Sure.
Tim: But there are sort of external realities, particularly for something like OmniFocus for the Web, where hosting the backend service would be a lot simpler if there were no Objective-C. So maybe that's worth considering, but that's a gigantic effort to undertake.
Brent: Yeah, yeah, for sure. Switching gears to something truly important, Rose Orchard asks, “What's your favorite lunch day at work?” Is it pancakes? Cause today we had pancakes.
Tim: Well, it's definitely Wednesday, which is usually breakfast for lunch. I think pancakes are good, but I think the egg sandwiches are probably my favorite.
Brent: Hmm. Egg sandwiches are good.
Tim: But you know, there's a lot of great meals here and it's kind of hard to choose.
Brent: Yesterday I was... I, myself, was very happy with the meatloaf and mashed potatoes. Oh my goodness.
Tim: Yeah. Oh yeah, that was nice.
Brent: The pancakes are my favorite day. Egg sandwiches, they're super good though. Thomas Kern asks, “How is Omni Group competing for developer talent against larger companies in the Seattle area?”
Tim: Right. I don't think we're directly competing. There's really a different experience that people have if they come work at a smaller company like The Omni Group, than they're going to have if they work at Facebook, or Google, or Amazon, or Adobe, or any of the other knowledge [crosstalk]
Brent: All of which we have here. Facebook's across the street and next door.
Tim: They're all within walking distance.
Brent: Yeah.
Tim: Adobe is a little further. A long walk.
Brent: Yeah.
Tim: You know, so to some extent we... It depends upon the kind of experience that the individuals want to have, right? And you know, that's up to them. I think one thing that is definitely changing is that Seattle is becoming a much more expensive place to live than it was even five or 10 years ago.
Brent: Right. Not much we can do about that.
Tim: Yeah. No, I mean, unless we hypothetically move outside of Seattle.
Brent: No, don't do it.
Tim: Yeah... there's trade offs there.
Brent: Yeah. So Chris Parrish asks, “Will the Sounders make it to the cup this year?” Of course, listeners, you're listening in December. It's only October 17th as we're recording. So this is all pure speculation.
Tim: Yeah, three years in a row. Wouldn't that be nice?
Brent: Yeah. What do you think? They gonna do it?
Tim: I think we'll know in December.
Brent: Chris also asks about the time you spent making the tifo displays with the Sounders supporters group. I don't know much about that. Tell me about — that's the Emerald City Supporters?
Tim: Yeah. Yeah, Emerald City Supporters is a independent supporters group of volunteers and then we do everything from the gigantic display, painted displays that you'll see in the end of the stadium, to the drums and flags throughout the match. We're down there, 90 minutes of jumping up and down, singing our hearts out, waving giant flags.
Brent: Cool. Do you think this helps pump up the players that the home team and...
Tim: Oh, absolutely.
Brent: Yeah.
Tim: Yeah.
Brent: That's cool.
Tim: We say that we sing for them and they fight for us and...
Brent: Nice. When did you get into soccer?
Tim: Well, it started with my kids starting to play soccer, really. They played rec soccer locally and we started occasionally going to Sounders games cause they were kind of interested, and then there are several people in the office here or who are... Were in ECS, Emerald City Supporters, before me, so I kind of got a little taste from them. Yeah.
Brent: That's cool. We're clearly going in random order with questions here, Justin Oaks asks, “What is the role of a CTO in a company where the entire business is technology?”
Tim: Well, it turns out there's quite a bit of our business that is not developers. There's a large group of support people that talk to people on the phones and Twitter and email, and they're super friendly and knowledgeable and help keep our customers supported. There's people that write documentation, and of course there's all the user experience, design, and people in marketing.
Brent: Yay, me! Testers. Yeah.
Tim: Huge.
Brent: Front office folks.
Tim: Yeah.
Brent: People that make our fabulous lunches.
Tim: Yes.
Brent: Turns out there's a lot. Yeah. Last question, Craig Hockenberry asks about your pottery and how that fits into your life.
Tim: Well, let's see, I think about 18 or 19 years ago, it was now, that my wife and I started taking pottery classes down at Seward Park Art Studio at the south end of Lake Washington.
Brent: The big one.
Tim: The big one. Yes. Now this was before we had kids, so it was easy to go out on weekday nights and do some pottery, but since then it's a little harder or certainly when the kids were younger it was harder to get out. So, oh, maybe 10 or 12 years ago we turned our garage into a pottery studio.
Brent: Cool.
Tim: And it's super nice to have something where you're not... You're a little more freeform. You're a little more open to whatever accidents happen. It happened and that's tactile and more experiment-ery tree and just different from what happens at the day job.
Brent: Yeah, right. All different from looking at pixels on a screen.
Tim: Yeah.
Brent: Yeah, so do you give your stuff away? You selling your stuff?
Tim: Right now it's mostly, I either make stuff knowing where it's going to go because otherwise, yeah, it does pile up in the garage. What am I going to do with this?
Brent: There's gotta be a limit. You'd have to buy a new garage or something.
Tim: So a couple of years ago, I made some yarn bowls for the people at Omni that knit and...
Brent: Oh cool.
Tim: Yeah, there's quite a few people here that knit. And then I've been doing some larger planters for home, and those are great because usually they crack and don't work out and then that's not a problem with where to store them.
Brent: Sounds like a lot of fun. Do you have to have a kiln? Is that the word? Like a really hot oven or something?
Tim: Yeah.
Brent: I don't know much about pottery.
Tim: Yeah, we have an electric kiln, which it goes up to 24 or 150 Fahrenheit and thereabouts.
Brent: If Gus Mueller were here he'd say, "You could make a pizza in that really fast." Have you tried that?
Tim: You would have to be extremely careful. It might be raw on the inside and black on the outside.
Brent: Black on the outside, yeah. Alright.
Tim: But yeah, no, I wouldn't recommend cooking food in it because it's...
Brent: Cause it's a kiln. It's not enough.
Tim: Well, it's had pottery glaze it and there may be a little residual copper that you don't want on your pizza.
Brent: I'm going to go with yeah, I don't want that on my pizza.
Tim: No you don't.
Brent: I like pepperoni. I don't like copper.
Tim: Yeah.
Brent: That's cool. Your house has been through some remodeling recently. Have you been able to keep up the pottery or is it in a little slowed down during that?
Tim: Well, most recently, yeah, the garage has been full of furniture and boxes. It's pretty well cleared out now. Hopefully by the time you hear this episode I'll be back out there and...
Brent: Back.
Tim: Yeah.
Brent: What's the verb? Pottering? You'll be pottery-ing.
Tim: Sure.
Brent: I don't know.
Tim: We do most stuff on a wheel so, throwing pots.
Brent: Alright, well cool. I think we'll stop at pottery. Thanks Tim. How can people find you on the web?
Tim: Thank you. I am @TJW on the Twitters.
Brent: I'd also like to thank our intrepid producer, Mark Boszko. Say hello, Mark.
Mark Boszko: Hello, Mark.
Brent: And I wanna wish everybody a happy holidays. We'll be back January 9th. We're gonna take a little break at the end of this month. And I wanna thank you for listening. Thank you. Music.
[MUSIC PLAYS]