In the classic board game Battleship, an adversary arranges a fleet of tiny, plastic combat vessels on a grid that’s hidden from view. After an analogous fleet is set up on a separate grid, the objective is to guess the locations of the opponent’s boats. Likewise, the opponent’s goal is to divine the whereabouts of your miniature ships. The game proceeds with opponents alternately wagering guesses by calling out grid coordinates (C5, A2, etc.).
At first glance, this patently low-tech and old school game may seem to have little in common with embedded systems development. However, many engineers actually develop and debug software using the same trial-and-error tactics required for Battleship. Just as participants in a game of Battleship call out grid coordinates in attempts to locate ships, these engineers painstakingly insert printf() statements into various locations in their code, hoping to eventually identify the sources of troublesome bugs.