Saturday, December 13, 2014

The Secrets to App Success on Google Play

Not long ago I got an email from Google Play with a great pdf file that I want to share with you today. Quoting the forementioned email, the attached document is "a guide to features and best practices that will help you grow a successful app business".

You can find the guide here.

What's inside?

  • Motivations for publishing on Google Play.
  • Technical advice on how to set up an account and publish apps.
  • Information on how to test, release, update, debug, track, and optimize apps.
  • (Material) Design hints and quality guidelines for phones, tablets, TVs, and wearables.
  • Clues on how to win more users and then keep them.
  • Advice concerning ads and in-app payments.
  • Instructions on how to measure things that matter.
  • Tips for publishing in various parts of the world.

In other words, it's a must-read for any Android developer, no matter where they decide to publish their apps. Go find out yourself.

Saturday, November 29, 2014

Toptal hasn't worked out for me (yet)

Let me tell you a story about how I got a great job... but not really.

It all started in July 2014, when I stumbled upon Toptal. In a nutshell, it's a premium freelancing portal which connects programmers with software projects. The big difference from other similar sites is that they don't admit just anyone. They have a 4-step recruitment process for developers and claim that only 3% of the people interviewed get admitted to work with them.

Disappointed by my previous experiences with freelancing portals, I decided to give Toptal a shot. I was hoping that they were able to address the biggest problems with finding contract work, i.e. people spamming offers without even reading the project's description, cheap coders from Asia breaking the market by working for $2/hour, and bad projects' descriptions not letting you assess the amount of work properly. This way my interview process started.

As I mentioned before, it consisted of 4 steps and took me more than a month to complete (partly because I went on vacation in the meantime). First, they give you a Codility test to solve. Then, if you do well enough, there's a technical interview during which they ask you about your work experience and test your English fluency as well as video and sound quality (you must be able to communicate with future clients without problems). After that comes another coding session - this time it's done live with a Toptal recruiter watching you write via shared screen. You have to have a microphone on as well to make sure that someone is not helping you with the solution. The final part is a mini 2-week project that you have to make. I can't reveal all the details, but it's basically a web/mobile app (you can pick whichever suits you better) that lets users log in and store some data in the cloud using asynchronous calls and REST. I used Parse for the backend and I have to say that it's a great tool. I chose it over Firebase which has been bought by Google recently and is probably a good alternative.

After my mini project had been accepted, I finally got admitted to the portal. I signed a contract and set my availability to 20h/week, because I was hoping to work on my own apps at the same time. I found a couple interesting projects, for which I immediately applied. They were pretty well described and seemed to be offered by people who knew what they were doing.

After several days and no reply whatsoever I began to worry. I noticed that full time projects were greyed out for me, because of my availability settings, so I changed it to 40h/week and applied for more jobs that I could possibly do. A couple of days later - still no answer.

Imagine my surprise, when finally someone from Toptal messaged me on Skype and asked me directly about two projects (some older ones that I hadn't applied for). I happily answered that I was ready to do anything they wanted me to.

Unfortunately, after the Skype conversation I didn't get any follow-up messages or project invites. Did they forget about me? Or maybe the process of connecting tasks with coders was so time-consuming that they didn't have enough man power to handle it. I'll probably never know.

All in all, having just moved to another country and not having too much savings, I was forced to look for a normal job, which I found (but that's a separate story). I also had to reduce my Toptal availability to 10h/week, so my chances of receiving a serious project are rather small now. Anyway, I'll keep trying and we'll see how it goes.

Tuesday, November 11, 2014

Fruit Worm Bubble

I promised you to reveal some details about the game I'm working on. Well, here they are.

It's called Fruit Worm Bubble (but you might have guessed that already) and it's a bubble shooting game. I'm not writing it from scratch, but rather finishing up the details left over by the previous developer. I agreed to do it because I really wanted to try libGDX and more serious game development in general. I have to say I've been having a blast so far, even though some of my expectations didn't really work out that well. But we'll get to that later...

To give you a better idea of the game, I should mention some of its features:

  • very nice graphics
  • two game modes - story and arcade
  • five distinct bonuses helping you beat the game
  • in-game store which allows you to buy additional items
  • customization options available after beating all levels

For people who like visual stuff - just take a look at the artwork to get a better grasp of what I'm talking about.

What I like about Fruit Worm Bubble is its playability. I rarely download similar games and if I do, I get bored with them rather fast. This time, however, I have to say that I was catching myself playing for much longer than it was necessary to just test the new things that I had added. The gameplay is very dynamic and addictive. The nice backgrounds, animations, and well-matched music help with the general impression as well.

Unfortunately, there are also elements I don't like so much. The biggest one is probably loading screens. They appear almost every time you move between views and they stay visible until you tap the screen.
I also had some problems understanding at first what the bonuses were for but I guess it might be part of the design.
Finally, I was under the impression that both story and arcade modes were quite similar to each other and should have been made more distinct.
All in all, the game is still quite fun and I'm pretty sure that future releases (possibly done by me as well) will get rid of the nuisances.

As to my unfulfilled expectations, I was hoping to learn more of libGDX, when as a matter of fact, I'm using mostly custom classes created by the previous developer. Does it mean that the library itself was lacking them? I'm not sure, but I'm inclined to think that at least some of the code is trying to reinvent the wheel.

What I did learn was the project's general structure and some game development stuff I hadn't had a chance to use before - tweening, advanced texture packing, resource loading/unloading mechanisms, porting to different platforms, etc. In fact, the ability to compile and run the game on my PC was a great thing that I didn't value enough before. Not only did the game launch waaay faster, but also it let me set custom window sizes and take screenshots more easily. As far as I know, they used the desktop version to record in-game videos as well.

To sum up, you can expect Fruit Worm Bubble to be published in December or January. I'll surely brag about it some more, so you don't have to worry about missing the big event. The game will have banner and interstitial ads in it, as well as take advantage of in-app purchases. I'm not sure if using those two monetizing techniques together is such a great idea, but we'll find out soon enough. To be honest, I'm really curious how well the game will do. The idea isn't new, neither is the gameplay very complicated... If only I had someone helping me with the graphics, I could surely create something like this from scratch (not necessarily of the same genre)... Perhaps it's time to start a new project :P

Saturday, October 18, 2014

Introduction to Game Design on edX

Hi guys! I just wanted to let you know that I'll be taking part in the Introduction to Game Design course on edX. It's going to be my first course on this platform and I'm excited to find out if it's as good as Coursera. If you feel like keeping me company, go ahead and sign up as well. It starts in four days and it's free, unless you want an official certificate.

By the way, I got to know about the course via the Indie Game Developers group on Facebook. Besides a handful of promotional materials that people publish there, you can also find plenty of interesting news. For example this video on how Rayman Legends is made.

This week I'll try to reveal to you some of the details of the game I'm working on for a local app company, so stay tuned. It's a casual bubble game and it uses libGDX. I'm not writing it from scratch, but rather finishing up the details, but still I'm quite enjoying the process.

Sunday, September 28, 2014

Making Money with Apps - e-book review

I've read the Making Money with Apps e-book recently (twice actually) and I would like to share my impressions with you. You might already know the author - Jörg Winterstein - from my previous interview that I did a year ago. Jörg, also known as Eiswuxe, is a very successful German indie game developer with almost a decade of professional experience, great blog called My-Indie-Story and an impressive portfolio of apps. I was extremely excited when he agreed to give me the book to review for free (usual price is $29.99). I hope I can help you decide if it can be a valuable read for you as well.

More about the author

Jörg used to work for a video game company and then decided to start his own business with a bunch of friends. Unfortunately, they went bankrupt when their financial backer stopped the cash-flow. After that, he carried on to create games by himself, to finally succeed and make a living from it (and even doubling his previous income). According to his reports he makes around $10k a month now.

What I liked about his story is that even if he failed first and kept working hard in order to reach his goals. Also, he didn't just get lucky with one app - he has a couple of them that are different from one another, but still make a lot of money.

What is the e-book (not) about

If you're looking for a programming tutorial - it's not a book for you. It doesn't tell you almost anything about the technical side of creating apps or games. Instead, it gives you useful tools and frameworks that Jörg uses/used to use, explains why he took certain decisions, giving you precise numbers and statistics, and basically leads you through the lifecycle of an app from choosing an idea to publishing and marketing it.

Here's a list of subjects that you may find in the book:

  • tools for coding, graphics, sounds, music, and other content
  • comparison and comments on several game engines and game programming languages
  • thorough explanation of mobile ads - their formats, ad networks, statistics, house ads and expected revenue - all with real-life examples
  • paid apps and in-app-purchases - how to set your price and perhaps even double your previous income, comparison to free apps with ads
  • app marketing - choosing an idea, naming, icon design, review sites, keywords, facebook advertising, forums, etc.
  • getting good ratings
  • Google Play vs. Apple App Store vs. other stores
  • testing - how to make sure your app does not contain bugs or design errors
  • alternative places to publish your apps
  • tracking the apps' usage and performance
  • taxes
  • tons of other tips - most of them from hands-on experience

Strong and weak points

The book contains a lot of invaluable information for indie developers on any level, no matter if they are just starting out or trying to improve their income. Some of the tips can save you a lot of time and money by helping you make a decision like whether to use facebook advertising or how to determine the price of an app. Making Money with Apps basically describes step-by-step how an app/game is made, distributed and marketed with real-life examples and numbers which give them credibility.

The thing I didn't like was that most of the statistics are becoming outdated - dating back to 2012. I know it's only two years, but a lot has changed since then. Jörg told me he is planning on doing a general update, so it should be fixed in the near future.

In some sections I also had a feeling that Eiswuxe tried to explain even the most basic notions (like what CPM is), not knowing exactly what his target audience was. It can be a good thing if you're a total beginner, but it might be boring for more advanced people (even though there are parts definitely more suitable for them as well).


I believe that Making Money with Apps e-book deserves a 4.5/5 score and perhaps even 5 when the statistics and general structure get updated (hopefully really soon). It gives you the insight of a game-programming veteran and definitely helps you be more successful with your apps. I was somewhat unsure about the price - $29.99, but after reading it I think it's definitely worth it. There's also a three-day-long money back guarantee, so if you don't like it, you can just get refunded. I strongly advise you to give it a try. I'll be glad to hear your opinion on it as well.

Sunday, September 21, 2014

Buying and Selling apps on CodeCanyon

A couple of months ago I found out about Fiverr and I decided to try it out. I published a gig offering to help people add ads to their Android apps. It wasn't very successful - I basically just got one person buy it. However, our cooperation didn't end with just ads. He asked me later to reskin a soundboard app he had bought on CodeCanyon for $15. I took a closer look at the portal because I was amazed at how cheaply you could get good quality code to learn from and reuse. Recently, I decided to run a full-fledged research and find out if CodeCanyon could be profitable for sellers as well. Here's how I did it and what I discovered.

Research details

In order to gather the data about mobile apps, I wrote a simple web crawler in Python. It went through all four categories - Android, iOS, Native Web, and Titanium, extracting interesting pieces of information about each app. After the script's work was done, it saved the collected data in a csv file, which I subsequently imported into a Google Docs spreadsheet. From there I extracted the statistics that seemed the most useful to me - how expensive the apps are on average, how much developers earn, which categories and platforms are the most popular, etc.

Results summary

There is almost a thousand mobile apps - most of them for iOS, but a lot for Android as well. They range from $5 to around $50 and the average price is only $15. It's insane that you can buy a fully-functional game or application for such a low price.

There are almost 50k apps sold worth more than 800k dollars. Again iOS is leading in the ranking, but Android is not that far behind it. Web and Titanium apps are far less popular, but still not insignificant.

The most popular apps have sold a good couple hundred copies worth around $10k earned. The best of them sell more than a hundred times a month, bringing their authors up to $2k monthly revenue.

On average, however, apps sell in around ten copies and earn between $100 to $200 a month and $1k in total (most app are quite new though). This is still not bad, taking into account the potential revenue you could have with those apps.

Among the most popular Android apps there are:
The Restaurant App - 463 copies sold
Android Flat UI Template - 418 copies sold
Kids Memory Game With Admob - 366 copies sold
Recipies App - 335 copies sold

Judging by the ratings, the majority of apps seem to be of high quality. Each gets rated by around 10 people and the scores are mostly favorable.

There's also extensive feedback from buyers - some discussions exceeding 400 posts. On average, however, there are 30 comments on each app, which gives you a good idea about other people's doubts and the author's responsiveness.

Categories Summary

I wanted to see which app categories were the most popular and profitable. Here's the result of my research.

Android Categories
iOS Categories

Web Categories

Titanium Categories

Full Applications

Full Applications
Frameworks and Libraries

Full Applications

Full Applications

As expected, people want to buy full applications and games which are ready to reskin and reuse. Some templates and utilities are popular as well, but usually bring less profit. For more details, take a look at the tables above.


CodeCanyon seems to be a great place to both buy and sell apps. It's affordable for buyers, but still lets you make a significant amount of money if you want to publish your own code there. Note that the extended license (the one letting people sell the app) costs five times more than the regular one. I didn't take it into account in my research, because there was no information about the percentage of people purchasing it. It might influence your earnings significantly though.

In the future I might experiment with CodeCanyon some more. I have a nice idea for a simple but interesting app related to Facebook. Perhaps I will try to see if other people would want to use it as well...

P.S. Sorry for not posting anything for so long. I was moving between countries - from Italy to Poland. There has been some exciting stuff happening in the meantime and I'd like to tell you about it. In short - I got my first Elance project, I read a good book about indie Android adventures, I'm working on an arcade game for a local company, and I'm on the brink of being admitted to a premium freelancing portal. Stay tuned for more details! 

Friday, August 22, 2014

Android video courses

Some people were asking me about resources from which they could learn Android. There are numerous courses on the Internet as well as books. You could probably just google them. What I want to focus on in this post though are video courses/tutorials. I've taken some of them and I really liked this form of studying. I've also done research to find out about less known ones. So here they are, ordered by the amount of experience I have with them.


It's a great site with free courses offered by the best universities in the world. I've taken almost ten of them now (not only related to programming) and they were all amazing. Only if you need a paper certificate of accomplishment, you have to pay a small amount of money. The only problem is that classes start at specific dates a few times a year, so that all students can work together and help each other. If there's no active session, you have to wait till the next one. Here are those related to Android:

Programming Mobile Applications for Android Handheld Systems
8 weeks, 5-10h/week

Creative, Serious and Playful Science of Android Apps
11 weeks, 5-10h/week

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems
8 weeks, 8-12h/week

Programming Cloud Services for Android Handheld Systems
10 weeks (6 core), 4-6h/week


Udacity offers probably the highest quality, most extensive and up to date Android courses taught by the best teachers (e.g. Reto Meier himeself) and endorsed by Google. It's enough to say that almost 100k people have signed up for them so far... and they've been available for around a month. The video materials are free. If you need access to projects' source code, help from a coach, or a verified completion certificate, you need to pay $150.

Developing Android Apps
8 weeks assuming 6h/week, $150 for the paid track

UX Design for Mobile Developers
4 weeks assuming 6h/week, $150 for the paid track


It's one of the biggest e-learning sites with plenty of Android videos for beginners and advanced users. Prices range from free to about $150. Other courses (design, programming, monetization) are of high quality as well. There's plenty of social proof - good ratings and reviews. The most popular classes have up to 35k students.

Most popular Udemy Android courses

Learn Android Programming From Scratch - Beta

Learn by Doing - Android for Beginners

Google I/O 2014

Google I/O is an annual software developer-focused conference held by Google in San Francisco, California. Its significant part is dedicated to Android. They will not teach you how to start making your apps, but rather tell you about new SDK capabilities, design guidelines, devices (wearables), Google Glass programming, material design, etc.

Google I/O 2014 Videos (you can filter Android related ones using the right panel)

Google I/O 2014 Android App to watch videos from your phone or tablet

Google I/O 2013 for last year's videos


It's probably the biggest repository of videos ever existent. Why not use it to learn some Android? The channels I watch the most are:

Android Developers

and their

Android Design in Action series

If you want to learn from scratch, there are playlists with thousands or even millions of students like you. Take a look at the following ones. Just be careful - they're becoming more and more outdated, dating back to 2011.

Android Application Development Tutorials
200 videos, 2.7mln views

Android Tutorial for Beginners
106 videos, 290k views

Android Bootcamp Training
2011, 18 one-hour-long lessons, 58k views

Android Mobile Development Tutorial
12 videos, 25k views

CS 282: Systems Programming for Android
26 videos, 21h in total, 21k views

Online video tutorials to help you learn software, creative and business skills. It's a paid site with a monthly fee starting from $25. They don't offer a-z courses, but rather smaller 3h-5h ones targeted to teach you a specific skill like creating a note-taking app or a simple multi-platform game in Flash. The nice thing is that once you become a member, you gain access to all the courses they have.

Android related tutorials on Android app

Android SDK Essential Training - 5h 10min

Building a Note-Taking App for Android - 3h 7min

Building and Monetizing Game Apps for Android - 2h 55min

Connecting Android Apps to RESTful Web Services - 3h 24min

Distributing Android Apps - 1h 38min

I hope you like my list. As always, I encourage you to leave comments with your experiences below. Help other readers find a course/tutorial for them or avoid the bad ones. Happy studying!

Tuesday, August 5, 2014

App review exchange with SmoothReviews

Many Android developers who release their first apps have problems getting an audience for them. It's really not easy to make people rate, review and share what you create. And without any social proof, obtaining new installs or getting featured by Google Play is very hard.

That's why people post their work on Facebook and Twitter, ask friends to install and rate it, create groups of mutual help or look for others with a similar problem to exchange reviews. All of the above usually with meager results. Your Facebook friends hardly care about your geeky side. Having a separate page or Twitter account for the apps might help, but you need to have some followers beforehand. Friends can always write a couple of nice words, but how many of them willing to do it every time you come up with a new app do you have? In self-help groups and review exchanges people mindlessly install what you tell them, rate very often without even running the app and then simply remove it from their device. If Google does not penalize those votes, they probably will at some point. After some time of practising this, your Google Play account will most probably look like a mess, recommending to you useless and uninteresting apps, just because you liked similar ones...

SmoothReviews might be the answer for this problem. It's basically a review exchange portal where you rate and review other people's apps and in exchange they do the same for you. The difference is that you pick the apps you want to rate and you don't have to give them five stars - just be honest. By requirement you have to keep the reviewed app for 48 hours. It's advised to write at least two or three sentences including some constructive criticism if necessary. Paid apps are supported as well, but they require you to return the favor. When you sign up, you get two app slots for free, but if you do it through my link, you get an extra one. The whole reviewing process usually takes a couple of minutes and includes taking a screenshot of what you wrote. Try it out if you think it might help you.

If you have any questions about SmoothReviews or want to share your experiences with it, please use the comments section. Perhaps you even get to review one of my apps :)

Friday, July 18, 2014

I'm looking for a (freelancing) job

After 1.5 years an Italian period of my life is about to end, since I'm moving from Milan to Cracow, Poland in September. After working from home as a web and Android developer and then doing the European Voluntary Service project for a local NGO I'm ready to finally move on to do something else. I'm not sure what that "something" will be, but I'm hoping to find a job related to game development, Android or both. I tried to look for online gigs that I could do from home, but it didn't really work that well. Here's what I experimented with along with the results.

It's one of the biggest freelancing portals with lots of projects and categories to choose from (from software and design to data entry, sales, marketing, engineering, accounting, and translations). It has changed a lot, mostly for the better, during the last year, but still there's a lot of space for improvement. Projects on Freelancer are usually poorly described, which makes it very hard to bid. Other than that, there's always tons of people from Asian countries (India, Pakistan, Indonesia, etc.) who are willing to work for $2/hour, which is probably not a salary suitable for Europeans or Americans. There exist premium accounts and specialized tests that you can take to increase your chance of being selected, but most of them are paid (usually $5) and I didn't feel like spending money on something that I wasn't sure would even work. My final balance is about 50 bids and never being selected... Perhaps you can be more lucky or find your niche. The most popular categories are very difficult to compete in.


Another freelancing portal from the big trio. Mostly IT centered. Project descriptions seemed to me more detailed than on Freelancer, but again the competition is quite fierce.


The last from the best known freelancing portals. The least known by me. Perhaps I made a mistake by not trying it out more thoroughly, because it's the most restrictive (you can't place so many bids), which prevents people from spamming every project they can possibly find.

Rent a Coder

It's a small, software-oriented freelancing site. Being less known might be an advantage here though. There's much less projects than on Freelancer, but also much fewer people to compete with. I managed to get a response from some employers once or twice, but the negotiations never got very serious. I haven't used it for some time, because I thought it had been bought by a biger portal and not being updated any more. It turns out that I was wrong.


I practically just got to know about it. It's an elitary portal with 4-step recruitment process - you can't just sign up and start looking for projects. I'm on the third step now. If they let me in, I'll make sure to tell you more about it. Almost for sure being part of it gives you the biggest probability of finding a job to do. They even insist that you work full time. They use Codility for their programming assessment, so you may want to give it a try beforehand. Oh, and they also have a blog where they published quite an interesting article with possible questions you can encounter on your Android job interview.


Have you ever been curious about what you can buy for five bucks? Well, now you know... Pretty much anything, from simple logos, illustrations, to apps, voiceovers and pranks. I was helping people to add ads to their Android apps and I managed to get to know a guy who was giving me more work afterwards (reskinning apps bought on CodeCanyon). After that I wasn't so lucky though, so I decided to take down the gig and replace it with new ones. Check them out here.

The point of the above rant is that freelancing is not an easy thing to do, even if you're a fairly good programmer. That's why I'll probably be looking for something more stable this time. As a side thing it can be interesting though and I'll definitely keep trying alternative ways of augmentig my income. By the way, if you have something to do for me, let me know :P

Sunday, July 6, 2014

My new app: Blogger Stats

As I mentioned some time ago, I've been working on a simple app for displaying pageviews statistics for blogs on the Blogger platform. The idea interested me, because I wanted to check how many people viewed my blog, and there was no app like this on Google Play. Using a browser to go to the administration website was simply inconvenient. It was slow and you had to log in to see the information. That's why I decided to try to create an app for it.

You can get Blogger Stats for Google Play here:

The screenshot on the right explains perfectly what the app does. It basically tells you how many people visited your blog in the last week, in the last month, and since you started it. Unfortunately, more detailed statistics are not available, because the Blogger API does not support it right now. This information is usually satisfying enough though.

What's great about the app is that you don't have to log in to your account, because it uses the built-in Android authentication mechanisms. This way it's also safer, because your username and password are not stored anywhere. What is more, you can use it offline, because it stores historical data on the device. Finally, if you have more than one blog, you can easily switch between them using the dropdown menu in the action bar.

What I'm particularly proud of is that Blogger Stats handles orientation changes elegantly by using retained fragments. This way the user does not even realize that the app is being restarted. To read more about this technique, go to the Handling Runtime Changes section on the Android Developers site.

If you're interested in implementing something similar or in using other Google API's, I recommend the following resources:
Blogger API reference
Google APIs authentication guide
Sample Android App for Google Tasks (todo list)
Google Plugin for Eclipse

As to additional libraries that I used, there was Crashlytics for crash monitoring and discreet-app-rate for displaying an elegant notification encouraging users to rate the app. Both helped me a lot with my other apps and are very easy to implement.

Once again, you can find Blogger Stats on Google Play. If you have a Blogger blog, I'm sure it'll be useful for you. And don't forget to leave me a nice review :)

Tuesday, June 24, 2014

Creative Programming for Digital Media & Mobile Apps on Coursera

I just wanted to let you know that another interesting course is starting today on Coursera - Creative Programming for Digital Media and Mobile Apps. I've just gone through the first week of video lessons and they are quite cool. They feature Processing - a development environment for visual arts and various creative projects. It's basically Java with a convenient library of functions that let you write graphic applications much faster. What is great about it is that it lets you export your projects as JavaScript or Android code, so you can easily run them on mobile devices (including iPods and iPads). I used Processing in the past and I quite liked its simplicity and power, although debugging was somewhat difficult.

Using the occasion, I'd like to present to you a site that inspired me a couple years ago to play with computational graphics and various visual effects: Complexification. Although it seems discontinued, you can still find there lots of awesome yet simple pieces of computational art... and the source code is mostly available as well (everything is written in no other than Processing again).

My firts Android live wallpaper has been inspired by the Binary Ring effect from Complexification. Later on, I created another one - Blender, which was based on a submission to the Processing's Exhibition section. It was all before I discovered that live wallpapers were extremely difficult to monetize (especially after notification ads have been banned by Google) and that people didn't download them almost at all, despite being advertised on sites like

If you browse through the exhibition archives some more, you'll find plenty of mind-blowing ideas like Mycelium or Shadow Monsters. I've been trying to code up something as awesome ever since I discovered them, but never with much success. Nonetheless, I had a chance to experiment with fractals (Mandelbrot Set rules) and decomposing images into single-colored rectangles, which resulted in a pretty neat effect as well. Hell, at some point I even decided to give my whole family huge prints of computational art interpretations of their photographs for Christmas. How geeky is that!

But I got excited again, so let's come back to the main subject for a while longer. Sign up for the Coursera course, if you haven't done it already, because it's cool, educating and doesn't cost you a dime. If you come up with a Processing app that you'd like sharing with the rest of the people here, feel free to post it in the comments section. I'd be happy to give it a try. Perhaps I'll manage to create something worth mentioning as well...

Thursday, June 19, 2014

Transforming SVG images into Android Drawables

Today I'd like to share with you a technique I used to create my map apps. I've never heard of anyone using it before, even though I find it quite simple. It lets you use SVG images inside your Android apps without any external libraries or extra code. What is more, the images obtained this way load instantly and can be magnified indefinitely without any loss of quality. Sounds interesting? Keep on reading to find out how it actually works.

It all began with my frustration with bitmaps, which caused OutOfMemoryErrors when used in too high resolution or zoomed in too much. I decided to switch to vector images, which unfortunately are not supported out of the box by Android. You have to use SVG parsing libraries that sometimes do not support certain features (text, gradients, symbols), contain bugs, and take a couple of seconds to create a medium-sized image.

After some time an idea came to me - what if I transformed an SVG loading library so that it printed Java code instead of executing it and returning a Drawable instance? It sounded very easy and turned out to require much more work than I initially expected, but the final result was great. All I needed to do was take the printed Java code and paste it inside a new class.

If it still sounds a little abstract to you, I created a sample app that uses an image generated this way. It basically just shows a vector-based creature and lets you magnify it up to 16 times (see the screenshots on the right). You can download it for free from Google Play and test it yourself. I'm making its full source code available as well, so feel free to take a look at it.

If you're wondering what kind of apps you could create using vector images, go and see my Milan Metro. It's a great example of simplicity and performance (just compare it with other similar apps!).

Apart from that, vector graphics is great for UI elements, because it scales without losing quality on all devices and screen densities. There is no need to create separate versions of resources for mdpi, hdpi, xhdpi, xxhdpi, etc.

Another good example I can think of are splash screens. What if you could make sure that they look pretty, regardless of the screen resolution and size, taking much less space at the same time? Wouldn't that be awesome?!

If you'd like to have your SVG pictures transformed into Drawables, check out my Fiverr gig - I can do it for you. You can also contact me via email (bartas [dot] wesolowski [at] gmail [dot] com) if you have a bigger task for me or if you want more instructions on how to implement a similar thing yourself.

Sunday, June 8, 2014

How I didn't get a job at Google

About 2 months ago I got an email asking me if I'd be interested in working for Google. Without much thinking I replied "hell yes", or something of this meaning. They were supposed to call me in a couple of days to discuss the whole procedure. In fact, being quite absent minded at times, I totally forgot about it, and you can imagine my surprise when during my dinner I got an international call from a guy explaining to me how the hiring process works, and then asking me questions about asymptotic complexity. Fortunately, my answers, although somewhat chaotic, seemed to satisfy my interlocutor. We scheduled another interview, also on the phone, but this time involving solving problems and writing code online. I was given four weeks to refresh my knowledge of algorithms.

At that point I decided to get some outside help. I contacted a friend who works for Google in the USA. She suggested that I should go through the MIT Algorithms course and familiarize myself with The Algorithms Design Manual. I started with the video course, since it seemed to me easier to chew up (how wrong I was at that time!). I watched almost 40h of material, took tons of notes and did extensive research online on some of the techniques I didn't quite understand. I didn't have time to event touch the book, but I was putting trust in the MIT professors and their extraordinary teaching skills.

Four weeks passed in a blink of an eye, and so came the day of the interview. I wasn't sure what problem difficulty to expect but I was about to find out. To my bewilderment, the task was actually quite simple. I had to write a Java method building a team ranking chart based on the match results given in a specific format. I breathed with relief, but I still made some small mistakes (fortunately I was able to detect them fairly fast). I didn't even think that they were judging not just my coding skills but also the way I approached the problem and tested my solution. All in all, I got through again and got accepted for an on-site interview. Things were getting really serious.

I had another four weeks to prepare for the next step. I finally coped with the algorithms book, which was great and I recommend it to all of you. I solved 69 problems on Timus (a Russian online judge, which I like). I took part in one online coaching session organized by Google (although I was very late for it because the person who organized it gave me a wrong hour). I studied the official guides telling you how to prepare for a Google interview. I found another helpful book- Cracking the Coding Interview, which was a great source of possible questions and tips for coping with them. In the end, I felt as prepared as I possibly could be.

The interview itself took place in Cracow (Poland) and was composed of five sessions (each with different person) and a lunch (not being evaluated by them). They paid for my plane tickets from Milan and booked me a 4-star hotel (only one night though, the second night I stayed with a friend in a 4-person room :)). Obviously, I didn't sleep very well because I was nervous as hell. I couldn't wait to finally get the burden off my chest, no matter the result. I arrived at the Market Square, where the company's seat is, feeling rather shitty, and trying to make myself think about more pleasant things.

The five sessions went actually quite well. I never had a major glitch. I managed to get out of difficult situations (e.g. when I didn't know the exact method signatures or class names) by going around them in a fairly elegant way. This time I was very aware that they were judging my approach and testing capabilities as well, so even when they were asking me about something simple, I tried to be as thorough as I possibly could. At lunch, I had a pleasant chit-chat with a guy who was telling me about his work (even going into details, which I was quite surprised to hear). Eventually, I let him eat because he didn't have a chance to touch his food when I was already half through mine.

When I left the building I felt such a release that I can't really describe it with words. The world was suddenly beautiful again, the sun was shining, and the ice cream tasted great. I half-convinced myself that I would get the job, because I was happy about my performance. I honestly couldn't think of anything I could have done better, bearing in mind all my preparation. Now, I just had to wait for my recruiter to call me (she went on vacations for two weeks, so I knew it would be in some time).

Three days ago, when I was on a train, I got the actual call. She told me that unfortunately she didn't have any good news for me. I was not accepted. She assured me that they usually give extensive feedback, but in my case she simply had nothing to say. She suggested trying again next year. Then she hung up.

I probably don't have to tell you that I felt terribly sad, not only because I didn't get the job all programmers dream about, but also because I commited so much of my time to preparing myself. Telling my friends about it, while they were expecting from you to be a genius, was not an easy task as well. I think I'm getting over it now, although I still feel a little nostalgic. We'll see what the future will bring for me instead.

When I come to think of it now, I'm not even sure if Google would be the best place for me. Of course, they have great working conditions and let you be part of a solution that millions of people use every day. However, they are still a big corporation with all its disadvantages - there are people above you who decide what's to be done and in what way, and you're just a cog in a big machine.

For all of you who'd like to give Google a try as well, you can apply here:
Just bear in mind that you'll have to commit quite a lot of your time for preparations, and that perhaps it's not exactly the thing that you would like to be doing (maybe you like mobile apps like me). Anyway, I hope you enjoyed my story, and should you ever go through the whole process, I wish you more luck than I had.

Thursday, May 22, 2014

Plans for the future

Hi guys! Thanks for visiting my blog again. Today, I'd like to reveal some of my plans for the next couple of months. I know I haven't been very active recently, but hopefully it's going to change next week. I've been studying for a very important job interview, which is going to be on Monday. Please, keep your fingers crossed. No matter the result though, I'll definitely be going back to Android work and here's a list of stuff that I'm going to focus on.


I really want to try this crash reporting system. I'm using Crittercism right now, but I only have a limited free version, which doesn't let me do more sophisticated stuff like sending information about caught exceptions. The reports don't look too pretty as well. I was hoping that Crashlytics might be the way to go, especially that it's used by such companies like PayPal, Walmart, Dominos or Groupon. Oh, and I forgot the best thing - it's totally free (even the enterprise features).

Mastermind Group

Recently, I came to the conclusion that I need a group of people who would help me make my apps better and share their experiences with me. I don't mean just giving me good ratings on Google Play. I mean giving me information on what I could do better, which app kinds are working and which are not, what ad networks bring the most revenue, etc. Of course I would help them as well, sharing as much of my knowledge as I can. I'm in the process of contacting some of the people I know, who are on the similar stage as I am. I think 5-8 members would be optimal. If you'd like to join and meet with us once a week or two (on Skype or Google Hangout), you can write me an email at bartas [dot] wesolowski [at] gmail [dot] com.

Map apps

I really like the tool that I created, which transforms SVG images into Android Drawables. I'm thinking about creating new apps similar to Milan Metro - just with different maps. People in other cities would probably be happy as well to see a high quality version of their metro map for Android. There are also trams, buses, university campuses, parks, and other places just waiting to be transformed into vector images and published as an app. I already have the necessary code base. Why not replace the map itself, the icon and the screenshots and put it on Google Play?

Blogger Stats

Some time ago I experimented with Google APIs and tried to write an app which would fetch my blog statistics without the need of logging in (it would use the Google account stored on the device). After the initial struggle I managed to get it working. The only bad thing is that the Blogger API doesn't let you see very detailed statistics - it just shows weekly, monthly, and all time views. It might change in the future though. Anyway, I just need to remove my hardcoded blog name, add Google account selection, and make the app pretty to be ready to release it. I use it from time to time, why not let other people do the same.

Video ads and alternative ad networks

Since I already have quite a lot of users of my apps (around 15,000), I should probably start thinking about monetizing them better. The CPM of around $0.5 which I'm seeing now is not the highest I could dream of. Other people have been advising me to start using ad networks other than AdMob. I also receive email offers from less known networks from time to time. I definitely want to try video ads and experiment with ad types and their placement. I hope it can increase my income and perhaps allow me to go full time at some point (although I'm quite far away from it right now).

Google Analytics for Android

I hate the fact that I don't know anything about my apps' usage. How many people play my games daily? How many of them make it through the whole game? Are the difficulty levels ok? What are the most common settings? I've been looking for a solution and I think I finally found one - Google Analytics. It's supposed to let you get all the answers you want. Having the data available, it should be much easier to make adjustments to your apps/games, place the ads, detect bugs and create new features. I'll definitely give it a shot.

Blobby Volley multiplayer

Being able to play with other human beings is what's missing in my game. Although my AI is quite strong and I'm quite proud of it, it can't compare with the possibility of kicking your friend's ass. I'm not sure how I'm going to do it yet. I don't have much experience in implementing multiplayer games, but I have to find a way to do it. For now, I'm considering AndEngine Multiplayer Extension and Google Play Services. I can't wait to see it in action!

Updating old apps

It's been a while since I created my first apps and they got quite old in the meantime. Not only at the time of writing them did I have the knowledge I have now, but some of the more sophisticated libraries simply didn't exist. There was no way of easily downloading, caching and showing online images. There were no pretty gallery views. No one even heard about Android 4.0. That's why I think my Raczkowski na dziś and Galeria Andrzeja Mleczki need a general rewrite. I'm not giving this task the highest priority, but I'd like to make those apps more user friendly and less buggy. They are part of my portfolio and I feel bad every time someone gives them a bad rating.

That's more or less what I have planned for the summer, unless something unexpected happens. If you want to see the results of my work, visit me again and check out the progress. I can't wait to see what the future will bring. Wish me luck.

Thursday, May 8, 2014

5 things that are working for me right now

Hi there! Today I'd like to share with you the results of my recent actions and experiments. Even if I don't create new apps, I try to at least update the ones already existing, with some new features, bug fixes and enhancements. Here's the list of five items that I consider the most successful/promising/helpful. I'm sure you can find there something that will work for you as well.

1. Online crash reporting solutions

Since I started using sites like BugSense or Crittercism, I think they are a must for every app. The Google Play's crash and ANR's section lets you see only a fraction on errors. It doesn't show any nice reports either. External systems like the ones mentioned earlier are much more powerful. They let you mark at which version each bug was fixed, they can give you additional exception information, they let you send reports about caught exceptions, they send you email reports, and their look-and-feel is much nicer.

In the past I used ACRA as well. It gives you more flexibility when it comes to data storage - you can even code your own adapter doing whatever you like with the exception that was caught. For me it was too complicated and I preferred other solutions, but I just took a look at their website and it seems that a lot has change in the past couple of months. Perhaps you will want to give them a try as well.

What I want to test in the near future is Crashlytics. Since Twitter acquired it, it has become completely free and I've heard a lot of good words about it. It looks quite pretty and professional as well. BugSense and Crittercism offer free plans, which usually are quite sufficient for indie developers, but to use their pro versions you have to pay, which is not an option for me right now.

Anyway, start using online crash reporting, if you aren't already doing it. It takes one line of code to add them and they let you avoid a lot of bad ratings and reviews.

And when it comes to user feedback, let's take a look at the next point.

2. Discreet App Rate

As the name suggests, it a neat library displaying a small banner asking the user to rate the app. The banner only shows up after the app has been opened a specific number of times or when the app has been installed for a while. It's easy to dismiss and it doesn't take the whole screen, which can annoy users and actually make them give you one star. If you're interested in the motivation behind it, you can read the article Nicolas Ponepuy (the author of the library) wrote.

I found out about Discreet App Rate through the Android Weekly newsletter. It's a great source of information about new Android libraries, tools and learning resources. You might want to sign up for it as well. Btw, my interviews got featured on it a couple of times at the beginning of its existence, which I'm extremely proud of.

But back to the main subject. Since I installed Discreet App Rate in my Milan Metro app (more than 3 weeks ago), the number of ratings has practically doubled and the average rating has increased from 3.8 to 4.24. It caused a 20% rise in downloads as well, although I changed the icon, screenshots and some app details as well, so the positive trend might have been caused by those as well.

3. Ad networks other than AdMob

I really like AdMob for its reliability, transparency, on-time payouts and in-depth statistics. Nevertheless, I don't think you should be using only their ads, because they don't give you the highest CPMs and possible ad types are definitely not up to date with the industry standards. My AdMob average CPM is only $0.58, which is not very high, although I do get up to $3.69 on a banner (!) in my Toothbrush app (I still can't explain this anomaly).

Anyway, I have been using Airpush and AdBuddiz for some time extensively and they give me average CPMs of $1.44 and $1.01 respectively. I use both of them with my Blobby Volley game, so the results should be representative. I have Airpush in one of my other apps - Supermarkets in Milan and it has a CPM of $2.58 (unfortunately with much fewer impressions).

In conclusion, if you experiment with alternative ad networks, they can basically triple your income. I'm probably not doing it well enough anyway, as Matey Nenoff mentioned in the comments on my last income report. There are video ads and other specialized ad networks that migh give me better rates. I will definitely commit some time in the future to experimenting some more.

Just as a remark, using too many ad networks might not be good either. They usually pay you after you've reached a certain level of income (like $100), so if you don't make too much, you may never see the money or you'll have to wait for it longer. Also, they don't always give you access to full statistics (I calculated the AdBuddiz CPM on a calculator), so it's not easy for you to analyze the traffic. Finally, they have limited payment options, so if you're used to being paid via PayPal or wire transfer, you might get disappointed and be forced to create an account on a third party money transfer site.

4. Transforming SVG images to Android Drawables

This point will be more technical, but it really changed a lot for me. Remember February 2013 and my post about using SVG images in Android apps? Probably not :) Just as a quick reminder then. Vector images are very nice to use, because they don't lose quality while magnified. They also usually take up much less space and memory than bitmaps. Sometimes they are the only way to go, when an image is very big and can't be loaded into memory. That was the case with my Milan Metro app.

Unfortunately Android does not support SVG images natively, so you have to use an external library to transform them into instances of the Drawable class. The existing libraries are not of very high quality though - some of them only support a subset of the SVG standard, others don't let you use text, different ones just transform the image into a bitmap, which may not be what you want. All of them have to parse the SVG file first, which takes quite some time (up to a couple of seconds). These disadvantages make it quite hard to use SVG images.

What I did was as follows. I used the svg-android-2 library (an updated version of the svg-android library I was using previously) not to parse SVG files and make Drawables out of them, but to print the code that would be executed in the process. This way I had the whole image in Java code, looking more or less like this:

public class MapPicture extends Picture {
    private final Canvas canvas;
    private final Paint fillPaint = new Paint();
    private final Paint strokePaint = new Paint();
    public MapPicture() {
        canvas = beginRecording(530, 415);
        canvas.concat(/* some matrix transformation */);
        canvas.drawText("PORTA ROMANA FS", 0.0f, 0.0f, fillPaint);
        /* other shapes and text */

I didn't have to add the SVG parsing library any more, the image loading time was practically unnoticeable and the map looked just as before. It wasn't as easy as I first thought to print the Java code instead of executing it, but it was totally worth trying. I started even thinking about creating a tool for other developers to do the same thing, and start using vector images without the necessity of adding external libraries and wasting time on svg file parsing. If you are interested in such a tool, please let me know in the comments section.

5. Simple apps

Many people think that by making a mobile app they can get extremely rich. Sometimes they spend a lot of time and money to create one, just to find out that it's a total flop. I believe such an approach to be wrong, at least for indie developers like me.

Making something small and simple is usually what works for me. I don't get bored and frustrated during the development process, I don't need to commit half a year of my free time to finishing the app, I can see if it has a potential of being popular much faster and then perhaps add more features.

I still can't believe that my Toilet Sounds game, which was basically a practice excercise for me, when I was trying to learn how to play sounds on a physical device, has been downloaded 40,000 times. I guess sometimes you just can't guess what people will like.

Another thing is, I'm quite ok with having 10 simpler apps, each making me a smaller amount of money. Complexity brings a lot of trouble - tons of crashes and pissed off users, long development time, investment in design and graphic resources, etc. Remember that if you create a map app or a simple point-and-click game, you can always make another one based on the existing code, e.g. make a map of something else, reskin the game to be played in another environment. This way every bug can be corrected in the common code base and not cause trouble in every derived version.

To put it in short once again, my extremely simple apps have probably the same amount of downloads as the more complex ones, although they took 1/10 of their development time. They made me realize what may or may not be successful (live wallpapers suck), they usually crash much less, they build up my portfolio. I'm definitely going to be making more of them in the future.

I hope you liked my list. I might make another one in the future, because I quite enjoyed the process of creating it. In the meantime, feel free to let me know what's working for you.