In opposition to reductive, determinist notions of computation, this work shows how computational design offers valuable methods, approaches, and strategies to working in socio-technical complexity. In this thesis, I have presented a three-part framework for understanding computational design as a situated, contingent, and evolving set of practices and approaches. The first component, generating, reveals how computation enables the designer to work at levels of abstraction, gaining facility in shaping and navigating large possibility spaces. The second, simulating, provides a frame for exploring complex systems, and envisioning and modeling potential interventions in those systems. Finally, interrogating, drawing from both Schön’s ‘reflective practice’ and an ethos of hacking, encourages computational designers to critically question their tools and practices in order to discover new ways of working and thinking. I support each component of the framework with background texts from computation and design, interviews with individuals demonstrating positive deviance in their creative work and research, and case studies of my own investigative software prototypes and design workshops. The computational design thinking framework, supporting interviews, and case studies are the culmination of this thesis, but I see an almost overwhelming space of possibilities for further research.