3 Technical Skills Every Developer Must Have
By: Dmytro Khmelenko
Tags: Software Development, Personal Development, Careers, Programming, Software Engineering

3 Technical Skills Every Developer Must Have

And none of them is a programming language

Photo by Bram Naus on Unsplash

Every developer is using one or a few programming languages every day. For somebody outside of the IT industry that might sound enough. Because what else is needed to become a developer? However, software engineers know, that it is not really true. In daily business more tools are in use. Those tools are almost as important as programming languages. Mastering them helps to progress in a career and enables doing work faster and more efficiently.

Version Control System

It is important to understand how features are being developed. Without a version control system (VCS), it is hard to imagine any company nowadays. This is a must for the company, especially when more than 1 person works with a code. With VCS is possible to see the history of all changes in code. Seeing when was a new line of code added and by whom allows us to trace back the previous changes. In situations when a critical bug was introduced, reverting those changes becomes an easy task.

At the moment the most popular system is Git. I’m not going to dig deep into details of it. There are many good tutorials available. The official one is good as well. Invest some time to understand how it works internally. Learning begins with simple commands (for example, commit and push/pull) and later advanced commands could be applied. Most probably it will be enough to use basic commands for some time. Git is indeed a very powerful tool used by many companies.

Even though Git is the most popular VCS it is not a single one. There are a few more available, but with different internals. For example, Subversion and Mercurial are other systems for version control. It is good to get familiar with either Git or any other system. Understanding common principles (such as branch and commit) of any VCS brings developers to the next level on how to operate with the source code.

Continuous Integration & Continuous Delivery

The concept of continuous integration (CI) and continuous delivery (CD) are actively used in the modern software engineering industry. They are not new and not complex. It is a simple concept to build reliable software. There are many available services for that. It could be a 3rd party service running in the cloud or it can run on locally provisioned servers.

The important thing is understanding of building a pipeline - the sequence of actions to be performed. It can be syntactic code analysis, unit tests, integrations tests, assembling binaries. Usually, it is enough to try to set it up a few times in order to understand how it works. The pipeline can be different depending on the technology stack. But the idea remains the same: execute a sequence of actions in order to ensure that nothing got broken.

Example of the release pipeline

The next level is to optimize the setup according to the project needs and make it efficient. Identifying the slowest job, giving priority to certain jobs, performance jobs in parallel when possible — those are a few examples of pipeline optimization. Apart from reducing costs, it leads to increasing the developer’s happiness level. Imagine that every developer has to wait 30 minutes for merging his pull request. Later fixing a typo would lead to another 30 minutes of waiting. Applying the strategy for caching results of the previous job and reusing the same cache could reduce build time from 30 minutes to 5 minutes.

The benefits of CI/CD are clear. While working in a team everybody wants to be sure that with every newly added line of code things are not falling apart. Unfortunately, that can happen very soon in big systems. Having a CI in place will act as a safety net making sure new changes do not break the existing solution.

Continuous delivery is being used mostly for delivering the solutions for end customers as fast as possible. It means that the changes developers made to the code can go live sooner without waiting for a long time to be released. The benefit of it is that the user base gets adopted slowly to every change in code rather than a big release once a month with 100 features, for example.

Automation

I know a few developers who tend to write a script for everything. They see an opportunity to automate any action where others would perform them manually. It is always exciting to hear ideas from them about what could be automated. In the end, it saves a lot of time for the rest of the team. The manual action which takes only 5 minutes a day will result in 25 minutes a week or almost 2 hours a month. That doesn’t seem like too much time. But automating it can make a significant result. It would not require to remember to perform the same task every other day.

Let’s be honest: each of us had those days when the next day we realize we forgot to perform some regular routine yesterday. Like preparing a report or uploading a log file to the server. Automation can bring some reliability and makes sure that action is performed on a specific day and at a certain time. For example, the following cron job will execute the script generate_report.sh every day at 10 AM.

0 10 * * * /bin/sh generate_report.sh

Second, humans are making mistakes. No matter how often we do some tasks, but sooner or later we make a mistake. Like trying to download a file without being logged in to the system. That would cause more time to perform the task: sign in and retry again. Having automation in place would avoid this kind of issue. Defined actions will be executed in a certain sequence. This is the beauty of when the script makes that job for us.

Having the skill to identify actions that can be automated proves the seniority of the engineer. There are many script languages available. Bash, Powershell, Python are most used nowadays. Each of them has its own advantages and disadvantages. Try to plan around with each of them, check if it is suitable for your needs. Then master at least one of them. Knowing already the capabilities of the language it will be easier to see opportunities to automate things.