• Templates and Data Types: we need to have programmable data sizes (32-bit floats, 16-bit integers), generic containers (linked lists, diagonal matrices), and generic classes (Fourier Transform must operate on all types of signals).

  • Data-Driven Programming: specific operations depend on the type of data in a file (recognition on a feature stream vs. an audio stream).

  • Centralized Memory Management: efficient, block-oriented memory management is essential.

  • Virtual Interfaces: implementations must be algorithm neutral and extensible (by novices).