In biological systems, there are striking examples where complicated structures (i.e., the bacterial ribosome) can spontaneously assemble, driven by specific interactions between the components. But how can systems be designed to have this property? Recent technological advances have created the opportunity for making technologically relevant systems that self assemble, using strands of DNA or objects coated with DNA. We will use these systems as inspiration to formulate theoretical models to understand how self assembly works in these systems, through theory, numerical simulation and experiment — and start to speculate as to whether resulting principles might be useful for unravelling the rules of biological self-assembly.