Skills that will help you become a better software developer
January 03, 2023
Despite the current tumultuous state of the world economy, hiring freezes, and big tech companies laying off a big proportion of their staff, I think there is still a growing demand for software developers in many industries. Most businesses are leveraging the capabilities of modern software tools in one form or another to build the best possible products and services they can offer to their users. According to a recent study done by LinkedIn Learning, the economy is currently going through a phase of upskilling and reskilling and some of the most in-demand tech jobs happen to be in software development. Before I dive into some of the skills that I think are essential to have as a software developer, I’d like to highlight an important baseline assumption made in this article. Irrespective of your position, specialization, and experience in the software development industry, it is imperative to have excellent foundational knowledge. A good foundation for a software developer includes an understanding of data structures, algorithms, databases (relational/non-relational), APIs, Object Oriented Programming, IDEs, scripting, and source control. You do not have to be a master of all of these areas but as a developer, you should have had some working experience at least in the majority of them. In my opinion, these form the essentials of a software developer toolkit. Now let’s talk about skills that will help you grow even further in your software developer journey. With the rise of DevOps in the past decade, the role of the software developer has evolved into a more holistic and general role that goes beyond the traditional definitions. In most companies, developers are not only accountable for the code they write but are also accountable for testing, packaging, deploying, and maintaining (life cycling) over time. Software developers are required not only to provide the most efficient, reliable, and cost-effective solution to a problem but they are also expected to be able to sell their solution to the stakeholders. For companies who are embracing the DevOps philosophy, developers provide level 3/4 support which means being able to demonstrate a thorough understanding of the application you are developing but also being able to translate complex knowledge into a leman is essential. Following are some high-level skills that can help you become a holistic developer.
System Design
As a developer, having a good end-to-end view of the application is crucial. Given a problem, being able to create a visual of all different components objectively demonstrates your understanding of the problem but also your domain expertise. Companies like Amazon puts so much emphasis on system design that they have dedicated interviews to evaluate potential candidates’ ability to design a system based on a problem statement. System design is the process of defining elements of a solution. This could include elements such as system architecture, modules that handle specific tasks, interfaces such as APIs or GUIs, data and storage. A system design is meant to be detailed enough that it encapsulates all of the crucial components of the solution. Generally, the system design becomes the blueprint of the solution you are building. However, as requirements and technology evolve, some components of a system design could change over time. There is an interesting tutorial on geekforgeeks and I think you might find it useful if you want to learn more about system design.
Cloud Computing/Hosting
It is needless to say that most companies are now moving away from on-premise hosting to cloud hosting due to ease of scalability, minimum to no management overhead, high reliability, and cost-effectiveness. There are so many cloud hosting platforms like AWS (Amazon Web Services), Azure (Microsoft Azure), GCP (Google Cloud Platform) and many platforms for to suit your needs (DigitalOcean, Linode, Kamatera). Hosting in the cloud is easy (with some learning), costs relatively lesser compared to buying your own infrastructure and requires minimal effort compared to hosting on-premise. Not to mention the overhead of having to maintain and update to keep up with evergrowing security threats. Regardless of whether you are working in a team, or building your own company or project, for you to get your software product out to the customer, you will need to rely on a cloud hosting platform at some point. Building and deploying of software is almost BAU (Business as Usual) tasks for developers these days and is kind of expected with most software development teams. Being proficient in cloud hosting platforms, being able to set up a cloud environment, deploy and connect to the network is such an important skill to have as a software developer. Whilst not having any experience in cloud platforms is a fine thing, having the experience will help you progress faster into more senior roles or DevOps kind of roles more easily.
Containerisation
With cloud hosting comes along containerization. What is containerization? Containerization is the process of packaging an application with all necessary dependencies such that it can be run platform agnostically. What this means is you bundle the application with all the requirements it needs to successfully do its job so that it can be deployed anywhere without having to worry about whether the hosting platform meets all the requirements for the application. As a result, as long as your host can provide enough computing power and memory, the application can spin up its own virtual environment for it to run, all within that container. So why is this so important? Can you not deploy the build file into a host and run it? Yes of course you can but then, you need to ensure that all the dependencies for your application are installed on your host, the operating system that the application was built on needs to match with the operating system of the hosting platform and so on; you get the point! You will have to do a lot of manual work to ensure your application can run properly without any issues. Tools like docker provide easy containerization capabilities that it is almost impossible not to containerize an application these days. With containerization comes other benefits like easy scalability, rapid development, easy distribution, and integration with many platforms seamlessly.
Testing
I cannot emphasize enough how important testing is in software development. As a competent software developer, you should be capable of writing code that is error-free but also testable easily. Testing the code your write helps you validate that the code is doing what it is intended to do and also there are no unexpected behaviors that could throw the code out of track in case of edge cases. Any great software should also contain a comprehensive set of test cases, which can be called at any time to prove the proper functionality of the application. There are various types of tests that you can add to your software depending on the scope but generally, they fall into categories like unit testing (testing of a specific function in isolation), integration testing (testing functionality of a collection of functions in a flow or for a use case), end-to-end testing (testing entire application or a collection of applications involved in a given use case), SVT/ PVT (validate the performance of the application), UAT (User Acceptance Testing). In the past, there used to be dedicated testing teams that run most of these specialized tests for multiple development teams. However, at present, developers are expected to have a thorough understanding of the business logic behind their code and are expected to be able to test their code adequately themselves at various stages, if not, work closely with testing teams to continuously improve the testing suite as the application evolves.
CI/CD (Continuous Integration / Continuous Deployment)
Most software projects are moving from the traditional waterfall method to agile mainly due to the need to have rapid development and reduce time to market. Gone are the days when you set up a team, identify customer requirements and start building your product only to find out that the customer now has different requirements and you have to start building a new version of your application all over again. The underlying philosophy behind CI/CD is that you can build new features, test them and ship them to the customer in a more streamlined way that you don’t have to wait till you build the entire solution all at once. In addition, if there are issues that need to be fixed or any modifications to any existing features in production, the availability of a proper CICD pipeline can help you get those changes to the user in a more efficient way. As a software developer, if you have an understanding of how to set up a proper CI/CD pipeline, and be able to continuously implement and deploy at a sustainable pace, that will be highly regarded, in my opinion. There are many CICD frameworks available out there for both enterprise and community developers. Some of my favorites are Jenkins, CircleCi, Bamboo, Travis CI, GitLab, AWS CodePipeline, and Azure Pipeline. Some tools are platforms specific whilst some are more generic.
Application Monitoring
So you have built an amazing application, you have implemented a great test framework to ensure that you have covered all the business logic and edge cases, and have deployed your application into the cloud environment with an automated CI/CD pipeline. Great! The next question is, how do you measure your application performance? How do you set up benchmarks and SLAs with your consumers? How to keep track of possible errors that might occur while servicing client requests? How do you ensure that your application is using available resources optimally? How do you trace transactions of your application and identify points of failure? This level of feedback is so important to building an efficient, resilient, and reliable application. The general term used for such level of monitoring is APM - Application Performance Monitoring. There are so many tools out there to help you build a robust monitoring setup to suit your requirements. Regardless of which tool you use, the ultimate goal is that you have sufficient visibility to your application once it is in production. Should a disaster strike, you have enough information through these monitoring tools to be able to efficiently troubleshoot your application. As a developer, having a good understanding of tools but also how they are integrated with your application is looked upon favorably. It should also be emphasized that we are living in a data-driven world. Monitoring tools can provide plenty of useful data and combined with proper analytics, could provide enormous benefits to a business to keep improving its product.
Documentation
As a developer, one thing that is important to remember is that you can forget things. It is not easy to remember every single line of code you wrote and the reasons behind why you implemented that function in that way. This is why documentation is so important, not only to you but also to your future self or other developers who might need to make changes in the future. It is also important to realize that documentation is not about creating pages and pages of notes somewhere. Software documentation can be divided into many parts. First and foremost is writing readable code. This means giving meaningful names to variables, Inline comments and function definitions. Secondly, provide a readme file in your repository for basic instructions on using the applications and answers to any FAQs. A well-documented code comprises code blocks that are self-explanatory, can be understood easily by another developer with a similar background, and all basic usage instructions are provided in a central location in the repository. So if you want to become a better software developer, focus on documentation. Also understand the difference between technical and non-technical documentation. For instance, nontechnical documentation could include content such as performance metrics that go to your business leaders but technical content could be things such as how to startup your application, debugging hints or enabling detailed logging the application.
Communication/Stakeholder Management
Almost all jobs require some level of communication and stakeholder management but why is this so important as a software developer? Have you ever been in a coding interview where you had to pair code with your interviewer? Generally, the first step of solving the problem is not about jumping into the solution but explaining your solution to the interviewer at a high-level. You take them through the problem-solving process, why you made certain assumptions, and why you think a certain approach is better suited to the problem than the other. As a software development team, you are always expected to setup demonstrations of your application or share the progress of your project with sponsors to ensure your funding keeps flowing. All of these examples have one thing in common. That is that you should be able to translate complex knowledge into your target audience in an effective way. When you go into more senior and tech lead roles, you are expected to work with leadership teams where you will be discussing long-term goals, planning resources and timelines, selecting of technology stacks, and planning funding or finances. All of these tasks require you to be able to effectively communicate. So this sums up my take on what are some of the most important skills to have as a developer. I hope you enjoyed reading this article and found some valuable information.
Happy upskilling…