Development Workflow Tools
In this post we will take a look at the minimal set of tools we found that were absolutely essential in order to implement a proper software development workflow. This post will look at these tools mainly from the perspective of a PHP programmer. Some suggestions for other languages will be put forward as well. But the same or equivalent tools should be available for almost any other language you may be using. We make extensive use of open source tools with a sprinkling of proprietary or hosted solutions. If you are running a small to medium level development shop and are missing any of these tools or their equivalents, we suggest that you start using them soon as the benefits are too great to ignore. Most of these tools are useful even for single-developer setups.
Version Control System
If you are not currently using a version control system, then stop reading this and go and implement a proper version control within your development workflow right now! Even today, I see development shops using the copy and paste method of managing code. This is the worst possible way to manage code just above not managing your code at all! The reasons given invariably are that too much effort and training is needed to set it up and get employees to follow it. We found that once the advantages of a version control system are explained, the employees are only too happy to start using it. The advantages of using a version control in your development workflow cannot be over-stated.
There are many version control systems to choose from that includes open source technologies such as Git, Subversion and Mercurial. For us, Git stands out as the best for our purposes. It is distributed in nature and there is great support and activity around the project. Plus, it is used to manage one of the largest and complicated software projects: the linux kernel. Github and Bitbucket provide great code hosting solutions for git so that you can easily share code among a team. In addition, we make use of the post commit hooks coupled with Git’s amazing branching mechanism to do one step code deployment to production and testing servers. This helps us to completely eliminate unnecessary and hard to discover deployment related errors.
Rather than re-invent the wheel, many developers use frameworks to build applications rapidly and efficiently. Frameworks abstract away many of the low-level concerns. They provide helpful, easy-to-use interfaces to complete common tasks improving your development workflow in the process. Frameworks are not only available for server side coding, but is now very relevant even in client-side development efforts.
Frameworks should not be considered as a solution to all your development problems. Instead, frameworks should be considered as a starting point for standardizing your coding practices and making best use of your coding time to actually solve your client’s problems. Most frameworks provide tools and extensions to eliminate redundant and oft-repeated tasks. Contrary to popular belief, a good framework does not (should not) get in your way. With a deep enough understanding of it’s working, you should be able to do anything with it that you will also be able to do with the underlying core language.
The main benefit of a issue-tracking system is to provide a clear centralized overview of development requests (including both bugs and improvements), and their status. Issue tracking is the single most important way to improve the quality of your software. Without keeping track of your bugs, there would be no way to maintain control of what each person on your team works on, fixes and finds problems with. Bugzilla, JIRA, Mantis, Redmine, etc. are just some of the more popular open source issue trackers available today.
An issue tracker should be given due importance in your development workflow as it not only tracks bugs but your features and with some setup, it can even track time spent on each issue. Nowadays, for small to medium projects, Github and bitbucket can also be seen to be used as an issue tracker. Such a setup has the added advantage of reducing the total number of tools in your development workflow if you are using either of those for your code hosting.
Package and dependency management is also an area that we have seen to be neglected often within a development workflow. For smaller projects it is not a huge problem. But as the size of a project increases and the number of libraries that the project depends on increases, it becomes harder to manage all these packages across team members. It also may quickly descend into what veteran coders like to call “Dependency Hell”.
There are dependency management solutions available for almost any programming language. Depending on the specific solution you use, you just have to specify the package name and the version number and the package will be downloaded and configured for auto-loading on each developer / production system. Some of the more popular ones are listed below against the specific language it was developed for:
If quality of your end product is of concern to you, then you just have to have a proper automated testing system in place. There are at least two types of testing you should ideally target: unit testing and functional testing. Unit testing tests an individual unit, such as a method (function) in a class, with all dependencies mocked up. Functional testing tests a slice of functionality in a system. You can think of functional testing as a robot that will simulate a user interacting with your application at your command and reporting any errors it comes across. This will test many methods and may interact with dependencies like Databases or Web Services. In addition to making use of testing frameworks in your development workflow, you also have to make sure that it is possible to run the entire test suite in one step.
You can pick from a wide variety of solutions for automated testing. For PHP, the de facto unit testing framework is PHPUnit and two of the most popular functional testing tools are Selenium and Codeception.
Are there any tools that we missed out on? Do you feel that there is some other tool out there that does a better job than those we have listed here? Please do let us know below…