What if you didn’t have to go to college and study to get a four-year degree?
What if you didn’t have to go to a coding camp and learn there? That can be quite expensive too, if you can at least find a good one.
What if I showed you how to effectively learn on your own, so within 3, 6 or even 12 months you will be effective enough to code on your own and build professional software!
I’ll spare you my “marketing” skillz for this blog post and just show you how…
Building a learning plan is a justified and often overwhelming thing to do as a software developer who is teaching themself.
You need to figure out what you want to learn and how you are going to learn.
At the end of the day, you’ll need to know if you have won and accomplished what you have set out to do and if you were successful or not.
These are some of the things I wished I knew when I started learning on my own and now I am here to teach you from my mistakes.
Sometimes I found myself stuck not knowing what to learn and where to go, but that is no longer the case.
In my previous blog post I wrote about developing technical skills and how to immerse yourself as a software developer, because I believe immersion is the key to unlocking your success as a software developer.
In that blog post, I briefly touched on developing a learning plan, but in this post, we’ll dive a bit deeper and learn how to develop one.
Learning plan? You need one
Now you maybe asking yourself, “What is a learning plan?”. And yes I understand your confusion…
A learning plan is what it says it is; it’s a plan or curriculum that you’ll follow in order to learn a new programming language, framework and build a full application.
But it’s really more than that. By developing your own learning plan (curriculum) you can judge for yourself what is truly necessary and what can be left out.
Okay, so you should be familiar with what you want to learn and what that something is and why you want to learn it. If you somehow miraculously haven’t, I’d suggest that you read my previous blog post on how to immerse yourself.
What and where
So you’re now all fired up and want to dive straight into learning your first framework and building cool applications! You have spend a good amount of time learning about software development and your favourite language and using a framework.
Okay, so you know what you are wanting to learn right? I certainly do! I am learning Java with the Spring framework.
Awesome! So we have somewhere to start before you run this marathon, rather we know where the starting line is.
The next question to ask yourself is how you are going to learn this one thing? And what you should know before you learn it.
When you assess how you are going to learn (I have’t covered this yet) it essentially mean, what are you going to use as your medium or platform for you plan. Where are you going to learn and teach yourself?
What would I know before I start jumping into learning this framework or programming language?
These are very important questions that you should ask yourself. I’ll share a little secret with you, don’t worry if you can’t find the perfect medium for learning just yet. You first need to dig around and play before you are ready to learn.
Don’t really worry just yet with what you are going to learn. You may choose an “immature” approach, such as online free tutorials and YouTube videos to get you started. If and only if you have outgrown those and they are no longer helpful, is when you should step up your game and learn elsewhere.
Hey, what about books?
Well, unfortunately books take to long to read and understand (trust me I have tried). You first need to learn how to read technical books in a certain way before you can make any use of them. Especially, technical books are well, technical. You may not find them appealing to you and easy to understand. I didn’t at first, but you’ll eventually get there.
Try online tutorials, paid courses, and guides. Remember, I didn’t say everything was going to be free! If you really are hopeless, get a book and mark-out the sections that are appealing to you and read those.
(if you’re patient, I’ll cover how to read books in the next blog post).
You certainly need to give it enough time and patience before you allow yourself to learn by following your learning plan.
(Learning how to learn more effectively will also be covered in another blog post too.)
But this blog post isn’t about learning how to learn, it’s about learning how to build a learning plan.
Okay, so let’s just dive into it and start hacking up a plan.
Define your goal
“Not to beat a dead horse” as I did mention this in that previous blog post, but I feel this needs to be said again.
Defining your goal is very important as it will help you determine the success or failure of what you set out to do.
Your goal is your end result, what you have envisioned your future self to be and be able to do.
My goal still stands for this year:
Become an Enterprise Java developer.
Become a Node.js developer
Define your agenda
Your agenda is also very important. It’s a short summary of what you’ll do to achieve your goal.
This is basically a high level view of what you are needing to do, and leaving out the details…
My current agenda is as follows:
Learn the Java programming language (fill in knowledge gaps). Learn Java core platform. Study algorithms, data structures and design patterns, Learn Java EE, Learn the Spring framework and Unit Testing.
Your agenda doesn’t necessarily have to be in a specific order, you can actually learn two things at once, be it that you have the time.
Thinking about your plan
Okay, so you should have a good an idea on what you want to learn.
To give you an example on what specifically a software developer should know when starting out, there are only a handful of things to know… But let’s take it at a graceful approach and not excite ourselves.
Start with one programming language. It doesn’t really matter which one, but choose one that you’re interested in and is in high demand.
Spend a good amount of time only learning this language and play around by creating small applications using a good amount of the language’s features.
Learn the core of that language, understand basics on the common or standard APIs that are available, like Date and Time, Collections and I/O.
Once you have a good “feel” for the language and you truly feel comfortable with building a complex-ish app with it, it’s not the time to learn your framework of choice.
The next part would be to look into the framework that you want to learn
Explaining a framework to a beginner is quite unpredictable. Some people use frameworks everyday and don’t even realise it; i.e. Java Swing.
This can be very challenging especially if you haven’t used a proper framework before. Spend some time looking into the framework, what it’s about and read and overview of the core concepts.
I know this may seem a bit obvious, but it’s very important that you have a good understanding to what the framework does, how it works at a high level and the problem it solves.
This is a pretty crucial step as without it you’ll often find yourself running into problems and not knowing how to get yourself out of them.
Okay, so once you really understand and can make sense of the framework that you want to use, it’s time to start playing and building small-ish apps.
If you feel overwhelmed, this is completely normal, but it’s a good idea to go back and look back at your understanding of concepts on how the framework works. Your overwhelming feeling should dim down a bit and you should feel a bit more competent.
Defining your learning plan… FINALLY
Okay, now we finally get to what you have been waiting for… Building a learning plan. Man that took forever right?!
Remember your learning plan is the precise steps that you’ll take in your learning venture; it’s defining a curriculum, if you will.
When creating a learning plan you need to consider two things: the amount of time you have and what you are wanting to do.
I have given myself a year, accidentally. Well because I had to figure everything out for myself that I am telling you. It is hard, but I’m still making a lot of progress.
Okay, first step: Brainstorm. Yes, really! Brainstorm all the possible things that you need to learn in order to build some sort of application..
“Well wait a minute here? I don’t even know what I need to learn?” You may ask…
Okay, so let me rather give an example of a learning plan, and we can take it from there…
Java Programming Language
- Core Java
- Collections and Streams
- Date and Time
Write a blogging platform application
- Include MongoDB
- Understand Spring Data commons:
- Paging, Sorting
- Spring Data MongoDB
- Mongo: Indexes, Annotations, Converters, Cascading
- Include REST endpoints
- Learn about servlets
- Learn Spring MVC
- Include Security
- Learn the basics of Security: OAuth, JWT, Http Basic
- Learn Spring Security
- Include Tests
- Learn JUnit
- Learn Spring Test
- Learn how to use Travis CI
- Push to production
Learn computer science basics
- Design Patterns
- Breadth-First Search
- Depth-First Search
- Binary Search
- Merge Sort
- Quick Sort
- Data structures
- Linked Lists
- Trees, Tries, Graphs
- Stacks and Queues
Okay, so if you look at that from a beginners stand-point you just might want to give up, close shop and walk away. It’s fine that you may not understand everything listed on my learning plan and you don’t need to, just yet.
You’re learning plan will be completely different to mine, or you might even just copy mine, drop everything that you’re doing and head straight for the “books”.
- Learn the basics of HTML/CSS and the core DOM APIs (document and window objects)
- Learn how to create a basic HTTP server with Node.js
- Learn more about HTTP
- Learn about NPM and how to install packages
- Learn how to install and use Express.js
- Learn about React.js and what it’s used for and the problems it solves
- Understand what are “reusable components”
- Build a basic application with React.js
- Make a complex application
- Learn about AJAX using XmlHTTPRequest (this is a low-level API)
- Learn about Lodash and JQuery (build on top of XmlHTTPRequest)
- Build a fully featured client and server application using Node.js with Express.js and React.js
- Build another complex application with the knowledge that you learned from the first one
About Month 4-5:
- Learn Git and how to use Github
- Build another application and work through the overwhelming feeling of using Git.
- Learn about Unit Testing
- Learn about the different Unit testing frameworks
- Practice writing basics test and test suites
- Add tests to your previous project (difficult)
- Learn computer science basics
- Understand (not master, yet) Big O notation and Recursion
- Common searching and sorting algorithms
- Build another application incorporating your new-found knowledge:
This is where you can kick it to another level and expertise your skills by reading books.
If I had this knowledge a while back, I would have saved myself a ton of time and effort just by having a plan and not wondering around confused.
Having a plan is the pivot to your success or failure. At times I felt like I wanted to give up and often hated that the fact I was little or any progress at all, because I didn’t have any guidance or plan ahead of me.
You need structure with everything. Like John Sonmez says, “Trust the process”.
The power of persistence
Okay, so you’re all pumped up and ready to start learning as much as you can in the shortest amount of time!
You might be thinking to yourself “Hey, I could finish this thing in a week!”
You can surely try to depending on what you’re learning, it may be so or it realistically will take a few months.
You need to judge that for yourself.
Anyways, the power of persistence is a powerful concept. No matter how hard you try to squeeze something into a short amount of time, the more difficult it will be on yourself.
Unfortunately learning doesn’t happen the way we want it to be, quickly. Instead it’s a long-enduring process that takes a long time.
Having a built wall is the end result, it’s what you’re ultimately striving for. But you shouldn’t focus on the glamorous wall at the end, rather focus on the process of laying each brick as best you can, everyday.
And one day, when the time is right, you’ll have a glamorous beautiful brick wall ahead of you and you can proudly say, “I built this wall, all on my own”.
Persistence is key because you must realise things take time and that if you just keep at doing something each day for a long time you’ll get very far.
That’s why I say, you should always make small improvements everyday and you’ll have an enormous progress over an extended time.
I must be honest, I only remembered to mention this at the day of writing this blog post (on the day I am scheduled to release it).
But anyways, a quick note…
Create a weekly report on everything that you have learned throughout the week.
This is useful when you need to reflect on everything that you have learned, you know, when the lack of motivation hits you.
Here is an example of this week’s weekly report
Weekly Goal: Finish learning Java Collections Framework
Expectation: Fell of the wagon and dove right into the Spring Security.
Revised the Spring MVC framework and Spring Boot features. (It makes a lot more sense now).
This week was a bit unstructured and I did bounce everywhere after readying to many blog posts on Reactive Spring (I’m very excited to learn it).
This is just a silly example, but a weekly report would look something similar to that. But it’s really up to you to write it and how detailed you want to be about it. You could very well document all the things that you have learned throughout the week, which is very useful.
i.e. Learned how to configure Spring MVC
-> Learned about WebMvcConfigurerAdapter class for configuring Spring MVC.
Okay, so the key to getting good at programming is to code, a lot. Practice as much as you can because if you don’t, your skills will eventually fatigue and programming once more can become difficult again.
What you should do is built as many applications as possible!
No, I don’t mean start and app, set it up and play around with it and not finish it. That app is worthless because it can’t be used. You have put all this work in and it doesn’t really count for anything other than sentimental value.
I have done this. I have created a few apps, spend hours and hours working on them and I’ve never completed or released them.
You should have a few basic ideas of apps that you can build.
If it’s a webapp, build a blogging platform like wordpress. (You can do this with Node.js and Express).
If it’s an Andriod application, build a simple TODO application or you can build a native Andriod client to consume your blogging platform’s API.
If you use iOS, well . . . goodluck.
Designing an application can get quite complex and difficult with regards to having a team and so forth. Rather take a pen and a large piece of paper and brainstorm all the ideas, features and so forth of this application.
Make little diagrams of how the interactions of how your application will go. You don’t have to design an entire software spec, because you’re not on a team (yet) just design the layout as best as you can for yourself.
Your idea should be centered around a Minimal-Viable-Product (MVP) and should only include the most minimal way to get this thing out and “completed”.
Once you have done that, then you can add nice features and so forth later.
Hacking it together
~The novice hacker~
This is somewhat of a skill I think all software developers should have: Being able to hack together an application.
What this essentially means is to be able to create an application by just making things work. You don’t care about the design structures or design patterns or the scalability of your algorithms, just yet.
This idea is borrowed from “brute-forcing” your algorithm and just making it work. The same can be applied to building an application.
Would you believe me that I build an entire application that wrote to files, had many forms (layout), was somewhat multi-threaded, could download files and could parse cryptic XML?
Well yes, I did. I only knew a handful of things, but my knowledge went a long way. I managed to build this application just by hacking away at it and using solutions on stack overflow.
I didn’t even know C# and I did this.
You need to do this as it builds character and you’ll quickly be able to build solutions fast and cheaply.
Structured: it’s difficult and you need to find balance
The other way of course is to take your time and learn about the language features and core components. Understand what tools are available to you and choose a couple.
Do you remember in warrior movies where the warrior is presented with a room of weapons?
Bow and arrows, swords, discs with bladed edges the ninjas throw, sling shots, tomahawks, etc.
Well be the warrior that chooses only the bow and arrow. Because I suppose the bow and arrow is the more reliable option and you don’t have to do additional Ninja training (because that could take years…).
Now that you are ready, it’s time to go fight the goblins and war with your bow and arrow and leave the rest of the tools behind for the next warrior movie or software project.
But keep in mind, you can always come back to this room.
This approach to building applications is slow and painful. You may feel that you want to try out all the weapons before you go into battle.
Andreas Blixt’s answer on Quora is quite amusing. He states the three stages software developers go through:
- Being a novice hacker, like I was when I build that C# application I told you about earlier. I can glue things together, it works for the mean time, but if I want to change something, everything breaks.
- Being a philosophizing abstracter. Well this is when have to learn design patterns, data structures and algorithms. The philosophizing abstracter makes everything abstract and “reusable” only to his demise that you may not want to swap out the handle of your sword or change the blade to a jagged one. That would be quite pointless. Just get a different sword.
- The wise hacker. Knows when to hack and when to abstract, basically. This person finds the balance between being a hacker and an abstracter and only applies abstractions and design patterns where truly necessary. The most important this is that he gets things done and doesn’t waste time abstracting away.
What I am trying to say is, it’s difficult to learn and build an application at the same time. Often at times you’re just feel the urge just to read and not write code because you find what you’re reading and constantly learning more interesting.
It’s easier to read and entire book than to write code, it’s easier just to read documentation thinking you’ll remember it when you finally build your application with it.
Don’t fall into this trap of not programming and just learning. I certainly have and it is difficult to pull ourself out of it.
Stick to your plan and maintain a balance between learning and programming. Sometimes you can’t just learn, you need to stop learning and start building, complete the application, then go back to learning.
This is vitally important for the success of your learning program.