It’s 2021, and Covid-19 is running rampant. You’ve lost your job, or you’re looking for a career change, after being told you were essential, but not going to get any hazard pay.
You know the kid down the street drives a really nice car, and looks like they have it all together.
You also know that they are something known as a ‘coder’.
Then you see yet another article online — 10 easy steps to start programming, and follow that one to 5 weeks to learn programming.
“This thing is easy!”, you think to yourself, and you set off to do so. “I’ll be driving that Porsche in no time at all.”
I’ve worked in this industry for over 20 years. I’d like to share some of what I’ve learned, as you begin your quest for a Porsche. Or maybe… just a bit of stability. You might be looking for fun. Or just eager to explore and learn. Whatever your needs and requirements, I wish you luck and perseverance on your quest.
First, be prepared for disappointment. I mean this seriously. This job is not for the faint hearted. There is no magical bullet — companies will look to get everything out of you that they can. They will ask you to work weekends, meet impossible deadlines set by someone else, and practice company “loyalty”. (IE — please don’t think about working somewhere else, we’ll fire you rather than match your offer.)
Programming can be very rewarding — but it can also be a major, major pain in the butt. There are people that just make it look easy — but what you didn’t see is that those people have put their hours in. They’ve done hard things over and over and over until it became easy, and that is what you see now.
What you didn’t see was the hours spent staring at a single line of code, trying to understand why it went wrong. You didn’t see the hours spent reading an API reference and digging through online documentation to figure out that the server was giving them something that it shouldn’t, but they had to handle it anyway. You … didn’t see the hours. The hours that go into the successful picture you see now.
Your Path will look something like this:
- What is a computer? At this level, you don’t really even know how these magical things work.
- What are Algorithms? At this level, everything is brand new, and you feel like you’re inventing the wheel every time you write code.
- Hey — I’ve seen this thing before! At this level, you’re starting to see some of the patterns over and over, and can apply what you’ve written before.
- Woah — I can see the Matrix! At this level, you easily break down problems and apply algorithms, even in areas you’ve never seen before. You can apply patterns and data structures, understanding the basic nature beneath them. In short, you are better than a large number of people that call themselves “coders”.
As you walk these high level path, you have to consider a couple of components.
First, the mechanical. What is a programmer? What tools do they need?
A programmer is defined as “A person who writes computer Programs”. This is a really, really broadly applicable definition. The field of Computer Science is super large — and can contain many, many types of “computer programs” and “people”.
Many times, you will hear an analogy to a carpenter — the computer is your tool, the language is your tool. You will hear a discussion of the output, or the final piece of art you are producing.
I like the analogy, but it is broken.
Here is a better analogy. Like a carpenter, you take in raw materials — in this case, the computer, the language, the problem, and product a functional piece of art. You do this by applying tools — data structures, reduction, algorithms, and logic.
These 3 tools allow you to break down any problem, even a problem outside your domain, into its components and solve them. Ever wonder why engineers so often do things outside what they were trained for? It’s because we are trained to break down problems (reduction) into the smallest components, and apply available tools (logic, structures and algorithms) to solve them.
Getting started in this huge field is a challenge — there is just so much to take in and so many places to start.
I learn best by doing, so I suggest picking a small section that interests you. Are you interested in how machines learn? Go explore that! Interested in Mobile Applications? Start learning that! It will focus your efforts, and give you projects to work on.
Seriously — don’t try and take everything in at once. Practice the fundamentals and you will be able to move between areas.
The other helpful thing this will do is to narrow down your choice of tools. Every coder needs to have tools. Contrary to what you hear a lot, these are NOT similar to the tools of a carpenter. They are, instead, the raw materials you will use.
There are 2 general raw materials that you will need:
I know — a computer makes sense, right? If you choose to buy your computer, Take a look at https://slickdeals.net/laptop-deals/ for the best deal.
The best deal here is — what I need to write computer code….. weighed against my budget and my needs.
The good news is that most computers nowadays will handle most tasks. At the time of this writing, I see $400 computers that will allow me to code. It is NOT necessary to have massive amounts of RAM and 5 large monitors to get started. Here are the basics:
- Memory — more is better. When working with large development environments, such as XCode, they will eat up your memory extremely quickly. I recommend at least 16GB.
- CPU — Faster is better — but even a slow budget CPU will allow you to compile code and run it. It’ll just take a bit longer. I would no longer worry about CPU — unless you are going to be running an emulator, and then a quick look at the software you are using will tell you what you need.
- Screen Size — personal preference, but note that if you are looking at documentation and code, bigger is better. You don’t NEED bigger though — I’ve written code on a 13" laptop. It was annoying, but doable.
What are your options if you don’t want to or can’t afford to purchase a computer?
- The library — Many libraries offer free coding courses, or computers available for usage. Combined with online coding tutorials, you can begin your learning pathway here.
- The cloud — if you need specialized hardware, such as a GPU for Machine Learning, or you want to experiment with things that would normally be outside your price range, $20 \ month can get you access to a lot of power.
- Your Phone\Tablet — Learning to code involves learning to think a certain way. You can use many freely available programs to learn how to code.
Let’s talk about the second item I have listed — PAPER. I know that in today’s world, it is a crazy thing to list for a programmer. BUT — the *only* thing I would use instead of Paper is a whiteboard.
There are 2 types of programmers I have met:
- The “I start coding and cut and paste from stack exchange” kind. This kind of coder generates messy code with lots of exceptions. They miss edge conditions in their testing. Their code is unorganized and does not look good. All of these issues have real-world ramifications, ranging from performance to wrong output.
- The “I think through my data, run some use cases, and apply an appropriate algorithm” kind. This type of coder generally starts by developing a plan — and that plan usually happens on paper or whiteboard. They walk through their algorithm before they code it, allowing them to see where it falls apart. This has the side effect of turning them into a human computer, which makes them more efficient at coding, and you enter a loop. But, like anything in life, it all starts with a plan.
Second, the learning. How do I get better as a programmer?
And herein, we come to the tools that are similar to the tools of a carpenter. A programmer is one who can:
- Reduction — break problems down. This is the first place to start as a programmer. If I need a set of input numbers summed, I need to understand how to break down this simple problem. I can then use that solution to combine with other solutions, building more and more complex solutions as I go. This is a generally applicable skill, and very handy in all walks of life, everything from scoring a goal in soccer to figuring out how to tile your bathroom.
- Application of Logic — Computers operate by a strict set of principles, and do not stray from them. One of these is boolean logic. That’s a really fancy way of saying that they use True and False statements to control program flow and generate output. That’s one type of logic — and a very important one. However, another type of logic is what you might find in logic games — the ability to use deductive and inductive reasoning to arrive at a solution. Both of these are generally applicable in life as well.
- Data Structures — There are basic data structures that any programmer must be familiar with. The name of these can change from language to language, but effectively, some form of tree structures, array\queue\list, and basic storage of numbers and text form the basis for all the more advanced and specialized data structures. Learn these like the back of your hand. Sadly, these are not usually generally applicable to life, except in abstract concepts, like filing cabinets.
- Algorithms — these are a set of instructions that are applied over and over. The output of these instructions is hopefully the result you want. In other jobs, it would be called the process, or the steps, or the instructions. Creating an algorithm is universally applicable to any field.
- Debugging — or the application of your head to a wall over and over till the wall falls over. This is a generally applicable problem set — figuring out where your algorithm went wrong, using tools like binary search, inspection, and … thinking.
- Control Structures — this is the part of the language that is a tool. Control structures are used in the implementation, and every language has basic control structures such as if\then\else statements (branching statements), assignments, loops, and basic data types. While many languages provide extensions for some of these, or specialization, the basics exist across almost all languages.
Note that at no point did I list a specific language. A computer language is the basic set of instructions through which you will implement your final solution. It will influence your choice of constructs and other control statements. But a good programmer can use any language and make it work. That said, one must be fluent enough in a language to translate the algorithm into the language, so learning to think in a particular language is important. There’s a fine line here.
There is a point however when a programmer has become familiar enough with the special features of a language that they add those to their toolbox. This requires study and time in a particular language, but eventually it will happen.
Frameworks, such as Node.js, are similar. There’s always a new, fancy framework being invented and used. These can be viewed as higher level languages in a sense, or a collection of patterns and principles to hide a lot of implementation details and let you get stuff done. (Or, sometimes… to prevent you from getting work done.)
Lastly, the process. How do I become a programmer?
I’m assuming that at this point, you have a goal in mind, something not as vague as “Become a programmer”. You’ll need an endpoint to this. It might be as simple as “Create an Android app that says HI”. It might be as complex as “Generate a neural network to classify images”. In either case, your curiosity and goal will help you through the course of becoming a coder.
1st, and most importantly, practice. Every day. Read code, and try and understand it. Use sites like leetcode to practice your basic algorithms. If you can’t understand it, then take the time to break the code down. Walk through the algorithm on paper for a few iterations.
2nd, practice the basics. Become familiar with the basic data types, such as a heap, and ensure that you know when and how to use them. Write your own heap library, and use it in leetcode instead of relying on the built-in. You’ll never do this in real life, but it will help you learn.
The practice of programming is what makes this so brutal. Every single day, you will be confronting your own weakness, pounding something else in your head. You will have to push through walls of understanding to learn new techniques. It is a set of mental exercises, similar to the way you look at physical exercise.
3rd, read about your goal. Break the problem down. What things do you need to accomplish in order to hit your goal? Do you need to learn Java? Do you need to learn about neural networks? Do you need to brush up on some math? The more you break a problem down, the more you will begin to see the points that must line up to get you to your goal.
4th, read about programming. Find a coding style and stick with it. Read about good and bad code — my favorite is the https://thedailywtf.com for what NOT to do. :) Learn how to code in your style. Work to make your code pretty. Work to make it readable. Continue to refine it.
5th, publish your code. Get ready for feedback, most of it negative. Embrace the pain — it is this pain which is our growth. Or, take part in a project, where you can get feedback from others. Feedback from others is how we grow.
Now for some 2021 specifics.
If I were starting out today, I would learn:
- VSCode — for my editor. I just love the ecosystem available for it, and it’s a great editor as well.
Online Editors and Compilers:
Logic and Programming Games:
- https://grasshopper.app/ — my 7 year old used this to learn basic coding.
- https://tomorrowcorporation.com/humanresourcemachine — teaches the basics of very low level coding
This is but a small sampling of what is available, making the barrier to entry lower and lower. The only thing remaining is your hard work — and a lot of that is required.
In closing, these are the basics. Many things separate the greats from the goods. But practicing the fundamentals will give you the ability to grasp things that will make you great.