Hi, my name is Brian, I'm 25 years old and I consider myself an autodidact. I've been programming for about seven years till the date and I think I have a few tips for those who are starting in this wonderful binary world.
When I was 18 years old I studied one year of Computer Engineering in which I learned what algorithms are and why we need them. I also assisted to lectures from the second year of the career (too anxious?) in which I learned Imperative Programming and Data Structures (and OOP).
In the university I got a licensed copy of Visual Studio 2010 Pro Edition and I began to learn C#. By my 19th birthday I have already made apps in every single .NET Stack framework. I was so exited that I decided to drop university and focus on learning more about software development. In 2016 I played the role of CTO in a small company (with big national clients) in my local town, and I met the business side of this world (which I didn't like).
Note: I'm not a native English speaker, the first thing I did was actually learning English (I still am). This is the first advice I give to those non English speakers who want to learn about programming.
Nowadays there are tons of resources to start: on-line free courses, free tutorials, free e-books, millions of youtube videos. You may feel overwhelmed because all of that. But, don't panic! Here a simple step by step list:
- Embrace the terminal: use the terminal, get used to it, love it.
- Learn about Data Structures. Learn how they work and which problems you can solve with them and why.
- Learn about Recursion and BigO notation
- Divide and conquer: get used to divide a problem into small pieces.
- Write clean code from the beginnings. Writing readable and well structured code always will help you to learn fast and avoid frustrating bugs.
Another good resource for learning is source code. Yes! source code, I learned a lot by reading source code from open source projects. Reading how talented developers solved their problems, and trying to figure out why they did it in that way, is a process that always teaches you something. But don't only read it, think, how could you improve it?
Back in time, when I was trying to read source code, I didn't know about GNU and open source, I only used Windows as SO. I think before I became a developer I became a good "decompiler". Don't get me wrong, I didn't decompile things to copy&paste the code into my projects. I am always curious about how things work. I remember one occasion I played a web game to win a Smart TV. The game displayed images and you had to type what you were seeing as fast as you can. My first attempt was a score of 1.5 minutes to finish the game. In the leader board was a guy with a score of 10 seconds. WTF, it's impossible! So I hit F12 in Chrome (show the web inspector tools). The game was a Flash game. I knew what Flash was but I never tried it, so I started to look up for the source code. I didn't find it. So: Okay google (or alexa), how do I decompile a SWF file? I got the source code. It had all the strings you had to type mapped to the images. Then I made an app with all that images. Every time I clicked on an image the app inserted the text in the game. Thus, I achieved a score of 8 seconds (to be honest I don't remember the exact number). Of course, I didn't win anything and lucky me I didn't get in troubles. But I did learn a few things.
So, go out there in the cyber-space and find some cool open source project (it'd be better if is made in the same language you are learning). If some app triggers in your mind the question "how did they do it?", go and look at the code! Be curious! Ask yourself about everything, how and why must become your most frequent used words. I think if I wouldn't have been as curious as I am I wouldn't be writing this.
When you are not being curious about something, you can practice your problem solving skills in HackerRank.
Before jumping from the terminal to a browser or desktop app, try to apply this: make a script for everything. You will be amazed how much you can learn by writing simple and small scripts. For instance, lets say that every time you turn on your PC you open the browser and navigate to some website. Well, why don't you write a script for that? Or maybe you feel curious about how many satellites are passing above your current location right now? make a script for that too! You get the idea? Take any little problem or need you came across with and make a script for that, you will learn something new for sure!
I can say that I have a script for everything, every time I find some tedious or repetitive task I write a script. Every time I need some specific tool (or just a function) I can't find, I write a script. To give you an example, a few minutes ago I have this need: I wanted a desktop Google Translate app and display it on top so I can check my english while I'm writing this in Typora. In 20 lines of code (there are some neural networks written in 14 lines, I should do it better 🤔) I solved this special need. Yesterday, I didn't know how to use WebKitGTK in python but now I have a basic idea of how to do it. Here is my script running:
Scripting can be also a good opportunity to learn new languages. Writing scripts in different languages is a good practice!
"To the need, write a script" you will read in my grave some day.
Frontend, Backend, DevOps, IoT, Blockchain, Computer Vision, so many things! Here is easy to get stuck and feel frustrated (I am, I wanna do everything!). First, read about each one of them (if you don't have one in mind already), which tech is being used? how do they work? what should you be studying/learning for it?
But, I think a good start is building a web app, front and backend. Yeah, it seems like a big jump but try to go for it. You can start with something really simple, e.g. a button that makes a request to a server and the server responds with the current time. I suggest you to use NodeJS for this. For your backend use Express or Polka. Here a step by step list to write your first one button web app:
- Do you know what is HTTP?
- Do you now what is HTML?
- Do you understand the concept of frontend and backend development? Are you sure?
- Make the web app with a button and add an event listener for the click event. (Event what?)
- Write a simple nodeJS server (what is a server?) that can handle a GET request. Serve your html file as static content (how do I do that?)
- Dow you know what is an XMLHttpRequest?
- Make a function that, once your button was clicked, makes a request to the server. The server gives you the current time as plain text.
- What if now I want a really pretty user interface for my web app? Learn some CSS.
- What if now I want the server to log every time a client makes a request? Learn how to write a text file from your code.
- What if I want the server also log the IP of each client but this time using a database. Do you now what is SQL and NO-SQL?
- What if I want that for every hour of the day the app changes its background color
- What if...
I didn't mean to tell you how you should do a one button app. I want you to take into account how we can start from a simple idea and make it, bit by bit, a more complex one. And also how you should get into that process by reading, learning and understanding every concept that is involved. Once you get working a basic version of your app, you can start with your what if list. As example, what if I want the script I wrote minutes ago to get text from the clipboard so every time I copy some text it gets injected into the Google Translate app? (yep, I made it. Now I need some shortcuts tho 🤔)
Okay, you built an app, how would you handle different versions? I introduce you to the Production and Development environments! This is the moment when you go and learn how to use a good version control system like Git (there are also things like SVN, TFS, and others).
Your first step in your professional career is very important! If you have the opportunity to apply for a job as a junior developer have this in mind:
- What is the main product/service of the company? Do you like it?
- Which will be your tasks? Would you like to do them?
I know, as a junior dev you can't just pretend to have a dream job but try to get one that makes you feel comfortable, that is important to start your professional career. Once you find a job that fits your expectations, have this others things in mind:
When I was a CTO I quickly noticed that the majority of the junior devs we hired were afraid or fell ashamed to ask for help, so they tended to get frustrated and commit mistakes or silly bugs. That is a big NO. Raise your hand, ask your questions. You are starting, you don't know everything and that is totally fine! First you have to try it by yourself, and then, if you hit a wall, ask for help. Ask for clues, not for the complete solution.
It doesn't matter if they are more experienced than you. Try to help them, suggest possible solutions. Only two things could happen:
- You are right: you proved yourself that you really understood the problem and you are making progress
- You are wrong: maybe you went to fast with the first solution that came into your mind. Your coworkers will tell you why you are wrong, thus, you are learning something new and you are making progress
I think every well structured software company has a document about good practices to write code. If they don't have it, ask for it. How should you name functions or document your code? pascal casing or camel casing?, tabs or spaces?, how should you set up your dev environment? etc.
Think about the worst case scenario when you are testing your code, that case you think it would probably never happen, that its almost impossible, and make your code to be prepared for it. I can assure you there is a tester out there waiting to create a ticket for you.
I think there is a common practice between beginners: find a bug, make changes, re-compile. And they go into that loop till they solve their problem. You are losing lifetime in that way! Set up a debugger and log values + info that could help you to fix the bug more quickly.
Feel proud of every achievement you have made. Feel proud (not too proud tho), it's okay to feel proud when you solve a problem that was killing you for hours or even days, no matters if it was an easy or a really hard solution, you made it!
Also, do not underestimate yourself. Take big challenges, take that problems you think you wont be able to solve and tackle them down! Challenge yourself! Here is a motivation phrase to hang in your wall:
You can do anything you magical skeleton!
It's okay to copy&paste code to gain time, to make things faster. What is not okay at all is to copy&paste without understanding what that code does and why it works. You will find yourself frequently visiting websites like Stack Overflow or forums searching for solutions to problems that others devs had before you. That is also okay. But once you find that piece of code that saves your life, you have to be sure if that code is the best solution before you paste it into your project.
Note: Changing variable names doesn't make that code yours!
Never ever forget to enjoy it! You are getting pay to do something that you enjoy and feel passionate about. That is an awesome feeling! I remember myself thinking "wow, the pay me to do this! I would have done this for free because I love programming" (don't ever think that at loud).
My first "job" wasn't actually a paid job. I was 19 years old when I met a guy who wanted to make a "Social network based on user movements" using Microsoft Kinect. It was 2012 and Kinect was the thing, everybody was doing something cool with it. I didn't know anything about software engineering at that time. It was so fun and I learned tons of things just googling, reading and discussing with him about databases definitions, code optimizations, geometry formulas, etc. By the fourth month I was interviewing new candidates to join the project. By the sixth month I left the project. Of course the project didn't see any light but here you can see a quick demo of a tic tac toe game played with the hands (I was so proud of that "pc player" algorithm). I encountered so many challenges and I got experience with many stuff (from .NET to Maya Studio) that lead me to get a job and start my professional career by December 2014. I qualified as Semi Senior developer.
Every idea that you have, you should make it happen or at least try it. I have this golden rule: if you have an awesome idea, google it first. Oh, so many great ideas I had an another guy, somewhere in this world, already did it. But don't let that stop you! Go and see how other people developed your (now shared) idea. And if you still wanna go with it you can think how you can improve it. Or even better, join forces with that guy/guys and make it happen!
I can't describe how much I love the open source community. Not only for the software&hardware. The philosophy of sharing knowledge, sharing your ideas, to collaborate with each other to make this world a better place (I'm a big fan of the scientific disclosure). These last years big companies were realizing about how good is to open source projects, the best example I have in mind it's Visual Studio Code. It has 679 contributors to the date, and you can be one of them!
So, another thing I think will help you to keep making progress in your career is contributing with open source projects. Also try to open source every thing you do (if you want), share your script, your solutions. Go to the forums and help others developers to solve their problems. I always find myself helping all my friends and coworkers and learning something new because they are doing different stuff with different frameworks and languages.
Related to the above, if you heard that some dev conference it's going to take place where you live, just go! Don't lose that opportunity. Dev conferences are cool! You will met people doing crazy stuff, you will learn new things. And if you want, you can be a speaker too! Last year I went to a DockerConf in my local town and thanks to that I started to get into the Docker&Kubernetes world which I really like. Talented devs talking about their experiences and teaching you cool things for free (at least I never paid to get into a conference, but I did contribute with some money).
And if you can't go, or there are no many conferences in your city (it happens frequently to me), you can follow this youtube channel: Coding Tech. For me it's a must watch before I go to bed, you will find a talk/conference about almost EVERYTHING
Yes, we developers are humans too! Don't forget that. There is something that not every developer talks about: programming is addictive. Some times I feel in my brain the chemical impulses that triggers some sort of time-tracking blocker protein, and I forget about time and I stay for hours and hours reading, coding, debugging, coding. Stop doing that! (that goes to me too). Go for a walk, don't eat fast food every day. Drink water! Sleep well! I really mean that. If you leave aside your health you're going to feel sick, tired, stressed, and that is when programming is not fun anymore. Here a GIF of Linus Torvalds walking and working:
Take care about your neck and your back. Grab an ergonomic chair. Adjust your monitors to a good angle of view. Learn how to sit correctly, it sounds like a silly thing but knowing how to sit correctly will help you to go through the day avoiding neck pains. Trust me, writing code and having neck pain at the same time is the worst thing I've ever done. And if you already have neck&back pain, make some physiotherapy and get rid of it.
It's really well known that there is a lot of stress in our beloved binary world. Dead lines, bugs, pressure, more bugs, servers failing, more pressure. I have anxiety problems but now that I'm getting older and wiser (I hope that) I can handle it way better than few years back. But sometimes it's almost impossible to avoid stress. So, if you are not doing great, if programming isn't fun, if you don't want to work anymore, try to talk with someone. Friends, family or even a psychotherapist. Again, it's really okay to ask for help, don't forget that. Your mental health is as important as your physical health.
I should have made some sort of sensor years ago that, if it detects me procrastinating, it sends me an electric shock or something. Dealing with procrastination it's a thing. It may no affect every people in the same way but you have to deal with it, it can be a huge problem if you don't set the limits to yourself. Find a way to be more productive every single day. Achieving more goals in short periods of time will make you feel super cool, It will encourage you to do more and more. This is one of my weaknesses but I'm already working on it.
Well, this could be a topic for a discuss. Nowadays I think you shouldn't master only one programming language or only one framework. I think you can get bored really quickly in that way. I know, there are lots of companies looking for candidates with a specific backgrounds like "Senior Django Developer with ReactJS Skills", but there are lots of companies interested only in your problem solving skills. Then, they will teach you some programming language they are using, or some framework. And that's why you should care about mastering your problem solving skills, your knowledge about computer science, about design patterns. Once you understand all those concepts you can apply them in any language.
If you are already working day to day with only one language try to include another one in your side projects. Suggest to your team to try some new thing you read about and you think it could improve your company products.
Hell! I've never wrote such a long post. ~3800 words and counting and there is not a single line of code here! This is how people feel when they are finishing an essay? I don't know if I should split it into 2 or 3 parts, but if you are crazy enough to read this to the end and you think it was really long, please let me know and I will think how to split it.
The main reason of this post is to give some tips to everyone who is thinking about becoming a software developer and don't know where or how to start. If you also wrote something with the same purpose, put the link in the comments and I will add it to a list in this post. Who knows, we can write together the next bible!
To be honest, I don't really know how to write a conclusion. But I will tell you this: do never stop being curious!
I hope you can find some motivation here. Some sort of a guide to start your journey.