In this post I hope to showcase some of the most essential items I have discovered to aid in the development of software.
Starting off with the code editor, whilst this may be a obvious tool to have; it is the most important as it is what you use to develop your software and can drastically effect your experience.
Most articles seen online make quite a fuss about various IDEs, and how you must have a specific one for each language or framework. Some of the IDEs spoken about being: Visual Studio or one of the many JetBrain offerings.
After several years of software development, I have come to realise how important it is to have a good keyboard driven code editor that can support many languages. These larger IDE’s spoken about mostly focus on being “point and click” interfaces; which can slow down development.
I would consider Visual Studio Code to be a great editor to start off with, it features an LSP so it can integrate with many languages and supports a reasonable amount of customisation. Through these extensions you can even get vim style motions allowing faster code modification; enhancing productivity. However the more you customise; it makes sense to switch to something like NeoVim or even Emacs. These editors whilst time consuming to setup, as they are more like a blank canvas to start with, take keyboard driven development to another level. I recently migrated to NeoVim and can recommend this as a more powerful alternative to Visual Studio Code.
I would consider the most important thing to keep in mind; is your editor should be as flexible as possible, meaning it can support many languages and support vast customisation, like NeoVim has achieved with lua plugin support and the ability to use the LSP.
Throughout my time as a software developer I have used various code formatters and linters, however I still see many people not using them. I believe code formatters to be essential for a developer. This is because well formatted code makes it easier to read and conventions can be followed. For example in Python development; one should follow the PEP8 spec, with a code formatter this is easy since all you have to do is run your formatter and it will transform the code to comply.
Having your code formatted to a specific spec can also reduce the arguments when working in a team. Since a convention can be decided and then automatically applied through a configuration in the project directory, meaning there is no question how the code should be formatted.
This next section may not apply to all projects, however can be very useful. When developing software that uses external services such as databases. It can aid development to have your own locally hosted and always available services. For example in my dev environment I have several databases always running ready to use.
This allows me to always have the option to connect and test my project. Whilst these services can be run locally (even easier now with Docker), it is still nice to have services always available and running on a real server.
As well as hosting your own services to use, having the ability to also test your applications on these servers can also be very useful, since they are running on real hardware. Some issues will not occur until run in the real world no matter how many unit tests you have.
Containers & Docker
Containers in general are a really useful piece of technology. Here’s a quick explanation of what a container exactly is: You can think of a container as a lightweight virtual machine, however it shares the host kernel, thus no emulation of hardware is done however the data is isolated. In a container you can package all of a software’s dependences together separate from any other installed software, this removes any possibility of services conflicting with each other. This also means that running the same container image on a different system should perform exactly the same, minus any performance differences.
As you can see containers now open the possibility of running databases and other services locally as part of your development environment, meaning development will be easier since all the services can be run without installing any software that may conflict with others.
Working in a team environment, containers can also allow everyone on the team to have the exact same services running; you can even lock to a specific version. This can allow for a consistent environment, without any outside interference from unexpected updates. These containers can also be used in production, bringing stable and consistent services which can be deployed independent of the underlying Linux distro.
Now on to Docker. This is a piece of software that can make handling containers easy. It can build images using Dockerfiles, run containers, manage storage mounts and configure inter-container networking. It currently is the only one that offers a complete easy to use platform.
This technology is a must to learn and try out for any developer.
Personal Git Server
First off, if you are not using Git or some other version control in your project how are you still sane? Version control is a major tool in development as it allows you to maintain a precise change history of your project as you go along; this allows you to go back in time and discover why you made specific changes (through comments in the history).
If you are using Git you’re most likely pushing your code to one of the major hosting sites such as GitHub, GitLab or BitBucket. However I believe that hosting your own as well will aid in the development of software. Not only will you now not depend on these hosting companies, you can now always access your data.
Consider this scenario where you only locally clone repositories using the “–depth” flag (which does not clone the full history), if your chosen site suddenly loose the data, you will not have the full history of your project. This can be quite important for discovering what changes you made along the way and possibility who made them.
Just because you host your own, it does not mean you can’t still mainly use the one hosted not under your control. To keep your own hosted solution in sync you can setup a repository mirror in most solutions; such as GitLab CE or Gitea. That way all remote repositories will have the same data.
A Linux Machine
Having a Linux based machine in my opinion is important, it allows you to have a system that is highly customisable and use features only available on Linux. For example containers are easier to setup and most images are designed to work on Linux. You can also benefit from a selection of many command-line tools, which can aid in a better development experience (like my program “run-tool”) since commonly performed tasks can be automated.
Another useful tool to have at your disposal; more suited to web developers, is the ability to quickly run you app and expose it publicly right from your development machine. This is where services such as Ngrok and Cloudflare tunnels come in very handy. Running their agent on your machine whilst your app is running they can expose your locally hosted app to the public internet, under a unique URL.
These http tunnelling services are great for teams or tech demos; where you don’t need a dedicated server or domain, just a quick way of sharing access to your app. They also do not require port-forwarding, since your machine first opens the connection to the server; meaning they should work pretty much anywhere the internet is available.
There are many other tools which could be mentioned, so many in fact that the article would never end. I Hope you enjoyed reading this article, maybe you’re now rushing to setup Docker or installing NeoVim; in which case I hope you have fun learning new technology!
This post was not endorsed or sponsored by any of the mentioned parties. My views are my own.
Looking for more self-hosted related content or programming help, join the Enchanted People community here: