  Block-based programming languages like Scratch have become increasingly
popular as introductory languages for novices. These languages are intended to
be used with a "tinkering" approach which allows learners and teachers to
quickly assemble working programs and games, but this often leads to low code
quality. Such code can be hard to comprehend, changing it is error-prone, and
learners may struggle and lose interest. The general solution to improve code
quality is to refactor the code. However, Scratch lacks many of the common
abstraction mechanisms used when refactoring programs written in higher
programming languages. In order to improve Scratch code, we therefore propose a
set of atomic code transformations to optimise readability by (1) rewriting
control structures and (2) simplifying scripts using the inherently concurrent
nature of Scratch programs. By automating these transformations it is possible
to explore the space of possible variations of Scratch programs. In this paper,
we describe a multi-objective search-based approach that determines sequences
of code transformations which improve the readability of a given Scratch
program and therefore form refactorings. Evaluation on a random sample of 1000
Scratch programs demonstrates that the generated refactorings reduce complexity
and entropy in 70.4% of the cases, and 354 projects are improved in at least
one metric without making any other metric worse. The refactored programs can
help both novices and their teachers to improve their code.
