So You’re Not a Programmer…Yet

I have to admit, I’m afraid to call myself a programmer.  I spend about 10% of my time at my day job programming, and I have three apps on Google Play that I wrote entirely myself.  Still I have this feeling of being a great imposter if I were to refer to myself as a programmer.  I have always had this feeling that there is something special that they teach professional programmers in school, and there probably is.  It’s probably all of best practices that self-taught programmers like myself have learned the hard way (or haven’t learned at all yet).  But I said all of that to say this:  don’t be afraid to jump in headfirst to programming.  Become an imposter.  Believe in yourself.  The knowledge is out there, you just have to find it.  

There is a bravado associated with people who know how to program, the higher the level, the higher the bravado.  This is intimidating for the would-be programmer starting out, because programmers have done such a good job of making themselves out to be geniuses.  No doubt some of them are, but that fear of being wrong and of someone putting you in your place can be paralyzing.  Don’t let it in.  Carry on and remember that the proof of the pudding is in the eating, and the proof of the program is in the testing and using.  If you can write applications that function as intended, you are a programmer.  Period.

Tip – Use Version Control. The Cool Kids are Using Git

Shortly after spending the equivalent of a full work week developing a pretty cool app, you are likely to start worrying about backing up your work.  Also, you may be wishing that there was a way to keep track of the changes you have made to your code over time, so that when you inevitably blow things up, you would be able to restore your work to its previous state.  If you are a programming newbie, you are not likely to have heard of Version Control (aka Revision Control).  Version Control is essentially the professional way to track code revisions and share changes in code in an organized fashion.  If you are working alone, it allows you to store the entire history of your project to another server as you go.  Personally, I love Git for this, and it is well integrated into Android Studio.  The definitive source for learning about Git is here.

After learning the basics of Git, I highly recommend checking out a tutorial before trying it out with Android Studio yourself.

The “killer app” of version control (and the reason it was invented) is that it allows you to share your code with other members of your team such that you can all contribute changes in a way that doesn’t constantly break the entire project.  Whether you are currently working solo or with a team, it behooves you to get up to speed with Version Control.  Of course, there are other Version Control systems out there, and while I am sure they are great, I know next to nothing about them.  So I won’t waste your time and will allow you to Google them yourself if you are so inclined.

Beware the Minimum Viable Product

The Minimum Viable Product (MVP) concept, first introduced in The Lean Startup and very popular in entrepreneur and startup culture, can be very helpful in getting started with mobile application development, but you need to be aware of a few caveats.  Your app may need to contain some very key features in order to be “viable” that may not be obvious to the absolute beginner.  By all means, if you discover that your original grand vision needs to be focused into an app that performs a core function, then you should focus on performing that function well.  Your idea was probably overly broad to begin with.  However, this approach to developing an MVP is not carte blanche to leave out application fundamentals that the user is going to be expecting.  In fact, this is probably the most critical rule to develop by:

Do not disappoint the user by leaving out simple capabilities that they have come to expect.

Case in point: The first version of my first application allowed the user to create workout routines, but it didn’t allow them to rename those same routines.  Oops!  As you can imagine this disappointed the users and led to bad reviews.  This is the cardinal sin for every app developer.  A disappointed, frustrated user is much more likely to leave you a bad review then someone who doesn’t quite agree with your choice of colors for the background or didn’t think that your icon really “popped.”  The reviews that you want to receive from your customers are of the sort, “It would be great if you added feature X…” not, “It is terrible that I cannot Y…”  Obviously, this is only partially in your control but not leaving out important features will go a long way here.

Far more important than looking snazzy (though this is important as well) is not deviating in a negative way from users’ expectations.  In short, if users expect a feature to be there, it should be.  The short list of requirements for the minimally viable app is as follows:

  • The app does not crash – The very first thing a user expects from an app is that it does not crash.  This is of course obvious but is far and away the most important feature of an app and the most difficult to attain, especially in Android with the litany of available devices and manufacturers.
  • Created data can be updated and deleted – If the user can create it, they should be able to delete it as well.  Likewise, they should be able to update it (rename it, change any of it’s important features etc.).  This means all of your CRUD (create, read, update, delete) operations should be defined in your data scheme and should be available via the user interface as well.
  • Data can be synced – If the user can save data that might be important to them, that data should be recoverable if they switch devices or if their device is lost or stolen.  As a bonus, it would be nice if that data synced across their multiple devices.
  • The app needs to have a unique icon – There is no way that I am aware of to get you app into a user’s hands without them first clicking on your icon.  It needs to look like it took someone with some skill more than 5 minutes to create, it needs to not be too busy, and it needs to convey what your app does.  People choose between high ranking apps based on their icons, and they would be silly not to.
  • The app needs to look good – It is very tempting to put this first and spend alot of time or money up front creating a beautiful looking app, and if you are going up against true professionals with large budgets, you are going to need to do this at some point.  But far more important than this is that the app not crash and not be missing obvious features. If you have the time and wherewithal to include an eye catching design in your application, this will certainly pay dividends in the success of your app. First and foremost it gives the appearance of a professionally developed application, but a nice facade on an app riddled with bugs will not get you very far.  On the other hand, a solid application with the default themes and styling at least has a chance to gain an audience.  At the very least, style your buttons and change the default colors of your themes.

With these minimum requirements, release your app and keep an eye on your ratings and reviews.  Fix bugs and add features based on what your users are asking for.  Re-release, rinse and repeat.

Tip – Hemingway Yourself Back Into High Gear

Have to leave the room for 10 min, an hour, two days (banish the thought)?  I’ve heard the Ernest Hemingway used to leave unfinished sentences on his typewriter if he had to walk away from his work.  That way  when he returned, he would be able to easily get back in the swing of writing.  I don’t really care whether this is true or not, because I think it is good advice regardless.  Before you leave, type something where you are working, such as a partially complete line of code or a note-to-self preferably in plain English but not in Java so that a big red error will appear in your IDE.  That way you will be able to pick right back up where you left off.

How to Know Whether It is Worth Your Time to Develop an App

How do you decide whether or not to develop the app that you have in mind?

To me this is basically deciding whether a problem needs to be solved, why it is you want to solve it and whether it is worth your time.

There are no hard and fast rules that tell you before hand whether your app will be successful.  However there are a few general keys that I like to go by:

  1. If you search the store and don’t find anything, that can be a bad sign.
    1. Maybe you are just using the wrong keywords, which indicates that you are either unique or that there is space available to rank for those keywords.
    2. It can also mean that no one has thought to develop the app you are looking for, but it behooves you to find some people with the particular pain point you are looking for before you spend your time.
    3. It can also mean that people have researched it and decided that there is insufficient market available to make it worth their time.  If you start to find that this is the case, walk away slowly.
  2. If you find a few apps that you think are poorly done but are still getting alot of downloads, this is a good sign.  Someone has thought this was a good idea (or multiple someones), and there is an opportunity for you to outshine them.  Be forewarned that ranking highly can take time, but it is totally satisfying.
  3. If you find a couple of really well made apps that don’t rank that well, that’s still good news for you.  Maybe the developers are not managing the apps well and not optimizing them for the same keywords you are searching for.
  4. If you find several really nice apps that do rank well, then you have some soul searching to do.  Is there a unique value proposition to your app or a reason that you think you can develop an app better or more useful than these?  If you think you can run with the big dogs, then by all means, give it a shot.  But it is not going to be easy, and you are not going to be making a return on what is going to be a significant investment for quite a long time.
  5. The holy grail is the underserved, highly searched keywords.  Perhaps this is the unicorn of app development, but it is what you are striving for nonetheless.

For researching app store keywords, tools like Mobile Action and Sensor Tower are indispensable.  Mobile Action is my favorite because it allows you to get your feet wet and to get some actual value for free.

How Do I Know When My App is Ready to Launch?

An Unexpected Dilemma

To the uninitiated the answer to this question might seem obvious, but in reality it is not.  Every app launches with bugs.  Every app launches with an app description and an icon that could be better thought out and further tested.  Every app launches with features missing that at least a segment of the user population would gain benefit from or are annoyed in their absence.  So this is a very relevant question indeed.

Faced with these issues and the fact that most solo or small company app developers do not have a strictly defined timeline for app development and release, it can be difficult to decide when the time is right.  So I have developed this list of questions:

# 1 Are you ready to share the app with close friends and family?

If so you are at least ready to release a beta version of the application for testing.  This is true whether you are releasing your first app as a hobby or whether you think you have the next Uber on your hands.

# 2 Are you ready to share the app with your extended network of friends?

Is this still true even if in the back of your mind they are more likely to judge you than to accept and support you?  If app development is a hobby or side hustle for you, you are probably ready at this point.  Politely let everyone know why you have been a recluse for the last 6 months and ask them to check out your work and provide their honest feedback.  Don’t badger them, and you will be surprised at how helpful and supportive they can be.

# 3 Are you ready to pay money to market this app to the general population?

If yes, you have a strong indication that you are ready for launch.  Be smart though and don’t sink your life savings into an unproven venture.  Make you marketing moderate and carefully targeted with an eye toward ranking for your top keywords so that your investment has strong downstream effects in the long-term.

A Justification for all of This Subjectivity

If you have noticed, these questions all stem from your subjective comfort level with the app rather than from some objectively defined criteria.  The fact is there is no such set of criteria that applies to all apps and all situations, and before release no one is more familiar with your app than you.  Further, if you are not willing to answer these questions in the affirmative, then you are not likely to make hard decisions or do the timely work that it requires to make sure your app is a success all the way to the finish line.  You will evade the difficult tasks and may not take full ownership in the consequences, feeling safe in the knowledge that the app was not your best work and not ready for prime time from the beginning.  Responding to frustrated customers is hard enough for something that you believe strongly in.  If you are not properly prepared, it can be very easy to give up, admit defeat and move on to the next project.

If you answer question 3 in the affirmative, be careful that you can also answer yes to 1 and 2.  In some ways it is easier to push an app out to strangers that you would not share with people you haven’t seen since high school.  It is surprisingly easy to hide in the comfort of the obscurity provided by the enormity of the app marketplace.

If you are asking yourself or your team this question, take a moment for some soul searching, and remember to always keep moving forward.

Tip – Resist the Temptation to Put EditTexts Inside ListViews

You may be tempted to put EditTexts within ListViews.  In some very rare instances, this may be a good idea (if the data to be entered is very short, like a number or a phrase). However, it is quite difficult to code and is cumbersome on medium to small screens.  Resist the temptation and opt instead to put data entry in a dedicated dialog, fragment or activity.  This is a common theme of things I have found in Android:  If the designers didn’t make a solid plan for it, and I needed to do alot of thinking/hacking in order to make it work, then it usually turned out to be a bad idea in the first place.  You can have one of two mentalities:

    1. You can buck the trends and assume that the developers at Google are stupid and not paying attention and that you know better (occasionally you might).
    2. Or you can get with the program and save yourself a ton of headaches.

The Perils of Hunt-and-Peck Style Programming

My grandfather is 81 years old, and he can hunt-and-peck on the keyboard with the best of them.  That’s fine for him.  He didn’t learn to use a computer until he was in his 70’s, and he is getting along just fine.  However I would not recommend to my nephew that he learn to type without a systematic understanding of the keyboard.  As I explained in my last post, it is not best practice to jump right in to the development process.  It is very easy to learn enough to be dangerous (to yourself and others) and go down the following path:

  1. Download Android Studio
  2. Go to Stack Overflow and ask:
    1. What does onCreate() mean?
    2. What is a Fragment?
    3. How do I make a button do something when I click it?
  3. Copy and paste the resulting code into your project and change the variable names.
  4. Smoke test your application on the emulator or on your device.
  5. Read the Stack Trace and paste the error into Google
  6. Rinse and Repeat

Knowing the Grammar of the Android Development framework will go a long way towards speeding your applications development, just as learning to type without looking at the keys will help you bang out that crime novel.  Don’t fall into this trap.  Learn the fundamentals of Android development and get off on the right foot.

Tip – Draw Everything Out on Paper

Draw everything.  Got an idea for a new app?  Sketch out the screens and how the activities will work with each other.  What data will be stored and how will its components be related to each other and to the user interface?  Want to switch up the design of an app you have currently?  For Pete’s sake before you start writing code, sketch out the new layout.  Just as importantly keep these drawings in organized storage to refer back to later!!! This will save your bacon when you come back to make updates after 3 months of working on something else, because I almost guarantee that the code you wrote is not as intuitive as you currently think.

Don’t Just Jump Right In to Android Development

This is going to be controversial, but if I could give you just one piece of advice for starting out on your mobile app development journey it would be this:

Don’t jump right in to the development process.

I am a firm believer that the best way to learn is by doing – by involving yourself in a project and getting your hands dirty.  So my advice may seem paradoxical, but having gotten myself out on the wrong foot, I can testify that obtaining a minimum level of proficiency in Android development skills is essential in reaching your goals.

As lifehackers and self development gurus have noted, there is a distinct difference between Just-in-case learning and Just-in-time learning, with the later being considered (rather naively in my opinion) the hands-down winner in terms of efficiency and effectiveness.  As usual, it is prudent to take a more nuanced perspective.

There is a trade off between Just-in-time learning and Just-in-case learning.  A delicate balance must be struck in programming, because not knowing the fundamentals can really waste your time and/or get you in trouble.  On the other hand, you can easily delay getting started by reading just one more blog post or doing just one more tutorial just in case it might contain something you might need to know.  The best strategy is to learn the basics, then jump in to a project and figure out which of the details you need to pick up along the way.  Trust me, you will thank me for this tip!

It is attractive to think that you can download the Android SDK, watch a couple of tutorials, download and peruse a handful of samples, and get started building your own applications.  You can certainly do this, but what you create is going to be a messy, confused, hacky peice of crap that isn’t going to do you much good in the long run.  If you are a persistent person who has a hard time letting go of bad investments, then you are going to want to fix this Frankenstein monster as you slowly and painfully learn by experience the right way to do things.  Don’t get me wrong, no matter what you do you are doing to end up with a mess on your hands, but this one is going to be hard to move on from.

In reality there is a system of knowledge, that once you have it, changes the way you absorb the information that you are presented and vastly improves your ability to integrate it into your development repertoire. In the language of the medieval Trivium, you must first understand the Grammar associated with Android development before you can properly understand the Logic and subsequently synthesize an application (Rhetoric).

This is a list of what I consider the minimum requirements for getting started developing android applications.  This can be thought of as the Grammar:

  • Java – I highly recommend buying a book and/or going through the lessons and tutorials on howtoprogramwithjava in order to get started.  You need to be able to answer at least these fundamental questions:
    • What is Object-Oriented Programming?
    • What is a Class?
    • What is a method?
    • What is meant by the following terms?
      • Static
      • Protected
      • Private
      • Public
      • Package
      • void
      • null
      • String, float, int, double, List, Map
    • You need to know what these magic words can do:
      • if/else
      • switch/case
      • for
      • while
      • break
      • return
  • XML – You should know in general how it is structured and specifically what it is used for within Android.
  • Android – On Top of Java and XML sets the Android system, which integrates these two into the actual application.  You should be able to answer these questions before starting out.
    • What is the manifest and what does it do?
    • What is the relationship between the Java files and the XML files?
    • What is an Activity?
    • What is a Fragment?
    • What’s the point of the strings.xml file, and why should I put strings there instead of hard-coded into my application files?
    • What is the application lifecycle?
  • Android Studio – I highly recommend getting started with Android Studio instead of Eclipse.  You should at least know what Gradle is and how the associated files are used to manage your apps dependencies and how you can incorporate different build variants of your application.

You also need to know where to go when you get stuck.  First of all, and I realize that this sounds low-tech, I recommend buying a book to learn the basics of Android development.  My personal favorite is The Big Nerd Ranch Guide, but there are many great ones out there I am sure.

The Google Documentation is a very helpful place to start and is the definitive source for information about Android Development that gets better every time I go there.  But do keep in mind that you need to know the basics of Java and XML in order to comprehend the documentation.  Be careful of the Reference documentation, which is well and good for those who know very well what they are doing and nearly useless for the beginner.

Stack Overflow is a powerful tool and a terrible master.  Use it wisely.  It is the definitive place to go if you know the ropes pretty well but have a very specific problem that you are trying to solve.  I myself have been there hundreds of times, and without fail, someone has already asked the question that I am looking for.  The major caveat with Stack Overflow is that, by its nature, it is not an integrative approach to solving your particular problem.  If you don’t fully understand the code solution that is presented there and blindly paste it into your app, get ready to experience some problems sometime between today and 6 months from now when you have forgotten the details of the problem.

I also highly recommend bookmarking a few tutorial sites for your reference.  Vogella is my personal favorite, but again there are many good options out there.