Many specification models are available in the industry, which range from natural languages, to pseudo code, to loose mathematical notations, and to formalisms with rigorous semantics. In this article, we first discuss the general challenges in writing proper specifications. We then discuss issues in choosing appropriate specification models for a system. Then, we briefly review several specification models, which include state machines, Petri nets, process algebras, temporal logics, guarded command languages, pseudo code, comments and assertions, VDM, Z, AMN, and message sequence charts. For each model, we also point to some available tools.