Most programs today are written not by professional software developers, but by people with expertise in other domains working towards goals supported by computation. For example, a teacher might write a grading spreadsheet to save time grading or an interaction designer might use an interface builder to test some user interface design ideas. Although these end-user programmers may not have the same goals as professional developers, they do face many of the same software engineering challenges, including requirements gathering, de-sign, specification, reuse, testing, and debugging. This article summarizes and classifies research on these activities, defining the area of End-User Software Engineering (EUSE) and related terminology. The article then discusses empirical research about end-user software engineering activities and the technologies designed to support them. The article also addresses challenges in de-signing EUSE tools, including the power of surprise in affecting tool use and the influence of gender.