This article presents a detailed description of fog computing ( also known as edge computing) and explores its research challenges and problems. Based on the authors' understanding of these challenges and problems, they propose a flexible software architecture, which can incorporate different design choices and user-specified polices. They present their design of WM-FOG, a computing framework for fog environments that embraces this software architecture, and evaluate their prototype system.