A significant amount of the software written today, and more so in the future, interacts with naturally occurring data - text, speech, images and video, streams of financial data, biological sequences - and needs to reason with respect to concepts that are complex and often cannot be written explicitly in terms of the raw data observed. Developing these systems requires software that is centered around a semantic level interaction model, made possible via trainable components that support abstractions over real world observations.