This post is part of a series of blog posts discussing the core skills every software developer should have. They are, Analytical thinking and problem solving, technical skills, domain knowledge, communication and marketing, knowing how to learn and finally, influence. You can find out more by searching this tag.
In this blog post and upcoming blog posts I’ll take each skill and discuss in detail my personal thoughts and experience with each. I also want to share some things that you too, the reader, may need to look into and practice if you’re starting out as a software developer
To infinity and beyond! …Where do I start?
Developing technical skills… How do you start doing it? How would you start if you don’t even know where to start or what to learn?
I only knew basic Java. I had built a couple of applications for my high school IT projects and some personal projects and that was about it.
I knew I had to learn a lot and when I mean a lot, I mean everything about software development (keyword “about”). I spend 3-4 months just trying to learn as much as I could about software development itself.
This was the most painful process. I hit it hard and even when I didn’t feel like doing it anymore, I continued to do so.
Even though it was a Saturday night and I felt like watching a movie, I still put in the time instead to learn about Enterprise Java or some other technology.
The idea is that you should pick one thing and learn and learn about it at a surface level, initially. Go as deep as your can and master it later on.
Only then once you have this deep knowledge about something should you move onto something else because then your skills are transferable.
We’ll talk a little more about this in a later section.
Space. Exploring the unknown unknowns.
I think this scares a lot of people, especially people who are just starting out in this industry. The unknown unknowns. You don’t even know about them until you do and if they’re complex, it can feel overwhelming.
But it’s good that you have spotted them earlier and have figured out a way to learn about them .
I am still learning the Spring framework but I didn’t really understand how it worked. I could use it, but concepts like containers and even different types of containers where completely foreign to me.
Even though I vaguely understood these things I still progressed to learn how Spring MVC framework worked so I could build basic applications. Only many months later when I went back to revisit the underlying concepts did it click for me and everything finally made sense.
You are going to have a lot of unknown unknowns or known unknowns, where as you know that something exits but haven’t gone in-depth about it yet.
if you want it bad, you’re going to have to make some sacrifices.
I want it so bad that this is all I do, this is who I have become. I will wake up, write some blog post for an hour and a half and then just read and study for the rest of the day. I will go to the gym for an hour, train hard, come home and continue studying.
I would only relax on the weekends unless learning about something was really bugging me, then it couldn’t wait.
Trying to learn entirely own your own is very difficult. Sure you can read for hours, lookup documentation and read source code. I did that for some things and I still didn’t know enough at a surface level what the technology was about.
Although, there is only so much you, yourself can learn in your entire life and the time required to learn that thing or even about that one thing is very expensive. Therefore you need to immerse yourself as much as possible.
Learning Hibernate for me was pretty much an undertaking challenge. I did a lot of jumping around between learning SQL, JPA and Hibernate.
It was really difficult for me because I didn’t have a solid learning plan. I wanted to learn Hibernate but I fell short because I didn’t understand really what an Object-to-Relational Mapper (ORM) was or how it worked.
I first needed to learn SQL and how the relational model actually worked; an underlying concept that without, you’ll have a very hard time.
And this goes for a lot of other things.
The idea is to immerse yourself as much as possible with the idea and concepts initially before you touch anything before hand.
Immersion itself is very hard to come by. Sure college will provide you with structure on the different things that you’ll learn in a specific order, but without that structure, it can become very difficult.
So, how do I immerse myself?
It’s difficult, but it is doable. To really immerse yourself you need to take the opportunity to learn from a lot of different mediums.
It’s going to be difficult, but exposing yourself to these mediums are going to help you significantly improve your skills as a software developer.
The idea behind immersing yourself is trying to find out as much of the unknown unknowns as much as possible and as quickly as possible so you can paint a picture of reality of what software development is really about.
TRY as much as you can to get enough exposure as possible so you can understand what it’s like.
I have been rejected to internships and job offers at interviews a few times, that doesn’t mean I am bad, no. It reveals my hidden weaknesses and the stuff I need to work on that’s more important than what I thought so.
By not going for job interviews I wouldn’t have known that I needed to work on my algorithms and data structures. Man, whiteboard interviews suck. My interviewer asked me to find a duplicate in an array and I couldn’t do it.
I wouldn’t then have gone to learn algorithms and data structures as of now.
I didn’t understand stuff like time complexity and the way I would have always done something is very ineffective and expensive (quadratic time). So thank you for that feedback.
Going to meetups, that’s where you’ll often learn about the challenges a business faces, how they eventually solved them with some new technology that saves them a lot of money.
You can get this kind of exposure.
Software development isn’t what I thought it was only a year ago. I used to think that you did some coding and that’s basically it. My friends described their jobs like that. But it’s really more than that.
By immersing yourself using these mediums you’ll have a clearer picture and a better understanding of the industry that you want to join.
The technical skills [the video game]
Ahh, the part you dear reader have been waiting for.
Technical skills, think of it as playing a video game.
In the tutorial section of the game, you’re learning how to use the controls, practicing hitting targets and so one.
You’re not playing the actual game yet. You still need some training before you can enter the first level.
Some people skip the tutorial and just go into the first level and get killed the first time, and the second and the third. But either way you’ll slowly learn.
Think of learning about software development the easier way as the tutorial part of the game. It shows you how to and what to do for certain occasions. It immerses you into the feel and new ideas.
I kind of did the opposite. I would play the game, die and then go back to the tutorial, figure something out and go back into the game and die again.
I wanted to play the video game so bad I did it this way. Think of the tutorial as college or a boot-camp, and playing the video game is learning own your own and building applications.
Only when you’re competent enough and have masted the tutorial is when you can start with your first level and die again.
Learning is like starting a software project at version 0.0.1. As you slowly add milestone features and fix bugs do you eventually complete the gap and can release the full 1.0 into the world.
The first full version, now ready!
Learning about software development is like completing the tutorial part of the game or working your way up to releasing the 1.0 version of yourself.
You can now enter the real world – well kind of.
Learning technical skills is quite difficult, in a matter of fact, it’s very hard.
In my earlier years, I would try to learn something and completely give up because I found it to difficult. Learning about a certain technology, or a technology for the first time is very difficult too.
I would learn about a certain framework, then I would constantly go back and forth learning about underlying functionality of how it really worked or the concepts that evolved around it.
Having your foundational skills is very important. Learn how a certain technology works first and truly understand how it works.
Raise the bar, high
Technical skills are one thing that can atrophy, kind of, if you don’t practice them.
I would often listen to a podcast and the hosts most often have degrees in Computer Science, some guys have PhDs and I often compare myself or envision myself as being on their level.
This is good. I have risen the bar high, I have set the expectation for myself, how I should learn and progress all throughout my life.
I want to be on that same level, do amazing things and discover new ways to innovate and change. I know that what I am expecting is going to take years to accomplish. In a matter of fact, I expect to accomplish my envision of myself in the next 2 or 3 years.
BTW, it’s building scalable systems with Microservices and messaging systems, all that kind of that stuff.
But I have set the bar high, where I want to be. You too should do that for yourself.
Some friends of mine just do the bare minimum to get by, they have just learned so much to get the job they have wanted and haven’t really progressed from there.
You should always be learning, no matter how slowly or how long it takes you, make the time to do it.
Look for people who influence you, and work to be on their level. Like I said, one guy from a podcast I listen to have a PhD in machine learning. I want to be on that guys level, one day. Although he studied for 10 years.
For Enterprise software, I lookup to people like Martin Fowler. If you’re interested in learning about Enterprise software, checkout his blog and books.
Have a plan
You first need to define a goal and some time for yourself.
The flaw with that somewhat of a goal is that I didn’t consider everything else around it that I needed to learn.
These are all important questions I didn’t consider myself and I wasted a lot of time hopping around trying to learn everything at once.
Define a goal. Okay, you need to be realist here as this is the most important part when starting out. What do you want to learn and why?
I want to learn The Spring framework and a JS framework like Angular or React.js so I can build web apps.
Coming from a better understanding now:
Do you know anything about Enterprise Java or what the Spring framework is?
That is your problem.
I read Spring in Action by Craig Walls for 4-ish hours a day for about 4 months. I still didn’t really understand what the Spring framework was or what it was used for after that.
I’m giving myself some advice here, but maybe you should learn Java EE first and understand what that is before you touch the Spring framework. Do you even know the Java programming language? The core Java platform? Huh?
When defining your goal, think about the programming language or framework that you want to learn. Do you understand concepts and reason why this framework is useful to you? Why did you choose this framework over any other?
These are all important questions to ask yourself. Do you even know what a framework is? Many months ago, I couldn’t answer those questions.
Develop a learning plan.
Building yourself a learning plan is or even more important that defining a goal. Your probably going to change or modify your learning plan significantly along the way.
Having a plan is important. It will keep your from doing things that you aren’t suppose to do. It provides your learning experience with structure.
Developing a learning plan is really an art in of itself. Your plan could last you only a couple of months, to a year.
Define your goal. Having a goal is very important, it will determines your success or eventual failure of your learning plan.
My current goal for this year is this:
Become an Enterprise Java developer.
Define your agenda. Your agenda is a short summary of what you needing to do to achieve your goal.
Learn the Java programming language (fill in knowledge gaps). Learn Java core platform. Study algorithms and data structures, Learn Java EE, Learn the Spring framework and Unit Testing.
Define your plan. Defining your learning plan is a lot more challenging. You’ll need to brainstorm all the possible things that you’ll need to learn and in the order that you execute each step.
Take your time and do this correctly.
My learning plan is as follows
Java Programming Language
- Core Java
- Collections and Generics
- Date and Time APIs
Write a blog 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
- Push to production
- Learn how to use Travis C
Learn the computer science basics
- Data structures
Now depending on your specific goal, you’ll need to focus on what really matters and filter out the fluff. This will save you a lot of time and energy.
My plan is quite large and it will take me some time to complete.
Don’t context switch
Remember kids, don’t context switch.
Man, when I started learning I wanted to learn everything. I quickly realized that is pretty much impossible. You’ll waste a lot of time context switching and not actually learning.
I spend 2-ish months doing this. I didn’t learn much, in fact I didn’t learn anything new. I spend about 20 hours reading YDKJS and I still can’t write any JS code today.
The point is that you need to focus on one thing and one thing only, but there are some exceptions. You can always learn those other things later. Develop a deep understanding of how this one things works because is it easily transferable to other things that you learn.
Okay, when I said, one thing and one thing only. I really meant the type of thing should only have one focus.
Learning algorithms and data structures. Yes this too is a different context. But it’s relative to the programming language of your choice. It involves algorithms and data structures, which are useful to know when for problem solving. Doing the exercises specifically well help me practice the language I am learning; in this case Java.
Writing a blog platform application, similarly to WordPress is a big undertaking. I have started working on it, but I am focused on Java specifically just to fill in my knowledge gaps then I’ll be able to get back to working on it.
Okay, so back to context switching. This is important factor to consider as the learning process is time-consuming. Learning something, iterating over it, and building a mental model of something and still digesting that information takes a long time. That’s why I only focus myself on learning at max two things at once because I have the time for it.
In the beginning of the day (until noon) I will focus on algorithms and data structures, the other half is Java (lang + core).
Like I said, once I have completed Java I will move on into the Blog application.
You see learning, there is a science to it. It took me a long time to figure it out. I can afford to learn the way I do, in parallel. You may not have the time that I have, so, you’ll need to smoosh everything in one and only learn on after the other.
Okay, where do I go from here?
If you’re only starting out in the software development industry or that you call yourself senior level software developer, you can still benefit from what I am going to share with you.
The Complete Software Developer’s Career Guide is a book all software developers should read. A lot of the sections I mentioned above are influenced by this book, but I have given my own personal experience that are in a similar fashion to this book.
In this book the author discusses a lot of the unknown unknowns and how you should to learn your first programming language.