Andreas & Florian on Gutefrage
Have a question? If you live in Germany, Gutefrage will help you find the answer. Gutefrage is a wildly successful crowdsourcing tool that enables users to easily ask any question and get an answer from the community. What began as a popular website has expanded into a robust application. We spoke to Product Owner Andreas Schürings and Software Engineer Florian Krüger to find out more about the platform and the app.
Tim Anglade, VP of Product at Realm: First, let’s talk about the application. “Gutefrage” means good question, basically. Is that correct?
Andreas Schürings: Yes, that’s correct.
Tim: The concept of it was amazing to me when I heard about it. It’s a place for people to ask general questions and get advice from people. It’s like Stack Overflow but for everything, not just technical topics. Maybe you can talk a bit more about the product.
Here in Germany, it’s the biggest advice community. There is no competitor in the German space, in Austria or in Switzerland.
Tim: I was looking through your website and through the app, and it seems like your focus is on daily life, like your health, advice for purchases or for car maintenance, stuff like that. I think it’s really useful that you have this general consumer focus, whereas a lot of sites like Quora are more professional- or hobby-based.
How long has the website been around?
Andreas: The website was launched in 2006 and now we have about 2 million community users. They’re all registered. In our iOS app, there are about 70,000 users overall. We get 3,000 unique users per day. At the moment we’re being featured by Apple, so we have 6,000 daily users.
The iOS app was launched in January of last year, and we released version 2.0 at the beginning of December.
Tim: Are both of you iOS developers, or what’s your background?
Andreas: I am the product owner and I am not an iOS developer, but I try it every day. I can make text changes. [Laughter]
Tim: That’s more than most product owners I’ve worked with can do. You’re the iOS dev, Florian?
Florian Krüger: Yes, I am the iOS dev.
Tim: How did you all first start looking at building this iOS application? Obviously you’ve been this very successful website for a long time. At what point did you start looking at building an iOS app, and how did you think about building this iOS application?
Florian: The plan was to build an iOS app in the summer of 2013. I wasn’t around at this point in time. We started really developing and publishing the app around December of 2013.
Tim: That’s a pretty short timeline. You said you launched the first version in January, and if you just started in December with the holidays and everything, that’s impressive. How did you go so fast on the first version?
Florian: The first version didn’t have all the features you see now. We had the streams and the text, the expert topics, stuff like that, but no profiles.
Andreas: You could only ask and answer questions, perhaps with an image. That’s a core function of Gutefrage, and currently our Android app, like the first iOS version, has exactly these core features.
Tim: You’ve obviously been making a lot of changes. You said you’re just shipping the 2.0 version now. What features did you add?
Florian: After we launched, we listened to the community to find out what features users wanted the most. There were a lot of features on the website that we could have been adding, but we didn’t know which were the most important ones. We developed the app very closely with the community up until the summer, when we started to rethink the whole design and got in touch with Apple. At this point, we made the decision to create the 2.0 version, which is the version you see now in the App Store with the new flat design, the new navigation, and much more.
Tim: I really love the design. I was reading through some of the reviews. My favorite review was a five-star review saying, “This app has become ugly. It used to be better.” I was like, “It looks pretty good to me. I don’t know why you’re leaving five stars if you think the app is ugly.” [Laughter]
What else has changed with the app? You started building this new version from scratch, and obviously you threw Realm in the mix at some point, but have you done anything else outside of going towards flat design and adding Realm?
Florian: We added the “like” notifications. In all 1.x versions we only had the Apple push notifications. We added WebSockets so we could very quickly add more and more notifications to the app and build the notification center. Our users had requested access to older notifications sent several days earlier, like you get in Facebook.
Tim: I can definitely see people wanting to be notified very quickly when they receive an answer to their question or other answers to something they answered, and that generating a lot of activity. The entire concept seems like it would be really addictive, actually.
So you have your own WebSocket server running server-side, and you receive it with a regular WebSocket library from iOS?
Florian: Yes. SocketRocket, I think.
Tim: Is there anything else you’ve had a chance to add in the last 6 to 12 months?
Florian: Yes, the profiles where users can put up a photo and see their data from the website. There’s no way to edit this at the moment, but we’re planning to add this feature at some point. You can now access your own content grouped into questions/answers and most helpful answers. And you can access all the content from other users from their profile. That was a big feature the users requested. They can go from a question that a user posted to his profile, and from there to the content from the user, because they want to check the user’s background before they answer their questions.
Tim: Lots of good stuff. Let’s talk a little bit about Realm. You added that for 2.0, correct?
Tim: What do you use Realm for right now?
Florian: In the 1.x versions, we didn’t have any persistence at all; it was online only. It is still somewhat online only, but we had the problem where every time a user accessed his topics, for example, we requested them from the server when the app was restarting. At first the user came to an empty screen. Same for the profile.
When we thought about how to optimize that, we thought about persisting this information.
I just heard about Realm, and thought this was a good chance to use it; I’ve had very bad experiences with Core Data.
We threw it in and it worked great. Basically, we use it as kind of a cache. There’s nothing in there right now in the 2.0 version that we can’t request from the server at some point. So if the database gets lost, the only thing that happens is the user has to wait for their content a little bit longer. It gives the app a very nice flow. You don’t have to wait for your topics; you can just access them.
Tim: We see that use case pop up a lot of the time, where people are trying to enhance the experience. It’s not even so much about being able to use it offline or anything like that; it’s just you get to have much smoother navigation, much better interaction for the user, and you get to keep people inside the application for a longer period of time because the app feels nicer.
How complicated was it to integrate Realm into the application?
Florian: At first I just threw it in and persisted the objects that I got from the server as they were, which was not a big deal. It’s basically just copying and pasting the example code from the documentation and changing the fields.
Where it really got interesting was when the user adds and removes topics, for example, from their list. The list reflects the Realm database state and not the server state. So when you’re adding a topic to your list, it’s actually adding it to the Realm database, and there’s a notification listener now that pushes this change to the server, and the other way around if you deleted the topic. There are two notification listeners: one is on the table that displaced the topics and one is on the client side that pushes and pulls the changes from the server.
Tim: How do you keep that in sync? Do you just go over REST API, or does it also go over WebSockets? What do you do for the server-side aspect of it?
Florian: That’s the REST API. We request all the topics when the user accesses their list first, and we sync it with the database, and all changes from there on are as described. The user adds topics to the database, the database listener now pushes these changes, and so forth.
Tim: Were there any particular aspects of Realm that you really enjoyed?
Florian: It’s really lightweight when you add it to your project. You don’t have these big models and stuff and have to drag around something in a graphical editor just to access your model. It’s basically just classes, and we could reuse all the models we had for the client. So there wasn’t really the necessity to create new models or create something else. It was always there; we just needed to implement the syncing functionality and fill the table from the database and not from the response we got from the server.
Tim: Was there anything you didn’t like? Any bugs you hit or things you really wished we would look at next?
Florian: Not really bugs. We had some crashes because of missing migrations. But that’s something you get at some point when you’re adding a persistent layer to your application because all the data that we have, as I said, is just a cache basically. So we added a crash functionality. We use Crashlytics, and if we get a crash reported from the app and the app comes up next time, then we wipe all the caches. The Realms that we’re using for storing the information from the server are completely wiped to prevent these migration errors.
Tim: I see. We didn’t really optimize for pure caches, but in your case it makes a lot of sense to look for that and not worry about it. I think there are some ways you can go around that in the migration just by deleting the file within the migration handler. That could probably solve your troubles.
Florian: We didn’t really want to delete the files every time we migrate. We have migrations; these migrations are working. We have some users who have some state of the databases that don’t fit the migrations, obviously.
Tim: I see what you mean. Usually it depends on how you design the migration sequence and definitely you can find yourself in a situation where you left holes in terms of the migration definition. That can happen. I’d be interested in getting your feedback on that, actually, to see how we can make that feature better. I know we tried to design something that would be sensible and would be better than Core Data’s migration, for example. But we may still have some improvements that we can do to the feature.
Florian: Yeah, we’re interested in the results as well. We’re still waiting for the update to go live that includes this crash reporting stuff, so we’re curious about this as well.
Tim: Cool, I will let you know how it goes. We definitely want to help.
Are there any plans to make Gutefrage available in new countries or new languages besides German?
Andreas: Currently no, but it’s possible we may go to other languages.
Tim: Can you talk a little bit about upcoming features or things you’re going to be doing with the application?
Andreas: In the new version, 2.2, there are bookmarks so you can save a question you’re interested in to a special list and watch when you are interested in it. That’s a beta feature only for iOS. The feature is using Realm as well. If this feature is used, we would build a service so the user can access the bookmarks on the Web, Android, and iOS.
Tim: Cool. I hope that it keeps getting the great reviews it’s gotten so far. I am really excited about it. I didn’t know anything about this community, and I don’t know why this doesn’t exist for a bunch of different countries and languages already because it seems like a really cool concept. Thanks for taking the time to chat. Good luck with everything.
Andreas: Thank you very much.
Florian: Thank you.