The proliferation of multicore processors has reinvigorated an interest in alternative models for programming that make it easier to express concurrency and utilize parallelism. Multicores are relatively easy to architect but they significantly increase the burden on the software stack to deliver the promise of Moore's Law to end users. The burden on software will increase as the processor landscape is likely to feature a wide range of systems that include homogeneous and heterogeneous multicores as well systems with reconfigurable accelerators and FPGAs. In this talk, I will draw from my experience with the Cell processor to highlight the challenges in programming multicore processors. I will argue that the existing software stack is an impediment to programmer productivity, and argue that while new programming models are a necessity, it is also necessary to reevaluate the software stack, and blur the many existing boundaries between software and hardware. I will conclude the talk by presenting Liquid Metal, an end-to-end system from language design to co-execution on hardware and software. The goal of the Liquid Metal project at IBM Research is to allow hybrid systems to be programmed in a single high-level and object oriented language that maps well to both CPUs and FPGAs (and everything in between). While at first glance it may seem that these different systems have conflicting requirements in terms of programming features, it is our belief that many of the features turn out to be highly beneficial in both environments when they are provided at a sufficiently high level of abstraction. By using a single language we open up the opportunity to hide the complexity of crossing domains from software into hardware, and facilitate a fluid movement of computation back and forth between different types of computational devices, choosing to execute code where it is most efficient to do so.