Author Archives: Ulrich Scheller

Interviewing software engineers

Category : Android

Interviewing basics

When interviewing software engineers, you typically want to answer one simple question: Will they be a good fit for my team? Therefore, your interviewing process should focus on answering this question. Obviously both sides try to answer the same question and so you also want to sell yourself as a great place to work.

Over the last years I was interviewing a lot of software engineers, mostly Android developers, for different positions. At first I always introduce myself and the company, explaining what we do and why it would be great to work with us. HR managers often like to ask the candidate why he or she applied to our company. I try to avoid these type of questions. If you are neither Google, nor Facebook nor Apple, chances are candidates didn’t choose you because of your great products, the famous community relations or because they love to work on the cutting edge. What you should do is to talk about their CV and let them explain some topics in detail.

Let them code

The most important part of an interview is a live coding session. Many engineers don’t like being tasked with a coding challenge. I even had Freelancers refusing to work on it. While I understand the negative bias, in my opinion it is still the best way to evaluate candidates. Interviewing is hard and hiring the wrong people is fatal to your business.

The result of any interview heavily depends on personal taste. and sympathy. This is especially true when you are looking for a skill set you are not 100% familiar with. Engineers with deep knowledge like to see multiple problems in every situation. Others might not know the same limits. This is called the Dunning-Kruger effect.

To prevent this from happening, you have to see applicants do what they are supposed to do: Let them write code. Now at least you have something to compare, not only how many buzz words they have memorized. Keep in mind, you will never be sure to have a top performer just by interviewing. But you can consistently wipe out everyone who just can’t code. Depending on how hard your tasks are and where you set your bar, you will also wipe out applicants who are nervous, get confused with your task or just have a bad day. This is not good. But it is still better than hiring the wrong people.

To reduce applicants nervousness at the beginning, I try to let them feel at home as much as possible. They can use their own laptop, their own IDE and language. And of course I will offer my cooperation in solving the task, by answering questions and telling when they are going the wrong direction.

You will be surprised by how much more you can see than just the resulting source code. It starts with the approach they take. Do they have an idea of the algorithm before starting? Do they ask clarifying questions? Then there is the coding itself. Will they use the IDE like Notepad or do they navigate the code quickly using all famous shortcuts? How to they verify and test their program? All this is more important than the actual solution.

Preparation

Most important part of the preparation is to understand how hard your task is. Only then can you evaluate others based on it. That means you (or one of your engineers) have to solve it in exactly the same setup and time.

A great source of tasks is ProjectEuler. It starts with FizzBuzz and gets slightly more complicated over time. Another great collection of interviewing tasks with solutions is rosettacode. It is tempting to use challenges from there, but don’t forget to solve them before reading the solution.

Final words

Finding the right engineers  for your team is hard. It is tempting to cut corners when you have to staff your team quickly. However, hiring the wrong person is much worse. Not only will you pay for an unproductive developer, but you can severely damage the productivity of others. Talking about NNPP. You could part ways with a non performer after a few months, but at that point it becomes much harder. He or she might have become good friends with the rest of the team including yourself. Firing someone has a great impact on the team morale and you should really limit it to exceptional cases.

On the other hand, if you feel confident about a candidate, then make it your first priority to close the deal. Send updates about everything, telling when to expect the next step. It is not hard to stand out from other companies (at least where I come from) nowadays. A positive feedback goes a long way for making someone want to work for you.


Write a great LinkedIn recommendation in less than a minute

Category : career

Can you give me a LinkedIn recommendation please?

If you ever had to write a recommendation for a colleague or friend, you also know how hard it is to write a positive, well formed description of that person. If you are like me, you will scratch your head for a long time before something useful manifests in form of a few sentences. Unlike a job reference, LinkedIn recommendations are still more personal and less standardized.

For writing a great recommendation though, it helps a lot to have a pre-defined structure. This way you only need to edit the specifics of your relationship. A great structure with several examples is described in this article.

Start with a knockout line to grab the reader’s attention. Then shortly describe the relationship you have. Next step is to describe a standout trait, something exceptional that the person stands for. Then you should give the recommendation a touch of personality and end with a solid recommendation.

This structure already helps, because you can be sure to cover every important aspect in your LinkedIn recommendation. However, it is still a lot of work to write it all down. I take the concept one step further, so you only need to fill in a few data fields and can quickly put together your favorite recommendation.

If you have a good sentence in mind, that you would like to see in a recommendation for yourself, just leave a comment below. I will add it to the tool so it improves over time.

Recommendation Tool

Simply fill in the values below and select sentences that best fit your relationship. The resulting text for copy & pasting will appear at the end.

Don’t forget making at least a sanity check before submitting such a recommendation. Does the text make sense? Did someone else already use the exact same words for his recommendation? Can you add a real personal sentence somewhere? Something that wouldn’t fit into a generic structure like this one.

I hope this tool will encourage you to post and receive more LinkedIn recommendations, whenever you would truly recommend someone. A recommendation should be something rare and valuable, though. So always re-read them before posting and make sure they are on spot and for the right person.

Name:

Gender:

Company:

Role:

Working together for:

Knockout Line

Relationship

Standout Trait

Personality Touch

Solid Recommendation

Your recommendation:

Few people have the opportunity to report to a manager who is also a coach and mentor – but I did when I worked for Ulrich. I had the pleasure to work with Ulrich for three years when he worked for me as Head of Mobile Development Android. He is always a very good communicator, also when the pressure is rising, calling for clear communication about goals, responsibility, performance, expectations and feedback for every member involved in the project he’s managing. No matter how tense a meeting, Ulrich made sure everyone left with a smile. It was a pleasure working with Ulrich and I would enjoy working with him again.



Career changes ahead

Category : career

It is an exciting time, as I have been quitting my high-rank day job for pursuing a different way of working. I am currently preparing self-employment, which should start around july.

Not everyone, certainly not my boss, understood why I am choosing this path. During the last months at 1&1 I was responsible for two teams with 20 developers in Munich and Bukarest. Since starting there, we have created some of the most successful mobile applications for the german market. I had a lot of great colleagues and also friends at work. Why did I look for something new? There were some good reasons for me:

  • The salary did not reflect this and there was no way around it because of company policy.
  • While being responsible for all these people and projects, I was not empowered to decide anything. Even small technical decisions had to be signed off by multiple committees, gatekeepers or just molesters in the company.
  • My career had peaked at the company. There was realistically no other role to move into or further climb the corporate ladder.
  • Losing my personal time, especially for Paragliding, because of important projects, meetings, etc…

Overall, the career was a pretty good one, but also very limited. This might be adorable again, when I have kids and other priorities in my life. At this moment, I feel the need to take on more risk in exchange for better opportunities.

Working self-employed is something I always wanted to do, but have set back because my career as an employee went too well and was a good time so far. While there are obviously more risks and not everyone likes this style of working, I hope it is the right thing for me. What I specifically hope for is:

  • More freedom to organize work and play time, as well as choosing tools and projects.
  • Getting paid better.
  • Getting to know many more companies and people. A 3 Month inhouse project is worth much more than a great interview, because people will perfectly know how you work.
  • Becoming more diversified skills and not depend only on a single company/boss.
  • Be closer to the business side of software development. When you are self employed, it is much simpler to start a project and try to monetize it, because you already have the legal setup.

Let’s see how it works out 🙂

 

 


Google Play Optimization for Android developers

Category : Android

Currently, I am preparing a presentation about optimizing apps for the Google Play Store. It is an interesting topic and still in its early stages. Unlike SEO for websites, it doesn’t seem to be affected by some page-rank algorithm. Instead the main focus is on keywords and, of course, the ratings of an application.

There is a series of articles about all the optimization topics on droid-blog.net. I highly recommend reading them.

The strong keyword-dependency sometimes leads to unexpected search results. My game laska, for example, is the online strategy game champion (of the world):


Multiple targets from one Android source (the better way)

Category : Android , java

Some of you might have read my article Android: Deploying multiple targets from one project. It describes how to create customized versions of the same software and therefore benefit from multiple apps with the same featureset. That deployment with an Ant script has proven to work well. For example our GMX Mail App is available in four different customizations, for different brands, and uses a similar approach with maven.

However, there is a better way now to handle multiple targets. It is less complex and gives you even more options to customize the different targets. By using an Android Library Project, you still have the benefit of sharing resources and code, without the hacky Ant script. Remember, the Ant script would go through every Java source file and change an import statement, just to resolve the different package name of the R File. Switching between Targets required an Ant build with a refresh of the workspace. Not any more. Now switching between projects is as simple as clicking the run button in Eclipse. Especially for bigger projects this is a huge benefit, because refreshing the workspace can take quite some time.

So what is the new setup? You need to create one base project, with everything common inside, and declare it as an Android Library Project. This option is available under project properties in the Android tab. Then you create the first one of your targets as a different Android Project in Eclipse. On the same properties tab of the new project, you add the base project as a library. Repeat it for another project, which will be your second target. Now you will have somthing similar to this:

For the showcase, I deleted all source files of the custom projects. Since we want to re-use the majority of our sourcecode from the base project, we don’t need any custom-sources right now. There is one little fix we need to apply to the AndroidManifest.xml file. The Android Wizard in Eclipse uses relative references to our Activities. This does not work if we want to use our Activity from the base project, because it uses a different package than our custom project. Therefore, we have to specify the full package name to the specific Activity. In my sample the important part looks like this:

That’s it. You can now overwrite all your base resources and source files in the custom projects. Every new feature developed in the base project is immediately available everywhere. Only if there is a need for updating the AndroidManifest, you have to edit it in all custom projects. But this also means you have a fine grained control over the manifest file.

I updated my old example project on Google Code. Feel free to use it as a start for your own project with multiple targets. Feedback and contributions are always welcome.


Key learnings from analytics

Category : Android

Enough time has passed since I put Google Analytics into my Android game Laska. It has been collecting statistics for nearly a month now. Therefore, I want to share some data and show the key learnings I got out of it.

The majority of my users are from China and Poland

This was quite unexpected for me. The game is pretty german. It is even named after Emmanuel Lasker, the famous chess player. However, Germany is responsible for only a very small part of the visits. It is interesting for future localizations, because a mandarin translation might make a lot more sense than a german one.

There is always more to track

I started off with only tracking the in-app pages and a variable for won/lost games. But with this new information, there is already the next pending question. How many games were played at the easy level? How many at hard? What is the percentage of won games on hard? There is always more to measure and I will implement it in future versions of the game.

Devices used

The Samsung Galaxy S and HTC Wildfire are responsible for nearly half the usage. The most common display size is 480 x 800 with 42% of the visits, followed by 240 x 320 with nearly 30%. I did not expect the small display devices to have such a big share of the visits. One reason might be, that users in China and Poland are more likely to use lower end android devices than in the US or Germany.

 


Start measuring

Category : Android

I have been missing one important part of improving my software for a long time. But after starting my new job at 1&1 in Munich, I was reminded of how important it is.

always measure

Whatever you are trying to build is probably been used by an audience of users. Especially in the mobile sector, most of the software is built for a mass market. Therefore, good quality of an app is a requirement (but not a guarantee) for success. And for improving your software, you want to know which parts users are really using.

Does anyone care about the help document? How many percent of users ever opened it? How much time did they spend reading it? Where are your users from? It is possible to get some information out of Appstore/Market statistics, but only plain download numbers.

If you think measuring only makes sense for high traffic websites, consider this: I am using Google Analytics at this website for some time now. It tracks the location of every user and shows them in a world map. This is accurate enough to show the city of every visitor. With the relatively low number of users, I can have a pretty good guess which citizen of Tartu would visit my homepage. Or if any possible new employer checked out my homepage before the interview. You will find plenty of other interesting questions that can be answered by those numbers.

So head over to the Google Analytics for Mobile website, see how easy it is to integrate into your app and start measuring right away.

 


Something is happening on the protocol front

Category : networking

For many years the basic layers of network communication have been unquestioned. TCP and HTTP are doing a solid job of delivering static and dynamic content to our browsers. But in some aspects those protocols could do a better job. Especially the TCP Slow Start is noticeable to end users and many big IT companies are cheating on this parameter. In the past, when bandwidth has been scarce, the slow start had less impact on network performance than today. Now, latency becomes the critical parameter, because it makes out for a more and more important part of the delay. Just to give a rough estimate:

The speed of light is 299.792.458 m/s, or around 299.792 km/s. Now let’s assume our webserver is located in California, while the client is from Germany. This is a distance of nearly 10.000 km or a round-trip of 20.000 km. For such a distance, the light could only travel 299.792 / 20.000 = ~ 15 times per second, therefore a round trip takes 67 ms. As long as we can not send data faster than the speed of light, this is our theoretical minimum. A Three Way Handshake can’t be made in less than 100 ms. A brief explanation of this latency problem can be found in the article More Bandwidth Doesn’t Matter (much).

There is a new experimental protocol named SPDY (SPeeDY) trying to get more speed out of HTTP. It is based on some very interesting ideas. Concurrent HTTP connections can be bundled into one SPDY connection, the server is able to notify a client via push and HTTP headers are automatically compressed. On a sidenode, all the traffic is encrypted by SSL. The project overview explains in more detail, how it works and gives some test results.

While SPDY definitely improves the current state, it will not be easy to push a new protocol into the market. The question is, will these improvements just be a bit faster or will they enable a new class of web applications?


Gain productivity by scripting your workflow

Category : shell script

One thing that helps me a lot during my everyday routine is having shortcuts for every simple action I perform. For example

  • uninstalling a specific Android app
  • opening the current XCode project
  • opening a ‘tail -f’ on the logfile of our server

can be reached with two mouseclicks from the dock. Some of those are nothing more than a copy and paste shortcut, the others are one line of shell script. There is really no magic inside, every decent developer should be able to do that. However, at my current workplace, out of ~20 developers, I have never seen anybody creating his own. So take this article as a reminder for reviewing your daily routine and automate the most mundane tasks.

Because creating shortcuts is too easy and doesn’t deserve a howto, I will focus on scripting actions on a remote server. Be sure to use private/public key authentication, so there is no need for typing passwords 20 times a day. This doesn’t require a Unix-style operating system, it is also possible with the Putty Tools on Windows. With that, you can execute remote scripts on a server.

My most often used script looks like this:

ssh root@myserver.com

Which gives me a logged-in terminal at this server when executed. It is also very helpful to access logfiles with just one click. Just append the remote command to the commandline:

ssh tomcat@myserver.com "tail -f /opt/apache-tomcat-6.0.20/logs/catalina.out -n 1000"

That prints the last 1000 lines of the logfile and keeps appending more lines. You might think of many more useful cases already. For example, restarting a server process, watching the network traffic with ngrep or printing the server load. You can also put these scripts into version control and use them with a team of developers.

Scripts like that saved me a lot of time already, and only take a few minutes to set up. And the much more important benefit is, that I use the available information much more often. If it takes 3 seconds to open the logfile, I will look into it even for small problems. But if it takes 30 seconds of a mundane and repetitive workflow…

 


Android AppRater

Category : Android , java

The Android AppRater is a little tool in form of a source code snippet for getting better ratings in the Android Market. Its basic idea is to kindly ask users to rate your application, after they have been using it for a while. Which is a fair deal, because many users only give negative ratings right before uninstalling an application. This way, you only ask those users that are actively using your application.

For my own Android game Laska (light-version) the AppRater is not yet integrated in the current Market version. But it will be part of the next update. The dialog will only be shown if the app is installed for more than three days and has been launched at least seven times. And if you dismiss the dialog, it will not pop up again. This is what it looks like:

Of course, if the application is a piece of crap, this doesn’t help in any way. But for all other apps, it might be worth the effort.


Recent Posts

Tweets