This document discusses decentralized applications (DApps) from a software engineering perspective. It begins by providing background on cryptocurrencies and blockchains. It then defines DApps, describes their architecture, and categorizes different types. The remainder of the document discusses developing DApps on various blockchain platforms, focusing on Ethereum as an example public blockchain and describing the development process and tools used.