We introduced the concept of programmability and showed how it can exist in network devices, controllers and software components as a key to how these elements interact with one another. Making a device easily programmable requires that we first create some sort of bidirectional communications channel between it and the other piece of software communicating with it—controllers or applications communicating with controllers.