Handling Fuzzy Requirements

I had a great conversation with remi Taylor of OpenRain Software today on how to handle fuzzy requirements when the customer isn’t available. You’ve been there… you get an issue tracking ticket like “Add Foozle Support” only to find no explanation of what this means other than the issue title. The customer/decision maker decided to add this ticket as your number one priority 2 minutes before getting on a space shuttle to Jupiter and is unavailable for clarification clear through next month. The customer says it’s the top priority, though, so you’ve got to do something.

The problem is an unaddressed gap in requirements between concept and action. In the customers mind, the concept may be clear. They may have a mental concept of what a Foozle is, what it means to the business, and how it will interact with the rest of the system. They may even have a GUI mockup laid out in mental Photoshop securely filed into the right hemisphere of their gray matter. As the developer, however, you don’t know any of this, and cannot act until you’ve figured out what the fooz you’re supposed to do.

The temptation in this situation is to pick up the keyboard and start coding according to your best guess of what the customer should have explicitly specified, since it’s not possible to reach him/her and you have to deliver something before they return. So you add a “foozles” table to the database, create some forms, tie it into the search algorithm and write a robust suite of regression tests. You are now the de facto project expert on Foozle and Foozle-related issues, and are pretty freakin’ proud of your work. The milestones completes, Foozle support hits production and it’s all good.

The customer returns from Jupiter delighted to find their feature request ticket resolved as successfully completed. They check out the work, and gaze wide-eyed upon the screen. Squinty eyes and an emoticon-like frowny face ensue, and all hell breaks loose. Sound familiar?

Yes: there has been a clear and obvious failure in process and communication. You–the developer–probably even muttered this when the issue hit your inbox, but let’s just assume that this particular real-world situation meant that the “proper” process wasn’t followed for legitimate reasons and you certainly weren’t about to twiddle your thumbs for two months waiting to meet with the customer upon return. Fail? Yes. The customers fault for hit-and-run management? Probably. But could you have handled the situation better? Yes! Let’s look at what could have happened to make an unfortunate situation a little sunnier…

When you first started thinking about the issue, you made the same mistake as the customer: you jumped from concept to a mental action plan without communicating the assumptions under which you made it. You formed your own mental concept of what a Foozle is, what it means to the business, how it will interact with the rest of the system, and created your own mental mockup. Unfortunately, all your concepts and conclusions ended up being completely different from the customers (since you couldn’t discuss them), and none of these discrepancies were discovered until delivery.

For our purposes, the interesting part about the situation is not that the lack of clear requirements prevented delivery of the “correct” system (according to the customer), but that you did not state your mental assumptions about Foozles  because your instincts told you it was a pointless exercise. The customer was on Jupiter and couldn’t possibly respond on time, so why bother? …right? Quite the contrary!

It is critically important to document assumptions on unclear requirement–especially when the customer is absent–because it places accountability of correct feature development back on the customer. What if your first reaction to the situation was to add a comment to the issue like this?…

I’m going to accept and attempt this issue, but I can’t find any detailed information on what needs to happen and REALLY need some customer time (~1-2 hours) so I know I’m going in the right direction. Not having this information leaves me with a LOT of fuzziness on what the expectation are, so here’s what I’m going to do…

[Explanation of your approach to the problem, explicitly making and stating assumptions as necessary in lieu of clear customer requirements. If you need a definitive answer that you can’t get, explicitly define one as an assumption so the reader knows how you’re getting from high-level concepts to lower-level action.]

If any of this is incorrect, PLEASE ping me IMMEDIATELY. I’m going to start development soon and want to definitively understand the intent of this ticket to avoid wasting time!

Your assumptions could be wrong. Really wrong. They could be so wrong that you’ve wasted 100% of your time because the customer made a typo and meant “Woozle”, not “Foozle”. The key difference is that you’ve been proactive in specifying missing requirements and gave the customer a non-confrontational opportunity to clarify their intention so you can Get It Done Right. Your clear, wrong assumption statements on Foozle concepts should–if the client was fulfilling their obligation–have triggered an immediately phone call from the customer. It didn’t, and that sucks, but given a tricky situation you’ve done pretty much everything you can do to assure the system is correct (short of a high-speed intergalactic chase to flag down the customer), and of that you can be proud.

In the best case, someone familiar with Foolze semantics will chime in to represent the customer until they return. In the worst case, the angry customer call will at least go much better since you can point to your desperate pleas for clarification on specific items, timestamped in a timeline manner before any of the “wrong” work was done.

Financial Primer For Self-Funded Startups, Part 1

You’ve considered starting your own business–ExampleTech–and have pondered the initial investment, opportunity costs and personal risks. Here’s a brief financial primer on what you need to understand before taking the big leap, and key issues you’ll need to grok for after ExampleTech begins operations.

My big leap is OpenRain, for which I manage financial planning and performance amongst a bagillion other things, so I frequently receive questions on the financial aspects of forming and operating a company. This failure-based example assumes ExampleTech uses accrual accounting as opposed to cash-basis accounting.

Understanding Your Initial Investment 

When you start the company books, the first type of financial statement you’ll need to understand is the balance sheet. The balance sheet is a snapshot of the company’s finances at a particular moment in time, and aggregates all the company accounts into one single formula which always remains true..

Assets = Liabilities + Equity 

Once you invest in the company, that money becomes a company asset, and is no longer yours. You are only given claim to this money by an equivalent amount of equity. The company is a living, breathing entity, and is considered to a be a distinct taxable entity by the Internal Revenue Service (IRS) if you have formed an LLC (ExampleTech, LLC), S or C corporation (ExampleTech, Inc.). Even if you choose to do business as a sole proprietor (John Doe “doing business as” ExampleTech), which is not a distinct taxable entity, you should mentally consider your initial personal investment gone forever! Don’t event think about mixing personal accounts with business. ExampleTech accounts belong to ExampleTech and are maintained separately from your personal finances. Period.  It’s company money now, not yours, so get over it. You’ve invested $10K in ExampleTech to get it off the ground.

$10K Assets (cash) = $0K Liabilities + $10K Equity (ownership)

Since, the company has purchased $6K of equipment using $1K in cash and $5K on a credit card with an $8K limit (this will be important later). The balance sheet now looks like this..

$15K Assets ($9K cash + $6K equipment) = $5K Liabilities (credit card) + $10K Equity (ownership)

Where did these numbers come from? We have $15K in assets because we started with $10K in raw cash, spent $1K of it and received $6K of equipment in return. The difference is on the credit card as a $5K liability. Some interesting observations…

  • You (John Doe) still have $10K of ownership equity even though the company only has $9K of cash in the bank. It would not be possible to cash out 100% of your initial investment without liquidating (converting to cash, a.k.a. selling) the equipment.
  • If you bought the equipment out of warrantee and it breaks on day 1, ExampleTech will be down the $6K in equipment assets but would still need to pay off the $5K credit card liabiltity. The loss would come out of cash and leave the balance sheet looking like this: $4K Assets (cash) = $0K Liabilites + $4K Equity (ownership). Oops. On the plus side, you would realize what the term “equity-funded venture” means.
  • All book equity is held directly by you, the owner. This is a tremendous advantage over private equity venture capital (VC)-based start-ups, because you are the only person who cares about the eventual return on equity (ROE) investment. By using short-term debt instead of long-term equity, your creditors couldn’t care less about ROE as long as you’re making payments on time, so ExampleTech’s decisions remain yours to make.

ExampleTech is now ready to operate, and opens its doors with a slick new job for ClientComm.

Understanding Cash Flow & Income

After 1 month of operation, ExampleTech has performed and delivered $8K of services to ClientComm. Only $3K in credit card expenditures was need to complete the job. ClientComm has been invoiced and “the check is in the mail”, which should arrive and clear within 2 weeks. ExampleTech is now moving on to a much bigger project for MegaComm. Here’s your current balance sheet..

$23K Assets ($6K equipment + $9K cash + $8K accounts receivable)
=
$8K Liabilities (credit card: $5K initial equipment + $3K ClientComm job)
+
$15K Equity (ownership)

Note that you’ve increase your equity 50%, which is now $15K up from the $10K you started with. Woohoo! Here’s the ExampleTech income statement for the previous month..

Income
ClientComm: $8K

Expenses
Office equipment: $5K
ClientComm production expenses: $3K

Net income for period (last month): $8K (income) – $8K (expenses) = $0K

So in your first month you not only purchased reusable office equipment, but broke even! (That’s pretty awesome, go grab a beer!) Armed with $23K in assets and a renewed sense of self-confidence, you’ve signed MegaComm to a new deal worth $40K which will only cost $10K to deliver. You immediately start MegaComm production by writing a check for the $10K in materials and production costs.

..And you’re about to realize how you just screwed up.

To your surprise, you receive a call several days later that your check has bounced due to “insufficient funds”. What you forgot to consider is perhaps the most important aspect of financial management for the start-up phase of a self-funded new business: cash flow. Your cash flow statement for last month defines the raw dollars going in and out of ExampleTech during the given period, and looks something like this..

Cash at period start: $10K
Equipment investment: $1K
Net cash flow: -$1K
Cash at period end: $9K

Remember the $6K of equipment you purchased before you opened your doors? It’s only represented as $1K on the cash flow statement because $5K was put on credit, and creditors have not required ExtremeTech to pay out. The $3K shelled out for ClientComm production isn’t represented here at all because you chose to finance the entire amount with credit.
Thus, your bank only has $9K of raw cash even though your balance sheet showed you at $23K of assets, which also includes accounts receivable: money that has been counted as income on your income statement but has not yet been collected. Accounts receivable did not contribute to your cash flow statement since no money actually exchanged hands during the period, even though the job is completed! The cash flow statement will not reflect the ClientComm job until you..
  1. Cash the ClientComm check (which you really need), or
  2. Pay the credit card bill.
ExampleTech was cash flow negative last month despite having positive income, a non-intuitive but not infrequent business occurrence. Being cash flow negative isn’t in-and-of-itself a problem, but puts you in a short-term pickle because you don’t physically have enough cash for the materials, and your credit is already maxed out at $8K. You’re looking your next big client square in the face but don’t yet have the assets to pull it off, and you’ll be scrambling for the extra working capital to push forward rather than getting actual work done.

In Summary

Self-funding your company comes with the perks of directional freedom, less time pressure and fewer legal complications at the cost of pressure to stay cash flow positive from day 1. The self-funded company cannot grow–let alone survive–without an early, consistent trend of positive cash flow as we’ve just demonstrated. ExampleTech won’t have much wiggle room for strategic ventures and operational improvements until these numbers provide an ample financial buffer.

Next

We’ve glossed over quite a few important details such as taxes, loans, interest, accounts payable and, of course, paying yourself. So if you’ve found this information helpful and would like to see more content on the practical financial aspects of start-ups, let me know you’d like a Part 2 and the specific topics you’d like to know about!

Identifying Senior Software Engineers: Six Critical Differences

For HR and legal purposes, most development companies classify Software Engineers into ranks from I to IV (or V). The higher the rank, the higher the responsibilities, expectations, independence and pay grade. To cut it as an interviewer and manager, you’ll need to classify people accurately with a minimum amount of direct personal exposure: a non-ideal but practical requirement of most hiring processes.

While we don’t regularly use titles at OpenRain, we nevertheless have to distinguish senior talent. The core issue is, “How do you objectively identify ‘senior’ engineering qualities?” Today we’ll focus on several key factors always present in quality engineers, independant of language and platform.

Instinct

He/She has developed extraordinary technical relevance filtering to the point of being able to scroll through a never-before-seen 500 line file in a language they don’t know, and tell you..

  • how complicated the code is.
  • where potential bugs are.

Even with no formal knowledge of code smells or design patterns, a senior developer can sense ugly code and architecture from a mile away even if they don’t yet know exactly why.

Foresight

Long-term implications are always on the mind of the Senior Software Engineer. They’ve been through the end-to-end development process (from requirements gathering to product maintenance and end-of-life) numerous times, know what issues are going to arise and will point out a suitable solution long before the symptoms start to appear. (This quality thus becomes most apparent after delivery when work is bombarded with never-before-seen use cases.) The truly elite developer is often hard to identify because they’re solving the important issues before anyone else notices the problem. (Ben is a primary example of this extraordinary perceptiveness.)

Results Focus

Knowledge without application leads to arrogance without insight. Senior developers are always focused on results which stand the test of time and can easily see through posers who fluff their way through status meetings.

Communication

New developers seldom understand the required differences of communication between different types of stakeholders. Newbies tend to treat all stakeholders as authoritative figures, and are quick to lose direction when exposed to people with differing incentives.  The criticality of non-verbal developer communication is also apparent to the senior engineer.  For example, a green engineer may see issue tracking as micro-management, automated testing as an ideological obsession, and project planning as administrative overhead, but these are all monumentally important aspects required to keep all developers and stakeholders in a real-time communications loop, since many do not directly interact. A senior engineer will see these concepts as empowering and often get grouchy when not present, because not having clear priorities and documentation introduces roadblocks to results.

Time & Priority Management

A senior engineer can more-or-less tell you what their schedule looks like a week out, even if it’s not written down, and won’t be hesitant to express any issues with workload ahead of time.

Estimation

New software engineers seem to invariably produce time estimates magnitudes off from reasonable numbers. The issue largely appears to be one of Foresight since accurate estimates are oft best produced by benchmarking current requirements against past similar project experiences: a task more easily accomplished with experience. This issue is an arguing point against the “Customer is Always Available” aspect of eXtreme Programming since a green developer is generally more likely to over-commit to a workload than a senior.