A more apt (but more technical) analogy is object oriented vs functional programming languages: Si is object oriented, where the code is centered on building things (objects) that have properties and methods, while Ni is functional, where the code is centered on building functionality than on building things. In C#, an object oriented language, every entity is an object: even integer, Boolean or string variables ... even functions are objects (when treated as a delegate). In F#, a functional programming language, every entity is a function ... even a "variable" is simply a function that is defined as taking no arguments and returning a specific result, and an "object" is simply a function that takes no arguments and returns the object.
As such, Ni systems will tend to center around modeling the dynamic behavior of things, while Si systems will center around the more static relationships between things. To Ni, the "things" are merely details of the system, while to Si, the functionality is merely one kind of detail of the "things" in the system.
These are just overall tendencies of course. Ni doesn't ignore the "things" any more than Si ignores the functionality, but there is definitely a preference on the part of each.