You cannot mandate productivity, you must provide the tools to let people become their bestSteve Jobs
Software development is a profession where the least you need is a computer with a notepad and a compiler (or interpreter). Yes, I can create a hello world using only this (as done in every intro to programming course). Still, I can’t imagine working on these gigantic problems with humongous interfaces and complicated interconnections without having an IDE that helps me autocomplete, marks syntax errors, and can give me documentation about the methods I’m trying to call.
As with coding or even in fights, there is always a right tool for the job. And is the same with the other areas around software development.
Verification and Validation
V&V (Verification and Validation) are two different processes for the developers to understand if the product is going on the right track.
Verification is to make sure that the product meets al requirements.
Validation is to validate with stakeholders that the product meets all expectations.
V&V is not unique for one step of the whole development process but is needed in every step. Mohamed Sami has a detailed post on how these process can be used in every step, here is the table summarized:
|Requirements||Validate the understanding of the requirements with the stakeholders and the rest of the team.||Each requirement is atomic and unique, with a purpose and reason for existence.|
|Design||Continuously present the client with the different wireframes, designs, and prototypes to validate their expectations.||Verify that everything is complying with non-functional requirements.|
|Implementation||If a requirement at some point of the development is unclear, redundant, or doesn’t make sense anymore, the developer needs to validate with the customer and act accordingly.||Testing! Unit tests and integration tests are your best friend in verifying that software is functional and meets requirements. Peer review is also critical in this step.|
|Testing||Validate the software with the customer. It meets their needs, everything is understood by them, and they are happy.||The team already wrote tests, but it is critical for everything to pass, test with real people (possibly with the client), and is the moment to verify that all requirements are met.|
|Deployment||Does it continue to work after installation?||Auditing installation and configuration of the environment.|
|Support||Evaluate changes and new requirements, as well as validate that everything runs according to the client’s needs.||The software continues to work as intended. If it fails, it recovers, and in general, verify that it has as few errors as possible.|
Tools for V&V
As I stated at the beginning of this post, there are multiple ways to do stuff, and in V&V, there is no exception. You could test everything manually, use emails to submit changes to code, and have a bunch of post-its around your desk for pending requirements, or you can use one of the multiple options of tools to keep track and organize yourself!
Everyone has made mistakes in life where you wish to be able to rewind time to prevent them. And even if that is impossible in real-life situations, everyone can rewind the errors in software development!
Disclaimer alert: For this to be possible, you need to really keep track of what you have done. If you don’t do this, then it will be impossible as well 😢.
“So how do we keep track of what has been done?” You may ask. Well, even if creating multiple copies and adding the word “Final” on each version sounds tempting:
When you code, using a Version Control System (VCS) is the best tool for the job!
VCS are tools that intend to keep track of the changes you do on a collection of information (usually code, but can be used for other kinds of things as well). In coding, there are tons of different options, but the most popular is Git, but there are other options like Mercurial (The one that is used internally at FB), and some companies even have their own implementations of VCS systems
Using a version control system as the one I mentioned, helps to track the development of a project, for example:
Every point in time can be understood as a goal, a requirement, or a small change. The idea is to submit these points in time (called commits in git) to the system, so if something goes wrong with a new change you are working on, you can revert to a previous point of time.
I don’t remember when or who told me this (I think it was during my FBU internship in 2018, but not sure), but it’s important to keep your history clean. What this means is to submit just code that is working because if you submit something that you know doesn’t work, then in the future, if you try to revert because you broke some other stuff, you may get to a point in time when it doesn’t work either.
Usually, when coding, it’s collaborative work, so the code needs to be stored in a central repository. This is really simple nowadays thanks to tools like Github, Gitlab, Bitbucket, which use these VCS systems like git internally and centralize your work for everyone to collaborate.
Manually testing is always an option, but please keep it to a minimum because it is not only a waste of time, but you may skip something that could break your system.
So basically when you want to test, there are multiple options depending on what and how you want to test. If you want to create unit tests, then a library for this in the language you’re working on may be your best tool (pytest for python, or maybe JUnit for Java). If you want an integration test of a webpage, maybe Selenium can be your best option.
Once you have defined the tools and frameworks best for the different tests you need. You write your tests, and now you need to run them! But, when do you run them?
You run tests normally every time a change is intended to be integrated into the codebase, this way, you avoid submitting errors to the codebase. There is the option to run it manually before doing the push, but there are also tools for this, like Jenkins!
Jenkins is a CI/CD (Continuous integration/ continuous delivery) tool, which helps automate the building, testing, and deploying, creating pipelines on what needs to be run and tested. This tool can be configured to run automatically and test everything before merging your work into the codebase!
There are other alternatives besides Jenkins like Teamcity by JetBrains, the ones integrated into Github, and more!
Keeping track of what everyone is doing and what is pending to do is important in every organization. And in software development, where there is always a user that has nothing more to do than breaking everything, there are always new tasks to fix stuff.
If you try to keep track of everything by memory, you may become crazy, so the best thing you can do is to use tools!
Jira (by Atlassian) is one of the most popular tools for this. You can keep track of milestones, tasks, who is doing what, have a timeline, and basically manage all the projects.
All in One
Nowadays, there are tons of options to do all this independently. Still, it is easier to have everything centralized and connected in a way, so you can refer, for example, your code history with one requirement in the administration process.
For this, companies have tried to merge these different tools in the most understandable way possible.
For example Github, if you create a repository not only gives you the version control abilities but it includes multiple tools for the whole development process:
For example, Actions can be used for CI/CD, automatize build, testing, and deployment. “Projects” is an integrated tool for project administration, and wiki can be used for documentation.
Another example is Atlassian, which has different independent tools for all developer needs, like bitbucket as VCS or Jira for Project tracking. And even if these are independent tools, Atlassian has a framework to help connect them and have a full set of interconnected tools based on your needs.