Software is getting smart. It's a slow, uneven process -- but it's also seemingly unstoppable. One by one, the hard problems of machine learning are falling to powerful new theoretical tools, letting us build software that can do some truly impressive things. Some applications, like self-driving cars, are a few years off.