Tips for Working with Programmers

  • The life and times of a software detective

    magnifying_glass_resizedA lot of the work I do involves looking for clues. Last week I upgraded a web app to allow users to upload photos of their properties. As my customer started testing, one user reported that they couldn’t access the photo upload page – an error was always generated. They tried with different accounts but the result was always the same. We assumed that there was something funky with their user accounts, and in fact they did discover some duplicate records that we suspected were the cause.

    We were wrong.

    As it turns out, the problem was much more mundane. No matter what account they used to access the system, they were always trying to attach the photos to the same properties. And those properties didn’t have phone numbers. And my code was trying to format the phone numbers, and broke when phone numbers didn’t exist.

    Oops.

    But here’s my point: fixing bugs can be real detective work. You have to first identify the true cause of the problem. Sometimes the culprit looks shady, so he is easy to find. Sometimes there aren’t any obvious clues and the culprit is elusive. And sometimes the shady-looking character is innocent and the real villain is dressed like a sweet little old lady.

    I always thought she looked suspicious.

    Anyway, that’s one of the reasons why in most of the applications I write, I try to make it easier to find those clues. For example, I’ll log errors to a file to help me pinpoint some of the specifics of the problem. And you can help me with my detective work. The more information you can give me about what you were doing when the problem occurred, the more likely it is that I will find that evil-doer and bring him to justice. Uh, I mean, find and fix that bug.

    Comments (0)

  • Avoiding the cone of silence

    One of my guilty pleasures is old TV programs. One series that was particularly entertaining was the show Get Smart, which if nothing else has an awesome name. (A great commandment: Get Smart! Immediately, already! What’s taking you so long?)

    On the program they would occasionally employ a tool called The Cone of Silence, which was supposed to permit its users to speak about secrets in a way that prevented others from hearing them. It never worked properly, making it impossible for the users to understand each other, but everyone else could hear them fine. This was of course the big joke.

    Sometimes I use my own cone of silence. As an independent programmer, I’m used to doing things on my own, and other than gathering customer feedback, I rarely get feedback from others. This is good for helping me focus, but also has its risks.

    Last week I was showing my husband an application I am working on. He asked about why I was using a certain navigation approach, then suggested an alternate and far superior option. Rats! The cone of silence failed me again.

    The lesson here is that having another set of eyes is a good thing. It is good for customers and it is good for the software. Don’t let software design and development happen inside a cone of silence. Feedback is a good thing! (Now where did I put that shoe phone?)

    Comments (1)

  • Why I love that you found a bug (really!)

    bug_resized I hate bugs in my code and want to squash them. RIGHT NOW.

    But…

    When you report that you have found a bug, that means you’ve been testing.

    And it means that you have tested the code sufficiently to discover something I didn’t find. So you probably did more than just log-in.

    And that makes me happy. I love it when you care enough about the application to give it a good work out. I want this software to be good, and it can only be good if you help. Without your efforts, the software will suck. Big time.

    (You would be amazed at how much software goes untested. Really. You would also be amazed at how frequently software goes unused. This is one of those crazy mind-bending puzzles, like if a program is written in a forest but no one uses it, did it ever exist. Or something.)

    So go right ahead and tell me about that bug. Even if I temporarily look sad because I briefly think about how much I hate bugs, that will quickly pass as I realize how great it is that you are testing the application. Yeah!

    Comments (0)

  • Source Code Control: Snapshots of the Code (and why business people should care)

    I have a theory that the reason why normal people are so put off by programmers is that they use goofy, complex language that is meaningless to most people. For example, take the phrase “Source Code Management” or “Source Code Control”.

    What the heck is that?

    It is software that programmers use to capture copies of the source code as it is changed. Think of it as a camera taking pictures of the code at various moments in time. These snapshots are stored in a central location for all the team.

    What do they use it for?

    A couple of things:

    Storing code in a central place for a team so all the programmers can get at it. That way, when Fred writes that great code to convert everyone’s name into Pig-Latin, Mary doesn’t have to write her own. She can just use Fred’s.

    More importantly, Mary can fix Fred’s code when she finds a bug for names that start in vowels. (That Mary is such a show off.)

    Is that it?

    Well, no. Because it keeps track of each version, if Mary’s bug fix breaks something else, we can recover by restoring a older version. Phew!

    Is THAT it?

    Well, no. Both Mary and Fred can work on code in the same file at the same time, and when they put a new version back into the software, it will merge their changes together. (Or it can merge two different versions worked on by the same person into one file.)

    Anything else?

    Well yes, but these are the core features.

    Why should a business person care?

    These are all features that either help developers be more efficient or protect the code as it changes.

    Should freelancers and programmers working on solo projects use source code control?

    Absolutely. Just because features involving multiple developers aren’t applicable doesn’t mean it isn’t worth the effort. Keeping track of multiple versions is very valuable. I find it useful to look at earlier versions of my code all the time. And merging changes between two different versions of the code can also be helpful. This allows the programmer to be working on a major set of enhancements, release an interim build that includes some bug fixes, and know that the bug fixes will be folded back into the major release.

    There are free and open source options available, so cost is not an issue.

    I just interviewed a programmer, and he says source code control is a waste of time.

    Be afraid. Very afraid.

    <shudder>

    Comments (2)

  • Why the scope creep monster doesn’t frighten me

    Most independent programmers have a fear of scope creep. Actually that’s not completely true. Most have a fear of scope creep they won’t be paid for. For those who are doing a fixed bid project, the fear is that expanding scope will eat away at any profit until they are making about $1.30/hour. Yikes.

    To compensate, some programmers get very aggressive about delineating project scope. They become militant when even a small feature change is suggested. And I have a lot of sympathy for that position.

    But I don’t share it.

    Look, everyone I know who has been in this industry more than a couple of years has experienced a bad project. A project where everything was out of control, no one knew what the project was supposed to include or exclude, and the customer was frustrated because the project manager kept saying “that’ll be $1,000 more”. Ka-ching. I’ve been there.

    But the truth is: if you don’t have a true partnership with your customer, where you both trust and respect each other and want the project and the relationship to succeed, scope creep is just a symptom of a much larger problem. And you aren’t going to solve that trust deficit by telling them that every little feature will cost extra.

    Yesterday I met with a customer to show them an updated version of an application I am building for them. The system is light on specs, because we are basically re-implementing an existing Access application using .NET. I’ve been focusing on the former Access application itself, but there are some basic Access features they need as well. And we talked about them.

    No I’m not going to re=create Microsoft Access. But I am going to give them some additional functionality that we didn’t specifically identify initially. That is okay. I trust them to not ask me to lose my shirt on their project. And they trust me to tell them when I feel that they’ve crossed the line.

    And I’m not saying that programmers should give it all away. If you ask any of my customers, they will tell you that I often charge extra for changes in scope. But not always.

    The bottom line is that software projects exist to solve business problems. If the project doesn’t solve the problem, then I haven’t done my job.

    Comments (2)

  • How to frustrate your users by making data entry annoying

    All I wanted to do was to create some calendar entries. A date, some times, and a description. Not too tough.

    Except the person who created the user interface has clearly not spent a lot of time actually doing this task. Take a look at the form:

    New_Calendar_Event

    Now consider for a moment how annoying it is to enter start and end times on this form. It always defaults to “01:00 AM”, which of course is NEVER the start time for one of my appointments. So I must always change the first drop down value. And if the appointment starts on the half hour, I must scroll through 30 entries. Who thought this was a good idea? (Not to mention that since the end date doesn’t default to the start date, for most cases I must pick the date a second time. Yuck.)

    Then I get the privilege of doing the same thing for the end time. The end time also starts at 01:00 AM”. Since most of my meetings are approximately 1 hour, if it started on the half hour I get to scroll that time yet again. Lame.

    As a programmer, I understand why the programmers picked drop down lists. It starts with these basic notions:

    • Time entry is structured data. It has numbers is a specific format and in a specific range. Plus that whole am/pm thingy.
    • If I let people type whatever they want, then I have to validate what they entered before saving it. This way, less validation.

    Which is all well and good, until you actually think about what users are trying to do. They are trying to create appointments. Quickly. There isn’t much info that is required for an appointment (dates and times and a description). Making it harder is really stupid.

    Compare the above to this control time picker, available from Peter Blum:

    Popup_Timepicker

    The popup list of times to select only appears if I click on the little clock next to the textbox. This is lovely because since most of my appointments are during regular business hours and on the hour or half hour, I can just pick a time. Or if I need to enter a different time, I can just type it. No pesky drop down lists to scroll through for 45 minutes past the hour.

    There is also the approach used in Backpack: just entering the whole thing in a text box, and letting the application parse it out.

    backuptimes

    This is the most complex option from a programming perspective. I also have mixed feelings about it for end users. I think for some users this is a welcome approach, but for others this takes some getting used to.

    But the bottom line is that either of these second options was much more thought out than the crappy option with the drop down lists.

    Comments (2)

  • Don’t forget the docs!

    Everyone hates documentation. It is either boring or it doesn’t answer provide the needed answers. Many programmers agree that documentation is critical when they are taking over a project for someone else, and think it is completely unimportant when they need to create it themselves.

    So as a customer: what documentation should you expect or require from your programmer?

    Every situation is different, but here are some documents you may want to consider requesting:

    System Design

    This is the specification that was (usually) created before the programming began. It can include functional specifications, wireframes, screen mockups, user stores, UML diagrams, screen to database field mappings, etc. The good news about system design is that it can really help the developer understand how the application started. The bad news is that over time, it can get pretty stale unless someone is keeping it up to date.

    In most cases I work with my customer to create a system design before programming begins, but this is not always the case. If a system design is provided as part of the project, make sure you request the most current version when the project is completed.

    Overall System Setup and Configuration

    This is “what if I’m hit by a bus” document. Its purpose is to allow another programmer to set up the application on their system with a minimum amount of pain. It should include:

    • A high-level list of all components and/or modules
    • The language and version used for development (and the IDE used by the current developer if appropriate)
    • The database in use and its version
    • The operating system in use by the current developer
    • The deployment operating systems currently supported
    • Any third party component used and their versions
    • Any third party or other tools used for code generation or build
    • The database schema

    A good programmer knows that this documentation can smooth the transition to another programmer, and that it is your right to want to minimize vendor lock-in. Don’t be uncomfortable asking for this documentation.

    The “Why” Document

    Every project involves decisions. Some decisions are obvious (we built a web app because we needed to give external users access to the data) and some are arbitrary (we wrote it in PHP because that’s what the programmer knows). Documentation that covers the “why” for the important decisions can help the next developer understand how the project evolved and can help them to not cover the same territory. For example:

    • Why we used a third party component instead of the built-in component
    • Why this service pack is important
    • Why a particular routine has an ugly hack in it
    • Why this table’s naming convention is different from the others

    Some of these “why’s” may belong in the code comments as well.

    Function and Subroutine List

    When programmers are asked for documentation, sometimes they use a generator to create a list of all the functions and subroutines in the system, with a description of each. While this can be relatively easy to generate, I’ve found its usefulness to be fairly limited. As a programmer, I rarely look at this type of documentation.

    End User Documentation and/or Help Files

    Depending on the application, this can add a lot of value to an application. It can provide that polish that takes the application to a professional level.

    However, many programmers have trouble thinking like an end user. (Remember, many programmers are aliens.) And creating this type of documentation can be expensive. So before you decide that the programmer should provide end user docs, ask if this is a service they provide. And ask to see examples of other user documentation they have created. Then decide if it makes sense for the programmer to write end user documentation or if it should be created by someone else.

    Creating documentation takes time. Think about what kind of documentation you want before the project begins and make it clear to the programmer what you are expecting. That way it can be included in their bid.

    Comments (0)

  • Having it your way (except when you can’t)

    Good projects (and by “good” I mean “successful” of course) always have a defined objective. Everyone knows the goal, and everyone stays focused on that goal throughout the project.

    Also important in a good/successful project is understanding the project sponsor’s values. For example, some customers place a high value on source code portability – the ability to easily take the code to any vendor. Others may prioritize completing the project as quickly as possible. In the case of the former, using a third party component might not be appropriate, but for the second customer this might make a lot of sense.

    I mention project objectives and customer values because these can have a big impact on architecture and design decisions. Dare Obasanjo makes this point in his post There are no bad design decisions… While I don’t agree 100% with his title, I think  Dare has a point. A design decision that makes no sense in one situation may be perfectly acceptable in another with a different objective and a different set of values. The key is understanding that these decisions involve tradeoffs.

    No one really likes tradeoffs. In a perfect world, we wouldn’t have to compromise. And custom software (which by definition is “have it your way” software), may provide the illusion to some that the laws of physics - or in this case the realities of software development - can be broken.

    Unfortunately some values will always be at odds. “Completing as quickly as possible” will never be completely compatible with “make the application really easy to change without additional programming”. You can have multiple values, but they need to be prioritized.

    While this can be frustrating, it can also be liberating. Trying to be everything for all situations is bound to fail, and take forever in the process. So define a goal, come up with a few key, prioritized values, and stop trying to achieve design or architectural perfection.

    Bottom line: You can’t really have it all. That’s life.

    Comments (0)

  • Gracefully handling the unexpected (deer edition)

    If you plan on enjoying your evening, I recommend that you do not ram a deer with your car. Really. Truly.

    I did not follow that advice. Last weekend as we drove home from a family gathering, a deer jumped into the road directly in front of the car.

    There was nothing I could do. There was not enough time to stop. Swerving would have put me in the lane of oncoming traffic, or the ditch. So I hit the deer.

    As you can imagine, the evening went downhill from there. I won’t bore you with all the details: the car damage, the waiting for a ride, navigating the insurance maze, etc. Not to mention the guilt over the certain death of what I’m sure was some other deer’s sibling or spouse.

    But here’s how accidentally running over Bambi’s mom relates to software development and working with programmers.

    Sometimes bad stuff happens. You can’t always anticipate the specific problem, but it is a given that something will go wrong at some point. And how the software responds to the bad stuff can make the difference between user forgiveness and their desire to hunt down the programmer and run them over.

    Good software gives you brakes to help you stop and prevent the accident. It gives you airbags and seatbelts to protect you when the accident happens anyway. And it gives you insurance to help deal with the damage.

    Good software tries to make the unexpected disaster as painless as possible.

    On the other hand, bad software reacts poorly to the unforeseen catastrophe. It ends suddenly with a cryptic message. It mangles your data so that it is unreliable or unusable.  It makes you curse and wring your hands and stomp your feet.

    Sometimes bad software can become good software, if the developer learns a lesson from the tragedy and improves things. But it can be hard to regain the trust of the end user. They may never forgive the software for forcing them to rekey in 500 customers that were lost. Or for lying to them by showing them data that looked true, but was actually wrong. So it is a harder road to travel.

    But even if software starts out bad, it is worth the effort to try to make it good. It is easier to support. And it makes users happier. Good programmers know this.

    Bad programmers throw their hands up in the air, shrug their shoulders, and force users to keep driving without safety features or insurance.

    Comments (0)

  • My software doesn’t contain missile launch codes, why does it need security?

    “I just want my users to log into my application before using it. Is it really that hard?” my customer asked, frustrated.

    Short answer: Yes.

    Long answer: It depends.

    Look I sympathize. If you think I enjoy all this security stuff, you would be really wrong. Security related issues are NO FUN. No one likes security. Users hate it, so if people have security-related trouble, they think the application is horrible and the programmer is an idiot.

    The reason why everyone is frustrated is obvious. Software security is intended to prevent unauthorized users from accessing the application. But users want to access the system. So right away the relationship between the end user and the application is in conflict. Not a good way to start things out.

    And as I’ve mentioned before: nothing is simple. Let’s say you just want to restrict access to the system via a simple password, and that all your employees will have the same password.

    Great! What happens when an employee is fired?

    I guess we should change the password. But how do you notify everyone that the password has changed?

    You could email it, but that isn’t very secure.

    I guess you can call everyone and tell them. Then again, saying the password out loud isn’t very secure, either.

    If your employees are in the office, you can put it on post-in notes on everyone’s computer. Uh, wait…

    Perhaps it doesn’t matter. You might never fire an employee. Or perhaps users can’t change data in the application anyway.

    But that’s why we have to ask a lot of questions, to weed through the details and make sure we completely understand your security needs. Questions like:

    • How many users will you have?
    • Will they all have access to doing the same things in the application?
    • Will they all have access to the same records (customers, orders, etc.) in the application?
    • Do the access needs of users change, due to changes in their jobs or other reasons?
    • Are there laws that govern how you must deal with this information (like data privacy regulations)?
    • What are the consequences if someone stole your database? Could you be sued? Would your business be destroyed?

    These are only a smattering of the questions that come to mind when thinking about security.

    I know it is a pain to answer all these questions. I know it is tiresome and no fun. Trust me. It is important. You’ll thank me later.

    Comments (0)

  • Is your software project run by underpants gnomes?

    Every time I see the underpants gnomes on South Park I shudder. These are the guys who came up with the brilliant 3 phase business strategy:

    File:Gnomes plan.png

    Actually I think the underpants gnomes are pretty funny. But they hit a little close to home, you know? Because I’ve seen a lot of software projects that follow a similar logic.

    Take for example a recent Craigslist post:

    “I'd like to find a web designer that would help me build a web community like MYSPACE or FACEBOOK. I’m looking for local web designers/students that can be affordable.”

    Uh, okay. You want to build a site like MySpace or Facebook without any money or experienced developers. Riiiggghhhttt.

    Now perhaps I’m being cruel here. Maybe they’ve really thought this through.But somehow it feels like underpants gnomes.

    I’ve experienced this personally. I once worked on a project where the customer had a big software idea that involved tracking birthdays, anniversaries, and other gift-given dates and integrating that information into commerce sites like Amazon.com. It wasn’t a bad idea, but she was pretty clueless about her market . She wanted us to build a proof of concept application that could some day talk to Amazon.com and other sites, but she didn’t have any idea how this would happen.

    If you want your project to be successful, you need to have a more precise objective than "Profit”. How are you going to make money? How much money can you expect to make in order for it to be successful? And back it up with real data. Why do you think you can make that amount – is that based on your research of the potential market? If your project’s objective is designed to save time, then you should quantify how much, and again be able to explain your reasoning.

    You might think it is presumptuous of me to even bring this up. But I can tell you that if you haven’t thoroughly thought through your objective and figured out how we are going to get there, the project won’t be successful. I don’t want to work on a failed project, even if I get paid for it. It reflects badly on me and it is no fun. So please leave the gnomes in your underwear drawer and come up with a real plan.

    Comments (0)

  • Why your programmer needs to be like MacGyver

    200px-MacGyver_intro Okay, I confess. I never really watched MacGyver. But the idea of someone who can solve most any problem by quickly inventing a solution out of duct tape and dental floss (or whatever is laying around nearby) is pretty cool.

    To me this seems a lot like how the best programmers work. While most programmers aren’t solving the life-and-death problems that MacGyver faced, they often have to solve them remotely, and with little or misleading information.

    So what MacGyver-like characteristics should you be looking for in the next programmer you hire?

    Creativity

    I think the thing most important MacGyver attribute for a programmer is creativity. Often technical problems are difficult to troubleshoot. The worst programmers will run through the obvious troubleshooting solutions and then quit. But the best programmers will use their creativity to solve a problem when traditional solutions don’t work. For example, this week I was trying to solve a problem involving a Windows Mobile Phone. I was almost at the point where I would be forced to suggest that the user give up the phone for a week and ship it to me to troubleshoot. Instead, I wrote a quick program that would email their database to me from the phone. Now I should have the pieces I need to replicate their problem and correct it.

    Tenacious

    When MacGyver gets into a jam, he doesn’t throw his hands into the air and give up. Instead he puts on his thinking cap and solves the problem. Similarly, some programmers prefer to work on new stuff and are uninterested in solving problems. But what is usually most needed is someone who can roll up their sleeves, dig into a problem, and keep plugging away at it until it is resolved.

    Thoughtful

    I have seen some programmers behave like a bull in a china shop, racing in to “fix” a problem without really understanding the issues involved. Occasionally this can lead to bigger problems. For example, I once saw a programmer write a quick script to fix some data in the database. There were only a few records that needed changing, but he forgot to write his script to only touch those records. Now suddenly ALL the records in the database were changed and they shouldn’t have been. Oops.

    A thoughtful programmer would have been careful, and made a backup of the database first. He probably also would have tested his fix on a test database. From what I know of MacGyver, he didn’t rush to solve a problem until he actually understood it. (Otherwise the show would have quickly ended in a large explosion.)

    When you hire a programmer, make sure they demonstrate these attributes so they can provide the best value for your business.

    Comments (2)

  • 3 Reasons Why Improved Data Validation Will Save You Money

    Occasionally a customer will tell me that they don’t want to validate the data being entered into a form or page. Sometimes they think there aren’t any rules for the data. And sometimes they are concerned about the additional cost. Here are some reasons why improving the quality of the data will actually save you money:

    Future assumptions

    It is easy to think now that there are no rules about the data you are capturing. But months or years later, you may start making logical assumptions about that information that aren’t really true. For example, you may assume that every contact record has a name and address. When you prepare to do a mailing, you’ll think you need 1500 envelopes because that is the number of contact records you have. But without any data validation, 20% of those records might be missing a name and address. Now you’ve wasted money buying envelopes and stamps you don’t need. And you probably didn’t catch it until after you printed out all your labels, wasting additional funds.

    Bad data clean-up

    Now that you’ve printed all those blank labels, you realize that the existing database should be cleaned-up. So you’ll end up wasting employee resources to correct the faulty data. And keeping the data clean will cost additional money. Why not just spend a little up front to prevent people from entering bad data in the first place?

    Security

    Especially for data entered in browsers over the web, this is an important concern. The more restrictive you are on the data that is entered, the less likely that some nefarious bad-guy won’t use some trick to take over your site. And if your security is breached, you can believe that you’ll spend money on correcting the problem.

    Comments (0)

  • Ask the Programmer: Why can’t I change my mind?

    question-mark_resized Ask the programmer is feature designed to answer questions from non-geeks about hiring and working with programmers. If you have a question, please email me at avonelle@lovhaug.com.

    Question: We hired a contract programmer to build a new application for our organization. Everything started out well, but now the project is late and shows no signs of getting done. He says it is because we changed our mind on some of the requirements. But how could we know it wasn’t what we wanted until we saw something? And several of these changes weren’t that big a deal. 

    Answer: This kind of problem is very typical with software projects. Users often have a difficult time envisioning the software before it is in front of them. And it can sometimes be difficult to see what is missing until you actually see it.

    When developing new software, I recommend that programmers use wireframes or prototypes – anything that allows the customer to see some of what they will be getting. That will help users to better envision what the software will look like and how it will work. It is important when reviewing wireframes or prototypes (or paper designs) to look at them carefully, and to tell the programmer as soon as possible when you see problems or areas that need additional work. And it is okay to ask for something like this if the programmer doesn’t suggest it.

    However, you shouldn’t make assumptions about how easy or difficult any particular change is. Most programmers try to create their software with some amount of flexibility in mind, but it would be fairly difficult (and expensive) to design for unlimited flexibility for easy change in all situations.

    Also, it can be de-motivating for a programmer (or anyone really) to change things over and over and over again. And it always adds time and effort to the project, regardless of how “simple” it is. So do your best to carefully review things the first time, and give a complete list of all the required changes. If there is a second round of changes, there should be very few if you’ve done your part and caught most everything the first time.

    Finally, before a project starts you might want to set aside a change order budget. If you plan for some change up front in your project, you won’t be as frustrated when things need to be redone. The change order budget should take into account both time (i.e. the schedule) and money (whether the project is time and materials or fixed bid.)

    Comments (0)

  • Talking to aliens, or how to communicate with a programmer

    goals

    Do you find it hard to talk to programmers (or techies in general)? I once knew a programmer who would get a dazed look whenever someone brought him a problem. We called it that “deer in the headlights” face, and it was disconcerting. It turns out that he wasn’t bored or terrified, he was thinking. And because he was thinking, he wasn’t speaking. Once we understood what was really going on, it made it a lot easier to communicate with him.

    Here are three tips for better communication with that alien life form, the software developer.

    Focus on goals and objectives

    Often a customer will tell me to “add a delete button to the customer form” (or a similar task), and occasionally they are right. But sometimes they haven’t fully thought through the implications of what they are trying to achieve. So instead of suggesting the solution, try to describe the problem and/or the goal. For example, instead of suggesting we need to add a new button, try explaining that you need a way to remove customers from selection lists if they are not active. From that you can explore with the programmer the best approach, be it a delete button or some other method of de-activating customers.

    Be specific and concrete

    Programmers live in the details. There is a huge difference between saying “the system needs to handle discounts” and “the system needs to handle flat fee discounts AND percentage discounts AND volume discounts”. It definitely makes a difference in how the programmer will be thinking about the rest of the conversation, so try to be as specific as possible.

    Repeat what you heard

    As with all communication what I thought I said may not line up with what you thought you heard. I find that if I repeat back my understanding of what the other person said, it helps to suss out any misunderstandings.

    Comments (1)

  • Good programming: making things better

    One of the reasons why I love programming is that when you are doing it right, the software you build actually makes things better for someone. Today I’ve seen two examples of this:

    • I rewrote an internal application for a customer that basically moves data between two systems. The old app had to be started manually and was slow and painful. The new app runs on a schedule and doesn’t require the same kind of end-user monitoring.
    • I’m working on updating a report for a different customer. The old report wasted a lot of white space because it had one column that was always very long and thus used several additional lines. The updates move that extra long column to a separate line underneath the others, making the overall report shorter. My test report used 6 pages with the old version and only 4 with the new one, and that is a fairly short version of the report! This is going to make my customer and their users very happy!

    The projects that are the best are those where the tangible benefits are obvious. When considering a software feature, we should always be considering the question “does this make things better for someone?” (If not, why are we doing it?)

    Comments (0)

  • Ask the Programmer: The Extravagant Programmer

    question-mark_resized Ask the programmer is feature designed to answer questions from non-geeks about hiring and working with programmers. If you have a question, please email me at avonelle@lovhaug.com.

    Question: I recently hired a programmer to build custom applications and reports. He is asking me to spend lots of money on a new computer and software. My company isn’t giant – I don’t have lots of spare dollars to spend. But I am willing to fork out some dough if it will help him work faster. How can I tell if these requests are legitimate or a spending spree?

    Answer: It is true that some technologists are happy to spend lots of money on computer hardware and software, especially if it isn’t their own cash. But there are some good reasons why those investments might help your programmer be more productive. Here are the typical reasons for programmer purchases:

    Speed-hardware. Programmers often need to run tools that take up lots of memory and processor cycles. These tools can really clog some computers making them slow and unwieldy. Upgraded hardware can translate to tangible productivity benefits in these cases. For example, if the programmer needs to compile their code about every 15 minutes, and compile time can improve from 2.5 minutes to 30 seconds, that can mean over an hour of gained time a day.

    Speed-software. New technologies can shave significant development time, once the programmer has mastered it. For example, when ASP.NET was first released, it made applications much easier to build than classic ASP. One of my customers asked for a classic ASP bid, but I also provided an ASP.NET bid that was less money and provided more functionality.  This can be tricky to quantify because there is usually an initial productivity hit while the programmer is learning the technology.

    There may also be a  buy versus build argument to consider. Your programmer might ask for a component or tool that they could build themselves. But do you want them to spend the next 3 months building something they could have purchased for $200?

    Support. Nothing lasts forever. Your developer might want to spend money upgrading because the your software is so old vendor support is waning or non-existent. Keeping current on technology will mean smaller regular investments rather than larger expenses that are more difficult to implement.

    So there are legitimate reasons for new technology. But how do you know? Here are some suggestions for clarifying the issue:

    • Ask for business justification for each of the items. An acceptable answer is not: I need it. A good programmer will be able to make the business case.
    • Ask for prioritization of the list so that the items with the most bang-for-the-buck are at the top.
    • Review the specific items. Ask what kind of shelf life he anticipates for those items. Does he think you’ll need to upgrade in a year?
    • Work with the programmer to come up with a plan for the year that takes their major concerns into account in addition to your budgetary constraints.

    Comments (0)

  • 3 Programmer Super Powers that Can Rescue Your Project

    Superhero When you are sponsoring a custom software development project, a lot of things can go wrong. And they will. You may not need super human strength, but there are certainly programmer super powers that will help to save your project from death and destruction.

    Laser vision

    Some programmers can be easily distracted by cool, shiny technical “stuff”. The developer with laser vision can focus on the task at hand and the ultimate objective: completing the project. Laser vision can also help them to see and anticipate what’s coming because it can see through obstacles.

    Nerves of steel

    There are risks on every project, most of which directly affect the programmer. Many programmers hide their eyes, refusing to think about challenges or how to deal with them. For example, I once knew a lead programmer who told everyone for months that he only needed a couple more weeks to complete the project. Problem: his architecture/design was flawed, and he couldn’t face it. The project was only saved when someone else took the reins and faced the hard, cold truth.

    Shape-shifting / Elasticity

    A project in trouble needs people who can respond in flexible ways. Often this can mean thinking in a unique way to find solutions to problems. It can also mean working in a different way or becoming quickly proficient in a new technique. Programmers without this super power attempt to solve problems in the same old ways, even when those ways have proven flawed. Eventually they simply give up. But a shape-shifting programmer will learn something new, or take on a task outside their responsibilities because it needs to get done and no one else can do it.

    Programmers with super powers don’t always show up at the last minute like Batman. So watch for them and hire them before your project starts heading for the cliff.

    Comments (0)

  • Software project lessons from 2001: A Space Odyssey (and 2010)

    "It can only be attributable to human error." --HAL, in 2001: A Space Odyssey

    Sweet, lovable HAL. It is hard not to love HAL with his serene voice and impeccable logic. Still, when he became homicidal we were all glad we weren't stuck on a spaceship with him. But after seeing the movie recently it occurred to me that there are a number of lessons we can learn from HAL and his two movies that apply to software development projects.

    Conflicting objectives are bad. Very bad.

    HAL's fellow Discovery crew mates found out the hard way that conflicting objectives can be dangerous. We learned in 2010 that HAL starting killing the crew because he was given conflicting mission goals and this caused him to become paranoid. But hey, that mistake probably only happened because of government secrecy, right? That wouldn't happen on a typical business project, would it?

    Unfortunately, yes it would and does. Before you start any software project, make sure the objectives are clearly defined, and revisit them periodically to make sure they haven't morphed into something else.

    You have to trust your team.

    The movie 2010 explores a couple of situations where the characters need to build trust. The Soviet astronauts don't trust the Americans. Dr. Floyd doesn't trust HAL. And Dr. Chandra doesn't trust Dr. Floyd. But only when everyone starts trusting each other are the astronauts saved, because they can't save themselves individually.

    Software projects depend a lot on trust. Project managers have to trust that the developers are working hard and making progress. Developers have to trust that the testers are reporting legitimate problems and not making up stuff to look good. Designers and architects have to trust that the information provided by end-users is correct so that the application requirements are accurate. Without trust, everyone spends all their time checking up on everyone else and not getting anything done.

    Things go wrong. Be prepared.

    Bad stuff can happen. In the movies, the bad stuff included a political conflict and a homicidal computer. On software projects, many different things can go wrong. The smartest thing you can do is to consider the possibilities up front, and put a plan in place for mitigating the risk. Here's an example: for some projects, the "go live" date is critical. Customers might be expecting the software by that date, or there might be some other cost to your organization if the project is delayed. If that's true, then have a plan in place to minimize the pain if the project is delayed for some reason. Perhaps you'll need an easy way to communicate with those customers so they don't start calling. You'll feel a lot less stress if you have a plan in place for dealing with problems.

    One final lesson from HAL:

    "I am putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do." --HAL

    Good idea!

    Comments (0)

  • Why you should reveal your budget

    One of the questions on my new client questionnaire is "What is your budget for this project?" Sometimes buyers are uncomfortable sharing their budget amount. Usually they are concerned that the price quoted by the vendor will be inflated to fit their budget, but there might be other reasons (like they honestly don't know yet.)

    I won't say that price inflation doesn't happen. But there are legitimate reasons why you should disclose your budget amount to the vendor:

    Are you a fit for them? It allows the vendor to decide if you might be a good fit for their services. Some vendors only take projects of a certain size. And the truth is that every vendor will have a different price for your custom software project, because pricing is determined by a variety of factors, most unique to the vendor. No sense wasting your time and theirs if you aren't a match.

    Are your budget expectations realistic? Since custom software development isn't your area of expertise, it isn't surprising that so many customers are unfamiliar with software pricing. Craigslist is littered with buyers describing projects like an Amazon.com clone for < $500. Discussing your budget with the vendor can help both of you to know if the ROI for your project is worth it.

    Customization to your needs. Often a vendor can tailor the solution to your budget. For example, they might say: I can give you shopping cart functionality for that price, but product reviews would fall outside of the budget.

    Okay, but what about price inflation? Here are some thoughts:

    Context is helpful. Some customers have a fixed budget, and would love to add more features if they can be included. Other customer would prefer to pay less for the minimum software requirements. Don't just quote the vendor a price - tell them about your other constraints and objectives. A good vendor understands that all businesses have different needs and objectives and will respond accordingly.

    Provide a range. Why not provide a budget range instead of just a single number? This tells the vendor what your upper limit might be, but also shows them that you'll be happier if the quote is lower.

    Ask for options. Suggest to the vendor that their quote should include both a bare-bones, minimum feature option and a more full-featured alternative. That will give you some choices to consider, and will help you to answer the question "how important is it to me that the software allows the users to change the color of every form of the application?"

    Comments (0)

  1. 1
  2. 2
  3. 3
  4. 4
  5. Next page