Our research is at the intersection of two fundamental computer science methods. First, we design and implement new programming models and frameworks with the goal of maximising the automation of technical (non-functional) concerns, so that developers creativity and engineering efforts are focussed on solutions for application domain concerns. Second, we design new methods and techniques for reasoning about software properties. There are obvious synergies between these two areas. One can design programming models dedicated to writing program analyses, so as to facilitate their design and implementation. On the other way around, program intelligence methods can be instrumental for ensuring the efficiency and safety of language concepts.