Verification is the process of checking that the software meets the specification.
It is doing what you wanted it to do.
An example could be that function need to add two numbers, then you verify (like write unit test) that it is correctly doing that.
Validation is the process of checking whether the specification captures the customer’s needs.
Using the example of the function need to add two numbers verification need to confirm that this function is really what user need, eg. maybe you need to multiply two numbers.
Practice vs theory
When I first head about validation I was able to understand it in theory, but in practice, I was thinking it is easy to know what you want why do you need to validate it.
Then I had personal experience of why and how validation is hard.
I build wrong software for myself and I had no one else to blame.
How I build wrong software for myself
My idea was to make software that will be run at 1 AM every day, will take all real-estate ads from https://www.njuskalo.hr/ for my town listed on a previous day, sort them by price for a square meter and send them to email.
Basically, I wanted all new ads per day to my email, sorted by price for a square (one day delay was fine for me).
Looks simple enough, what could go wrong?
After a few days and I had it running in production and it was working, verification was successful, I every day I got all ads from the previous day.
Why validation was wrong
After a week I found out that my software was useless.
What was the problem?
Rember that I wanted to get “I wanted all new ads per day to my email”, I wanted all “new ads per day”, but what I got was all updated and new ads per day.
Let me explain.
Every day I was getting around 200 ads per day and I noticed that a lot of them were the same ads, day after day.
What was happening is that a lot of people were just updating the same ad every day.
And they are doing this so that their ad is always on the first page, sometimes they even do it a few times per day (later I found out that a friend of a friend was contracted by one local real-estate agency to make software that will automatically update ads for them).
Altho my software was working correctly, only after I have made it I found out it is useless because of wrong assumptions.
My assumption was that every ad will be added only once, not that 60% of adds will be updated every week.
I have solved this problem by making version two that could know if an ad is new or updated and if updated what was updated.
Am I stupid
This experience was fascinating to me.
On this project, I was everything: user, project manager, architect, coder, quality assurance, investor, every hat was on my had and I manage to build the wrong thing.
It gave me a practical understanding of why it is common that the end user is not happy with the finaly product.
Even if everything is done correctly it is possible that the final product is not solving user original problem due to wrong initial assumptions.
How to improve validation
One approach is to make MVP, in this way you will spend fewer resources on version one.
If validation of MVP is correct, then add additional features, if not cancel it
Another approach is to get some domain knowledge ether internal or external.
I had built a few web-scrapers in the last few years and now know a few tricks about that domain, but I learned each on the hard way.
I also understood why some companies hire domain experts consultants (just be sure to have a good one).