Sunday, December 29, 2013

World Map App Update

World Map App continues to gain users, and the cost of maintaining the app is fully covered by revenue generated by the advertisements. I plan to fix a few bugs and improve the app soon, but I have not had time recently to work on the app. As far as I know, World Map App is the only map in Russian that offers maps with Russian labels. I believe this is the main reason for its popularity.

About 2600 people have app installed. The app has experienced steady growth since release of version 6. Version 6 was exactly the same as version 5 except that the app would automatically download all the maps in the user's language. The whole idea in version 5 was to allow users to pick and choose which maps they wanted rather than forcing them to store unused maps on their phone. However, as soon as I release version 5, the number installations suddenly slowed down dramatically. I believe this was because users did not want to spend the time to download new maps, or users couldn't not figure out how to download new maps. To combat this, when the app is run for the first time it automatically downloads all maps that are in the user's language.


Russian speakers continue to be about 70% of the users.


Not surprising, the top three countries where World Map App is installed are Russian speaking countries


I've included advertisements in the app to help cover server costs to host the SQL database and generic storage containers for the images. Originally, I was hoping to make a significant income with the World Map App, but it is very difficult to make much money on advertisements developing apps for Android that are free.
I've shown about 36000 advertisements, and users have clicked on ads about 550 times. I've generated about $30 on advertisement clicks.  The image below shows the earnings on a daily basis starting in August 2013.

I average about 300 advertisement impressions per day, and I average about 4 clicks per day.

My server costs include both the SQL db on Windows Azure and the image storage on Google Blob Storage. Azure costs (not including December) are shown in the image below. As of the moment I'm writing this,  December 2013 is estimated to cost $3.79.

My Google storage costs for Map App have been about $4.84.

Based on the cost and expense, I've made $2.09. Not much, but at least I'm not losing money, and the experiencing of developing an app has been invaluable.

Saturday, December 28, 2013

Product Planning (Stage 1 of product design)

Product design includes five main stages. A super simplified explanation of them are presented below. 
  1. Product planning. The company strategically finds market needs, their company strengths, and determines several  potential products that they might develop. Using all this information they form a strategy of which  products that they will design to meet the market needs and company strengths. 
  2. Product specification. After a product is generally defined for company planning purposes, the engineers and company managers need to define in some detail what they are attempting to design for a specific product. A long list of requirements that the product must meet is defined. 
  3. Conceptual design. The engineers take the requirements and create 1-3 final ideas on how to meet these requirements.
  4. Embodiment design. The engineer takes the 1-3 ideas and fleshes them out in much more detail. For a mechanical engineer this normally includes using CAD. As more information about the design is available, the ideas are evaluated and narrowed down to one design for the product. 
  5. Detailed design. The product's manufacturing instruction, user manual, and other documentation is finalized. 
At school and generally on the internet, teachers focus on teaching , stage 4, embodiment design. However, all the stages are important. In my experience working as a paid engineer, small companies don't follow these 5 stages of design and the results are horrible. It is easy to have a good idea (which normally means you have a good idea for how to implement something, stage 4), and the company makes a valiant effort to get the idea to work. However, as soon as you include someone else in the design project, then things begin to fall apart because they don't see why your idea is so great and can point out several reasons why it is not great at all. Since you never clearly found out what people want (stage 1), you never defined what exactly you were trying to do (stage 2), and didn't consider alternative methods to solving the overall problem (stage 3), when someone else comes along and ask for justification for your design, you have nothing to show. For me, I was the new person, and I kept on asking "what are we actually trying to make (stage 2)? why are making it (stage 1)? why didn't you try something else (stage 3)?". Unfortunately, I never was given legitimate well documented answer to these questions. 

Recently, I've discovered another facet of product planning (stage 1). Once we have an idea of the product(s) we want to create, then we can create a strategy for how several iterations of the design will progress. In general when starting something new, it is best to keep things simple. The first iteration of a product that is released to  customer's should fulfill the basic requirements without bells and whistles. During product design enough things will go wrong so that creating a product which fulfills its core functionality well will be challenging enough.  

During product planning, the engineers can select core product functionality as the requirements for the first iteration, and then for later iterations incrementally increase the complexity of the product by adding features to it. Hopefully, the product specification for later iterations will also be influenced by customer feedback. 

The key idea I want to communicate is that you should plan out the iterations of your product as the very first step in product design. The first iteration should be as simple as possible. Later iterations should add features that add value. A common mistake is to make your first iteration far to complex with cool ideas. However it is also a mistake to totally forget your cool ideas. Cool ideas (features) can be planned for in later iterations of your product. 

Sunday, September 1, 2013

World Map App Version 5


News

Today I released World Map App version 5! Version 5 has a lot of new features in it and fixes no known bugs. Version 5 lets the user download new maps to their phone from a server so that they can customize the user experience based off what they want or need.  Because large images take up a lot of disk space, I didn't want to embed a lot of large images into the app and thereby make the app size around 30 MB. So instead, I let the users choose what they want and only downloaded want they need.

Server 

I'm using Windows Azure Mobile Services in the background to host my database. I downloaded the official SDK for connecting to Azure from Android and was able to connect my app to Azure after hours of work and looking at the test example. Azure provides an easy to use back-end for a mobile app.  I looked at Amazon Web Services, but it was too complicated; the Google App Engine examples were not working, so I ended up using Azure.

 

Also, I generated a small website backend to connect to the Azure server and allow me to modify the database. The website is a heavily modified version of the javascript,html example app from Azure. I learned a lot about javascript, jQuery, and html 5 while working on my website.


An important part of the table that hosts the data, is the column "in Production". If this is set to "true", then the map will appear on all mobile android devices when someone clicks the "Download Maps" button. This lets me make modifications to a row before I put it in production, or easily pull a row out of production with the click of a button.

The actual images are stored on a Google Storage (which is an unstructured blob type storage). I used Google to store the images because it was really easy for me to use there "Web Console" to choose the images I wanted to upload. In the future I plan to use Azure Blob storage, but the ease of using the "Web Console" was the reason I used Google Storage for now.




Statistics

Since version 4, World Map App has more than doubled in its user base. Like before, most users speak Russian (nearly 70%), and more than half of users are in Russia.


I translated the app into Spanish, but the app is having a hard time gaining a user base in Spanish. Hopefully with the new features, I should be able to add maps that are written in Spanish and are of Spanish speaking countries. This should help make the app useful to Spanish speakers. 

About 3/4 of users that had version 3 of World Map App installed version 4 (as of 11 days after the release of version 4). This statistic is interesting because it tells me that some people don't update their apps, so that it is important when I release a new version that it works well because who knows when it will actually get updated by some users. 
In this line graph, you can see how the number of people with version 3 installed on their device flat-lines which means they just don't update their apps (version 3 is blue and version 4 is in green). 



Sunday, August 25, 2013

Balmer Leaving Microsoft

I read this article, Balmer Legacy, and found it really interesting. Perhaps I'm a Microsoft fan because I really hate being put into the one size fits all box that Apple products have created, but I think the article hits on the important points about Balmer. Balmer's success was in the behind the scenes arena.

"Looking through the small screen of a smartphone, it’s easy to miss the bigger picture. Microsoft is struggling through the downward cycle of PC sales, but it’s making small but significant gains in phones and search. Its cloud-computing platform is a serious contender and it’s gearing up to launch the next Xbox, building on the huge popularly of the current Xbox 360. ...

While Steve Jobs was winning with the iPod, iPhone and iPad, Ballmer was winning over companies with Microsoft servers and business software. Jobs tried and failed to break into the enterprise server business and nobody cared; Ballmer struggled with music players and phones and was mocked."

I'm not sure that Microsoft is winning the backend of devices either, but it certainly is in the top 3 with Amazon Webservices out in front. But the point is that most people who mock Balmer (at least that I know), really don't understand all the work that goes into running a dynamic website, a backend for a mobile platform, scaling VM across geographic regions based on loads, and all the other things that happen in the background to make devices work well with a cloud connection. 

I certainly think that Balmer has had some mistakes, but over all the general characterization of Microsoft as being backwards and lacking innovation (with Balmer being the poster-boy) is incorrect.  

Saturday, August 24, 2013

World Map App Version 3

I finished version 3 of World Map App. The new release includes a new set of icons, and removal of the menu in the about activity. Also World Map App is now available in Russian!!! My wife was kind enough to do the translation for me.

Users should expect to receive the update in the next 24 hours.

https://play.google.com/store/apps/details?id=com.stackingblockstopreventoverflow.blogspot.worldmapapp&hl=en

I'm working on a CAT bus app right now. The app will show the current location of each bus on its respective route. The app is much more complex than "World Map App" because I'm doing something besides just showing images. I'm using a sqlite3 database to store the bus stop information, and I'm creating nice complex SQL statements to select the exact bus stop time information for the correct season, day, and time.

World Map App Version 4!



I finished up version 4 of World Map App. Key updates include the application size so that it takes up less memory but has the same high resolution maps. Also version 4 includes a Spanish Translation of the app. Users can expect the update in the next 48 hours.

Version 3 included a Russian Translation that drove downloads since it was released. The pie chart below shows the language distribution when I released version 4 a few moments ago.

As you can see, Russian users make up 60% of the user distribution. The next graph shows installations by country. 

As expected Russia has the most downloads followed by the USA and Kazakhstan (which is right underneath Russia, you can look it up on the "Russia" map on the World Map App).

Why all the growth in Russia? I suspect that the English World Map type app market for Android is saturated, but in other languages it is not. Also, I included a nice Russian map in the app.

Time will tell if the new Spanish Translation in version 4 of World Map App will also spur downloads.

 What do you think? Feel free to leave a comment about the best strategy to get your app into different languages?

Spanish Google Play listing.
https://play.google.com/store/apps/details?id=com.stackingblockstopreventoverflow.blogspot.worldmapapp&hl=es

Russian Google Play listing.
https://play.google.com/store/apps/details?id=com.stackingblockstopreventoverflow.blogspot.worldmapapp&hl=ru

View All Files in a Directory on Android

I was having a terrible time trying to figure out how to list all the files in a folder on Android. I know how to easily do it in C#, but java-Android is making life difficult. Finally I figured it out. The seemingly trivial was made difficult by vague exception messages.

The key is that the file you run listfile() on must be a directory. This was not clear from all the examples I found on other websites.

Tuesday, August 13, 2013

Software Life Cycle - Updating Software 1

Part of the software life cycle is to maintain or update the software. I found a quick video on YouTube that is nice and short but reinforces this point.



Updating software can generated tons of new problems and issues, and it is important that the designer of the software takes time during the original creation of the software to do things the right way rather than the short fast way.

So what are some of the things that a developer can do to help make the software easy to maintain??

1. Document everything. In code documentation is the single most important thing to help make software easy to maintain. Different people have different preferences on how exactly the documentation should be written, but no matter how you do it, documentation is key to making software easy to update.

2. A debug mode. When trying to fix software you need to see what the software is doing under the hood. Obviously what the software is actually doing shouldn't be shown to the normal user, but when you go to fix a problem having the software print information to the console or a log file can be invaluable. Also a debugging mode can switch off all "try-catch" statements so that the software actually fails when and where the problem actually exists.

3. Functions/Methods that do just one central thing.

4. Automated tests.

5. Give methods, fields, parameters, classes, and namespaces meaningful names.

What do you think? Tell me in comments below.



Wednesday, August 7, 2013

World Map App v.2

https://play.google.com/store/apps/details?id=com.stackingblockstopreventoverflow.blogspot.worldmapapp

World Map App took a step forward today by receiving its first incremental app update. Everyone who has it installed should receive the update on their Android device in the next few hours.

You can read about World Map App on my previous post.
http://stackingblockstopreventoverflow.blogspot.com/2013/08/world-map-app.html



Saturday, August 3, 2013

Software Life Cycle

Although I haven't worked on tons of software project and I'm still relatively young, I keep seeing common problems in thinking about software development. Perhaps I see more of these problems than the average software developer because I've worked with mechanical engineers and other people who don't know much about software. I'm certainly not an expert and still make these mistakes myself.

The problems is that software development (especially doing the actual programming) is only the very tip of what it takes to produce and maintain high quality software. The false assumption  made is that developing a piece of software will only take a few resources and then "Hooray!!" we have a great software program running with no bugs and everyone is happy. Developing software is like having a car. First you need to do research about what kind of car you need, what you can afford, what is good car for the price range you are looking at, what cars are available near where you live, then you need to go actually test drive a few cars and find the one that you like best. Once you finally buy a car and you are all excited, a lot of work will still need to be done. Insurance, fuel costs, preventive maintenance, unexpected maintenance all add up quickly to make the cost of owning a car quite expensive.

In a similar way to the car, software development has a lot of extra costs. First before any code is ever written you need to decide on the objectives of the program, how will we store and share the source code, how will we test the software, how will we distribute it to our customers, how will we update the software, how will we track bugs and deliver updates to customers. All the extra considerations that go along with software development are normally the root cause of software development failure. Generally software development efforts fail because of something that wasn't directly related to programming.

I hope to talk much more about software life cycle in the future. Until then here is a great article to read. http://spectrum.ieee.org/computing/software/why-software-fails

Thursday, August 1, 2013

World Map App



https://play.google.com/store/apps/details?id=com.stackingblockstopreventoverflow.blogspot.worldmapapp

My newest attempt at supporting myself, my wife, and my little baby on the way is to use my computer programming skills to write Android apps and use the Adsense network along with paid apps to generate money. My strong history in C# programming allows me to switch over to Java without to much trouble. After working on learning the Android API and other Android issues for about a week, I published my first app today on Google Play, World Map App.

The inspiration for app came while Shari and I were in China. We were at a restaurant eating our food and trying to carry on a conversation with the owner using Google translate on my phone. Like any good conversation we wanted to the owner where we were from, but we wanted to tell him in more detail than just saying "I'm an American" (我是美国人, Wǒ shì měiguó rén). Of course the easiest way to show someone where you live is Google Maps and just point at where you live! As I zoomed out I suddenly ran into a problem; Google Maps only caches the maps for the country you are in so if I wanted to show him the United States than it would need to download new map data over the mobile network. Unfortunately my phone's mobile network at that location was pretty slow (actually really really slow), so as I zoomed out on Google Maps almost everything outside of China was blank and it wasn't going to show up any time soon. So Google Maps was not a good way to show someone where we live, and hence the need for a simple offline world map app arose. Another consideration for the app is that it is really simple, and allows me to get my feet wet with programming for Android. 

Key Features:
- offline world maps
- simple

Ideas for Future versions of the App
- More maps
- Higher Resolution maps (probably make a paid version for these because HD maps cost me money)
- Work on the zoom in feature to actually show it in more detail
- Possibly use AdSense 
- Add Translations


Tuesday, July 30, 2013

Introduction

I'm a mechanical engineer (still a student to be exact) that  programs computers. Almost all of the engineering jobs that I've had were related to software development and not mechanical engineering. I've only had one class related to computer science which was a c# class during undergraduate. Although we didn't get to far in explaining complex CPS problems in the class, it did teach me OOP which has been invaluable as I've tried to learn C#, Java, Matlab, and C++. 

I got started programming in undergraduate because I was working on a robot that would self-navigate down a course marked by white lines. This robot was about 100lb., had 3 wheels, and used a laptop running Windows XP as it's brain. The funny thing was that all of the engineering students who had volunteered to work on the robot did not know how to program because all of our classes were about math or dynamics or some other engineering topic. Ironically, the hardware of the robot was working great, but the brain of the robot need some help. So there I was as a mechanical engineering student faced with the dilemma that has continued to come back to me, how do I modify the source code of this program to make it do what I need? No one else on our robotics team really tired to understand the C++ code that controlled the robot, so as I jumped into it I didn't have much help. But as I started to try to understand and modify the code I learned a lot and I was able to make some basic changes that helped the robot act smarter.

I'm sure that my story of getting thrown into programming is common to many engineers. It highlights the fact that computers are powerful, software often is what separates good machines from bad machines (even if mechanical engineers like me wish it was the mechanical design that separated the good from the bad), and that all engineers need to learn to program.

Since my robot experience I've had other jobs related to software development. My undergraduate senior project allowed me to create a 3D simulation of the robot in C# using XNA to test a vision algorithm. I had a job straight out of college working for a defense contractor working on a Linux embedded system. I reused my 3D robot simulation for an optimization project in graduate school to determine the optimal steering parameters of the robot. I worked extensively with Matlab in designing control systems for several of my graduate classes. I went to China to fulfill Clemson's contract with Baoyan Automation. While in China I modified a windows form application to meet the needs of Baoyan Automation. Now I'm still in graduate school and I'm trying my hand at Android development.

The purpose of this blog is to share thoughts, ideas, and solutions to some of the engineering problems I face. Many times when I've faced a problem I would find the solution on an engineer's blog, and now it is my turn to start doing the same in return.