The Complete Software Developer

The Software Development profession is still a relatively immature profession. There are few real certifications and no real licensing processes that provide any realistic guide to an individual's competency. The landscape evolves quickly and covers a very broad spectrum of skills. These reasons make it difficult to map out a career path that will lead to the development of a complete Software Developer. In this article, I intend to lay out what I feel is a solid career outline for a Software Developer, and why each step is important.

It is important to note that this is not the path to be a competent developer, but to be an outstanding developer. The tools and resources available today make it possible for someone to achieve reasonable levels of successes with minimal levels of skill and education. Instead, this is a roadmap to become what I consider to be a complete developer. This includes more than just pure technical skills, but someone who can work with others to solve problems.

Education

A favorite movie quote of mine is from 'Die Hard':
"'And when Alexander saw the breadth of his domain, he wept, for there were no more worlds to conquer.' Benefits of a classical education." - Hans Gruber
While a Computer Science or Computer Engineering degree is not required to develop software, it can provide an understanding of the foundational elements on which everything else is built. Understanding both how a computer actually works, and the fundamentals of algorithms, data structures, and operating system design will provide a solid theoretical foundation for an entire career. I also believe it is important that the degree focuses on theory more than practice. A Computer Science degree that spends time teaching how to use Visual Studio or Eclipse may produce students who can be more effective in year 1, but does them a disservice in years 2-n.

The only other degree I've seen with some regularity provide individuals with a solid understanding is Physics. Even so, they have had to learn the fundamentals along the way. I guess with the Physics background, they probably understand everything at a much deeper level anyway.

Consulting

I believe that every new college graduate's first job should be with a consulting company. Not just any consulting company, but one large enough and experienced enough that it provides real training on how to be a Consultant, in addition to how to develop software. Consulting is a skill, and it is one that will pay dividends through an entire career.

Working at a consulting company will expose new Software Developers to a variety of technologies, business domains, and cultures. Ideally, the consulting company works in a variety of technologies and new consultants get an opportunity to work on projects across multiple languages/technologies/platforms.

Travel is not a requirement, but can provide some added benefits. From the simple worldly benefits of seeing different parts of the country, to business dinners with clients, where new developers can gain a real insight into how business gets done. You may also get to eat some great meals along the way as well.

Consulting also helps new developers learn to market themselves. Since consulting companies really sell the competency of their staff, and their 'unique process', developers will learn how to position their skills and experiences to demonstrate competence and credibility. After consulting for a while, every future job interviews will be much less stressful.

Ideally, spend 2-3 years broken up into six month projects across at least two different platforms (Java, .Net, etc.), and with at least one project in a different city.

This experience will do several things. First, it will teach new developers how to be a consultant. This includes everything from dressing professionally, to presenting ideas and concepts to non-technical customers, to understanding the business of selling services. Second, it provides a broad experience base while new developers are still young and impressionable. There are many different technologies and platforms out there, all taking different paths to solve problems. Seeing this diversity early insures that new developers do not become assimilated into the group think of a single platform or pattern. It is hard to work in different platforms like .Net and Ruby on Rails without developing a knowledge about how the underlying technologies work. Finally, new developers will also see the rich diversity of business and cultures across companies. It is an opportunity to learn the trade-offs of different business models and cultures, and how they impact the ability for software development teams to be effective.

Support

After spending some time in Consulting, it is time to move into a role where you can own and support a product. This can either be within an internal IT department, or for a Software as a Service company. A packaged software vendor provides many of these benefits but I believe that a critical part of this experience is 'carrying the pager', which packaged software usually avoids.

The key learning here is to own and support a system across several major releases. Building version 1.0 of an application as a consultant is very different from enhancing and maintaining an application across several minor and major releases. Being responsible (indirectly, if not directly) for the support and success of a production application is a critical learning experience.

Ownership is an important concept. This experience provides the ability for a new developer to really work on something over a long period and 'own' it. A developer can see the payoff of a bit of foresight or extra effort they put in 12 months ago. They can also feel the pain of taking shortcuts that were ill-advised. They can learn how those trade-offs work and begin to get a sense of when they are worthwhile.

In the end, working in IT or Engineering provides a different set of goals and drivers for Software Developers than Consulting can provide. These different goals force new developers to see software development through a different lens.

Performance and Scaling

The opportunities within most consulting and traditional IT/Engineering roles to really focus on high performance code and application scaling are limited. Within consulting, it is often a non-factor, as performance and scaling issues often do not appear until long after the initial deployment. Within IT/Engineering roles, there is often an opportunity to address issues, but only within the context of a single application and infrastructure.

Therefore, the next stop on the career path is Professional Services or other specialized consulting. Professional Service organizations often focus on providing extremely skilled resources for short periods to address critical issues. These can often focus on performance or scaling issues, and provide a great opportunity to gain exposure to a broad set of problems, architectures, technologies, and infrastructures. To be successful in this role, an individual needs both a deep understanding of the product they are supporting but also an understanding of how it fits into the greater ecosystem.

In a Professional Service or specialized consulting role, individuals often interact with very senior members of the customer's staff, allowing developers to gain experience and exposure to a individuals they may not traditionally interact with.

This type of experience provides an opportunity to solve a large number of very intense problems over a relatively short period of time. This provides a breadth of knowledge about how the different types of major systems in production, and the problems that they face. It also allows developers to build an impressive network of contacts across a broad range of companies.

What's Missing?

As a career outline, I believe this is a great start, but it is probably incomplete. There are many other valuable experiences that an aspiring Software Developer should experience. Some of these can be done in parallel with the above outline, others may be additional steps.
  • Build a product - Whether it is an Open Source application, shareware, or a commercial application, build something from scratch that other people will use. Interact with your user base and understand the challenges that product managers face.
  • Manage a team - Lead a team. Learn the interpersonal skills necessary to manage a team, and learn the leadership skills and qualities necessary to rally a disparate group of individuals into a team.
  • Work for a startup - As a side project or part of your career path, understand how a small company can often achieve more than a much larger firm.
  • Work for a Fortune 500 Company - In a consulting role or as an employee, understand how the right decision for an organization isn't always the right decision for an individual team or group, and the political and interpersonal issues that this can create.
  • Learn - Learn a new language every year, at least. Learn a new framework, pattern or approach ever quarter, at least. Understand how things work on the other side of the fence, you'll be amazed at how it can change your perspective.
  • Mentor - Learn to help others grow. If you can't teach someone else how to do it, you probably don't understand it well yourself.
  • Build your Network - It is a small world. You will run into folks again and again. The impression you make on them as a junior developer may be important a decade later.
  • Maintain your Network - Keep in touch with as many people as you can. Reach out to them and help them as much as possible. It will pay off.
Go Forth and Create

Now, focus on your passion. You have the background necessary to learn any new technology, solve any problem, and effectively communicate with others. It is time to focus on what you are passionate about, and become a leader in your chosen field.

7 comments:

  1. Hi Eric-

    Great blog.

    Couple of side comments:

    1. Licensure consistently means there's either been a political fight between two factions and one successfully forced the state to view its version of the world. The licensing of Medical Doctors is but one example. It also keeps the riff-raff out (the US allowed anyone to 'read law' in a Master-apprentice system until the ABA formed.

    2. Certifications satisfy only the company supplying the technology (MS, SAP, Cisco, etc.) and really lazy HR/Recruiter types. As a hiring manager I should be much more concerned about real life skills than how well someone can take a test or file documents that stretch the bejesus out of what really happened (PMP and IIBA) on a particular project.

    ReplyDelete
  2. Eric,

    While I agree with your second point about striving to be exposed to multiple types of clients, technologies, situations, etc... I think that consulting out of the gate would be one of the worst steps a new college graduate could make.

    Consulting shops like you described are ultra-rare. What you usually end up with is a body shop looking to bill a client 40 hours a week, no matter what. You rarely get to try new technologies, instead you're pigeon holed as a ".net guy" or "java guy" and the company is unwilling to spend money for you to learn while you could be billing somewhere else.

    Lastly, perhaps worst of all, is that there is a tendency to not learn to think holistically during a project because you don't have to live with your decisions. Long term consulting is typically an oxymoron, though there are exceptions. It's easy to churn out the first version of a project. It's a lot harder to have to live with your original assumptions and have to churn out the 3rd and 4th versions.

    I've been privy to both types of consulting companies, including even some in between. Like anything sales related, the marketing material used to convert someone from a prospect and the actual experience once you're an employee are often divergent.

    Not that I think consulting is bad or not a good path to follow. I just think that you should be a little bit more seasoned and strive to come into a consulting company that is a known entity for you.

    ReplyDelete
  3. Griffin,

    I agree that there are many consulting companies out there that are body shops and do nothing to really grow new developers. Many of those also don't have college recruiting programs either, so it is often a non-issue.

    When choosing a consulting company as a first job, it really is critical they they have an established and proven new hire program. As Griffin points out, these are not common.

    That is also why I suggest only doing it for 2-3 years. In that period of time, most developers are still really learning how software development works, and how to write real world code. While they don't learn the full life-cycle of a software application (hence the next step), it provide needed 'polishing' and broad experience for them to be successful in the future.

    ReplyDelete
  4. Eric,

    I can think of several that do recruit colleges. However, it's entirely possible that you and I have different experiences with the bigger names out there. While some may see them as safe choices, I would steer new recruits to the more boutique and/or smaller shops out there. They tend to treat software as more of a craft and less of a 9-5 job.

    ReplyDelete
  5. Very good article, I couldn't agree more

    http://techno.emanueleziglioli.it/2010/01/complete-software-developer.html

    ReplyDelete
  6. This is an article I go back and read from time to time. Sometimes I wish I would have read it 15 years ago! Nonetheless, Eric, I think your points are valid. One thing I am wondering is a good approach to truly learning new languages, frameworks, technologies. Maybe it means re-writing a personal project or doing some free work. I see one con in learning by doing a personal project in that when you run up against a difficulty you can change your requirement -- something that doesn't happen in the real world. What are your thoughts on learning techniques?

    ReplyDelete
  7. I've always invented personal projects as a testbed for learning new languages/frameworks. If you look at this site, you can see that I've rewritten (or at least partially rewritten) JES as CSES, and iTunes Export has been a .Net client, a Flex Client, and a Scala command line utility.

    I don't think 'flexible requirements' are a big problem with these. When you are learning, finding out that certain things can be very hard with a technology is useful as well. Just don't be too lazy!

    ReplyDelete