Scientists are skilled with computers, and main of them understand the intricacy of numerical computing. Yet, designing the sophisticated software architecture that controls an experiment requires different skills, and small- and mid-sized experimental labs often lack a software engineering culture. Bad design choices plague experimental labs even though the real experimental difficulty seldom lies in the software itself. In this article, I give some guidelines for designing an experiment's control software based on my experience in various Bose-Einstein condensation labs. I explore the tools and patterns that lead to successful projects - in particular, a flexible and reliable code base that lets scientists cope with a research lab's ever-changing goals and resources.