History repeats itself. Since the invention of the programmable computer, numerous computer scientists keep dedicating their professional lives to the design of "the single, best" programming model, whereas programmers "vote" by choosing their favourite languages and tools.Interestingly, these choices have always been guided by non-functional properties. For programming a single computer, the most widely used models have become objectoriented and component-based programming, a choice driven by their high abstraction level, leading to high programmer productivity. For parallel computers, the winner turned out to be message passing, providing by far not the highest-possible abstraction level, but the closest match between machine architecture and programming model, leading to efficient program execution.For grids, the race is still open. Here, additional nonfunctional properties like fault-tolerance, security, and platform independence enter the scene. In this paper, we explore the scope of grid programming problems and argue for a palette of programming abstractions, each suitable for its respective problem domain.