Today's software developers don't have to worry about many things that their predecessors used to, like coding to minimize RAM consumption even if it means significantly longer execution time, or WAN connections maxing out at 14.4 kilobits per second. (Although, there may be some out-of-fashion skills they could benefit from or that may yet regain relevance.)
However, the reverse is also true: there are many new skills and areas of expertise that today's software developers, hardware developers, system and network administrators, and other IT professionals need that simply didn't exist in the past. (Where "the past" could be anything from "more than three months ago" to five, ten, twenty or more years.) Or were only relevant for organizations and applications with immense budgets.
"The list of what you need today that you didn't need before depends on how long ago you went to school, how hard you've worked to keep up on technology, the software industry, and software engineering," says David Intersimone, Vice President of Developer Relations and Chief Evangelist for Embarcadero Technologies.
Knowing what you need to know matters, whether you're just starting out as a software developer (or planning to become one), or are a "seasoned" professional who wants to keep your chops fresh so you can stay in, re-enter, or advance.
So here, as a counterpoint to my "lost skills" article, are "found skills" -- what a number of IT professionals see as these new areas for software developers that you want add to your existing knowledge portfolio. (Disclaimer: For the most part, I've left out suggestions about specific programming languages, as too obvious.)
"One thing that strikes me as a new skill is the need to work with massive pre-packaged class libraries and template libraries in all the new languages, like Java or C++ or Python," says consultant and software developer Jeff Kenton. "It used to be that once you knew the language and a small set of system calls and string or math library calls, you were set to program. Now you can write complex applications by stringing library calls together and a little bit of glue to hold them all together. If you only know the language, you're not ready to produce anything."
iPhone app developer Hwee-Boon Yar, who has been writing and selling software for 10 years, says "More programming resources are now available online freely. Knowing where to look, such as stackoverflow.com, as well as what habits are good to adopt in the long run is important. For example, if you become someone who Googles for a solution to a programming problem and copy and paste every time, you will never advance your skills."
Factoring in your users
Meredith Anderson, a business and information architect, adds, "In 2008, discipline keywords like 'information architecture' and 'usability engineering' were scarce in online job postings. In 2010 there were numerous job postings with these keywords. I'm not sure whether the market acknowledged the need and existing skills, or whether the need coalesced around these words to find the skills. In any case, the skill set of user experience engineering -- usability engineering, user interface design, and information architecture -- all distinct from graphic design -- has become a formal area of expertise, described by a specific vocabulary. And in the last couple of years demand for these skills has exploded."
Merryl Gross, a UI Architect in the healthcare information technology area, says, "While knowing your technology is critical, knowledge of the people who use their software, how they use it, and what's important to them about the software is critical these days, when people expect more from their devices. This will keep you from making a lot of expensive mistakes. And where you don't already have this knowledge, assuming you will be spending some of your planning time understanding why your target users like or want the things they want -- and knowing how to do this information gathering and assessment."
Asynchronous programming and other techniques
"Because of the move to cloud computing mostly through web-based interfaces, we are seeing an emphasis on asynchronous programming," says Itai Danan, founder of Cybernium a software development and web design consulting company. "Ten years ago, this was mostly used by transactional systems such as banks, hotels and airline reservations. Today, all but the simplest applications require asynchronous programming, mostly because of AJAX. This is a very different style of programming -- most things taught about software optimizations do not apply across the network boundary."
Brian Fino, managing director, Fino Consulting, an IT consulting firm that specializes in developing enterprise, cloud and mobile applications for the modern business environment, stresses the need to understand the impact of distributed, networked infrastructures, multi-core hardware, etc.
"Cheap and readily available infrastructure has made most all applications multi-dimensional and distributed," says Fino. "Software engineers have to have a good understanding of how distributed systems work from the functional right down to the packets on the wire and how they're routed."
Also, says Fino, understand multi-threaded design: "Hardware today is multi-core; software engineers have to understand how to design software that can take advantage of the hardware capabilities readily available today."
A breadth of skills
"Programmers don't learn that someone else is going to take care of the code they write," criticizes Sarah Baker, Director of Operations at an Internet media company. "They don't learn about release management, risk assessment of deploy of their code in a infrastructure, or failure analysis of their code in the production environment -- everything that happens after they write the code. They don't learn that a log is a communication to a operations person, and it should help an operations person determine what to do when they read that log."
Craig Schwartz, Senior Engagement Manager at Freeborders, a global IT services provider, sees three core skills being in demand: mobile development, global delivery and agile development experience. "With the growth in mobile computing, the ability to create Web applications designed to work on mobile devices, Rich Internet Applications (RIAs) for the mobile market and applications that run directly on mobile devices (Android and iOS) will be a necessary skill for developers as this market grows."
It isn't just about what you already know, either. It's also about continuing to add to your knowledge and skill sets, comments Amy Wilson, Client Services Manager at web and mobile app design firm Accella. "With the ever changing face of technology, and the skills necessary to keep up with new software/hardware, programmers and developers have to be much more flexible in today's marketplace. Learning ONE language or skill won't cut it in today's workplace. Being flexible and staying up to date on new software releases is key to being a truly successful resource."
Domain expertise for new jobs
Many new jobs call for "domain" (subject matter) expertise in addition to software chops.
Mary-Anne Wolf, who is a senior software engineer, project technical lead and architect, sent me a list of four-score-plus skills and job foci; here's some selections:
Speech recognition-based non-visual user interface designer
Software designer for large-screen mobile devices with no hard disk
Designer of location-responsive and orientation-responsive applications
Specialist in software for oil and natural gas exploration and geology
Specialist in the design of medical devices which are embedded in the human
Bruce Douglass, Chief Evangelist, IBM Rational Software, suggests several areas of domain expertise, including:
Electric vehicle mechanics: "As automakers upgrade the features in electric, so will the amount of software code in each vehicle. Software engineers with knowledge and fundamentals on electric vehicles will be in better position to create complex battery systems, electric drive units and cabin electronics."
Environmental engineering: "The green movement will remain a hot button issue for future engineers. Finding new ways to improve the environment, provide healthy water, air, and land for human habitation, and to remediate polluted sites are all important areas of expertise for software engineers."
Agile and collaborative development methods
"Today's developers need to have awareness of more agile software development processes," says Jeff Langr, owner, Langr Software Solutions, a software consultancy and training firm. "Many modern teams have learned to incrementally build and deliver high-quality software in a highly collaborative fashion, to continually changing business needs. This ability to adapt and deliver frequently can result in significant competitive advantage in the marketplace.
"In order to deal with continual demands for change coming from the business, and sustain reasonable maintenance costs on their systems, today's developers need to understand how to incrementally grow their systems using appropriate quality technical practices," says Langr. "Some of these practices are: test-driven development (TDD), automated acceptance testing, refactoring, continuous integration, and continuous delivery."
Developing for deployability, scalability, manageability
"Sysadmins are likely to own the software for much longer than the developers -- what are you doing to make their stewardship pleasant enough that they look forward to your next deployment?" asks Luke Kanies, Founder and CEO of Puppet Labs: "This includes deployability and manageability. New technologies are often much more difficult to deploy on existing infrastructure because developers haven't had time to solve problems like packaging, running on your slightly older production OS, or connecting to the various services you have to use in production."
Also, says Kanies, manageability matters, "The most important part of an application's lifetime is when it's running in production, yet developers don't spend nearly enough time thinking about how to maintain the application while it runs. For example, is there debugging or performance instrumentation? If it's running slowly, can you tell why? If there are failures, can you trace the failure without the service being down? Can you hide failures from the user but still pass the debugging information on to the sysadmin and developers? Can you tune the application, or deploy more copies, without bringing it down?"
And, finally, some short sundries
Walter Gillett, a developer at software consultancy Twenty Geese Software, suggests:
Distributed computing technologies like Hadoop for seriously scalable cloud computing
"Big data" -- analytical capabilities to deal with the flood of web and scientific data, e.g., clickstreams from a gazillion users of a large-scale web site.
Senior software engineer Amy Unruh adds, "it is useful for today's developers to understand issues in realtime search, and techniques for pipelining data analysis and for managing 'activity streams.' And you should able to exploit the 'small pieces loosely joined' model, including use of microformats, and understand how to consume APIs from other services and support relevant APIs for your service, by building on RESTful computing principles."
What new skills have you found you've had to learn -- or are planning on learning?