On Not Knowing Until You Know

by bob on December 25, 2012

I’m reading Extreme Programming Refactored:  The Case Against XP from Apress Books.  I have to confess that although I generally regard XP as an off-the-rails over-reaction to the perceived shortcomings of traditional software design and specification methods, I have some affinity for the XP concept that “the code is the design” — in this limited sense:  in some scenarios, the process of coming up with a meaningful estimate of project cost requires so much effort that it’s equivalent to just doing the implementation in the first place.

I should qualify that by saying that clients often want so many guarantees and assurances regarding timelines and costs, yet for development purposes have such a nebulous idea of what they want, and desire so much freedom to keep changing what they want, that up-front design and sign-off on requirements sometimes becomes a fiction that we all pretend we engage in but in fact don’t actually do.  This probably is in part because exaggerated XP concepts of emergent design were so undeservedly influential for many years.  Its siren song appealed to the tendency of managers to want developers to just do something now, to provide faux closure and specious assurances and political cover at all costs.  Not incidentally, XP’s aversion to written documentation exacerbated a natural tendency in business to allocate basically zero resources to technical and end user documentation, too.  And in fairness, it worsened many a developer’s aversion to properly commenting and documenting their work.

All that being said, “not knowing until you know” is not just an artifact of business politics.  Many times we’re asked for a new feature or enhancement in an existing, complex system and by the time the actual requirement is clarified and all the knock-on impacts and side effects are discovered and researched and accounted for, actually writing and testing the code is relatively minor.  Clients like to pay for that minor part as if it’s the entire story, and it’s my never-ending job to bring that pesky time-consuming and necessary planning part to their awareness.  Sometimes I’m even able to get them to see the importance of that after the fact documentation and training bit, too.

One obstacle to careful and thorough due diligence is that now and then, someone will come along who is sloppier, yet a good self-marketer, and will initially impress with their ability to sweep aside the concerns of cooler heads, and Make Things Happen.  During the interim period before the inevitable flame-out, one must simply bide their time.  I recall quoting a custom accounting system years ago for a manufacturer, who ended up having the owner’s nephew do the work at one fourth my quoted price.  Ten months later a chastened and beleaguered owner called to have me untangle his nephew’s mess, and that led to a mutually enjoyable business relationship over the ensuing decade.

Another example comes from the above-mentioned XP exposé: the tale of a consultant who was told that his insistence on up front design ran counter to accepted XP practice and if he would not omit that step, the client would find someone who would.  The consultant lost his bid for that important project … my guess though is that if he was gracious in defeat, a year or three down the pike he was be able to get the even more lucrative job of undoing the resulting damage.  Ultimately it all comes down to trust, and an appreciation for careful work often comes only after first hand experience of the bitter fruits of more hip-seeming ad hoc efforts.

 

{ 0 comments }

On Professionalism

by bob on December 25, 2012

In software development, there are — how to put it delicately? — prima donnas.  It’s always been that way, but this year I’ve had more than my share to deal with, and it’s moved me to reflect on the nature of professional conduct.  What, exactly, constitutes “professional conduct” in this field?

Accusations of “unprofessionalism”, after all, can be nothing more than wounded dignity.  Recently one of my clients hired a developer for a small one-off specialty project that I was tasked to honcho.  We got on fine, but the delivered product was not properly tested and simply didn’t work.  I didn’t think the flaws ran deep, but it seemed pretty clear that the executable was tossed over the transom to me without sufficient testing.  The nature of the problem was such that there is no way that valid output had ever come out of the program.

I worked with him in my usual easy going, non-shaming way to trouble-shoot it but it was a busy time for me and it was worked I hadn’t allowed for.  I had to install various dependencies on my personal development machine and the back-and-forth with him on that took some time.  One day he wrote me and said these delays were causing him “big financial losses”.  Mind you it was a flat quote project for $2500 and there was nothing preventing him from taking on other projects — our testing and trouble shooting was a small side show.  I mentioned as much and basically said, please don’t make that my problem — let’s continue to work together on this and get through it, get the software done and get you paid.

He then became 100% unresponsive for a week, and I suspected a bruised ego.  Sure enough, he emailed the CEO of my client company complaining that I was “abusive and unprofessional” and demanding that another resource be assigned to work with him.  He mentioned that he had a master’s degree and 30 years of experience up to the CIO level, as if this should insulate him from ever being questioned or said “no” to.  The irony of the incredibly egregious unprofessionalism of his own conduct  was apparently lost on him.

In writing my client he had included the email chain that led to that point.  My client could not see what his problem was or what I had done to set him off.  She gently told him all our resources were maxed out and he would need to work with me.  He did, and we both basically pretended nothing had happened, and the job got done.  In that sense, I guess, we both conducted ourselves … professionally.

My relationships with both clients and colleagues are uniformly smooth in the main, but I’ve had to deal on limited occasions over the decades with people who have personal problems that leak into their business relationships — petty jealousies, paranoia, inflated egos — the kinds of things anyone reading this has to deal with from time to time.  The common thread that runs through those regrettable situations, in my view, has been arrogance.

One of my early gigs was to un-stick a project that hadn’t gotten anywhere in some months and the discovery I made about the root cause was that the developer who had been working on it had not so much as compiled the code in many weeks.  He was obsessed with the perfect design and could not tolerate even the criticism of a compiler error message that might disagree with him.  You can call that OCD, or fear — but at bottom, isn’t the inability to receive honest feedback, even from a machine, an example of the arrogance of insisting on being provided a perfect world to operate in?

Needless to say, that fellow thought I was unprofessional for sharing this problem with the client, and that the client was unprofessional for replacing him.  But the client did enjoy getting a working system in a matter of days.  Life is unfair sometimes.  That fellow went back to academia to get his master’s degree and no doubt still thinks the whole situation was unfair to him — and may have never reflected how unfair it would have been to the client for things to continue to be “fair” to him.

That was an extreme example, of course, but it hasn’t been lost on me that most of the much more minor blind spots I’ve seen in myself and others have had to do with the idea that software “ought” to respond as expected by its creator, that users “ought” to use the software as expected, that acceptance testing “shouldn’t” take “so much” time, that we shouldn’t have so many budget constraints and procedures and so forth.  In short, arrogance.

The most fundamental arrogance we developers are prone to is to elevate personal needs and requirements — even largely legitimate technical ones — over business needs and requirements.  Admittedly, it’s a delicate balance, because neglecting legitimate design issues can provide short term business benefits and yet also long term business harm.  But ultimately we are solving problems for customers, not building personal playgrounds.  The final call on business value is seldom ours to make anyway.

To me, professionalism is best manifested by caring more about the sustainable advantage of the customer than about having a pleasing environment for myself.  About making the customer look like a genius, rather than myself.  That sort of thing.  Caring too much about who gets credit or advantage or perks is the road that leads to colleagues, and ultimately clients, not wanting to deal with you.

Also, you should never leave the “corporate world” under the illusion that independent consulting actually allows you to escape dealing effectively with other people, even (and especially) difficult ones.  Consulting is not “writing your own ticket” in that sense.  In any event, often, people are difficult only because you haven’t taken the time or trouble to truly put yourself in their shoes.

I hope you’ll comment on this post to share with me your own experiences with (un)professionalism in software development, and more importantly, how you effectively managed those encounters.  I’m particularly interested in how independent contractors deal with these things.  We often are brought into troubled situations, not infrequently in troubled companies, where we are perceived threats to existing players.  There may be resentments engendered by a perception that we make too much money, have too much freedom, or don’t have enough skin in the game — or simply because we are the outsider, the Other.

We technicians need all the people skills help we can get — let’s help each other out.

{ 0 comments }

Connecting to a Mirrored Sql Server Database With No Failover Specified

March 10, 2012

I was testing a new development tool today that connects to remote servers using a proprietary connection string builder that doesn’t allow you to specify a failover server.  Since I was connecting to a mirrored database I was curious what the implications were for not specifying a “Failover Partner” in the connection string. The answer [...]

Read the full article →

On Solutions Looking For Problems

March 8, 2012

Microsoft has now made Windows 8 and its Metro touch interface available for us all to look at and Neil McAllister over at InfoWorld isn’t mincing words.  He’s calling the Metro value proposition for developers “a con”.  His fellow columnist J. Peter Bruzzese calls it Windows Frankenstein.  Meanwhile Visual Studio 11 is getting a lukewarm [...]

Read the full article →

On Usability

March 2, 2012

It’s spring, when many US citizens not only have to cope with figuring out their income taxes, but if they have college-bound or college-age children, learn that there are things worse — far worse — than the dreaded Form 1040. I’m speaking of FAFSA and related “now you have to dance for your money” applications [...]

Read the full article →

On Intuition

February 28, 2012

We techno-geeks like to think that we make all our decisions based on dispassionate evaluation of empirical facts, but there are times when things just don’t pass the sniff test. I’ve been in this game for nearly 30 years and my sniffer sometimes smells that “off” quality of the air in the IT fridge in [...]

Read the full article →

Fixing an OutOfMemoryException on a DataTable.NewRow() Call

October 12, 2011

Few things were less expected by me yesterday than the out of memory exception that was suddenly being thrown by very mature code that had functioned pretty much unchanged for about five years.  Especially when the offending line of code simply created an empty DataRow with less than two dozen columns.  What, I thought, could [...]

Read the full article →

SQL Server INSTEAD OF Trigger “Gotchas” Revealed

May 26, 2011

I just finished implementing a schema change on a table that is central to a public-facing database.  The objective was to normalize the table, and this required that the original table be broken down into five tables.  This will allow my client a lot more flexibility, but it also means that hundreds of thousands of [...]

Read the full article →

When is a Routine Too Big?

March 14, 2011

I’m thinking — and not for the first time — of slimming down a monster method that has grown beyond the size any “well-written” routine is “supposed” to be.  Depending on who you’re listening to, no routine should exceed a hundred or so lines of code, or two or three screen’s worth.  And almost universally, [...]

Read the full article →

Sql Server Management Studio Epic Fail: User Canceled (NOT!)

March 1, 2011

I just spent 10 minutes of my life that I’ll never get back.  I defined a complex view with a bunch of join conditions and field aliases and such, saved and named it.  Then I was informed of an error (despite the fact that the query parsed fine in the UI) and was told that [...]

Read the full article →