Programming is everything and everything is programming!
I was recently reading through comments on a Youtube video while eating my lunch (You know, like you do) and I came across one that got me thinking. It was a question from someone looking for guidance early in their coding journey, and concerned about the effects of a coming recession. It read:
What if you are new? Like started coding 1 month ago? 0 experience. Trying to learn the basics of web dev currently. You don't have any job currently, and already started to burn through your savings. Any advice?
This got me thinking about what I've learned in my career, the choices I have made, and how it could apply to this person's situation. I've been where this person is, more or less, and I truly feel for them. Granted, I'm not a professional dev and not in a hurry to get there, but I've had a "colorful" career so far, that has led me to a good place and taught me a lot of lessons along the way.
I realize now that learning programming has had a vast effect on my ability to think and to interact with the world, and interacting with the world has likewise had a vast effect on my ability to envision patterns, retain principles, and write code. So I started thinking about what I could say to help them, or at least lend some encouragement. It turns out what I can offer as my opinion is beyond the scope of a comment on a video platform. So I started writing this post.
Life and code have more in common than you think
Everyday life is like programming, I guess. If you love something you can put beauty into it.
Think about taking care of a houseplant, or a pet, or a child. The more you spend time with it, nurture it, provide what it needs, and give it the space and resources to grow, the more it will grow, be healthy, and flourish. The opposite is also true. If you neglect it, it will start to decline, possibly decay, or worse.
Code works the same way. Give it the time to make it better, the resources to run properly, and maintain it well, and it will stay healthy. But if you neglect it, it starts to rot away. Sure, the actual code is still there, but runtime updates, dependency updates, and emerging best practices will make it obsolete over time, to the point that eventually it won't run anymore. Your code is dead.
This all sounds quite gruesome, but I wanted to make a point. There are a lot of parallels between code and life, between programming and living, and between the abstract world of technology and the very real but still abstract world of reality. Both have patterns, systems, best practices, and things you just don't do. If you can start to uncover the patterns in life and in code, you can start to find similarities. You can start to see things in both life and code as reactive, responsive systems. You see inputs, you see outputs, and you see how it all ties together.
Let's say you are struggling with a coding concept. If you have been paying attention, you can probably find a situation in your real life that will give you a living, breathing metaphor for the concept you want to learn. I can give you an example of this. Let's say you are struggling to define what an algorithm is and you are working as a cashier at a supermarket. Your day job has a perfect example of what an algorithm is, and you are actually a part of it.
- The shopping cart that the customer brings to your register is one of the inputs to the system. In this case, it contains a collection of items the customer wants to buy, which is a data structure.
- You start scanning the items, and each one is added to the receipt, and increments the total of the transaction. The receipt then is an output, in the form of another data structure. The total that the register calculates and increments is a variable.
- You represent the loop in this algorithm. You loop through the items in the cart, scanning each one. You are "iterating" over the cart (input data structure) to create a receipt (output data structure) and calculate a total (variable that is mutated as a side effect). At the end of the transaction, you have transformed the cart input into a receipt output and a total the the customer needs to pay you.
You might think this is strange, but if you look hard, you will see similar examples everywhere! And there is power in this, because this allows you to build an internal library of real world examples to allow you to grasp concepts at a more fundamental level. This is not only helpful, but necessary to allow you to think faster, learn faster, and progress faster. I'll get to why in a bit.
Learning how to learn is now the most critical skill
We now accept the fact that learning is a lifelong process of keeping abreast of change. And the most pressing task is to teach people how to learn.
In the world we live in now, things change faster than at any time in human history. Just 40 short years ago the internet was just a novelty and few people could even grasp the concept of email. There weren't smartphones, or even cell phones, save for a few cumbersome units used by the elite. Whole office buildings were dedicated to rows upon rows of cubicles, with people doing "data processing" jobs that were considered strong middle class positions. Those jobs have all been replaced by computers, and at a reduction in cost and increase in throughput that wouldn't be believable in the 1980's.
Imagine being in the generation impacted by this change. People who started their careers in the 80's saw their jobs under threat in the 90's as the internet revolution and increases in automation started taking shape, and saw many of the manual information processing positions go extinct by the mid 2000's. This came as a shock, and one that these people weren't prepared for. Their parents didn't have this much change to deal with, nor did any of the generations that came before. Automation allowed for increases in production scale that weren't possible before. This was a tipping point that shifted the paradigm of knowledge work the world over, and then bled in to other industries like manufacturing, agriculture, logistics, etc.
The big multiplier here was the effect that computers, automation, and eventually big data and machine learning was having on everyday life. Suddenly people found themselves in a world where paradigm shifts occurred not from one generation to the next, but from one year to the next. Jobs that never could have been conceived of 5 years earlier were popping up as other jobs were automated away. This led to an interesting situation:
The only constant was change, and the change was accelerating.
What this means for you and I is that the greatest skill we can posses is knowing how to learn, and do it quickly. This breeds adaptability, meaning you can flex with changes, flex your thinking with new information, and allow yourself to grow to meet the challenges presented, rather than stagnating. The faster you can assimilate new information, the more valuable you can be to yourself and the world around you.
Learning at a conceptual level is important
didn’t know what was important and what was trivial. They couldn’t remember what mattered. Without a conceptual framework in which to embed what they were learning, they were effectively amnesics.
There is a key point that differentiates between people that can learn things and retain a good deal of them, and people that can learn A LOT of things an retain nearly all of them. It is subtle in nature but mighty in impact, and is one of the biggest indicators of outcome when trying to learn something new. And it's surprisingly simple.
Do you understand Why?
Imagine yourself in a classroom learning something new, with a variety of other students closeby. Some are picking up the new material quickly, and it seems natural to them. Others are struggling to retain it, and it quickly fades away in their minds. Depending on what the subject is, you could be part of either group.
Imagine again that you are a teacher, and you have a group of students learning a new idea. Some of them pick it up quick, and others struggle. How would you view the students that picked it up quickly versus the students that struggled?
Hold on to these scenarios in your mind for a minute. I'll come back to them.
Learning something at a conceptual level is less about learning how, and more about learning why. It's about finding the underlying pattern of something that ties it to a logical or intuitive representation in your mind. (and in some cases, both). It is about creating an abstraction to represent the idea behind it, so you can base interpretations and decisions on something that makes sense to you.
A great example of this is learning to cook rice. If you just learn the steps - measure rice and water, put it in a pot, heat for x number of minutes, rest, serve - it's still just steps. But if you take the time to learn the underlying concept, it becomes much more useful. For example, if you understand why the rice and water need to be at a certain ratio, and what you are doing is simultaneously re-hydrating and cooking the rice, and you need to keep the lid on so you don't lose cooking liquid, it solidifies a concept into your mind. This concept then works for other things, like cooking quinoa. By learning the concept once, you can change some variables on the input side and come out with something else, and know what is happening in between.
Programming is the same. Walk through the steps of a semi-complex programming task without understanding the key concepts and you can probably get it to work, but the next time you do something similar you are starting from scratch again. This is the fallacy of tutorials that hold your hand too much. It's easy for you when all the steps are spelled out, but once you take the training wheels off and try something on your own it suddenly doesn't make sense.
The alternative is to take the time to consider things like SOLID principles, what the right data structure might be for an input or an output, time complexity of your algorithms (Big O), and possibly a design pattern that can help you out. In a learning setting, look for teachers that take the time to go through these things and give you concepts to go with the code. The result is a much better conceptual understanding of the problem, leading to a cleaner and more elegant solution and a greater understanding of how to solve similar problems in the future.
Refer back to the teaching examples above. Can you think of times that you've been in the fast group and times you've been in the slow group? Can you imagine being the teacher and seeing some student thrive and other struggle? I would bet the difference is conceptual learning vs learning by memorization. The better students get the concept.
You always gain by learning, regardless of what you are learning
"Be passionate and bold. Always keep learning. You stop doing useful things if you don't learn."
"I never lose. I either win, or learn."
Did you know that learning to be a better communicator helps you write better code? It's true! The better you can communicate to others, the easier it is to write code that will communicate it's intent to the person that reads it next. That person might be you in a few months or a few years, so it's worthwhile to make sure it makes sense.
Did you also know that learning to write code in modular, cohesive units helps you in everyday life? This has more to do with the concept behind learning to divide code up into units: you are learning how to divide problems up into logical sections, which allows you to think more clearly and deeply on each section. You can also better understand the boundaries between different concepts, and how they compose into the greater whole.
Sound interesting? It should.
Everything you can learn, from the very basics of tying your shoes, to the esoteric heights of theoretical physics, can have an impact on everything else. As you learn, you develop more refined and complete mental models of ... well.. everything! Life is much more intertwined than you think. Your mood can affect the outcome of your day and vice versa. Random things you learned years ago can suddenly apply. As an example, I learned the Pythagorean theorem 20 years ago and never used it - until just a few days ago when I wanted to calculate a CSS offset for a clip path and make it look right at an angle. Useless for 20 years, and then suddenly I wasn't getting that CSS done without it.
So the point is that whatever you learn, it has value and can be applied elsewhere. Sometimes it's obvious. Sometimes it's just as metaphors for other things, or something you can use it to contrast your current thinking and challenge yourself. So take every day and every activity as a learning experience, from classes in school to a boring job, to coding bootcamps and courses. Find connections to other things. Find differences. Find patterns. And don't ever be afraid to learn something new. You never know when it might become useful.
Skills get work done. Soft skills generate opportunities.
“Take advantage of every opportunity to practice your communication skills so that when important occasions arise, you will have the gift, the style, the sharpness, the clarity, and the emotions to affect other people.”
I think this is an important distinction that needs to be made. You can be the most skilled person in the world at any difficult craft (of which programming is one), but what does that get you if you can't work with others? Nobody wants to work with a jerk, or someone who isn't willing to stand up for themselves, or someone who talks in circles and never gets their ideas out. You can have the skills to kick out work very quickly and at high quality, but it would actually be less important than a few simple soft skills. And every soft skill in one way or another, comes back to the basic but critical skill of communication.
To start with, keep in mind that people generally want to help each other, and especially people they have things in common with. This is the basis of communities and tribes. By working cooperatively, groups are better able to find and manage resources, protect each other, and achieve things together that aren't possible for a single person to do. So where you fit into this is actually pretty simple: Be the kind of person that will help others, and develop your communication skills to be the kind of person that people would want in their communities, and people will help you.
What surprises me though, is how many people get this wrong. You see it all the time as the infamous internet troll and the grouchy person on the street. It's not that these people don't want to be part of communities. In the case of the internet troll they probably very much do want to take part, otherwise they wouldn't be posting anything. It's more that they haven't found effective ways to communicate what they want and need to say. The result is that they use negative language and approaches, mostly as a way to make themselves feel better. This is unfortunately at the expense of everyone else around them.
The contrast is the people that get it right. They are easy to spot because they are easy to talk to. They are approachable. You come to trust them. (As long as they are trustworthy) These are the people that become the cornerstones of communities, and as a result, when they are in need, those same communities will move mountains to help out. If you become one of these people, you will find yourself in a position where opportunities are abundant and you have the resources to capitalize on them, because people will want to help you.
So which do you want to be? I think the answer is obvious.
Managing your perspective improves outcomes
"If you change the way you look at things, the things you look at change."
Most people don't think about how they see the world and how their perception can alter the world around them. It seems almost magical and beyond the realm of reality to even think about. But there is a surprising amount of science and logic to support this.
To start, your brain's first and largest job is actually to be a filter. And for very good reason. You have over 7 trillion nerve cells in your body. That is beyond a lot. That is an unthinkable number. And on your skin alone, you have over 1000 nerve endings per square inch. Each of these is constantly reporting information back to the rest of those 7 trillion nerves about things like hot, cold, pain, pressure, and myriad other things.
Do you notice all of those? All some odd million sensory inputs per second? Of course not.
This is because your brain is filtering them out. Only what you need to know for your immediate survival and higher operation comes to the attention of your consciousness. The rest is analyzed for importance, and mostly discarded by lower portions of your nervous system before ever getting near to any real thought process. And this is good, otherwise you would instantly become completely overwhelmed by all the nerve signals, and promptly go completely insane.
But this isn't even the full extent of it. There are parts of your mind that are thinking without you actively doing the thinking. This is your subconscious. And believe it or not, most of the decisions that you make through the course of your day and many of the larger decisions you make in life are made at this level. Some estimates put this at upwards of 90% of all of your decisions. That means it's possible that 90% of your life choices are made without you even being consciously aware. Believe it or not, this is still a good thing. If you had to make all of those decisions, you would still go insane.
Your brain has been designed through eons of evolution to surface only the most important things, and handle as much as possible without using any of the higher order thought cycles of conscious thought. This means that you can learn to walk, or ride a bike, or drive a car, and once you have it down you can do it without thinking about it. There is a part of your brain that is thinking about it, but you can move on to bigger ideas. This is the nature of habits and biases, and by design these things can help you in the long term to instinctively protect yourself and those around you, be aware of things without focusing on them, and ultimately survive.
This then begs the question:
What important things are being filtered out by your subconscious? And what habits and biases are you perpetuating without even realizing it?
The true reality is that we live in an abundant world. There are constant opportunities around us to improve our situation, move closer to our goals, or move the other way by chasing quick fixes, fast money, and the easy way out. Some people see the opportunities and some don't, and this is largely a result of how our perception has been trained.
So you can start training your perception to be different right now. It will take practice and it will take time, but the payoff is there at the end. And most of this process is as simple in theory as adjusting your perspective, which will then lead you the direction you want to go. In practice, it will be a challenge, because you are asking your brain to work differently. It will resist at first, but ultimately will play along if you stick with it.
And as for the example of a job being an algorithm above, this is how you find more of the examples I was talking about. You learn to see them. Once you start, you see them everywhere. You start to see the world as connected systems and processes, and you start to understand the higher level concepts surrounding everything with greater speed and clarity.
Understand that any change will be a process
"The good life is a process, not a state of being. It is a direction not a destination."
In a world of on-demand video, fast food, and everything you could ever need just a few clicks away, it's easy to get accustomed to everything being this way. But it you want to change your life, you need to get comfortable with a different pace, and manage your expectations accordingly. Things won't happen overnight. They might not happen on the first try. Failures will allow you to learn, which makes the next attempt more likely to succeed.
It's easy to say "I was that and now I'm this", but that's not how it works. Even if you decide to make an abrupt change, you have to actively curate that change until it becomes part of your habit patterns and subconscious mind. Nothing in this realm will be quick. What I suggest then is to adopt the attitude of guiding the process, and make it open ended. Don't set goals. Set milestones instead. This allows you to keep moving and keep growing, and keep learning and adapting. Ultimately this will let you reach far greater heights than you imagined.
So what about the question that started this post?
"What if you are new? Like started coding 1 month ago? 0 experience. Trying to learn the basics of web dev currently. You don't have any job currently, and already started to burn through your savings. Any advice?"
Random person on the internet
The quote that started this post came from a person that wanted a change and took action to make the change. They are not alone. The situation can be scary, and people can become discouraged quickly.
My response to this person would be this:
- Find every opportunity you can to think about things in programming terms
- Focus on building your learning ability as priority one
- Learning concepts over content will get you farther
- Learning is never truly wasted, even if you think you were going on the wrong direction
- Soft skills, especially communication, will be key to reaching your goals
- Learn to shift your perspective for better opportunities and better results
- Understand the process and embrace it
By following these guidelines, I am confident that person will find success. Not just in programming, but in anything they want to do. I hope to see them in the future in the tech community as an active, positive member.
Until then, I'll keep following this advice myself and keep on growing.