by Nityesh Agarwal

How (and why) to start building useful, real-world software with no experience

Photo by Brandon Wong on Unsplash

When you were starting to learn how to code or starting to learn a new technology, how often did you find yourself getting stuck in the tutorial phase, or “tutorial purgatory” as Tony Mastrorio calls it in his incredibly insightful article?

You know, the phase where you are just working through tutorial after tutorial, completing one course after another, and yet you feel like you aren’t learning much.

You have probably read how all the “celebrity coders” have created interesting, and often highly lucrative, software products. You have read some story or some blog post where a developer lets you in on the “secret” to their success: doing lots of projects.

If you haven’t come across one of these stories, I urge you to read this one.
TL;DR — the guy built a webapp that lets you search YouTube in real time, it went viral, and prompted the CEO of YouTube to offer him a job via Twitter.

But back to you. You are able to ace all the projects in any course that you take, but every time you try to start a project of your own, you get overwhelmed by the sheer amount of things you still don’t know. You know that if left on your own, you won’t be able to create anything.

Or maybe, you don’t even allow yourself to think about starting side projects because, well, you feel incompetent and think you don’t know enough.

Oh, and reading the bios that go like —
“Programming since the age of 13 years”
DO
NOT
HELP!

I have been there, and I know how demoralizing all this can be. You feel like maybe this technology is not for you, or worse, maybe programming is not for you.

Or, if you are a more optimistic type of a person, then maybe you think something along the lines of —

I am probably not there yet. Maybe I should continue learning more and wait until I gain that mysterious ‘experience’ thingy and then I will be able to create some ‘real-world software’. For now, I should just do the advanced-level versions of my previous courses…

But does your knowledge even count if you can’t put it to use in the real world?

Here’s what you need to know — it is not you!

Really!

All of that is just imposter syndrome talking. You can always create real software that actual people might use. There is no secret experience bar that you need to cross to ensure that you are qualified to build something.

“Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.” — Patrick McKenzie
Credits: Pixabay

The problem with our approach

So why do we hesitate and almost…fear starting projects of our own?

Is it because the MOOCs with all their curated projects, accompanying videos, and the multiple dedicated forums make the learning a little too comfortable?

Nah. I don’t think it’s right to blame it on such courses. I find myself going back to them time and again. They are incredibly useful to quickly get started on a subject. They are cheap (or free) and definitely provide good value for the money. And they are helping democratize education, which was once available only to the students of a few elite universities.

So, yeah. They are awesome!

Now, I believe that the problem isn’t with MOOCs themselves. Rather, it’s with the approach that many of us take while learning.

It goes something like this —

  1. Do a MOOC
  2. Start a project to apply what you learned
  3. See if you know enough to complete it. If not, go back to step 1.

The more I think about it, the less sense it makes.

Finding ways to apply your knowledge after the learning process essentially means that the learning happened without much sense of a destination. All we were trying to do was amass all the knowledge we could, in the hope that it would come of use in some distant, mystical future.

Well, that just feels like procrastination. Doesn’t it?

There are two key elements that are essential to completing any project, and you shouldn’t expect to learn them in a course. And, not surprisingly, when you try to go from step 1 to step 2 while taking the above approach, you lack those two elements.

I believe that simply by adopting an alternative approach (that I will propose towards the end of the article), you can effectively circumvent this problem, build a real product, and have an enriching learning experience.

The two essential elements

The ability to find answers yourself

Courses won’t necessarily teach you how to find the answers yourself. They try to make the learning as fluid as they can, and scouring the internet or course materials for an answer often feels like a roadblock.

Asking for the solution to your problem on a course’s forum is easy because of the dedicated mentors and the hundreds of peers who are working on the same project as you. But looking for a solution to the weird problem that you are facing in your personal project — on Google or even asking a question on StackOverflow — is difficult.

It requires patience and it requires grit. It requires you to have the courage to leave your comfort zone. And those are the characteristics that you need to develop.

When you set out to build some real project, you realize that you might not know the “necessary prerequisites.” And even worse, those prerequisites aren’t given to you in nicely formatted and perfectly timed videos.

Being able to teach yourself what you don’t know is, as William Koehrsen puts it, a real life superpower.

A lofty goal

MOOCs provide certificates of completion, but those are just short-term incentives. If you are dependent on them to provide the motivation to learn, then it will become incredibly difficult for you to sustain the learning after you are done with the course.

A while back, I decided to get into machine learning and deep learning. I found this entire Deep Learning Specialization, comprised of five courses by the famous teacher Andrew Ng. It was really exciting to work through each course and get those certificates. In fact, I was able to complete the entire specialization in just 20 days. But after that… nothing!

I couldn’t think of a project idea, and the ones that I did come across seemed either too difficult or too common or too boring. There seemed to be no project that would perfectly fit my knowledge. And learning more without first using my current knowledge to build something seemed pointless. And that’s how I spent the next three months — with little to no progress.

Okay, so what’s a possible alternative?

Now I want to propose an approach to learning that gives doing projects the primary importance.

When you try to make something, you discover a hundred things that you don’t know. You discover things that you thought you knew but don’t really know. You trip over things that seemed so simple that you didn’t even pay attention to them. You fill the gaps in your learning.

You can get all that only if you do a project. So, I think that it’s worth it to center your entire learning around completing a project.

If you still have any doubts on the usefulness of doing a project, I would like to point you to the tons of stories about people receiving job offers or starting their own startups because of a pet project that they did.

Now, lets cut to the chase.

The 5-step approach to learning

  1. Pick an idea that seems interesting
    This is crucial, so spend some time on it. Observe your own interactions with tech. Is there something in your day to day life that feels repetitive? Look at others around you. Is there someway they could be helped by using some tech? Pick something that makes you go — “Ah! It would be cool if someone made a tool for that”. You will become that someone now.
  2. Understand the possible prerequisites for implementing the idea
    Here, you figure out things like what field does this idea fall into — is it mobile or is it web or is it native or is it cloud computing or is it ML or is it IOT? Then you try to get a idea of exactly what topics you need to know to simply get started and build a minimum viable product. You can do that by doing a lot of Googling and (/or) asking other people.
  3. Start building and go as far as you can with your current knowledge
    Now, you just build. Do as much as you can. Go as far as anyone with your set of knowledge possibly can.
  4. Learn the thing that made you come to this step and go back to step 3
    Sometimes, it can be just a quick Google search and at other times it can be immersive MOOCs. Just be sure to do the bare minimum that you need to go back to step 3. This way you will develop a cycle which will guide your learning journey and will ensure that the learning never stops because of a lack of motivation.
  5. Get feedback on your project, learn how to improve, and go back to step 2
    Release it to the users or ask some other programmer to review your code. This way you can avoid getting stuck at a local maxima.

Do this until you are satisfied with the product — which might be never. In which case, congrats! You’ll be building something that you are really passionate about and learning new things for the rest of your life!

Why it will work

The first step — where you pick an interesting idea — is the key here. That is what will help sustain your learning in the long run. So make sure to pick something that interests you. When you are building something to solve a problem that you care about, you will be motivated to learn and grow. You will always want to work on improving your solution.

It doesn’t have to be a big, future-billion-dollar-startup-idea kind of problem. It can just be some trivial problem that you or someone you know faces.

It doesn’t really matter if the only user of your tool is you or your parents or maybe some local store owner. The prospect of being able to help even a single person can provide enough motivation for you to keep learning.

Almost feels like you have some superpower!! 😁

As Naval Ravikant puts it,

“The tools for learning are abundant. It’s the desire to learn that’s scarce.”

That being said, don’t worry if your idea seems too ambitious, because it probably will seem that way. Just pick out the most bare-bones features of the implementation and get started.

Now for some examples

I recently read this article on Indie Hackers — I needed a tool for myself so I’ve learned to code. The author did exactly what the heading says: he learned to code in order to make a mobile app to solve a real problem that he faced. He then released the beta, and the testers recommended that he build a browser extension to extend the functionality of his app. And then he learned that and made that too!

Going from “Oh I wish there was some tool to help me with this problem that I’m facing” to “Hey, I was facing a problem, so I coded an app and now that problem is gone!”... just imagine how exciting that learning journey must be!

That is exactly what I am trying to pitch here. Adopting such an approach will:

  1. Provide you with a constant motivation to learn.
  2. Enable you to deeply engage with the learning material.
  3. Be a constant source of energy and confidence. Because only a few things are as exciting as building something you want or need with your own hands.
  4. Help you in choosing what to learn. Because “what to learn” is often more important than “where to learn”.

— Edit —

In a response to this article, Bosko Stupar narrated his own experience wherein he built a ping tool for his personal needs and picked up C# along the way (although he is a web developer).

He says that “(What I have written above) is perfect example (of) what new programmers should learn aside from syntax. Find a problem that you have — use skills that you learned so far and build a solution, (and) also learn more in that process.”

— — —

I tried this method by building a very simple browser extension and learning Javascript/JQuery along the way. It was an extremely fulfilling experience. I wrote an article about it — Learn how to be a better programmer by automating the boring stuff. It got quite popular and, to my complete astonishment, has been read almost 20 thousand times now!

This suggested to me that at least some people find the approach interesting as well. And if you are curious, I am still working on that extension, although quite slowly. I would absolutely love it if you want to contribute to it.

Final thoughts

In hindsight, I wish I’d had a similar ulterior motive when I was doing the Deep Learning specialization. Something more than just “getting into the field” because it is hot and it is the new age tech. Then I might not have paused after doing those courses.

But then, that’s what helped me realize the importance of having a lofty goal to strive towards when learning something. So, I guess it’s alright.

Going forward, I plan to adopt the above approach in my programming journey. I’ll keep you updated with any projects that I do (read: follow me on Medium 😜)

The approach that I proposed above could become much more rewarding with the support of a community. Especially when you want an idea to build something for someone to help them with their weird problem. Or, when you are trying to understand the tech-stack needed to implement some idea, or you need to ask for a feedback so you can improve.

That is why I have created a new Slack group. Feel free to join using this link.

Thanks for reading! Let me know your thoughts on the approach that I discussed in this article by commenting below. Or you can contact me via Twitter or LinkedIn. You can also shoot me an email at nityeshagarwal[at]gmail[dot]com.

Here’s the link to the Github repo for the Chrome extension that I mentioned, if you want to contribute or just take a quick look.

Also, you can follow me on Twitter— https://twitter.com/nityeshaga; I won’t spam you feed ;-p