Author: preston.lee

  • 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.

  • 10 Joys Of Small Business Ownership

    Don’t fret about those woes! For on a daily basis…

    1. You are building something greater than the sum of its parts.
    2. You set the mission, vision and values.
    3. You define the right people, right roles, and right rules.
    4. You will push constantly to explore and learn to think outside your comfort zone.
    5. You will often fall, but consistently stand up stronger… usually.
    6. You will grow leaps and bounds professionally and personally.
    7. You will come to understand the wisdom of those you admire, and fear.
    8. You are pursuing your dreams and will pity those that lack the courage to pursue theirs.
    9. You have no limit to your possible successes.
    10. You are the driver of your destiny.

    I’d also like to emphasise that none of these items are directly focusued on the immense financial wealth of which we all hope. Over time wealth may or may not come, but the common factor amongst all great entrepreneurs is the primary importance of personal satisfaction regardless of monetary riches. At times–and during all stages of business–progress can require a certain amount of financial masochism and sacrifice, yes, but always should you be proud of what you’ve done, where you’re headed, and excited for the treasures of the next day.

  • 10 Woes Of Small Business Ownership

    1. You work more than anyone else.
    2. You cannot take time off at leisure.
    3. You carry constant stress.
    4. You get paid less.
    5. You get paid last.
    6. You pay for other peoples taxes and benefits.
    7. You always deal with the “problem” cases, not the fun ones.
    8. You are asked for more-more-more, often by those who already have more than you.
    9. Your sacrifices will not be recognized, and rarely noticed.
    10. You will not be thanked for all of the above.
  • The Financial State of Arizona

    moneyThe Arizona Joint Legistlative Budget Committee (JLBC) released two documents yesterday quantifying the effects of U.S. economic fear, uncertainty and doubt as it applies to Arizona’s 2009 budget, and proposals for 2010. The big question on U.S. minds is, “How will all this affect my business?” By most accounts the answer is not positive.

    The JLBC’s February 12, 2009 budget update puts “January revenues 21.5%…below [fiscal year] 2008”, for a cumulative 2-year decline of 35.9%. “January results [are] significantly worse than expected”, says slide 4 of the report. These numbers directly translate to additional lump-sum budget cuts for state-funded programs, including the Arizona University System.

    Layoffs in the private sector worsen the situation via a direct reduction in state sales and employment taxes. In a 2010 appropriations hearing presentation also released yesterday, the committee discussed specific cuts to a page-long list of Arizona institutions. A 2010 option for reducing the Arizona University System budget calls for a $160.6 million lump-sum reduction. “ABOR and university system received a combined $141.5 million lump sum reduction [in 2009].” Such changes would affect Arizona’s Arizona State University, University of Arizona and Northern Arizona University despite higher projected enrollment numbers and tuition increases across the board. Arizona State leads in projected enrollment increases at 4% in 2010, with 15% at the East campus. Arizona University System tuition prices have increase an average of 8.5% annually since 2004.

    The effect? All employees and families of the state of Arizona are nervous to find out, as “[c]urrent forecasts can indicate the direction of the economy, not its precise landing point”, to quote the 2009 update report. The nightly news will likely continue to cover layoffs, salary cuts and sob stories for Arizona not-for-profits for the foreseeable future, and it seems unlikely that a “quick fix” will restore budgets to previous levels as existing layoffs and budget decisions cannot be quickly recovered.

    Please tell me I’m wrong.

  • Offering Developers Startup Equity, A Dialog

    I have this conversation about once a month, generally by a well-intentioned dreamer new to the software space who doesn’t understand why I can’t accept projects for equity. I may be exaggerating slightly, but it sure feels this way…  🙂

    Preston: Hi Bill, nice to meet you. How can we help you develop your online venture?

    Bill: I have a unique web startup opportunity worth $4B and am accepting HTML experts to implement it.

    Preston: [immediately suspicious of the phrase “HTML expert”] Ok, you have my attention. What’s the business plan?

    Bill: It’s essentially a combination of eBay, Facebook…

    Preston: [senses where this is going]

    Bill: …Slashdot and TheSuperficial.

    Preston: It’s a news and auction site for celebrity social networks?

    Bill: No no no, it’s more like Google meets MySpace.

    Preston: Like.. Orkut?

    Bill: Kinda, but simpler.

    Preston: [completely confused] Back to the business plan part for a minute. Could you tell me about the nature of the business? Is this an ad-based site?

    Bill: No.

    Preston: Ahh, ok. Some sort of subscription thing then like Salon or TheOnion?

    Bill: No way. Users hate paying for stuff. It’ll affect our bottom line. We’re going to keep it free for everybody. And green. We should probably add a database of sites using ecological products. And videos, of course.

    Preston: [now confident of where this is going] Let me restate the question. Where did that $4B figure come from?

    Bill: YouTube was bought out for $18B. Google will be all over this after we capture 10% market share.

    Preston: [completely ignores the issues with those two sentences] I see. To be completely honest, I should share a couple general thoughts. [brings up telephone script #4 from personal wiki] We haven’t talked about budgets at all, but I assume this is an equity-share idea, and I’m really honored you thought of us. There are a lot of great people out there, and I’m happy and thankful to have stood out. Unfortunately, we’re not accepting equity-based projects at this time for two primary reasons. First–and again all in frank honesty–we have the technical, business and other resources to implement these things on our own without external partners. We have a lot of great ideas, and it makes the most sense for us to pursue them internally. Secondly, it’s our goal to treat employees the way we all want to be treated: with respect, recognition and great benefits. That comes with cash flow requirements we just can’t meet with equity-heavy relationships. I’m going to email you some contact information for other resources you may want to follow up with directly, and I think you’ll find that reputable software engineering shops will share these two sentiments in common as a matter of prudence. We look forward to working with you in the future, however, and we’ll keep in touch periodically to check up on you!

    [exchange of pleasantries]

  • Logical Programming With ruby-prolog Slides

    rubyI gave a ~1 hour talk last night to the Phoenix Ruby developers group on how to implement logical programming concepts in Ruby using the ruby-prolog gem recently released by OpenRain. Enjoy!

    [Keynote] [PDF] [Slideshare] [Code] [Releases]

  • The Truth About Integrating Rails In The Enterprise

    Ruby on Rails is a great RAD framework. We use it all the time. But one place Rails loses its magic–while not the fault of the framework itself–is with external integrations to legacy systems.

    First of all, soap4r sucks. Everyone I’ve seen try to pick it up has gotten frustrated and angry at how awkward it is to write a SOAP client in Ruby compared to Java and .Net tools, which can do the same thing in a matter of minutes. Since RoR IDEs aren’t exactly 1337 yet, we need to put some serious love here as a community to prevent larger companies with heavy SOA leanings from running away screaming.

    For some reason, many people seem to think that pouring t3h Rails int3rn3ts into an infrastructure will suddenly trim 75%+ off all development and maintenance costs, complete with rounded corners and shrink-wrapped buttons. Wrong. Many of the development tasks will take significantly shorter times to develop under timeframe expectations relative to Java and .Net, yes, but you can’t avoid costs associated with migrating legacy data and integrating with retarded external systems such as your ghetto-ass SOAP services. Nor should you avoid design activities such as usability analysis or proper testing practices. 

    So if you have a web project that lives in complete isolation and does not have any legacy issues with which to deal, OpenRain can bust out that web project in a heartbeat. But if you have unresolved data management and integration issues, there is no acts_as_silver_bullet plugin which can save you the burden of having to actually think about and address those problems. Rails isn’t the cold bucket of water for your data nightmares.

  • Hiring For IT: What We’re Doing Wrong & How To Fix It

    HR departments for many technology firms tend to be a bit backwards in the way they evaluate potential hires. Early in the process, an HR member or technical recruiter will typically contribute to the never ending stream of listings posted to the popular online job sites, and funnel the subsequent flood of applicants through a filter before passing on candidates to the geeks. The key issue is that HR cannot realistically be expected to hold all the technical knowledge necessary to appropriately evaluate and filter applicants based on technical criteria. Many resumes are thus evaluated solely off keywords or ridiculous automated online exams that supposedly quantify a candidates abilities based off asinine declarative factoids.

    My personal hiring strategy, while admittedly skewed towards finding only top tier entrepreneurial people, follows these steps..

    1. Go to the core of The Right Persons culture. Forget about the “Java” checkbox on Dice.com. Figure out what The Right Person does online, and go there directly. Post a Java job to the local JUG mailing list, or a Ruby job to the Ruby talk group, for example. Only people genuinely into these topics sign up for mailing lists and forums, so by going straight to the cultural center of the ideal candidates interests you’ve already filtered out the dingbats who would apply just for the sake of applying. The Right Person is probably already employeed and thus would not be checking monster.com anyway. Allow HR to apply their own filters after you’ve identified the right culture.
    2. Evaluate their communication skills via email and phone. When was the last time you read an uber-competent technologist who ended every sentence with three exclamation points and a smiley face!!! 🙂 Yeah.. me neither. The subtleties of written language reveal how in touch one is with technical culture. They might have extensive experience with 16 different databases on their resume, but if they can’t explain — in layman’s terms — what a database driver does, I can’t see him/her being able to produce well-documented results or be terribly useful in business meetings. Ar-tic-u-la-tion of one’s thoughts in both written and spoken word is critical to effectiveness.
    3. Talk about technology in general. I do not expect you to know the internals of the JVM to be qualified for a Java developer position. I do expect you to keep current on general technology trends and always have your ears open. I expect you to constantly learn and get your hands dirty, and I expect you’ve done some of it on your own time.
    4. Ask the right questions.What type of Exception does Socket.close() throw?” would be the wrong question. Phrase your technical inquires such that they are open ended, recognize that He/She Is Not Google, and allow the respondent to give an intelligent response even if they do not know the answer. Example: “How would you describe the lifecycle of a network connection?” The question is specific enough such that a knowledgeable person can immediately give a thorough answer, but not overly so such that it is a miniscule factoid you’d see on Jeopardy. Also ask questions which are subjective or provide incomplete information, such as, “Which Java OR/M technology would you use in a new web application?“. You’re not looking for a “correct” response, but to gauge how’ll they’ll react when prompted with incomplete, unclear or clearly stupid business requests. Just like the real world. Arrogance and stubbornness can often show through with a definitive answer to such questions, whereas a more pragmatic person might say “It depends.” followed by a diatribe on the pros and cons of various options, none of which a singularly “correct”.
    5. Invest the time. Many large companies outsource recruitment because they see it as a secondary distraction to the organizations primary tasks. But the thing is… putting the right people in the right roles is as core to your business as it gets. And for the prices charged by technical recruiters, the $20K+ per head can easily be spent on competent geek personnel dedicated to networking in the correct communities for purposes of recruitment.

    But don’t fret: there are companies trying to change the system. For the time being, however, keep this mind next time you hear an interview going on down the hall…

    Organization and role-specific cultural requirements come first; HR policy requirements come second.

  • Presenting At Phoenix Ruby Monday, February 9th

    I’ll be giving a technical presentation to the Phoenix Ruby User Group on Monday, February 9th at 6:30pm. The topic will be using logical programming Prolog concepts within the object-oriented Ruby programming language using the ruby_prolog gem. Attendance is free and open!

  • Everyone Should Grow Up Poor

    There are only two relatives I’ve ever known to whom I’ve felt a strong biological connection. One of them died last month. This is a tribute to her…

    I spent the majority of my early childhood growing up with my mother in a single-room add-on attached to the side of my grandmothers house in a Northern suburb of Chicago.

    My mother never went to college and worked very hard to keep us financially safe doing jobs such as data entry. She is a very hard worker that gains personal satisfaction from a job well done and was always gainfully employed, so we were never poor in the hungry, homeless or other romantic sense, but firmly lower class, yes. My mom still loves to tell the story of how I didn’t understand you could purchase food without a coupon clipped from the Sunday paper. She didn’t have a lot of free personal time due to being a single parent, but made it work. I don’t think I would handle that lifestyle well, and have a tremendous respect for single parents trying to make ends meet while “being there” for the kid(s). I was even fortunate enough to get a hand-me-down obsoleted Macintosh computer from my mother’s coworker on which I typed school papers from elementary school until high school.

    The land and house I grew up in had been established by my grandparents some years after World War II. My grandma grew up on a farm and filled the house walls with rural-feeling nick-nacks and small-town artifacts. The surrounding neighborhood became caught in urban sprawl and began to transform into luxurious mansions settled comfortably on 1-acre lots.

    My father is a South Korean immigrant who came to America for a better life, and eventually found his place in California. The balls it takes to pack a suitcase and move to a foreign country with a pocket full of dreams continues to astound me. I recall listening to him confidently lay out his plans to run his own successful businesses as so many other Asian immigrants did in Los Angeles. Looking back on the first 18 years of my life, I now realize…

    Having less in an environment of opportunity can be empowering.

    When you have less, you feel like you must improve yourself to be noticed amongst peers. No one can fix a situation with a magic wand should you fail, so you must dedicate yourself to tasks because success will not otherwise come. And if you succeed, you’re not stuck with a convoluted sense of entitlement to a world full of subordinate peons. You know exactly how hard it is to make it in life because you’ve seen the sacrifices and tears from your family and friends. You chose your fate, and made it come true.

    I enjoy the niceties in life just as much as the next guy (who doesn’t?), but I feel good that I don’t feel entitled to them. I know that if I get a nice dinner or fun new toy, I earned it, and I’m going to be more proud and protective of it than if you just handed it to me. It’s not just another disposable object; it’s mine because I consciously caused a chain of meaningful events resulting in a reward. Push the button, get a treat.

    So here’s the deal. If you win the next Powerball jackpot, you get to keep a few million to secure your home, family and reasonable lifestyle, and have some fun while you’re at it. Go for it. Take a vacation on the International Space Station or something. I’d do the same. But you don’t get to blow $5 million in Vegas or $50 million on a toy.

    You hire a financial management team and get to work doing something meaningful with your fortune (and your life) by sheltering homeless children, curing cancer, somethingMake the world a better place. And if you’re investing wisely, you’ll feed off the inherent greed of the system and use the profits to further your own philanthropy. Keep the compassion, dreams and simple contentment of being poor, and use the power of being rich to change the world.

    The fated rich have not such empathy for the masses.

    Do not strive to be rich. Do not strive to possess. Do not strive to control. Do not seek admiration of the world. Do not seek approval of authority. Do not strive to be popular. Do not be a pessimist. Do not dwell on the past.

    Strive to be wise. Strive to be kind. Strive to be selfless. Strive to be loving. Strive to be more. Strive to do more. Strive to use less. Strive to be an example. Strive to leave the world a better place than you found it.

    Strive to redefine humanity.