The way we regard a thing determines the way we interact with it.
At first sight, software is functionality. Its goal is to take an input, execute some algorithm and to produce an output. We all know that software systems can be complex and that they need checking. When you look at software as functionality, the way you check systems is by performing a test: you provide the input, trigger the functionality, and check the output against a desired value.
But, software is data, too. Every time you add a character in the code, you add another little byte on the existing pile. Every time you introduce a new class, you add a new entity. Every time you introduce a new call, you add a new relationship. Every time you run a program, you generate runtime entities. Every time you commit a change, you add it to the historical data. And so on.
This data can be modeled. And it can be checked, too. It's just that the check is not a functional test. The check is a different kind of analysis.
Software is data. See it for what it is to know what to do with it.