Tips for Aspiring Developers (Self-Taught Story)

IT as a branch is ever-evolving, new people show up every single day. The most common questions are "Which programming language to learn?", "How do I start?", "How do I get a job?", "Where can I learn?" etc. 

These are all valid questions, and hopefully, this article will help such individuals maybe manage a bit better in this branch which is constantly changing, probably more than any other.

 Note: Take all of my advice with a grain of salt as it is opinionated. It's mostly based on my personal experience and the experience of the people around me and my interactions with people online.
 Additionally, as the title implies, this article is not directed at developers, but rather people who are either aspiring to become one, or people who have just entered the waters.

Which programming language to learn?

Probably the most asked question of all time. You're interested in programming and decided to learn a programming language, but which one?

In my opinion, there isn't a right or wrong language to start with. Choosing a language heavily depends on the affinities of the person studying it. Some are more directed towards web development (PHP and JavaScript are probably the most notorious ones), some are more often used in game development than others (C#, C++), some are most often used in desktop applications (Objective C, Swift, Java) and some are used all around for everything (Java, C#, Python). There's a myriad of languages to choose from, some are focused on a certain field, some are not.

If you know your preferred field by heart, your circle of selection is smaller, but if you can't just decide or want to work in all fields, perhaps it's best to choose a language that's being used in a lot of fields like Java, C# or Python.

Some may disagree with this - languages like Java and C# aren't the easiest to start with, and some deem that a beginner should start with C or C++ to build a foundation, but the first programming language I had a serious connection with was Java, and I just love working with it so much. It excites me to open up some new Java books, or books regarding any technology that can be used with it. 

Java and C# are a lot alike. The difference in resource and memory management made C# a better choice when it came to game development, and even though Java's speed and memory management have been improved and increased dramatically over the years, C# is still used in this field and will probably stay for some time to come. On the other side, making large enterprise web and desktop applications is usually done in Java, I won't go too much into it now since that would be off-topic.

Python has been gaining a lot of popularity lately and has seen an increase in the industry usage. It's used in game development, web development, machine learning and so on. As far as I know, it's somewhat easier to learn than the previous two, so it might be a good one for starters.

How do I start?

Should you go to college, should you enroll in a course (traditional or online), should you get some books?

I don't think a college is needed to become a competent developer. A lot of people feel let down by college, and don't feel as if they gained enough knowledge on it. In my experience, no matter what environment you're in, no matter how good or bad, if you want to learn, you'll learn.

I started by enrolling in a course offered locally. This is where I built my foundation and some basic things that I could build up upon. The next few years I've dedicated to buying courses on websites like Udemy and buying books on websites like Packt Publishing.

It goes without saying, I've relied heavily on forums and communities, StackOverflow became my new best friend, YouTube, etc... I've seen a lot of people very happy to help online, and I really owe the community a big one. 

Another common thing I've noticed is people concerned over prerequisite knowledge. Ideas like "Do I need to be good at math?", "Do I have to know physics?", "Is it too complicated for me?" etc. I'm not sure how these ideas really spread out, to be honest. Yes, knowing math is a plus, and some fields require an extensive use and understanding of math, like artificial intelligence and deep learning.
But keep in mind that for most fields, knowing basic, elementary school math is perfectly fine. You don't need to be a math guru to learn programming. 

I've even met a lot of people who weren't interested in math, and after swimming in the programming waters for some time found it a lot easier to understand and more fun!

Knowing some concepts, or simply understanding computer sciences is a big plus when it comes to learning programming, but it's most certainly not needed. 

Programming itself isn't all that complicated in my experience, learning the syntax of a language isn't hard, mostly because it's logical and made simple to use. However, being a good programmer is measured by knowing just how to use that syntax to make something work in an efficient way. It does require the ability to adapt and find solutions which are sometimes abstract, and it requires a fair dose of thinking outside the box and being critical. Fortunately, these aren't exclusively innate traits, and they can be acquired if a certain individual doesn't manage that well in the beginning.

Where can I learn?

In my humble opinion, you can learn anywhere. No matter the environment or the people around you. But I guess that a better way to answer this question is to name a few examples.

There are numerous free and paid services online that you can use to start learning!
Here are just a few:

  • CodeAcademy - A very popular choice, known with a good reputation. The website offers an interactive way and balances theory and practice by providing you with small theoretical segments, after which you can use an online, built-in compiler to play around with it and practice what you've read about.
  • freeCodeCamp - A somewhat different approach, focusing firstly on theory, and then on practice, this website supports you to build projects, get certificates, and make nonprofit projects to add to your CV.
  • CodeWars - There's a separate section about this website later on in the article.
  • W3Schools - Mainly focusing on web development, this is a definite go-to for HTML, CSS, JavaScript etc... One of the best places to learn these technologies, especially for beginners.
  • Udemy - One of my favorites. Udemy offers a wide variety of courses, for really cheap. In my experience, I've had better experiences with paid courses over free ones, and Udemy courses are really cheap. Don't be fooled, usually, you can see a 200-350$ tag on some of them, but this is a marketing trick. Udemy has discounts all the time. Once, I didn't manage to get a few courses within the discount time, only to be greeted with an even bigger discount right afterward. Expect that each course costs 10$.
  • edX - A high-profile educational website powered by MIT and Harvard. Some of the free courses include a paid certification too!
  • Khan Academy - Another popular choice, offering courses and lessons on a wide variety of fields.
  • Udacity - Offering free courses on both programming and non-programming themes, as well as paid degrees and certifications.
  • Packt Publishing - Another one of my personal favorites. Packt books never let me down, and I'm always excited to get some new ones. Sadly, these books can be quite expensive, but fortunately, you can also catch a discount and buy them for cheap - for around 15$.

Always keep studying

I think it's very important to always keep studying. This is a branch that changes daily. The solutions that were ideal a year ago can be considered garbage nowadays. I've bought an Angular 2 book last year to expand my work field a bit and still didn't get around to reading it, and all of a sudden, I've noticed that Angular 6 has been released a couple of months ago. 

I love education and find it an important aspect of progress. Loving what I do made it possible for me to learn all these new things each day, without feeling like it's a chore for me, or something mandatory. I don't decide that it's time to study and go study for hours. I accidentally find myself reading new articles, getting up to date, and making an application for the fun of it, testing myself with challenges because it's fun.

Truth be told, it takes a lot of time to keep up to date with these things, constantly in motion and studying, but it won't be hard to do if you like doing so. 

How long does it take to "become a developer"?

This is a discussable subject and another one that doesn't have an answer set in stone.
What I can tell you though is how much time does it usually take people on average to reach a level where they can start working.

It depends on the student, as always, but thoroughly studying any language should take you at least a year. But also keep in mind that once you "become a developer", you never really stop learning. 

Years of experienceKnowledge level
1 year With one year knowledge, you should be able to create simple applications, and have at least some experience with popular technologies and frameworks often associated with your chosen language.
2 yearsI reckon that it requires at least 2 years of studying to be considered a junior developer, capable of actually working on a project.
3-4 yearsWith 3-4 years, you can very well be considered a fully fledged developer, or as some people call it a medior developer.
4+ years

It also depends, but I've often seen people with 4+ years of experience to be considered senior developers.


Keep in mind though, simply the time you put in doesn't make you a developer. The effort you put in does. A person with 2 years of experience can be a much better developer than someone with three times as much. That means that the table I've included should only be used as a reference or as a general idea of the time you might put in in the near future, to see some results.

Failure

Failing in doing something - whether it be making an online platform or an AI, a video game or anything else - is a common thing. 
I've felt beaten so many times, fell into "programming depression" when I don't feel like I'm able to do anything, stuck on the same exact error, sometimes even for days. It made me feel helpless. I have to admit, it wasn't always easy, but feeling the sweet victory over an exception that caused a problem for days simply reignites the flame and makes it all worthwhile. Experiencing these ups and downs is a fundamental process of advancing in any field, and you have to be ready to accept failure in some way. It's normal.

Focusing on one thing

Being a king of a single language, rather than being a prince of all trades is a good starting point. Movements like DevOps are popular, unifying a lot of fields in one profession, but I wouldn't advise this to a novice. If you want to be able to do everything a regular development team does, go ahead, but it requires immense knowledge, will, and experience to do so.

Practice

Practicing allows you to exercise problem-solving, which is a much-needed trait for programming. Practicing will also improve your skills once you get started with programming.

In my experience, a good place to train and practice is CodeWars.

CodeWars offers countless challenges, for a bunch of different languages like Java, PHP, Python, Ruby, JavaScript, C#, Clojure, Go, SQL, Swift, TypeScript, C, C++, and the list goes on...
It's made in the image of a traditional eastern style, which I am keen of. They introduce Katas (individual training/challenges) and Kumite (sparring with/challenging others) with an honor system that increases with each solved Kata or Kumite. You advance from 8 kyu, all the way to 1 kyu, also in the image of traditional martial arts.

There's a large community at CodeWars, and you can really learn a lot. 

With all that said, don't be discouraged if you get stuck on it in the beginning. These katas aren't easy to solve and require both knowledge and wits.

Don't reinvent the wheel

In most cases, there's no need to reinvent the wheel. You'll be able to find most solutions online, ready for use. Feel free to rely on some else's solution or implementation to allow you to focus on your work. Yes, it can be beneficial to do everything from scratch, but it can also just cloud your vision and lead you astray from your original goal. 

Practice reading people's code

Even though everybody develops a preferred style of programming (naming, formatting etc), you should practice and be able to read other people's code as well.

When you get into a development environment, an office, or team, you'll have to cooperate with other people and you must be able to understand what they wrote as well. Teamwork can help you maintain and upgrade existing code easily while being closed-off with only your own style will lead you to reinvent the wheel, which is the point I brought up before this one.

Learn to walk before you learn to run

If you're new to this whole thing, build a solid foundation with the fundamentals, before trying to make something that is still too advanced for you.
If you try to force progress, you might just end up burning out and quitting. Take your time with the basics, and it will be easy to progress afterward.

Become a part of the community

Being a part of a community is a classic human trait. We group up and organize over things we find interesting or beneficial. If your town holds meetups regarding computer sciences or a certain programming language you're interested in, don't be afraid to go and see what it's about!

It doesn't matter what's your knowledge level, meet up with some people, listen to what they have to say, exchange ideas. You might very well find another novice who would like to give you a helping hand for yours in return.
I often exchange books and courses with my friends. We each buy them in bulk and share them, so even if you're on a tight budget, it shouldn't be hard to get your hands on useful material this way!

Document to save time for others

It's not the most fun thing to do, but it's highly advised both for yourself and for your team. If you make a certain function and there's no need to revisit it for some time, you'll most probably forget how it even works. This happened to me a lot, revisiting old projects left me scratching my head in confusion: "What did I do here?".

This leads to hours upon hours being wasted on figuring out already written code, and simply by documenting with simple explanations, you'll save a lot of time and headaches for everybody.

Making this your habit is a great thing, I didn't develop the habit in time and suffered greatly because of it.

Conclusion

With all that said, I'd conclude this blog. I hope it might help anybody on their journey into this wonderful branch, and I hope that my personal experiences can in any way give back to the community.
Feel free to read other blogs on this topic to get another view, and perhaps some information I missed. 
If you'd like to share your own stories, questions or critique in the comments, please do!

Good luck!