The Hard Part of Software Development

Silverlight Logo

I've spent a lot of time the last few weeks looking at some of the new buzz words in software development. Domain specific languages, dynamic languages, TDD, DDD, *DD, etc.. Most of these ideas have definite benefits to the work of software development but I think they miss the mark on what is really hard in software.

In most projects I've worked on the past twenty some-odd years, the hard part is not how to architect a project, not how to tune a database and not how to eke out every CPU cycle of a function call.  In fact the hardest part has always been in understanding how a business does business. There are many names for this but I like to think of this as domain specific knowledge. It's the time in the meeting room with the business veterans (stakeholders of one sort or another) that understand how it really works.  Whether that is how freight is shipped across country, how users register with forums or how those scanners at the grocery stores actually work; in all cases these stake holders already know how they do or want to do their job.  It is our work as developers into transitioning that into actual software.

Eric Evans talks about this in his Domain Driven Design book, but I think some readers of his book seem trapped into thinking that the magic of the domain is the top-down design of a system.  In my opinion they are missing the point.  Turning domain knowledge into a system is hard work, no matter what design methodology you use.

It's a people problem. We engineers talk in terms of code, architecture and data.  We have our private language that helps us communicate.  If you don't think that's true, ask your spouse/partner what happens when they hear you talk about work with your friends. The thing is that in most industries this is true. When you talk to stake holders, they have their own language too. Our job is to pull that information from them and translate it into software designs. Often a small misunderstanding can be the cause for large changes in a system. Getting this knowledge transfer right is crucial.  For the most part we do an admirable job of it, but I think it is critical to understand how essential this is. Constant communication with the eventual users of a system is a key to the long-term success of any project.

So, if you've stayed with me this far we're probably in agreement about the importance of domain knowledge. Here's where I get incensed. So much of development these days is being done by outside developers.  The strategy of business to keep developers around has vanished. This is evidenced by off-shoring, outsourcing and contractor-based development. Companies are attempting to cut costs by using cheaper developers as well as development teams they can cut loose once a project is complete. 

The problem with this strategy is that all the domain knowledge is leaving the enterprise. Companies spend a lot of money for a project and some percentage of that money is in teaching the development team about the problem domain and the way that the company does business.  By having short-term development strategies all this knowledge isn't being recouped by the companies. I don't think they understand yet what a bad deal this is for them.  But it's not just bad for companies, it is also bad for developers.

In some sense we developers are part of the problem. Quitting your $75K/yr job to be hired back at $75/hr seems like a good deal, but in fact it is not a good deal for either party.  Your loyalty is to the paycheck and when you leave, the domain knowledge goes with you. This extra knowledge can help if you stay in the same industry but that's pretty rare.  Usually you go to a new type of company and spend time 'ramping-up' on how they do their business. This seems bad for developers because most of the ones I know have passion for technology. They want to be part of a winning team. By being a well-paid mercenary it becomes easy to not care about what you are doing.  At the end of the contract you just move on, forcing you to divest in a personal stake. I miss that part of this business.  I have had more enjoyment about projects that didn't work than all the mercenary positions I've ever held (yes, I am looking at you Gen<X>).

The dirty little secret in my house is that I'd give up my business and go work for a company if I could believe in them and believe that I was part of something special.  In some ways I think most developers are like that. But in this atmosphere of short sightedness, it just doesn't exist.

So do I have a call for action?  No. I think that domain knowledge is an important idea that both developers and companies need to address, but I don't have a nice and tidy solution. This is a shift that I think has to happen in software development. Both sides of the table need to look long at the last five to ten years and determine if what we're doing now is better than before.  Does it only feel better because each line of code is cheaper to produce (mostly a product of better platforms, not better coders). I hope this can change.

UPDATE: Here's an interesting link that has a different opinion of this subject:

http://thedailywtf.com/Articles/Up-or-Out-Solving-the-IT-Turnover-Crisis.aspx

Comments:

Wow, great post Shawn.

I've seen this time and again... company spends tons of money on hiring, tons of time+money on getting devs up to speed on the business, then either cuts them loose when the quarterly numbers are 0.025% less than analysts' projections, or when the project's over/canceled/delayed. Or, they simply institute live-action Dilbertonianism and drive the competent devs away, leaving only the ones who aren't marketable elsewhere. Meh.

I've always preferred small companies, for this reason. Granted, you have other issues there (occasionally worse than the above, sadly), but still, you generally have a stronger attachment to your work and the company itself.

I think this also speaks to the culture of companies like Google (and, many would be surprised to learn, Microsoft), and even open-source-esque development in general... it fosters the sense of ownership and pride in good developers in ways that working for the Initech's of the world never will.

Like you, I (unfortunately) live in Atlanta, where there is a serious shortage of interesting small companies in general, and .NET-based small companies in particular. The job market here is saturated with soul-less corporate jobs and used-car salesmen-driven consulting gigs. Double meh.

I've managed to find some interesting work lately, but it sure isn't ATL-based.

Excellent post!

I completely agree with you about the desire to work somewhere that I can believe in what the company is doing. It would be a dream job to work in an environment with other people that share a passion for the common goal. Is there such a place? I haven't experienced that feeling in a long time. Sometimes, I question whether I have truly ever experienced it at all because I would probably still be there if I did.

Great post, Shawn...

The last time I really dug in on a project for a company I ended up with a technology nobody was using, none of the new skills being looked for, being out of work for 2-1/2 months and being owed 10 months salary... that's taking loyalty too far, but in that type of market (like the one we're headed into), you do what you need to do to keep from showing blank spots on your resume.

I'd love to work for a company that was technologically advanced, kept me challenged, recognized my contributions, and provided incentives to stay like the jobs our parents/grandparents had... unfortunately, I think that ship sailed :(

I could not agree with the post more!

I work for a major UK Bank with 85,000 employees as an Architect in a Application Delivery department where it is difficult to find a developer who writes code who is a permanent employee ..

We have the whole alphabet of suppliers from Accenture to Xansa deliverying software components. Development is done suppliers onsite, suppliers offsite, contractors, offshore and in fact every model possible except for in house with FTE developers. There seems a genuine fear of maintaining development capability.

I'd also expand the concerns relating to domain knowledge to include the continual relationship building as personel change as a negative impact. Basically the next best thing to not understanding a domain is already knowing someone who owes you to spare 30 minutes to explain it!

Also the "ramping up" may happen serveral times on single projects due to the complex nature of dependencies and priorities in the enterprise as projects mobilize, demobilze, mobilize etc.

As a footnote I have ownership and common goals but this has always been in a product based environment rather than a project driven environment.

Shawn, I couldn't have said it better myself!!

For the last several years, I worked as a contractor. Sure the money was great (the taxes, not so much...), but I found myself working for 3-6 months at one company, only to be shown the door after my work was "complete" and got a good grasp of the domain knowledge. Sad, really. This revolving door work continued for several years. I never really got loyal to any of these companies, nor did I care if I ever really got the work done the "right way", I did just enough to satisfy management.

At one particular company, they had so many contractors go in then out, that the code got incredibly ugly and unmanageable. One contractor would do a series of tasks, leave, and then another contractor would be hired to pick up where they left off. There was virtually no documentation, no real use of reusable code, and ad-hoc "fixes" that would only cause other problems to arise. Management: oblivious.
The developers? Not a care in the world, as long as the checks kept coming.

Don't fret, though. I have since found a wonderful company that truely cares about their programmers. The pay not be as great, but it is definitely a job worth waking up in the morning to go to. They DO exist!!!

Private language for the Architects and the software developers........

Hey wait a minute now. Not all contractors are the mercenaries that you describe. Quite a few of us tend to be quite a bit more dedicated than the FTE's we work with.

Yes we are in it for the money, and as long as you pay us, we will continue to do the work, but those of us who are into it for the long term understand that a happy customer is one who will bring you back again and again. Repeat customers are easy sales if you have done a great job the first time around. The attitudes described in the comments above are not conducive to repeat business as a consultant.

And to Shawn's original point. Domain knowledge is always the key to building a good system. If the customer does not have real good Biz Analysts, good architecture requires that we learn the biz cases that the project is actually trying to solve. If that means going out in the field and running a cash register, or riding on a truck with a delivery guy, so be it. Otherwise the system built will suck. I have only had one customer that the biz analyst truly understood the problem, so getting my hands dirty with domain knowledge is usually the norm to me.

The work environment is only as good as you make it. If you are just into it for the money, you will never truly succeed.

Paul,

I certainly didn't mean to paint all contractors into a corner. I know that all contractors aren't that mercenary but there are business pressure that push both sides into their current states. Businesses want smart people without long-term commitments; and contractors want good pay and interesting projects. That forces some uncomfortable situations.

Its a business. If you believe in giving value for the dollar, and the customer sees value in that effort, the customer will respond by giving you more dollars. If you believe that the next customer/sucker is around the corner, you will get paid, but eventually run out of customers.

Its the same way from the biz perspective. If they believe that they can get the same value for cheaper from another consultant, they will. Its up to you as a consultant to sell the customer on your talent being worth 3 of anybody else.

Right now the perception is that the imported talent, and outsourced efforts are "cheaper". I dont have numbers to back me up, but I dont believe they are. If you look at the life cycle costs to that type of development, you see that quite often things have to be redone and redone and flushed and redone, multiple times before an acceptable result is shown.

There is no perfect place to work. IMO, they all change over time to be a place you would rather leave. So why not be paid the best that you can during the time you spend there? Give your full effort while you are there, and then move on to the next great place to work when its obvious it needs to occur.

All employees are expendable in a biz's eyes. The only difference is that the consultants realize it.

Mercenary? I prefer the term Ronin. <grin>

I am not trying to vilify contractors, offshore companies or employers...I am exalting the value of domain knowledge. Though Ronin is a good term...

I now work for the County office of Education. Coming to work feels great because you're working on programs that do things like track the visits needed for some therapy for a special education child. But I took a serous cut in pay and I'm easily $40k a year off of what I was offered to work for private companies. Not to mention the fact I would lose half of the money in taxes anyway I have no regrets. So I say trade the money for the hapiness.


 



 
Save Cancel