A major impediment preventing ubiquitous computing with cellular automata (CA) stems from the difficulty of utilizing their complex behavior to perform useful computations. In this paper non-uniform CAs are studied, presenting the cellular programming algorithm for coevolving such systems to perform computations. The algorithm is applied to five computational tasks: density, synchronization, ordering, boundary computation, and thinning; our results show that non-uniform CAs can attain high computational performance, and furthermore, that such systems can be evolved rather than designed. We believe that cellular programming holds potential for attaining 'evolving ware', evolware, which can be implemented in software, hardware, or other possible forms, such as bioware. We have recently implemented an evolving, online, autonomous hardware system based on the approach described herein.A.