My Secret Life as a Spaghetti Coder
home | about | contact | privacy statement
This is the fourth in a series of answers to 100 Interview Questions for Software Developers.

The list is not intended to be a "one-size-fits-all" list. Instead, "the key is to ask challenging questions that enable you to distinguish the smart software developers from the moronic mandrills." Even still, "for most of the questions in this list there are no right and wrong answers!"

Keeping that in mind, I thought it would be fun for me to provide my off-the-top-of-my-head answers, as if I had not prepared for the interview at all. Here's that attempt.

Though I hope otherwise, I may fall flat on my face. Be nice, and enjoy (and help out where you can!).

  • How do you make sure that your code can handle different kinds of error situations?
    I write tests that describe the expected error situations and check to see that they are handled appropriately. If the software is legacy and prone to generating exceptions, I'll wrap it up to report the exceptions to get an idea of what needs attention first, and start attacking it there. Of course where required, we'll use try/catch.

    Mostly I try to follow the rigorous WOMM development process.

    Works on my machine!

  • Can you explain what Test-Driven Development is? Can you name some principles of Extreme Programming?
    TDD: Red, Green, Refactor. You write a test that specifies some behavior the code should produce. Run the test to make sure it fails. Write code to make the test pass, then run it to make sure it passes. Change the code as needed to improve its design.

    XP: Aside from testing, we want to continuously review code through pair programming, maintain sustainable work conditions with sane work-weeks, and continually integrate our code to reduce the time we have to spend working out kinks in that process. There's more, but those are a few.

    Reading: Xprogramming.com is a good starting point. The associated lists (TDD and XP) on Yahoo Groups are great for discussion. It's probably worth reading a book or two on the subjects. I'd recommend Kent Beck or Ron Jeffries.

  • What do you care about most when reviewing somebody else's code?
    Does it say what it's doing, and do it correctly? Is it readable?

    Reading: As with most of these questions, Steve McConnell's Code Complete 2 is an outstanding resource on the subject. If you don't read anything else, read that.

  • When do you use an abstract class and when do you use an interface?
    I'd use an abstract class when I want to provide some implementation for reuse, but where some also remains to be specified by the inheriting class. An interface is useful for multiple inheritance in languages that don't allow it, as well as a decoupling device - allowing you to depend on interfaces that don't change as often as implementations might.

    Reading: Books on OO design are useful, especially those targeting static languages like Java.

  • Apart from the IDE, which other favorite tools do you use that you think are essential to you?
    Continuous integration tools, testing frameworks, (some people might include dependency injection frameworks), scripting languages, the command line, source control, ... What else would you include?

    Reading: McConnell's aforementioned book, The Pragmatic Programmer, Practices of an Agile Developer, tons of blogs that talk about the tools they use to make themselves more productive, and (although I've only seen the presentation and not read the book), Neal Ford's The Productive Programmer probably contains some useful items.

  • How do you make sure that your code is both safe and fast?
    The question seems to imply these goals are normally at odds. I haven't felt that way. I'd program for security first, and then if it's slow, I'd try to identify the bottleneck and then find a way to improve its time complexity. If the algorithm is already at its lower bound for time complexity, I'd move on to micro improvements, like moving variable creation and function calls outside of loops.

  • When do you use polymorphism and when do you use delegates?
    I don't have any hard and fast rules. I rarely need to use polymorphism since I primarily program in dynamic languages that make it unnecessary. (I guess it's still polymorphism, but you're not doing anything special to achieve it.) When I have been in static languages, I'll implement the methods that accept different types as needed to make client code more friendly to work in. If we're actually building an API for public consumption, then obviously we have to move from "as needed" to a more aggressive schedule.

    I'm at a loss for a better answer to this question, because (surprisingly to me) I've not thought about it before now.

  • When would you use a class with static members and when would you use a Singleton class?
    I don't know how to answer this except for "when the situation calls for it." I'd normally opt for the class with static members when it makes sense to do it. As far as a proper Singleton, I don't know that I've ever written one that enforces that property. More often, if I need just one, I only create one.
    Singleton pattern in UML
  • Can you name examples of anticipating changing requirements in your code?
    I write unit tests, so that helps with changing requirements. How? It helps keep the design very modular to allow for extension and easy changes, and the tests themselves provide assurance I haven't broken anything when I do need to make a change.

    I don't generally go leaving hooks and pre-implementing code that I think will be needed. YAGNI helps guide me in that regard.

  • Can you describe the process you use for writing a piece of code, from requirements to delivery?
    Requirement -> unit test -> code -> run tests -> commit -> run tests -> deploy.

    I think that explains it all, and explaining each step could be a blog post or more of its own.
My basic advice on how to prepare for this section of questions is: Read and internalize Code Complete 2. I should probably read it again, in fact.

What advice would you give?

Hey! Why don't you make your life easier and subscribe to the full post or short blurb RSS feed? I'm so confident you'll love my smelly pasta plate wisdom that I'm offering a no-strings-attached, lifetime money back guarantee!


Comments
Leave a comment

There are no comments for this entry yet.

Leave a comment

Leave this field empty
Your Name
Email (not displayed, more info?)
Website

Comment:

Subcribe to this comment thread
Remember my details
Google
Web CodeOdor.com

Me
Picture of me

Topics
.NET (19)
AI/Machine Learning (14)
Answers To 100 Interview Questions (10)
Bioinformatics (2)
Business (1)
C and C++ (6)
cfrails (22)
ColdFusion (78)
Customer Relations (15)
Databases (3)
DRY (18)
DSLs (11)
Future Tech (5)
Games (5)
Groovy/Grails (8)
Hardware (1)
IDEs (9)
Java (38)
JavaScript (4)
Linux (2)
Lisp (1)
Mac OS (4)
Management (15)
MediaServerX (1)
Miscellany (76)
OOAD (37)
Productivity (11)
Programming (168)
Programming Quotables (9)
Rails (31)
Ruby (67)
Save Your Job (58)
scriptaGulous (4)
Software Development Process (23)
TDD (41)
TDDing xorblog (6)
Tools (5)
Web Development (8)
Windows (1)
With (1)
YAGNI (10)

Resources
Agile Manifesto & Principles
Principles Of OOD
ColdFusion
CFUnit
Ruby
Ruby on Rails
JUnit



RSS 2.0: Full Post | Short Blurb
Subscribe by email:

Delivered by FeedBurner