  To design peer-to-peer (P2P) software systems is a challenging task, because
of their highly decentralized nature, which may cause unexpected emergent
global behaviors. The last fifteen years have seen many P2P applications to
come out and win favor with millions of users. From success histories of
applications like BitTorrent, Skype, MyP2P we have learnt a number of useful
design patterns. Thus, in this article we present a P2P pattern language
(shortly, P2P-PL) which encompasses all the aspects that a fully effective and
efficient P2P software system should provide, namely consistency of stored
data, redundancy, load balancing, coping with asymmetric bandwidth,
decentralized security. The patterns of the proposed P2P-PL are described in
detail, and a composition strategy for designing robust, effective and
efficient P2P software systems is proposed.
