  In IoT data processing, cloud computing alone does not suffice due to latency
constraints, bandwidth limitations, and privacy concerns. By introducing
intermediary nodes closer to the edge of the network that offer compute
services in proximity to IoT devices, fog computing can reduce network strain
and high access latency to application services. While this is the only viable
approach to enable efficient IoT applications, the issue of component placement
among cloud and intermediary nodes in the fog adds a new dimension to system
design. State-of-the-art solutions to this issue rely on either simulation or
solving a formalized assignment problem through heuristics, which are both
inaccurate and fail to scale with a solution space that grows exponentially. In
this paper, we present a three step process for designing practical fog-based
IoT applications that uses best practices, simulation, and testbed analysis to
converge towards an efficient system architecture. We then apply this process
in a smart factory case study. By deploying filtered options to a physical
testbed, we show that each step of our process converges towards more efficient
application designs.
