Near-ubiquitous smart phones are the most promising heralds of future pervasive computing. However, despite their increasing capabilities in computation, communication, and sensing, programming phone platforms is still fraught with unique complications. Through involvement in several research projects pursuing middleware architectures to support pervasive applications on smart phones, we have gained a good understanding of the issues to be addressed. We report here on the difficulties, the lessons we have learned, and our recommendations on how to best tackle the major issues. While delivering the pervasive computing vision is challenging, we believe that careful resource management, lightweight communication protocols, and asynchronous programming are the necessary keys to succeed in this endeavor.