If you are looking to be a great general purpose software engineer then the skills for the next 5-10 years are very similar to the skills needed in the last 5-10 years.
- Strong understanding of the fundamentals of Computer Science
- Data Structures
- Operating Systems design
- Highly analytical
- Able to decompose big problems into smaller problems
- Sequence and prioritize what needs to be done
- Work well in teams (meaningful work is done in the unit of teams)
If you are looking to optimize for trends in the industry or what you think the real world will demand of computer technology then focus on Machine Learning, Computer Vision, Mobile development or Distributed Systems (IoT).
I have one caveat regarding Machine Learning. Most people think of it as this sexy field (which it is) but most practical applications of machine learning really depend on strong system design focused on effectively using memory, IO, and extracting features that don't reside on the machine making the classification. Most graduate course are focused on the underlying classifiers but really the magic is in how they are applied to real world problems.
I keep waiting for the programming world to undergo a revolution. I've been waiting 30 years now. I'm sure it's coming any day now. It could even be in the next 5-10 years!
Barring that, here's what I think people should be focusing on as programmers and designers.
- Higher level languages such as Java and even the latest, greatest C++ which has some very nice features. Get comfortable with these suckers, they've been around for a while, they're going to stick around. Python is also useful. The jury is out on other very cool but not very broadly adopted languages.
- Get comfortable with big data. It's not for everyone, but there's big money in it, and it's incredibly useful for business, digital assistants, and human-computer interfaces. Intelligent agents - software which learns your preferences and finds things on your behalf - will come sometime soon. Big data - processing an internet worth of data to understand what you like, and are likely to like - will be a part of it. Get comfortable with SQL and distributed analogs to SQL for querying and transforming data.
- Cloud computing. Be familiar with cloud computing. Think of it as a way of being able to easily scale up and scale down solutions, depending on the amount of data / customers you have a given month, week, or even hour. Get comfortable with it, or at least with AWS and possibly Azure. And of course the stuff that'll come out of the team I'm on at Oracle ;)
- Touch and other non-qwerty interfaces. You don't need to learn how touch is tracked, and the mechanics of voice recognition. Instead, try to ensure you're able to incorporate these techniques (and possibly others such as gestures) into your applications.
- Build for the universal screen. Microsoft is trying to unify their operating system ecosystem from the very small to the very large, and I think it's BRILLIANT. Become familiar with technologies which span device categories.
- Mobile rules. On the client side, mobile is where it's at. There's more smart phones and tablets out there than PC's, laptops, and notebooks. I think this will only continue. Time learning how to write apps and interfaces for mobile devices is time well spent.
- Web technologies. I've given up on the web going away, although it looks like flash is on its way out. HTML5 and web protocols both seem like very sound investments, for those who can benefit from them.
Notice I didn't put anything about becoming a mathematical genius or distributed systems expert. There's value in those things, but the reality is, a small set of people will solve the hard problems in these areas, and adapt them with a nice compromise between power and usability.