This process entails examining the structural components [of a computer program ] at each level of abstraction to determine whether their particular inclusion at that level was ‘idea’ or was dictated by considerations of efficiency, so as to be necessarily incidental to that idea; required by factors external to the program itself; or taken from the public domain and hence is nonprotectable expression. . . . The structure of any given program may reflect some, all, or none of these considerations. Each case requires its own fact specific investigation.