A Train of Thought – July 10th 2007 Edition

Just for fun, I’m going to try to keep each section under 3-4 sentences, and finish in under an hour.

 

That’s bookkeeping, not project management

JIRA, Microsoft Project, VSTS, whatever.  Fiddling with a project management tool is not project management.  Project management is communication, analysis, risk management, and getting me the stuff I need to keep coding!  Don’t tell me project milestones or tasks in a tool.  Let’s determine milestones and iteration plans collaboratively in an iteration kickoff.  More interaction and communication and less bookkeeping.

 

How do you not know?

I listened to the DotNetRocks episode featuring the VSTS panel at TechEd the other day.  Part of that conversation bothered me a little bit.  The panel addressed a question about using the metrics generated by VSTS on developer checkin’s to make quantitative judgements about the relative productivity of the developers on a team.  I thought the panelists were fairly good about saying that the metrics should merely inform the judgement of productivity and named a couple reasons why the metrics (code checkin’s, code churn, whatever else) could be skewed to give you a false impression (and I can think of a couple dozen more, not the least of which would be pair programming).  That’s fine, but my immediate response was how the *&^%%$ do you not know exactly who your most and least productive developers are?  Even without statistics and software engineering, how the heck are you not intimately aware of your team and each of your teammates?  I don’t buy the big team/big project argument because those projects are just divided into a team of teams.  What gives?

 

Stay on Target!

My colleague got a little object lesson today in priorities.  At almost all times, you need to stay focused on the highest priority feature.  Any effort you spend on unnecessary frills or low priority features is time and energy that isn’t spent on higher priority tasks.  It sucks some of the fun out of development, but the guy paying the bill needs to be kept happy.  You’ve only got so many units of developer time to play on the project.  Use them wisely.

 

The Last Responsible Moment

In a related topic, last week I did a review of our system to the developer who’ll likely be in charge of the system after I bow out.  I showed him our scheme for plugging in new types of trades into our WinForms app.  Right now it uses a C# fluent interface that’s nothing but a thin layer over the StructureMap configuration API.  He challenged me on why there wasn’t an option to plug in new features by simply deploying an extra assembly and making an Xml configuration change.  My response was that there wasn’t a requirement for that.  It does sound like something that might be useful in the future, but any time spent on that feature today takes time away from the things that are necessary now.  In terms of the Last Responsible Moment, however, we’ve left the door wide open for making that feature possible in the future.  By no means have we eliminated the possibility of pure xml extension.  Things just don’t have to be perfectly future proof when you’ve got reversibility.  Code and design in a way that leaves the door open for extension and modification later and you won’t have to kill yourself getting it perfect upfront.

 

YAGNI for Enterprise Architects

I came to a realization today on one of those strategic versus tactical decision points.  We decided early on to persist data in the industry and client standard Xml format.  The horrendously convoluted not meant for human consumption Xml format.  Why did we do this?  Well, because in the future it should make it easier to communicate with external systems and it’s the standard by golly!  I thought it sounded like a good idea, with a minor caveat.  In the end though, that decision has caused us a significant amount of extra work with zero payoff.  With an Xml format that complex you can’t say that you’re ready to integrate with another system until you’ve tested the Xml payloads anyway.  If we’d gone with the alternative of just serializing the Trade objects to a simple Xml format, we would have save a lot of time while still delivering the immediate business functionality.  I think we should have YAGNI’d that decision.  The Xml will almost certainly need to be tweaked later for the downstream systems anyway, so all we bought ourselves was an extra headache.  And compliance with corporate guidelines.

 

Dogfood It

Process, design, or framework.  It just shouldn’t be trusted at all unless the creators dogfood it.  You need to feel the pain of your decisions.

 

If/Then Klooge is my Coding Horror

Jeff “Coding Horror” Atwood recently wrote a post criticizing the usage of design patterns as unnecessary complexity.  While patterns can definitely add unnecessary complexity when used inappropriately (just about any use of the Singleton anybody?), I’m going to disagree with Jeff.  If you take a close look at most of the original “Gang of Four” Design Patterns, you’ll see that many of the patterns are aimed squarely at:

  • Reducing the amount of branching constructs in the code.  Switch statements and deeply nested if/then statements are to logic bugs as stagnant water is to the mosquito population
  • Eliminating duplication 
  • Decreased coupling
  • Separate concerns

All of those bullet points seem like good things to me.  Maybe you just simply ask yourself if a pattern helps you before you use it.  I know many people have a near knee-jerk reaction to design patterns, but if you ever work for me I’ll verbally abuse you for deeply nested code and repetitive branching logic.  I’ve started to walk up and down the row of cubes just muttering “Control-Alt-M.”

There’s a strain of Extreme Programming practitioners that seems to believe that “simple” means using nothing more sophisticated than throwing if/then statements against the wall until unit tests pass.  Then, once it’s so obvious that a casual observer is appalled by the state of the code do they start some refactoring work.  Don’t be like that.

My latest hypothesis for the development skills shortage

I think most of you will agree with me that there just isn’t enough developer talent out there right now, and I’ve got a little theory about why this is.  I just interviewed a trio of candidates with about 10 years of experience on average.  A couple of them might be okay with some coaching, but on the whole all three seemed rather weak

 

Fast way to blow an interview with me

I knew within 5 minutes that I was rejecting a candidate, but I try to give everybody a chance.  This particular candidate had bombed some basic .Net trivia before proceeding to crash and burn on my design related questions.  I’m always worried that the questions I ask might not bring out the particular strengths of a candidate, so I try to give people an opened ended chance to tell me what they bring to the table.  This clown gave me a spiel about how he did poorly on the interview questions because they were skewed towards a developer perspective and he was an architect.  All rightie then.

 

2nd Fastest way to blow an interview with me

I’m too lazy to change it, so I’m more or less stuck with an attacking Tie Fighter as my cellphone ring.  Last year I was interviewing with a little consulting firm in Austin when my phone rang.  One of the interviewer (about my age) had no idea what the sound was.  I just couldn’t imaging working in a development shop with people that can’t quote Star Wars.  It’s just plain wrong.  Like using an interface without prefacing the name with “I” wrong.

 

3rd Fastest way to blow an interview with me

The same interview from above included a pop quiz that included a question on basic CSS mechanics.  Um, google?  If you’re actually asking me that, what the heck does this position actually pay?

 

4th Fastest way to blow an interview with me

So, Jeremy, our architect is concerned that you won’t be happy just writing code and not doing any design.  How do you feel about that?  Um, bye?

 

5th Fastest way to blow an interview with me

From a single shop, in rapid order:

  1. Our architect builds the framework, we just use it
  2. Them:  We want to be database neutral, so we’re using the ODBC provider.  Me:  That’s a terrible idea!  You’re not using stored procedures then are you?  Them (looking annoyed):  Of course we’re using stored procedures for all data access.
  3. We’re asking all employees to work 48 hours a week until we ship next spring — and everybody in the room had the bleary-eyed look that coders get from too many hours and too much caffeine

 

6th Fastest way to blow an interview with me

Steve & I:  So, we’d really like to have a tester with strong test automation skills.  What is your experience in this area?

Him:  I don’t think test automation is very important

 

7th Fastest way to blow an interview with me

We have our own proprietary Agile process (why the hell do companies insist on trying this line of mularkey) that’s based on RUP.  We have our Inception phase, then our Elaboration phase, then…

About Jeremy Miller

Jeremy is the Chief Software Architect at Dovetail Software, the coolest ISV in Austin. Jeremy began his IT career writing "Shadow IT" applications to automate his engineering documentation, then wandered into software development because it looked like more fun. Jeremy is the author of the open source StructureMap tool for Dependency Injection with .Net, StoryTeller for supercharged acceptance testing in .Net, and one of the principal developers behind FubuMVC. Jeremy's thoughts on all things software can be found at The Shade Tree Developer at http://codebetter.com/jeremymiller.
This entry was posted in Uncategorized. Bookmark the permalink. Follow any comments here with the RSS feed for this post.
  • http://www.marcstober.com Marc

    Not sure if you were the interviewer or interviewee on some of these…

    Anyway, I have interviewed people and reminded them many times that they could use Google, or MSDN, or whatever other online help we had to answer a question – and they did not. On the other side of the table, Q: “What would you do if you were stuck?” / A: “Google, maybe even Google Groups” made me an outstanding candidate. Apparently a lot of people just don’t read – they took the crash-course and got their MS certifications, why would they still need to learn anything?

  • http://codebetter.com/blogs/jeremy.miller Jeremy D. Miller

    @Maestro,

    The only constant is that I was the one shaking my head, regardless of which role I was playing.

    I forgot #8, the limp handshake from hell. Think about spilling a cup of warm pudding all over your hand and wrist and that just about describes it.

    @Steve

    I was definitely being ironic, but I’ve just never managed to kick the “I” habit. I do have the good grace to be mildly ashamed of it though.

  • http://stevef.truemesh.com Steve Freeman

    No, no no! The ‘i” prefix is a horrible wart left over from dealing with the C++ train-wreck. Nowadays the compiler knows what’s an interface and what’s not. And if you /do/ need some name noise, put it on the class.

    Or were you being ironic?

  • http://softwaremaestro.wordpress.com Software Maestro

    I’m confused here — it seems like sometimes you are the interviewee and sometimes you are the interviewer??
    Software Maestro

  • http://weblogs.asp.net/bsimser Bil Simser

    Hell, if I was in an interview with you I would be quoting Star Wars and relating the errors in how the Death Star should have used Scrum to build the ultimate weapon instead of waterfall. Then they may have avoided their big bang delivery and having unit tests would have brought out their “one-shot-can-blow-them-up” weakness.

    Although if you’re wearing the Princess Leia slave outfit, the interview is over!

  • http://www.trump.com/main.htm Donald Trump

    Jeremy, you blew it. You’re fired!

  • Robert P.

    You know, I have no idea what the hell you’re talking about, but I still thought it was funny.

  • http://gutzofter.blogspot.com Joseph Gutierrez

    If/Then Klooge is my Coding Horror: I think this begs the questions. How do you define complexity. Was the complexity already there? Has the patterns encapsulated the complexity properly?

    If I can read the code. Complexity nil. In my opinion complexity is probably caused by the Observer :)> not understanding the pattern.

    See:
    http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf

    Nice quote:
    All the
    same complexity still exists, it is just better contained within the scope of each object, and exposed
    in a healthy way.

  • http://codebetter.com/blogs/jeremy.miller Jeremy D. Miller

    @Steve,

    I simply answered with “I don’t know” to the CSS question.

  • http://www.njgeeks.org/ Steve Goguen

    Regarding the CSS question, if a person answered, “Just Google it” with me, I’d be very disappointed if there were interviewing for a web developer position, because it tells me a number of things:

    1. They think CSS is not worthy of their time and don’t appreciate how fundamental a role it plays in really good web design.
    2. They don’t understand DHTML and have no experience writing decent AJAX applications. They don’t understand how advanced JavaScript libraries use CSS selectors to make their job 10x easier.
    3. They don’t try to learn more than they need to know and they don’t try to learn things the right way, or they’re not interesting in learning how to do things the right way.
    4. They have a bad attitude.

    Now, if somebody didn’t know, it would be nice to hear them say, “I don’t know the exact rules, but I would imagine it worked like…”

    That type of answer would be acceptable for me, especially if their answer demonstrated they had a solid understanding of the fundamental ideas, or if they provided me with a good design for how they CSS *should* work.

  • http://quadhome.com/ Scott Robinson

    The syntax of a stored procedure is going to be database engine specific. Therefore, they weren’t “database neutral.”

    I don’t think he was passing judgment on the use of stored procedures.

  • http://codebetter.com/blogs/jeremy.miller Jeremy D. Miller

    @DonD: It wasn’t a question on how CSS works or what it’s good for. It was just a black and white “what does this CSS property do?” question

    @Jon,

    Nothing special. Just the old standbys like Reference vs Value type, interface vs. abstract class.

    @John C.

    You’re not suckering me into another SPROC argument. All I meant in this case was that the company wanted their app to be database neutral, but writing stored procedures makes that goal significantly harder.

  • http://weblog.raganwald.com Reg Braithwaite

    Speaking as a guy who was sixth in line to see Star Wars *when it opened in theatres,* I want to know if “stay on target” was a deliberate quote :-)

  • John C.

    Jeremy,
    I’m a newbie data-driven applications guy, in your 5th Fastest way to blow an interview with me, what’s bad about using stored procedures for all data access?

    Thanks!

  • Jon Parker

    Regarding the CSS question, I think it brings up a very valid point. If a CSS question creeps up, I am wondering what job am I applying for again? Depending on how much css knowledge they expected, I would worry about their separation of concerns.

  • Jon Parker

    Jeremy, was wondering if you could post an example of your .net trivia and design related questions as you mentioned in this post?

  • DonD

    “…a question on basic CSS mechanics. Um, google?”

    I’m a little surprised by this. Would this be a fair answer asp.net controls? C# generics? Javascript inheritance? Sql functions? Http itself?

    “I just google it” is an honest and maybe even legit answer for lots of things, depending on the job. If the job is for web developer though, you really should know at least the basics (selector specificity absolutely, box model probably, text styles not so much). Such questions may seem beneath you, but it might at least inform the hiring manager to not put you in charge of structuring the web front end bits.