Hey there traveller, I want to share a story with you. Some time ago I set off for a programming journey. This has been a fun and rewarding adventure. It was also filled with unexpected frustrations, roadblocks and dangers. I have been on the learning road for some time now and I want to share my experiences and things that did work out for me in the end.
Hopefully, some of those parts will give you ideas about how to progress, other just make you feel better that you are not alone in your feelings. This guide is written from a perspective of someone who has recently stumbled into the programming world from a somewhat different tale but hopefully also seasoned travellers can find some inspiration in it.
Where did I come from you ask? Well, the story is somewhat typical for this day and age. I worked for large corporations, coordinating work of various technicians that tried to fix a broken server in one part of the world from the opposite side of the globe. This did not feel satisfying. I always felt that there is an adventurer in me, that craves for something more creative where you have something tangible at the end of the week. World of programming was calling me, but I felt frightened that this is no place for someone like me, someone without the necessary background. One time, however, I took a chance… Let’s get started.
A fork in the road
It all starts one morning. You wake up, pack up your bag, gather your equipment (never leave without your viking axe and hat) and are ready to go. You are full of hope and motivated like never before. You may not be aware that everything will become overwhelming very shortly (and probably stay like this for a while). The first thing that I encountered on my journey was a number of different directions that I could choose right from the start.
It’s no secret that there is a lot of languages and (maybe even more) frameworks built on top of those languages. It’s very likely that if you try to read some advice from other fellow travellers they will likely contradict each other and tell that their path is the best and at the end you will get half of the princess and a hand of the kingdom (or simply become the happiest programmer in the world). Your head will surely be spinning very soon. How should a poor adventurer proceed?
There seems to be no limit in the number of paths that you can follow. Many of those look equally promising or equally scary. This illustration only scratches the surface of possibilites . I casually drop a list of programming languages from the annals of wikipedia.
You have not even begin yet and there is already so much to choose from. This will not become easier as the time goes on as something new is constantly just around the corner.
There are luckily some which can help you make a decision. If you have a friend that already knows some path as the back of their hand you are very lucky! It is always better to have someone that can help in difficult times. Select that path! If you are less lucky, there is no reason to stay at home either. Think about what really interests you (web, mobile applications, games, some math problems). This will likely limit the number of choices from the start and will leave you with some more reasonable number of choices. You can then try out some of the languages that interest you briefly. Do a quick tutorial, play with the syntax. Check how community looks like (their website, maybe some channels on youtube, available learning materials). Don’t spend too much time on it though. Most likely the choices that are suggested in each field are equally correct. In case of real struggle, toss a coin and select something.
Once you decide on one of the paths, really stick to it. Do not get distracted. Don’t go off the beaten road too far, even if you notice some brilliant bush of fruit. There will come time for trying other paths. In the beginning, you need to strive to become very familiar with one of them. Try to become as good as possible in that one thing. When you will look for contracts at the end of your journey, it is better to know something quite well rather than multiple things in a very basic way.
Lesson: After some time playing with few options, pick one and stick to it for now
Lay the foundations
You will also spend your time wisely if you invest in learning some general concepts. They are not language specific, but give you a better overall picture. These include: learning about Object Oriented programming principles, or functional programming, or SQL or concepts about working with people by reading books or essays about how great software was put together. This knowledge will transfer easily between various adventures that you choose to go to. Bear in mind that sometimes it may be too advanced for your current level, I know that I bite sometimes more than I could chew, but it is still useful to become familiar with some names (e.g. of design patterns) so that you know what others are talking about. You can always return to a book that was difficult sometime along the road.
Lesson: Learn languages before frameworks and invest in general knowledge
It helps when you know your strengths and weaknesses. You don’t need to spend a week in the woods naked to learn about this (although some might say that it helps). Truth is that it is not always easy, but when you really focus on this and reflect on your past experiences, think about what went well when you were learning something in the past and what did not work at all, you will discover that there are some ways in which you learn or work faster and better. This involves trying out multiple things before deciding on the one that works best. Some of us like to listen when others explain, some prefer reading, others like to look through more experienced viking’s shoulders and observe how they work. Find out what is the most useful way for you and follow it. There are some courses that show various strategies in learning like e.g. this course about learning techniques from coursera.
An important factor when learning something new, is leaving your safe zone. It is easy to become cozy in the environment that you are in and not try anything new, because everything works, right? You are familiar with the surroundings, nothing can surprise you. Why risk it if it is good right now? Well, if you are living in the bubble, how can you be sure that there is something beautiful and exciting right around the corner? You just need to move a bit and try it out. Additionally, when you learn something and know it well, you may become too satisfied. Programming is a field that moves very quickly so in order to stay relevant it is important to leave the comfort zone and learn about new ideas.
When you are beginning everything is new, so almost everything is outside of your comfort zone. This can be scary and discouraging as there is a lot to take in. You not only need to learn the language itself, but lots of new ideas, tools to make the work done. This is intimidating, but going slowly outside of what you know is what makes us better each day.
Lesson: Find what learning style works best for you and leave your safe zone bit by bit
Just keep on going
You’ve been travelling for some time now. It seems like it is a long way from home, but still the goal is so far away. You are sometimes frustrated, sometimes tired, perhaps the times when your journey is really satisfying are few and far between. At the beginning, everything looks easy, but then there comes a point when many things become harder and you feel like you made no progress or you will never reach your destination. This is ok. Other adventurers have felt the same (I know I have). If you struggle, this means that you are in fact making progress. If you did not feel pain, this would mean that you are not challenging yourself enough, and the only way to become better is to make another step into the wilderness.
Practice is important. You may not feel significant and instant progress each day, but if you stay motivated and keep practicing you will eventually become better. This sometimes is like magic that the old man in the village mentioned that one time when you were sitting by the fire. It is not something easily noticeable but one day everything will fall into place. Part of the frustration that you feel comes from the new things that you will find and will not quite understand at first. There may be times when you will feel like you are reading some ancient hieroglyphs left by an alien race. That’s ok. Maybe you just went too far and need to get back when you have some more experience. Everything will become clearer with more experience. Some traveller’s notes are just too advanced for you at this stage. Some are directed for more experienced adventurers, but don’t give up. Some day you will look at those mysterious notes that you’ve seen at the beginning of your path and everything will suddenly make sense.
You just need to remember to practice every day. It can be an hour, it can be a bit more, but be persistent and do it every day no matter how hard it hurts and how tempting it is to never leave your tent ever again. It is better to practice shortly over a longer period of time than to have long stretches of learning one day in a week. It is required to move the blocks with knowledge from short to long term memory.
Lesson: Be persistent, don’t give up
Draw a map
While spontaneous adventuring is great, having clearly defined steps can be useful for such a long journey as ours. It can also make your life more organized if it is too chaotic and help in the long run.
It is no secret that when going into wilderness planning is important. You want to prepare for as many surprises as possible and have a target in your journey. This is not always simple (especially if you don’t know what to expect - as a beginner I certainly had no idea), but try to prepare. Have a list of items that you want to learn, have some overall deadlines with dates before which you want to achieve it.
Try to schedule regular hours for your learning based on your previous experiences and lifestyle. Your organism will get used to it. Try to work even if you don’t feel like it. I found that when I skip one day because I don’t feel like doing it, it is more likely that I will skip the following day as well and then give up altogether. Don’t let that happen.
There are some techniques that may be helpful in being persistent and staying focused - like pomodoro. Some useful techniques were described in one of the previous posts by Piotr. It is similar as in finding your learning style. Try it out, maybe it will work for you. There is also a chance that something else works better. Find out what time of a day you are the most focused / awake / productive and use it to your advantage. This will help you in being persistent. If you know that you have fixed hour for learning scheduled each day, it is more likely that you will do it.
Plan in some breaks as they are also important. We are not robots (not yet, unfortunately, but I keep googling for the possibility of cybernetic sight or arm). You can also use that plan for awarding yourself for meeting deadlines (the proverbial carrot can be anything: new video game or new shoes - whatever works best for you). Reward yourself for the streaks of learning. This will help you motivated to press on. There is a chance that one time, gaining knowledge will also become a motivator in itself.
Don’t be too hard on yourself. Take all the time that you need. Try to be as systematic as possible though.
Lesson: Be systematic, keep an eye on the target
Try what you see
Experimenting in wilderness may not be such a rewarding experience. You may discover some delicious new fruit, but there is also a chance that this beautiful strawberry-like bush will kill you. Luckily in programming, such risk is really small, so experimenting is highly encouraged. Scientists experiment (I always liked those cliched movies where they explode whole labs with uncarefully mixed ingredients), children also learn by experimenting. You can facilitate your learning by trying stuff out too.
You know how it is in life. In order to learn something, you need to try doing it. As practical as it would be, you really can’t learn skiing by watching winter olympics in tv (no matter how big the tv is). You need to try and fail and then try again and eventually become proficient.
Whenever you read a book about a new or an old language - old ones can teach us a lot, too - try to read it actively. I am sure that most of the books say that in their introduction so trust them and trust me. Type out the examples that they show. Then change some things, then add some things, then try to break some things. Does the program still work? Then think how this relates to what you already know. Don’t be passive.
You can also apply this to a multitude of available code bases out there. Try to find something that interests you on Github, fork, update, check how it works and again experiment. This is how you will learn things faster. All the paths are filled with bits and pieces left by other adventurers that struggled just like you. Use their experience and build on their experience.
Reading your own code from the past can also be illuminating (see this fantastic post by Dawid). It can also be motivating when you will see how far you have gone.
Lesson: Be active learner, read code and experiment
Build something larger from scratch
Practicing on discrete examples can teach you about basics, however, it is also useful to try something more ambitious. In order not to fall to false complacency that tutorials can lead you to, you need to build your own ideas and build them from scratch. Try things that are not just copying from books or tutorials. Sites like codecademy are great, but these are heavily guided and you always have those hints and forums to fall back on. You may breeze through the examples and feel that you are ready, but this is a bit misleading.They are great for syntax, but nothing will teach you more than building your own ideas. You will then see where you need some more training, what gaps you have and what information to look for. You will also find how things connect.
If you sit down before an empty editor and start creating you will see how many things you need to learn. What are the gaps in your knowledge and how all those small parts work together. You will need to find answers on forums, ask questions and really think about designs. This is really overwhelming task at first but it is also very illuminating.
This is when you will really put your brain to work and use the knowledge that you had. Building your own projects can also keep you motivated. It is very likely that you started this journey because you had idea and wanted to build something. This is the time. You may not yet have all the required skills to complete it, but you will know what you are still missing in the toolbox. You can go one step at a time and go back to your projects armed with better tools after some time.
This will also keep you from a dangerous trap when you watch someone doing something and think to yourself “pfft, that’s easy!”. Try to do it yourself - usually you will find that you will struggle with some parts that seemed so trivial in that video you just watched. When you are building things, it will make you think and test how those branches are put together to build a hut. It can look easy in the picture, but if you will not try it yourself you will never learn the intricacies or will never notice something in the back wall that is not as obvious as it seems.
If you feel like you don’t have lots of ideas, build simple things: blogging engine, basic twitter clone, movie catalogue. There is no need to be original. Find an application that you like and try to rebuild some of its parts with what you learnt. Or put a twist on common apps - like randomly generated todo list where you can mark things as “to be done tomorrow” or an achievement based list for home chores.
You even don’t need to complete all of the projects. It’s ok to leave some of them partially built. It does not matter. Maybe you will come back to it in the future, maybe you won’t, but each hour building gives you more confidence in what you know. They will also be helpful once you finish your amateurish adventure and try to become paid professional. Potential employers will be able to see what you have built.
Lesson: Try building lots of your own projects, even if you don’t complete them
Keep your eyes and ears open
When you are out in the new place, there is a lot of things going on. Be open to them as they can give you a lot of experience. You are likely to meet other adventurers that want to share their knowledge about what they have found out (sometimes they will be really passionate about their way of doing things and tell that it is the best). Listen to everyone and try to understand their point of view. Do not criticize other paths. All are equally important, even if they prove to be unsuccessful in the end. This is especially true when you are beginner. You don’t know if something is good or bad yet. It would be silly to repeat something that someone else said without too much knowledge. It can only make you feel stupid if someone asks follow up questions and you really don’t have anything to back up your claims other than “forum X said so”.
Once you become familiar enough with your path (I would say it will take at least a year, but it varies from adventurer to adventurer), add something more to your schedule. A classic book recommends learning one new language a year. While it might be very difficult to really master something in such a short time, it is good to try out some other paths that will expand your knowledge. Try something else from a completely different spectrum that you are aware of. It will give you more survival tools for your journey, but remember not to get distracted when you are just beginning.
We can learn from each other, choose the best parts and apply them in our life to make it easier and more manageable. Each language and framework can have useful parts that drive the dynamic world forward. You need to be like a sponge. Listen to everything, read everything, experience the world around you. After becoming familiar with one path, take another. Maybe one that is completely different (like in functional vs object oriented programming). Even failed ideas can teach us a lot (or even more than the successful ones). Keep an eye open for the builders of those crazy flying machines.
Learn from different sources. Having been presented with one point of view is not always a full picture. Maybe the source that you read is not completely honest or did not find some issues that others had with specific technology.
Lesson: Be open to other ideas
Respect your elders
It is more dangerous to travel alone. Nobody will tell you that the plant that you have found is poisonous and it is better not to touch it. There are some benefits in being a lone traveller trying various things on your own, but having a more experienced person next to you is a great asset.
If you have that someone at the start of your journey, you are incredibly lucky. If not, don’t panic. There are lots of adventurers meetups where you may be able to find someone, there are lots of open source projects you can take part in if you feel like it. Finally, there are boards where you can ask for advice. You really are not alone.
Be respectful though. A lot of other people are willing to share their time and experience and time is very valuable. Ask meaningful questions when you are stuck. Show what you already tried. This will save time for both involved sides as the mentor will not give you answers that you already tested. It will also show others that you are not looking an easy way out, but you really struggled with your problem.
Sometimes by describing your issue to someone else, you will find a solution yourself. It was there all along, you just needed a deep breath and putting what you are working on together. Then you will likely see a clear path that was hidden before. It is known as rubber duck debugging
Find people who are worth following or speak to you best and read what they have to say. Follow their journals, twitter, smoke signals.
Lesson: Respect people that are trying to help you
Share your story
When you are on the road, you often use knowledge of others. You find their notes, use their advice or read guides. This information does not come out of nowhere. Other travellers spend their time in order to provide guidance for less experiences fellows. This is what is beautiful and fascinating in this community. Especially in comparison to some other fields.
You can join meetups of travellers on similar path like you (those who selected another fork in the road will likely be happy to see you as well), you can share your joys, fears, ups and downs with them. Do not break that chain. Help other travellers on their road, write about what you are learning. Especially if you had troubles finding the information yourself or what you found was not written clearly. You can save someone’s ass (I mean time). It will also help you in facilitating your knowledge. In order to explain something to someone else, you need to really understand it so it is the fastest way to find gaps in your knowledge and fill them up. It can also be rewarding if someone thanks you for solving their problem or showing the path.
Even if you only describe your struggles, it might help others who will no longer feel like they are not able to succeed. Remember that frustration that you feel. Others feel it as well and are looking for someone who feels the same way too.
If you are too afraid to speak to a larger audience, you may explain what you learnt to your husband/wife, girlfriend/boyfriend, dog/gold fish (I have no experience with cats so I am not sure how good listeners they are in comparison to a statistical spouse). They don’t need to be programming adventurers like you. If you can explain what you read to a non-technical person, chances are that you’ve learnt it well.
You can also write a blog post (or something to hide in your drawer, but it is usually beneficial to share it, no matter how scary it feels). It may be easier that standing before a large crowd. You have more time to review what you want to say. Maybe some other weary traveller will find your journal and will become inspired or find consolidation on their hard times.
Lesson: Share your knowledge and experiences
Programming journey has been a fascinating one for me. It is a great way to satisfy a hunger for knowledge, do something challenging and at the same time rewarding. There are some difficulties along the way no matter how motivated you are in the beginning. Hopefully, this guide showed that you are not alone on the road and gave you some ideas on how to overcome those obstacles. This is by no means a complete and thorough description. These are more like a loose thoughts that I had.
Keep going adventurer, maybe we will meet somewhere along the way.