100k App Downloads Later: Advice for New App Developers

Last month I reached a significant milestone for my Android portfolio by surpassing 100k app downloads across my Google Play account. I’ve been publishing Android apps to the Play Store since 2015 and working on Android projects since 2014 – giving me nearly 5 years of experience with the platform.

The milestone got me thinking about my early projects and how awful they were, along with all the lessons I seemed to love learning the hard way to reach the point where I’m at now. While I still have considerable room for improvement, I wanted to share some of the lessons that I really wish I would have learned sooner.

Hopefully if you’re thinking about getting started in app development, or have already started but are stuck on some of your projects, these tips will spare you from making some of the same mistakes that I did.

General App Development

Picking A Project Idea

Something that often goes unsaid about making apps is how to come up with a good idea that people will actually use. It gets even harder when you consider the fact that there were more than 3.5 million apps on Google Play in 2017 – so it’s really difficult to come up with a unique idea.

For a long time I waited to get into app development because I kept saying to myself “oh well there’s already an app for that”, or “oh I couldn’t do that – I have no idea how I would build it” or even the “I want to make an app but I don’t have any good ideas right now”. Those were huge roadblocks for me, and I think they are for a lot of other people too.

The truth is that you just need to start working on something – anything – and to keep trying. Just because someone else already created an app for something doesn’t mean that you can’t do it better or in a different way that people might like. You can easily find a lot of stories about people who have made music player apps which even though there were already hundreds on the app store, theirs rose to the top because of a superior feature or UI. Sometimes having a saturated niche can be better than one that’s brand new because there will already be a lot of people looking for that kind of app. So if you can find a way to stand out from the competition, your app has a chance to really succeed.

When it comes to concerns about technical ability, it’s important to keep in mind that everyone has to start somewhere. My very first app was called “African Drum Simulator” and allowed you to push buttons to play notes from different hand drums. My second was a loan payment calculator – about as simple as it gets. My 3rd app “pixelates” an image from your gallery for you. Looking back, those apps are honestly pretty terrible but the point is I just kept practicing. My advice is to continuously work on projects that are just outside what you already know how to do. As you finish more and more projects, you continually build on your knowledge and after a few iterations suddenly a project idea that previously seemed really difficult and complicated is now trivial to you.

Last but not least, what do you do if you’re stuck and can’t even think of an idea in the first place? My advice if you’re stuck here is to think of apps that you or a friend would want to use. I built my series of state lottery scratch-off apps because a friend frequently bought scratch-off tickets and was having a hard time picking out games to play. The benefit when you or a close friend is a stakeholder for your app idea is that you can very quickly come up with ideas and features – and you have an easy way to get early feedback about your app.

Perfection is Less Important Than Timing – Release Fast, Iterate Fast

The next lesson I wish I learned sooner is that timing can be really REALLY important. This point is specifically for app ideas that might be in a more trendy niche. I’m going to use my cryptocurrency conversion calculator app CryptoConvert as an example.

I came up with the idea for CryptoConvert originally in August of 2017. I started working on the app shortly after, but didn’t actually publish it until a few months later in December 17th, 2017. Even then, I didn’t update it again until January 27th, 2018 – over a month later.

Here’s why the timing is so important. In 2017, “Bitcoin” was one of the most frequent searches on the internet. Everyone was talking about it and by extension, cryptocurrencies as a whole. In fact, “Bitcoin” was the #2 ranked Global News search term on Google in 2017, and ranked in the top 5 in of other categories like “How To…”. In the United States specifically, it was in the top five search terms for three additional categories.

Now if we map out the timeline of “bitcoin” as a search term on Google for the past 2 years and overlap my timeline of events with CryptoConvert, we can get a really clear picture about what I could’ve done better:

While working on CryptoConvert before it’s initial release, I distinctly remember thinking to myself that I could be working a lot faster. At the time I was only working on it a couple hours here or there but realistically I could’ve finished it in just a couple weeks if I had really put the pedal down. As you can see in the timeline, I released CryptoConvert right on the biggest search spike in the past 2 years. The problem is that it takes time for an app to start ranking for searches (some sources like apptamin.com say as much as 2 weeks). Ideally CryptoConvert should’ve (and could’ve) been on the store weeks before this spike instead of right in the middle of it. Hindsight is certainly 20/20, but the lesson here is that I knew I could have worked faster but didn’t, and lost out on a big opportunity because of it.

An equally egregious mistake that I made in my timeline was that I waited over a month before publishing the first update after release. Here’s some quick context before I talk about why this was such a mistake. CryptoConvert’s initial release was relatively bare bones, which was a conscious decision on my part. I wanted to get the most basic functioning product live on the store so that it could start ranking for different search terms and start collecting feedback before I added the more intricate features that I knew would be really time consuming.

Actually if there’s anything I did right in this timeline, it was that – releasing a relatively bare-bones (but very functional) app first, and then adding the bells and whistles later with updates over time. By doing this, it allows your app to start ranking for searches, gaining downloads, and collecting really valuable user feedback. If I had waited to release CryptoConvert until after I had finished all of the content that was included in the first update, then I would’ve basically missed that huge spike altogether. Basically I’m saying that in this scenario, I did the right thing by taking a more agile approach.

My mistake was that I waited over a month before publishing the first major update with all the “bells and whistles” when if I had released it faster, I could’ve possibly retained more of the users that I gained along that search spike. If I could have picked a more ideal timeline (that’s still realistic with what I could’ve accomplished during that time), it would’ve looked something like this:

Code

Don’t Reinvent the Wheel

When you’re building your app, you generally want to avoid spending time solving problems that other developers have already solved. The way you do this is by using third party libraries – tools and solutions that other developers have already created and shared. If you’re in need of a component that does something (be it load an image, make a network request, open a drawer view in the UI, prompt the user for a review, etc), you should do a quick search to see if there’s a good 3rd party library already available for you to use.

Say for example you were trying to display an image in your app from an online source. You could write all the code to go out and fetch the data, build the image, and load it into your view all by hand. Alternatively, you could use a library like Glide or Picasso to do all that work for you. You’d also have access to plenty of extra features like the ability to scale, crop, or cache the image – or even to specify a fallback image if the network fetched image fails. A simple dependency added to your build file and a snippet of code to load your image and you’d be all done.

There are plenty of other great examples of libraries available for you to use. I’ve already mentioned Glide/Picasso, but here are a few more of my favorites that I use in almost every project:

GSON – A library used to serialize and deserialize Java objects into JSON. Built by Google, GSON is really useful for working with APIs. It allows you to even read JSON objects as a stream, which is really useful in mobile development.

OkHttp – A library to simplify HTTP requests (built by Square). Keeps your stuff loading faster and saves bandwidth. Also will silently recover from common connection problems.

Retrofit – Built on top of OkHttp and is extremely useful for making Rest API calls. It basically turns your Rest API endpoints into a Java interface (also built by Square)

Third party libraries save you a ton of time because each library is one less piece of your app that you need to build and maintain yourself. They often save you even more time because libraries (the more popular ones at least) are generally well tested and maintained – which are all fewer things you need to worry about.

One of the last major benefits I’d like to touch on is that libraries keep your code modular. They automatically keep components of your app separate from each other, which keeps your codebase neat and compartmentalized.

As with anything in the software engineering world, the choice to use a 3rd party library is often debated. I would like to point out some of the reasons why you might not want to consider a 3rd party library for your app.

Firstly there might be some licensing concerns that you’d need to pay attention to (especially if you are selling your app). You are using someone else’s code in your project after all, so pay close attention to the different types of software licenses.

It also may be the case that you might need a feature that’s not supported by any library that you’ve been able to find. Your only solution might be to build something fully custom if you have a very specific use case. You could also I suppose want to build it just for fun, or because you think that you could write it better.

Last but not least it’s worth mentioning that a 3rd party library is pretty much completely out of your control. If the library suddenly changes or is no longer supported and it breaks your codebase, you might find yourself in a lot of trouble. Instead if you’ve written and maintained your own, you’ll never face that issue.

There are certainly trade offs to using third party libraries, but by and large when you’re first starting out I think it’s worth it to just avoid reinventing the wheel when you can, save yourself some time, and use some of the really popular 3rd party libraries until you gain enough experience that you investigate using more custom solutions.

Don’t Skimp on Testing

One of the things that you can’t avoid to cut corners on with your app is testing. If people are using your app but you push out an update that breaks everything for them, a lot of your users are likely going to uninstall and leave a terrible review for your app. It’s considerably harder to get positive reviews than negative ones, so it makes getting any negative reviews that much worse. A lot of the time, all it takes to avoid catastrophic issues with your apps is to put a little extra effort into your testing.

You’re going to want to test everything about your app. Write unit tests for your code to make sure everything still functions properly at that level. Write some UI test cases with Espresso. Go through your app on a handful of physical devices (buying some older test devices on eBay, Craigslist, or LetGo isn’t a bad idea). Even after that, use the emulator that comes packaged with Android Studio to test your app with a variety of different operating systems and network speeds and signal strengths (3g, Edge, 4g, etc) as well as different screen sizes / densities to make sure your app renders properly. It’s both a blessing and a curse that the Android ecosystem has so many different devices and operating systems in use.

I know testing is a bit of a pain sometimes and can feel like overkill, but it really is worth the effort in the long run. Here are a few libraries and tools I’ve found that make it a little bit easier:

Android Debug Database – Allows you to view your app’s databases and shared preferences directly in your browser. This gives you a much clearer picture of how your databases are structured and makes working with them significantly easier.

– Allows you to view your app’s databases and shared preferences directly in your browser. This gives you a much clearer picture of how your databases are structured and makes working with them significantly easier. Android WiFi ABD – Will allow Android Studio to quickly connect to your physical test device over WiFi to install, run, and debug your apps without a USB cable.

– Will allow Android Studio to quickly connect to your physical test device over WiFi to install, run, and debug your apps without a USB cable. Leak Canary – Built by Square, Leak Canary is a memory leak detection library for Android. Memory leaks can cause apps to run sluggishly and become unresponsive. Sometimes memory leaks can be hard to detect, but Leak Canary does a great job.

The last point I want to make is if you use any network services that you pull data from, it may be a good idea to have some way of being alerted if that ever changes or goes down. This actually happened to one of my apps once. The API I was using suddenly changed without warning (no email, no newsletter, not a single notification) and it broke my entire app. What’s worse is I didn’t find out about it until a little over a day later – and then I had to scramble to fix it and publish an update. This means that any new downloads I received in that time became immediate uninstalls. Also all of my existing users were locked out of the app, which when that happens is a great way to get even your most loyal users to quit and uninstall.

I’m glad I caught the issue within a day instead of within a week, but my response time could have been much better. After the incident, I realized that it’s good practice to set up a process where you can be alerted as soon as something goes down – either by a custom tool or by using something like Jenkins.

Marketing and Advertising

Expand to Other App Stores – It’s Free and Easy

Both Google Play (previously called the Android Market) and the Apple App Store have been around since 2008. This has allowed for millions of apps to accumulate on each store for well over a decade.

Because of that, it’s difficult to stand out on either of the main app stores. There are some extremely well-established niches like music players or alarm clocks with hundreds or even thousands of results – so how is your app ever going to be seen?

One thing I recommend doing is to search out some alternative app stores and publish your apps on those. The 3rd party app stores often are much smaller markets which means that your app will have a much more significant chance of standing out and getting noticed.

While the traffic to 3rd party stores is only a fraction of what Google Play or the Apple App Store receive, they still see millions of downloads across them and can be a significant source of users for any of your apps.

There’s also very little downside to publishing on 3rd party app stores. Not only do you expand your market to new users that might have otherwise not found your app, but it also increases your general web footprint of your app which is great for your overall marketing. It’s also usually free to publish on these stores and generally requires very little extra work to tweak your store listings to match.

Some of the biggest 3rd party app stores are the Amazon App Store, Aptoide, and APKPure, but there are plenty of others out there that are worth examining.

Here’s a list of over 20 different 3rd party app stores complete with some links to the developer resources you’ll need to sign up and start publishing.

Paid Marketing Can Work, Free Is Better, but Both Are Better Than Nothing

When you first release your app to the Play Store, you may see only a handful of downloads trickle in over the course of the next few weeks. Your description might be great and cover a lot of significant keywords, your app could be super useful and well-built, and maybe even your store listing graphics are really compelling. So why so few downloads?

Well, the important thing to keep in mind is that it will generally take a couple weeks before you start ranking in the searches for your targeted keywords. The other thing is that your app will have so few downloads and so little community feedback that it’s just really far down in any search results that it does rank for.

Generally the organic downloads you get from app store searches will come with time, but until then you need to strongly consider some different marketing strategies to give your app the download boost it needs. You probably already knew that, but with my first few apps I definitely did not and I put zero effort into marketing until I learned better.

There are a plethora of different ways to market and advertise an app, but generally they’ll always fall into one of two categories: paid, or unpaid. My goal isn’t to provide a comprehensive guide on how to market or advertise your app, but I hope to at least get you thinking about it so you can come up with a strategy that’s right for you.

PAID

Paid advertising is exactly what it sounds like – you pay money in order to get your app in front of an audience. It can be as direct as sponsoring an online influencer like a YouTuber, Instagram personality, or a blogger to post about your app to their audience. It can also be like setting up an online ad campaign with a network and running ads for your app to a target demographic (most likely people in your niche).

On one hand, paid advertising is one of the best ways to get your app in front of a chosen audience. On the other, it requires resources that you may not have when you’re first starting out. Let’s say you run an ad campaign of $5 per day for your app. Over the course of a month, that’s generally about $150 – which is not a small sum of money. Or if you’re working with an influencer to do a sponsored post about your app, the larger their audience, the more it will cost you.

If you have the resources to invest in some forms of paid advertising and you don’t mind spending it, then I highly recommend you go for it. Another thing you can do is take whatever revenue your app makes and directly invest it back into an advertising fund. Let’s say your app makes $1 a day, then after a month maybe you have enough to buy a sponsored post from an Instagram influencer. Or maybe if you make $5 per day from your apps, you can run an ad campaign with a $5 per day budget.

If you do go with a paid ad campaign, here are a few of the most popular networks you can use:

Google Ads – Google ads is extremely easy to set up – which is one of it’s biggest benefits. I’d recommend starting out with a universal app campaign.

Facebook Ads – A great option if you want to target a very specific audience with your advertisements.

Bing Ads – Free access to their support – who will help guide you through setting up an ad campaign. The support staff is amazing, and right now they have a promotion to get $100 in free ad credit when you spend $25.

FREE

While paid advertising is great, you are entirely limited by how much you can spend on it. There are plenty of other free options that you can (and should) explore simultaneously. With any free marketing strategies, you’re only limited by the amount of time you can spend on them.

Here are a few ideas for some “free” marketing you can do for your app:

Send out emails to writers at different app review blogs and ask if they’ll review yours

Find bloggers in your niche and see if they’ll review or write about your app

Find your niche on social media networks like Twitter and Instagram and become active

Look on YouTube for any content creators who might be a good fit to talk about your app in a video – message / email as many as you can find

Go to different app review exchange Facebook groups and try to get some early reviews

Ask your friends to download and review your apps

There are plenty of other strategies you might think of but this should help you get started. Regardless of whether or not you have the resources to do a paid campaign, you need to at least be implementing some sort of free marketing plan for your app. Do it in your free time instead of browsing Facebook. Do it while you’re watching a Netflix show. Allocate 30 minutes of every day to it – whatever works best for you and your schedule.

If you rely entirely on organic search to fuel your app’s downloads instead of actively marketing it, you’re relying on a lucky break rather than putting in the work to make something happen.

App Store Optimization

App Store Optimization (ASO) is the process of optimizing an app’s search rank on a given store. This applies to any kind of app store be it Google Play, Apple’s App Store, the Amazon App Store, or any others. While there are slight tricks to optimize each different store, there are some general principles across all of them. Here are a few of the things I really wish I had learned sooner with regards to ASO.

You Can Never Have Enough Ratings and Reviews

When I first started publishing apps, I knew that ratings and reviews make a significant difference in how well an app gets ranked on the store. It makes sense that the more ratings (and higher ratings, as well as more recent ratings) and app has, the higher it should be ranked in search results against it’s competition. What I didn’t realize is that you will pretty much never “have enough” ratings and reviews for your app.

Online reviews (for any type of marketplace) are a form of “social proof” for a product, meaning that the more people have tried something and rated it, the more likely other people are going to think that it’s a good product and try it as well. There has been a very well-documented “popularity bias”. In a recent study by the journal Psychological Science and reported on by Quartz, researchers showed participants 2 Amazon products with identical 3.1 star ratings. One product had 29 reviews, the other had 154 reviews. According to the statistical model generated as part of the study, there was only a 40% chance that the more-rated product was actually the better one, however 90% of the study’s participants would still choose it. So it’s not just enough for you to have X number of reviews and call it a day, but it’s extremely important to have more reviews than your competition.

Even though that study was conducted on Amazon products, the principles still apply to other online marketplaces like app stores as well. What this means is that if a user finds 2 competing apps on the store that basically do the same thing and they have the same average rating, they will be roughly 90% more likely to choose the app with significantly more reviews.

Therefore the more reviews you have for your app, the more likely people will be to choose it over your competition (even if your competition’s app may be the better one). Alternatively, the more reviews your competition has over yours, the more likely someone will be to download that app over yours even if yours is the better product.

As it turns out it’s actually rather difficult to get app reviews, and the vast majority of apps on the Google Play Store don’t have very many at all. According to AppBrain, 63.8% of all apps on Google Play have between 0-10 ratings. Furthermore, 86.6% of all apps have less than 100 total ratings.

So fortunately it wont’ take much for you to stand out from the majority of apps, but if your niche is really competitive and sought after, you’re really going to have your work cut out for you to get more ratings than your established competition.

I recommend you still follow the best practices when you try to earn your reviews and that you avoid “pay for review” sites or spamming your users with pop-ups asking for reviews. In a followup blog post, I will go over some of my tips on how to earn more ratings for your apps.

Invest in High-Quality Graphics, and Keep Iterating

When I published my first Android app to the store, I didn’t put much time or effort into the screenshots I used. I simply took screenshots of the different pages in the app and uploaded those (intending to adjust them at some point in the future). I fell into this trap where I figured that the app would speak for itself once people downloaded it and that it was more worth my time to improve the app itself than the marketing materials.

What I didn’t really consider was that my app’s quality would only matter once I’ve convinced someone to download it in the first place. If my screenshots and other store listing graphics were so bad that nobody downloaded it, then it nobody would see all the effort that I put into the app anyways.

Looking back, I can see where I was coming from. It’s like you spend all this time building an app that you’re really proud of and you’re so excited about it that you just want to upload it to the store as quickly as possible. Then once the app is live, you just want to keep improving it and you prioritize that over any marketing or promotional endeavors. I guess what I’m saying is that it’s easy to get so focused on the building and engineering of a project that you lose track of the other things that are equally critical in making it a success.

The lesson I should have learned sooner is that you always want to be iterating your store listing graphics. They make an incredibly significant impact on someone’s decision of whether or not to download your app. You need to constantly be running A/B tests to tweak your materials and maximize your install conversions. You can find plenty of articles like this one discussing various success stories or even this one that points out how Angry Birds 2 improved their conversions by 13% which resulted in millions of extra downloads in the first week.

If you’re like me and want to do things the hard way, then you can always practice your graphic design skills and iterate on your app’s graphics yourself. I recently wrote a blog post that goes into more detail about the tips and lessons I learned by redesigning one of my app’s feature graphics. Or if you’d rather pay someone with real design skills to create graphics for you, websites like Fiverr or some popular subreddits like /r/designjobs or /r/forhire are great options. It really is worth all of the effort to make sure your screenshots, feature graphics, and icons are as effective as possible at converting. Otherwise it’s like you build an app so people can use it, but what’s the point if you can’t even convince anybody to download and try it?

Think About Relevant Keywords Before You Start

There’s a little-known trick when it comes to ASO that your app’s package name (and thus it’s URL) can affect to some extent how you rank for searches. As noted by Daniel Peris in his Medium article, you can add at least one keyword to your app’s package name and have a noticeable effect in how you rank for that keyword.

Daniel’s article discusses how the package name for Super Mario Run contains the string “zara”, but that string is listed nowhere else on the store listing for the game. After it’s release, the game started appearing the top 10-20 results for a “zara” keyword search despite how competitive the keyword is and despite how the game only contains the string in it’s package name.

Even though Super Mario Run no longer appears relevant to a “zara” search at the time of writing this nearly 2 years later, I think that it is still a good practice to add one main keyword that you want to rank for in your app’s package name.

I wish I had learned this sooner because unfortunately once you publish an app to the Play Store, it is impossible to change it’s package name unless you unpublish your app with the old package name and re-upload your apk with the new package name as a completely new application. So what I recommend you do is once you get your idea for an app, start thinking about the relevant keywords that you might want to rank for.

It’s relatively easy to change the package name of an app while you’re developing it and before you publish it to the store, but you should probably figure out your final package name before you start developing it anyway. If you need help thinking of good keywords, Google Adwords has a free keyword planner tool that will help suggest some related keywords that you might not have thought of.

Once you have your keyword picked out, find a good place in the package name to insert it. For example, I chose the keyword “cryptocurrency” for my app CryptoConvert Pro – giving the final package name “com.mnm.cryptocurrency.cryptoconvert.pro”. Here’s it’s URL on Google Play:

com.mnm.cryptocurrency.cryptoconvert.pro

This trick may or may not still be relevant because it’s been nearly 2 years since Daniel’s article was published and the search ranking algorithm is constantly changing. However even if it’s not relevant anymore, it’s still a good practice to follow in case it ever becomes a significant factor again in future iterations of the search algorithms. Another indirect benefit to consider is adding an extra keyword might help people identify what your app might do before even clicking on a link to it.

Localization – Not Always Relevant, But Worth Considering

If your app can be relevant to someone in another country and there would be significant interest in your app, I highly recommend looking into localizing your app to different languages and cultures. Localizing your app allows you to expand your audience to the global market level.

Why might this be significant? According to Statista, in 2017 there were approximately 224 million smartphone users in the United States, but over 2.1 billion worldwide. Localizing your app gives you access to all of those other people – which can significantly boost to your daily active users and total revenue.

To localize an app you translate your store listing information and graphics (as well as your in-app resources) to different languages and locales so that when someone from another country looks at your app on the store, they can interact with it in their native language.

Again, this might not be applicable to every app you ever create. Take for example my state lottery scratch-off apps. These are pretty much mainly applicable to the people living in and around those specific states, so as long as I cover the most spoken languages in the United States, I won’t need to do much localization.

On the other hand with CryptoConvert, I’ve translated it to over a dozen different languages to make sure it’s accessible to as many people around the world as possible. Because of that, here is what it’s user demographics looks like over the past year:

My home country only accounts for 6.44% of all CryptoConvert sessions in the last year. Had I not done any localization with CryptoConvert, my user base would be a fraction of what it is today.

It can be a bit tedious to localize your app for different languages and locales, but it does have a lot of upside. If you’re looking to localize your app for free, you can always use online translators like Google Translate to help out but you really should find a native speaker to help you if you can because those translators are never perfect and you’d probably want to avoid a situation like this:

If you can’t find a friend or peer to help you translate your app’s information, then there are plenty of services online that you can use. I’ve already mentioned Fiverr, but Google offers a translation service right inside the Play Developer Console. From the menu on the left, go to “Store Presence” -> “Translation Service” and you can read all about it there:

Final Thoughts

While this list is far from comprehensive in terms of showing you how to build a successful app, it covers a lot of the lessons that stuck out to me as really important to learn as I grew my projects to 100k app downloads. Was there something I missed that I should cover in a follow-up post? Leave a comment down below or contact me and let me know.

If you enjoyed this post, check out some of my other content – I’ve written about side projects, app development tutorials, and more.

You can also fill out the form below to subscribe and get notified to your email whenever I publish a new post.

Thanks for reading!





New To Java or Programming?

Here are the top 5 books I recommend to help you get started. Note – these links are affiliated, so if you buy something I get a small kickback of a few cents that helps me afford some coffee here and there. Thanks for the support!

“Effective Java” by Joshua Bloch

Joshua Bloch is a contributor to several major Java classes / APIs including the java.lang and Java Collection framework, so he is just about as reputable as it gets in terms of someone to learn Java from. The book goes into detail about many best-practices, which are all extremely insightful and things I wish I had learned sooner.

2. “Test Driven” by Lasse Koskela

If there’s one thing that slows down or inhibits project development more than anything else, it’s the result of poor testing. Learning the ins-and-outs of Java (or any programming language for that matter) is only part of the equation – the rest is how you use it, and how you test it. This is the best resource I’ve found to learn test driven development – which you’ll find all over the enterprise world. I highly recommend you give this a read.

3. “Java Concurrency in Practice” by Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, and Doug Lea

Another extremely important programming skill once you start to get into some bigger projects is concurrency. Essentially, concurrency is a concept that allows you to run different pieces of code at the same time – which can cause for some scalable performance gains or is useful for any network functions you might need to use. If you aren’t careful however, it can cause some very serious problems with race conditions – so if you’re unfamiliar with the concept in Java, I think this is about the best resource you can find on the subject.

4. “Clean Code” by Robert C. Martin

If you’ve ever worked on a large team project, you may know what a struggle it can be to read someone else’s code. Everyone has their own style, habits, and naming conventions. Even how Java should be spaced and tabbed is hotly debated. “Clean Code” will help you learn the best practices to write clean, readable code. Trust me, your future project teams will thank you for it.

5. “Elements of Programming Interviews in Java: The Insider’s Guide” by Adnan Aziz, Tsung-Hsien Lee, and Amit Prakash

This is one of my go-to coding interview prep resources (alongside of course the ever-popular “Cracking the Coding Interview” by Gayle McDowell). The book will present you with challenging problems and puzzles (similar to what you might come across in a coding interview) and will show you how to think critically to come up with efficient algorithms for your solutions.