Enabling Heterogeneous Computing For Software Developers