Wednesday, December 14, 2005

Critical Skills for Modern Software Engineering (2005)

I have always believed in multidimensionality in skills as a requirement to be proficient at architecting and building software and systems. What I mean by multidimensionality is being relatively proficient in many areas. Instead of specializing and doing one thing good, I mean doing many things well. This is not exactly a mainstream concept. Actually, I think it is a viewpoint that is anti-mainstream based on what I read in daily/weekly journals.

So what is multidimensionality for modern software engineering you ask? It is having a wide understanding and proficiency of many technical areas. For instance being skilled at programming (Java, Delphi, C/C++, PHP, REXX, Basic), modeling (SA/SD, UML), networking (Windows, TCP/IP, Unix), data communications, distributed databases, user-interface design, graphics, operating systems (DOS, OS/2, Linux/Unix, Windows) , technical writing, non-technical writing, and everything else computer science without resigning yourself to being at a beginner or novice level. The proficiency is being at the intermediate to advanced level in all these areas. The most critical of all the skills is the ability to communicate verbally and in writing.

Over the years, I have seen this trend towards specialization in an area of business information technology. You hear this over and over again from all angles. These angles are the press, career recommendations, instructors, professors, and even from professionals within the field. I've even seen software development teams built around specializations. These specializations include user-interface (HTML, Javascript, JSP, GUI), business-tier (rules, logic, subsystem integration), and integration-tier (database, systems integration). These teams of specialists are not a bad thing. For large projects or projects under a particular time constraint for which you have no control, a team of specialists may be your best route. These types of teams have their place and can actually be the best solution given a particular set of constraints.

What I have not seen much of is software teams composed of multidimensional people. This probably occurs in the R&D environment more often but not so much in the business solutions arena where most of us exist. I have been fortunate in my career to have been given the opportunity to exist in both the business solutions and R&D environments. When working in the R&D environment, multidimensional teams are better in my opinion. When working in the business solutions world, I would like to have a team of exceptional multidimensional people however, this has not been possible due to many management variables that are usually outside of my control.

Ok, now let's get back on track. In 2005, there is this new wave of web development evolving that is leaning towards multidimensional skills. These are the small and agile teams of one, two or a handful of people who are accomplishing things at unheard levels of productivity. As I get more into researching, designing and building newer software systems (client/server, java, web/AJAX, networking systems), the more I see the need for extremely high skilled or multidimensional team members.

Another really important perspective is how this applies to the modern business world. With all the outsourcing and globalization, the need to be even better is crucial to remaining competetive in the future.

I can't tell you how many experiencies I have had when many points of technical discussion I'd like to make that I cannot even have with specialized persons because they do not have the 'other' skills, knowledge or experience required to even understand what I need to discuss. This is where the multidimensional skills matters. The multidimensional person may not have all the skills yet, however, has the right mindset towards learning and assimilating knowledge and knowing when to do this. This is the multidimenstionality trait. These are the good technical people that everyone talks about but can never find. I agree. These individuals are rare or very difficult to find.

So what are the critical skills for modern software engineering again? Multidimensionality, excellent verbal and writing skills, open mindedness, confidence, and willingness to assimilate knowledge.

1 comment:

^-^,-,~ Inu said...

Speaking as one who has worked with this guy - he is absolutely right. When you have a team so handicapped by the lack of understanding by various members, you have to basically ditch them to get the job done and then let them catch up in the maintenance phase. Design/development for the latest goodies is no place for personnel who don't understand crucial components of the system. It merely wastes time (can you say 18 months!), and produces ZILCH, ZIP, NADA. Only when my cohort took over and just wrote the design docs (this after 18 months of nothing from the assigned leads), did a real design exist. Next is implementation and he's being told to be a team player. Excuse me but the team didn't produce. He has. I say "go PV go!"