Learning to become a software developer is an exciting journey. I remember my time at the University of Central Missouri learning Java my first two semesters. I built fun projects such as small remakes of Deal or No Deal and Tic Tac Toe. By the end of 2 years of education and practice, I was able to make a card game with Flash that all my friends enjoyed playing, and even deployed online. It felt amazing!
My first full-time gig came a few years later as a Ruby on Rails Developer. I experienced about the same amount of growth for the first few years of my career. Rails was exciting to learn and using it to build websites was highly engaging.
However, as my career progressed, the amount of learning I obtained began to stagnate. I wasn’t making as much progress in learning new skills. It’s hard to imagine that in a field like software it feels like you aren’t absorbing anything new. It’s especially frustrating when thinking about future opportunities and how to adequately prepare for them.
Reasons for stagnation
When working on a project, we often feel the best opportunities for our career are to learn more about our existing tool and framework, which seems like a novel pursuit. If you’re looking to grow in your company, improving your current project is the first place to start.
The difficult part is that you won’t use every feature you need for a framework. In fact, you’ll probably end up using 20% of the features 80% of the time. Not only that but the extra 20% is probably related to situations that you can research as they arise. There isn’t a need to dive deep into those situations upfront, especially as that knowledge may not be retainable.
So here you are with your current project, but you still want to prepare yourself for opportunities down the road. What can you do now? There are several approaches you can take to begin building your skills again.
Start with high-level concepts instead of tools
Effectively solving problems is at the very core of software engineering. Knowing how to take a problem and turn it into a coded solution takes a deep understanding of the objective and the parameters you’ve been given. One of the best ways to learn about this is through problem-solving sites.
At HackerRank, there are a ton of tasks to complete from general problem solving to learning a solution that involves higher-level concepts such as graph theory. It also features discussions with other programmers, so you can learn how others solve the problem and modify your solution based on their implementations.
Growing these skills can help you prepare for companies building new apps, as they address a need in the market that requires a brand new approach to solving an existing problem. A good understanding of binary trees and graph theory for example can help discover new solutions.
Another great thing about high-level concepts is that they stay with your skillset. Even if you forget the details of a solution, you know where to start since you already have experience with these types of problems when they arise.
Go for quantity over quality when researching tools
Tools are designed to help you complete the tasks, but they are usually for a specific purpose, and can easily be replaced by something that works better. This means that mastery of a tool shouldn’t be considered the most virtuous trait of a developer. It’s more of a means to an end as opposed to an end itself.
A great example of an overused tool was Adobe Flash vs HTML5 during the early 2010’s. HTML5 provided a ton of functionality that flash used for multimedia purposes, but Flash developers were very reluctant to switch over.
Tools are still useful, but I don’t recommend obsessing over a specific tool. Get a general knowledge of what is out there for your current framework, and know where to find helpful information when it comes up. Find blogs that you like, and see if they talk about any particular tool or dependencies that can help. As you see places in your project where it helps out, that’s when it’s recommended to dive deeper into the tool. Until you find the next one that does the job better.
Debugging and troubleshooting software
Every software application will at some point have major flaws that need to be addressed. Sometimes it can be difficult to determine where the error is and how it should be fixed. Scalability can be an issue here as well, as it may not be crystal clear how much load an application can take at once. These are universal principles that apply to any kind of application you are writing, be it web, mobile, or even desktop.
Improving this skillset requires developing a variety of habits. How often do you run your code? Do you test after every change or wait until everything is done? Do you review and test your teammates' PR's? Developing these habits can help you learn about the ins and outs of an application and can catch you up on the codebase if you get switched to a different project.
Another habit to monitor is how you search for bugs. Do you just do console.log statements? Or do you go further with any breakpoint tools your application uses. Do you look at any performance tabs in your browser or framework that tells you how long code takes to execute? These are habits that can easily transfer between application frameworks, and device targets as well.
In addition, look into Testing Software. Every application has its own testing framework, but the core objectives are the same. This ensures your application doesn’t break when a change is made. While the principles seem simple, oftentimes developers get lost in exactly what to test and end up writing tests that are duplicate. Sometimes tests are missed entirely as critical workflows are missed.
I would look into articles about what types of tests are written, understand the purpose of a test when you are writing them, and also when you don’t need to write a test as well. Writing solid tests can be a challenging task, but by reading practices on experiences from other developers, the expectations can be made more clear. The specifics of a framework can easily be learned when the need arises.
Learn what it means to truly have a Minimum Viable Product (MVP)
Learning programming can help you write software, but it will not make an application complete. Users should have a clear objective as to why they are using your software, and that takes learning outside of frameworks and programming languages. I’ve seen instances of coding that have led to a dead-end in regards to user functionality.
To resolve this, I recommend building your own mini-apps from time to time. They don’t have to be sophisticated apps that require tons of resources. Personally, I find developing video games to be a great way to learn about building an MVP. They don’t require backends to function if it’s a single-player game, and these can easily be deployed to a site like itch.io.
Other web-based apps that are great for practicing software design skills are 3D apps made with three.js and babylon.js. If you want to build a mobile app for personal use, why not develop your own photo gallery app, decorate it how you like, and have it use local storage (so you don’t need to worry about cloud environments)?
I also highly recommend looking through applications on sites such as Behance and Dribbble. Even if your goal is to develop server-side backend skills, looking through other app designs can help you think about what data layers you should use. You can see how users complete a workflow, what they expect to see and interact with, and refine your skills based on what others in the field have done. Sites like these can develop the team as a whole, and improve the user experience of your work.
Another suggestion is to attend a local hackathon if that is an option. They are a great way to meet others in the city, and to also see what other tools exist. Vendors advertising various API’s like to make an appearance, and offer prizes specific too their company if you are able to integrate their tools with your application. The app can be anything you like, and since you are brainstorming with others, it can be a great training exercise in working with others on a project.
Just remember… have fun with what you learn! While there are elements of software that feel very tedious, software is a field with a lot of concepts to learn. And different tools and gadgets you get to experiment with. Keep your eyes open for anything that looks appealing. Whether it be blogs, local tech events, or anything that inspires you.
That often means going outside of your current project at work and diving into other areas you are unfamiliar with but curious about. No matter if it’s directly related to your immediate responsibilities, these will help you grow and prepare you for that next opportunity.