Some people liken the building blocks of software to Lego bricks, and I can see why the analogy is made. There are different sized bricks in Lego which do different things. Similarly in software there are modules, libraries, packages, subroutines etc. which contribute different functionality to programs. Theoretically one could reuse a function like sqrt() infinitum times, just like the standard Lego block. It won’t wear out. I can also use the functions of OpenCV to build applications which process images, so in fact I am constructing software. But Lego bricks have not changed since the plastic bricks appeared in the early 1960s. Software has changed, and continues to evolve, sometimes at a rapid pace. The use of building blocks such as OpenCV rely on an underlying infrastructure including a programming language Python? C++? Using it also relies on evolving *versions* of the building block. Because Lego bricks have not changed since their inception, they are backwards compatible. Sure new bricks have been added, but the method of connecting them hasn’t.
However when a package like OpenCV changes (for instance to deal with the fact that algorithms like SIFT and SURF have patents), software breaks because it is no longer backwards compatible. Then the system has to be changed to compensate for this. Lego doesn’t need to change. The other thing that is different is that Lego is a constructive entity. It can be used to build anything… from an space-ship to a real house. Software can’t.