How to develop an app without any skills ?

Adhithyan Vijayakumar
codeburst
Published in
11 min readJan 12, 2018

--

“Life has thrown you for a loop, encouraging you to break free from old patterns and ways of being. So why be predictable in your responses and in your actions?”
- Stephanee Killen

Here’s my story from having an idea for an android app to designing, developing and marketing it. In every phase I got stuck in a loop and came back to the same point again and again. But with my sheer determination and never give up attitude, I broke it every-time.

Infinite Loop 1: Procrastination

I found very difficult to read news of Marketing, Finance, Economics and Tech in one place. For Marketing I followed blogs like Hub spot, MadOverMarketing. I used to follow Bloomberg for Finance.

There is no dedicated app for reading exclusive management related news. So, I thought lets make one and curate news from the sites people loved to read. I decided to make an android app, because I don’t own a mac or iPhone to do iOS development.

I shared this idea with a close friend of mine. Let’s call her X.

I kept on postponing the development work for no valid reason. I was so lazy to code. It was a phase of my life where I didn’t do coding for about 3+ months. After few weeks, X got to know I didn’t started to code the app. X was furious and to escape from X’s wrath, I started to code. Coding is lot more easier than arguing and winning the argument with X.

Source: izquotes.com

If you have an idea and you procrastinate, get some motivation. Read books or get surrounded by some amazing friends who keeps pushing you out of your comfort zone.

So X started and ended the loop 1. Time taken to break the loop 1–1.5 months.

Well, you may think there are plenty of news apps out there, and I set out to make one? Does this problem even exist? Sounds like a bad idea dude! I hear your mind voice.

Being a Steve Jobs aficionado, I love this quote. So having an idea backed by this wonderful saying, I immediately dived to code. Without any research, I started to code. I thought that millions of people will download the app. But it proved me wrong. May be the quote works well for established companies. It does not apply to an independent coder like me with no marketing budget, trying to make big. Let’s go to this part later.

It was first week of May when furious encounter with X happened. Within 2–3 weeks the first version was live on Play Store. The User Interface (UI) of initial version was so ugly that I didn’t even had the courage to share the app among my friends.

Infinite Loop 2: Fear of failure, Fear of rejection

But, I shared with X , who insisted me to share in our class WhatsApp group. (FYI: I am a final year post grad management student). Whenever X insisted, I kept on saying excuses. One fine day it turned into a heated argument and I decided to revamp the app to escape from X’s wrath. Again, X started the loop.

This was during November and without any promotion, my app got 70+ downloads with 15+ active users. So my app had takers though it had a bad UI. Thank you guys! You people are awesome.

Google play console statistics for version 1

I decided to do my own icons and drawables, since I wanted to have full control over design. And yeah ! Finally, I decided to learn Photoshop, which was on my to-learn-list for so long. I googled for Photoshop tutorials and all were in bits and pieces. On the way I stumbled upon Udemy and enrolled in a Photoshop beginner course. Eureka!

From giving the design contract to a freelancer to doing my own design

I enrolled the course for $10. Before, I contracted a freelancer on Upwork to make a launcher icon for $20. So the Udemy deal was perfect for me. The course was great, I learnt the basics of Photoshop. After 2–3 days, I came to know that the course was intended for retouchers and photographers. I didn’t check it out while enrolling. Still I would recommend it to anyone who wants to learn Photoshop. It is a very good course to learn the basics of Photoshop. I enrolled based on it’s popularity in Udemy.

So I enrolled in another course for $10 to put my skills to practice. These are the courses that I enrolled in Udemy :-

  1. The Platform’s Biggest & Popular Photoshop Course
  2. Photoshop for Entrepreneurs — Design 11 Practical Projects
Play Store Banner

This is the banner of app shown in Play Store. I designed after a week of taking both the courses. ( Still I didn’t complete both the courses). Without the above courses, I wouldn’t have done it. Guys, if you wanna learn Photoshop do check out the above courses.

Now I decided to draw inspiration for UI and User Experience (UX) from Inshorts app. It is an great app. The core idea of this app is very simple which is reading a news article in less than 60 words thereby saving time. Do check it out.

The design philosophy of Inshorts app is :

  • Show article image at the top, followed by article.
  • Swipe right to read next article.
  • Pull up from bottom to the read the original version of article.

I decided to follow the same pattern in my app.

Show article image at top, followed by article

Using Google, I learnt that it can be achieved by CollapsingToolBarLayout with NestedScrollView. This was the easier part. I did it without any difficulty.

Swipe right to read next article

I added an OnTouchListener to the layout for achieving the functionality. NestedScrollView and OnTouchListener clashed a lot. So I was not able to achieve this functionality. For one article swipe right worked. But for other when swiped right, the article scrolled down. It didn’t go to the next article. After googling and checking Stackoverflow and making all the changes, I was not able to fix it. So, I scraped this functionality.

Pull up from bottom to read original version of the article

Due to NestedScrollView, pulling up scrolled the article upwards. Again, I scraped this functionality.

So I placed 3 buttons at the bottom. One to view the article in browser. One to share the link to article via SMS or Whatsapp. Another one to read next article.

Previous version UI — Screenshots.

In previous version, first the article titles and short description will be displayed. When the user taps on a card, the article will be shown in a WebView. This is old school right. Trust me, this was my design sense before 6 months.

Drona current version — article reader screenshot

This one is the screenshot from current version of app. And yes ! I have used a custom font the make the text reader friendly. I simplified the two stage process for reading an article to one.

Where are the 3 buttons you mentioned? I can’t find it in screenshot. Go ahead and give the app a try to experience yourselves.

Again X started this loop . I pushed and challenged my selves to break it by learning new things along the way. Time taken to break the loop: 15–20 days.

Whenever you don’t have the courage to show something to the world due to fear of failure, fear of rejection, remember the following :

Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked.
- Steve Jobs

Loop 3: Getting stuck in a problem

After finalising the article reader, I decided to pre-fetch next article. When user taps next button, news article can be shown immediately without loading. This part took lot of time.

First I used a normal thread with a AsyncTask to load the first article. I showed a ProgressDialog during loading. Using Crux library, I extracted title and body from url. Crux is an opensource library that extracts title, body and image url from a webpage. The extracted image url was loaded into CollapsingToolbarLayout using Picasso. It is an opensource library for image downloading and caching.

I showed the first article to user. Then I called the extractor for second article from another Thread more like background fetching. If user tapped next, before completely fetching next article, Application Not Responding (ANR) occurred.

As a work around, I showed a ProgressDialog till the next article gets loaded. Again it lead to another bug, the ProgressDialog was shown for some and it was not shown for some articles. Also, ProgressDialog got stuck at final stage of extraction, leading to ANR.

anr : input dispatching timed out (waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. wait queue length: 30. wait queue head age: 5515.0ms.)

The above was the ANR dump I obtained from logcat. Googling the same lead me to Stackoverflow threads of ANR. From a series of chain links I landed up on the official documentation of ANR.

Reduce memory leaks.

Don’t keep so many global variables.

Move the resource consuming, non blocking, asynchronous operations to separate thread.

The above were the solutions found in many articles to fix ANR. Unfortunately these didn’t solve my problem.

List of things I did to fix ANR:

I changed from Thread to Runnable. This time there was no ANR but the app crashed straightaway.

So I moved to RxJava and RxAndroid. I found some success with this. But again the ProgressDialog got stuck but not to the extreme of Thread usage.

This went on for a week and I enrolled few of my friends for beta testing. They all reported the ANR while going to next article. I have 4 categories in app and all reported ANR in one category. Rest of the categories worked fine. The ANR occurred for me in more than one categories while testing in simulator. But I didn’t find any ANR when I tested in my phone (Oneplus 5t).

I created a very low spec device in Android Virtual Device (AVD) manager with around 700 MB of RAM. Finally, I was able to reproduce the bug reported and ANR occurred in the same category as reported.

I added reading time because I was very fond of it and it fixed a bug for me.

Long back I added a util code to calculate reading time for an article. Whenever an article is loaded, Snackbar will appear showing the reading time. I found a wonderful javascript library to calculate reading time in Github and I ported it to Kotlin.

I found a correlation between reading time and ANR. There was no ANR for articles with less than 2 minutes reading time. So i thought that the extraction process took more time. But this was not the case, since the extraction was done in a separate thread. Only setText was called in UI thread. So I came to a conclusion that setText was the problem.

To confirm, I did the following things :-

  • For all articles I set empty text. There was no ANR.
  • Articles which had less than 2 minutes reading time was set with the original body. For other articles empty text was set. There was no ANR this time also.

So, I checked the code to find that I was using a opensource library JustifiedTextView. I used this view for article body. The justification process caused the ANR.

The extracted body text contained HTML tags. So I converted to plain text using Html.fromHtml() method and then I was setting the body text. I wanted do this in single step. I found a opensource library HtmlTextView and I replaced two steps of my code with a single step. After testing, there was no ANR and I was so happy that I fixed it.

Sourced from imgflip.com

Never give up attitude and perseverance broke the third loop. Time taken 1 week.

Why do we fall? So we can learn to pick ourselves up. — Alfred

Loop 4: Venturing into unknown territory

At this point, my app was perfect. So I uploaded to beta. After few days I moved from beta to production. Now, I can’t make excuses to X. I went ahead and shared with my class WhatsApp group. This got me 30+ downloads with few reviews and ratings.

The next step was to share with my family and relatives but they were not my intended audience. So I posted to my Facebook and also wrote 3 Quora answers.

The above got me roughly 20+ downloads and 20+ upvotes to my quora answers.

Ideas are cheap. Ideas are easy. Ideas are common. Everybody has ideas. Ideas are highly, highly overvalued. Execution is all that matters.
- Casey Neistat

Meme generated using imgflip.com

1 week passed by and the organic downloads were not increasing. It was almost 1 to 0 downloads per day after the social media activity diminished. So I decided to grow inorganically. I signed up with a popular vendor and before spending few bucks I wanted to test their effectiveness. I launched a trial campaign, within 30 mins they claimed that 50 downloads were completed. I had no tracker in my app. So I was not able to verify their claim. I decided to wait 2 days, so that I can verify it in Play Console.

I verified and found their claim was true. The console cited the source to be the same vendor from which I launched the campaign. I got 40+ downloads and 40+ uninstalls in the same day. I got heart broken. Thank God! I didn’t spend even a penny. This is not what I wanted. No developer actually likes this kind of scenario.

No of installs on the campaign day
No of uninstalls on the campaign day

I am currently in the loop because marketing is new for me. I am exploring this space and I will break it soon. This article is one such attempt to break this loop. Cheers!

The source code is available in Github. If you like my work, kindly star the repo. Contributions, pull requests are welcome.

This is my story. If you have a similar story, let me know in comments. The best way to learn any skill is by practising it.

The best way to learn is by doing. The only way to build a strong work ethic is getting your hands dirty.
- Alex Spanos

--

--