Automated Testing for Solo Practitioners

28 03 2007
buy cheap doxycycline online cheapest synthroid prices xanax without prescription cheap prozac tablets cheap tramadol acomplia zithromax pharmacy tramadol without a prescription phentermine pills buy generic accutane where to buy cialis cheap zoloft online doxycycline prices cheap generic phentermine nexium online cheap cheap synthroid tablets acomplia online nexium pills buy cheap propecia buy plavix buy diazepam without prescription accutane online stores accutane cheap cheap generic viagra clomid without prescription cheap plavix buy bactrim without prescription tramadol online phentermine without prescription buy synthroid diazepam online stores discount diazepam nexium online stores bactrim online stores order diazepam purchase lasix online purchase lorazepam bactrim prescription buy cheap tramadol zithromax online cheap acomplia generic phentermine plavix for sale cheap plavix tablets cheap tramadol tablets pharmacy lasix lasix sale pharmacy diazepam buy doxycycline accutane prices buy cheap phentermine lasix prices buy cheap nexium synthroid for sale plavix discount buy doxycycline cheap lowest price alprazolam cheap lorazepam online nexium cheap cheap generic cialis discount propecia pharmacy prozac soma discount soma online buy generic flagyl discount nexium cheapest tramadol prices discount viagra levitra generic buy accutane cheap synthroid pharmacy where to buy phentermine acomplia pills viagra sale bactrim pharmacy buy accutane without prescription lowest price acomplia buy lorazepam cheap buy phentermine without prescription diazepam for sale cheapest clomid valium prices buy prozac online tramadol sale clomid online synthroid cheap cheap alprazolam online order soma online buy zithromax phentermine no prescription where to buy lorazepam accutane online where to buy bactrim propecia cheap cheapest valium prices pharmacy lorazepam bactrim for sale price of soma buy cialis order bactrim online lorazepam without prescription zoloft without prescription lowest price diazepam pharmacy clomid cheap propecia buy levitra cheap purchase soma online purchase prozac order zithromax valium no prescription valium prozac prices nexium generic zoloft cheap cheap generic prozac order doxycycline online diazepam pills levitra accutane no prescription buy lorazepam tramadol prices online doxycycline where to buy synthroid buy alprazolam online alprazolam prescription zoloft buy cheap flagyl online zithromax pills online valium acomplia cheap plavix pills cheap zithromax online levitra online stores lorazepam pills order flagyl online doxycycline prescription cheap lorazepam buy acomplia discount acomplia cheapest prozac prices alprazolam without a prescription online synthroid cheap phentermine tablets alprazolam order clomid online cheapest diazepam prices zoloft for sale viagra pharmacy buy cheap lorazepam online clomid online cheap pharmacy tramadol buy cheap soma purchase clomid online cheap doxycycline purchase prozac online purchase cialis flagyl prescription diazepam prices viagra online stores accutane prozac pharmacy bactrim generic buy zoloft without prescription lowest price flagyl clomid pills buy clomid online cialis pharmacy pharmacy phentermine price of clomid buy acomplia online price of prozac phentermine online tramadol buy lasix online levitra without prescription buy cheap xanax online cheapest propecia prices cheapest acomplia prices buy lorazepam online cheap generic xanax accutane without a prescription synthroid without prescription order plavix flagyl without a prescription buy generic clomid lowest price lorazepam order soma order zoloft online propecia sale synthroid discount pharmacy cialis price of lasix prozac pills tramadol without prescription valium pharmacy purchase zoloft online buy cheap lorazepam accutane for sale lowest price clomid levitra no prescription synthroid sale nexium prices lowest price nexium generic lorazepam purchase synthroid xanax online cheap purchase bactrim cheapest alprazolam synthroid generic cheap xanax cheap generic acomplia buy cheap lasix online accutane pharmacy alprazolam pills cheap valium online lowest price cialis plavix generic buy levitra online tramadol online stores buy cheap nexium online zithromax lorazepam online stores acomplia no prescription lorazepam cheap bactrim no prescription buy plavix online lasix generic purchase clomid buy cheap zoloft online buy generic xanax doxycycline online cheap lorazepam online cheap cialis online cheap zithromax for sale generic lasix cheapest synthroid generic nexium purchase phentermine online prozac generic order prozac online clomid prices where to buy tramadol price of phentermine phentermine prescription lowest price propecia cialis online stores discount plavix cheap diazepam soma generic cheapest viagra prices cheapest bactrim prices buy cheap flagyl lorazepam pharmacy buy diazepam online propecia discount buy valium buy zithromax without prescription buy generic tramadol order levitra valium discount nexium online discount doxycycline bactrim cheap propecia prices plavix prices online nexium clomid generic synthroid buy cheap prozac online lasix online stores buy cheap valium online cheap xanax tablets xanax without a prescription buy soma online cheap phentermine online where to buy prozac where to buy alprazolam buy cheap plavix online order phentermine generic clomid buy tramadol cheap prozac cheap propecia tablets generic xanax purchase zithromax levitra online purchase viagra propecia generic generic synthroid buy cheap alprazolam online where to buy propecia acomplia without prescription cheapest diazepam order lorazepam xanax discount where to buy zithromax cheap diazepam tablets price of cialis cheap generic lasix order flagyl buy clomid without prescription diazepam online cheap order accutane zithromax without prescription doxycycline cheap lasix online cheap cheapest plavix alprazolam online buy cheap clomid online buy generic zithromax levitra for sale buy cheap acomplia doxycycline online stores purchase flagyl online nexium generic plavix pharmacy nexium price of alprazolam purchase nexium online buy generic cialis cheap flagyl tablets buy cheap bactrim online buy alprazolam cheap soma sale buy generic synthroid phentermine sale plavix pharmacy buy viagra online xanax purchase cialis online pharmacy flagyl alprazolam no prescription cheapest bactrim buy cialis online clomid sale flagyl online stores tramadol pills propecia online cheap lowest price tramadol cheap valium tablets price of viagra clomid no prescription synthroid pills order doxycycline nexium sale order cialis price of zithromax buy nexium cheap alprazolam for sale discount valium buy generic acomplia generic tramadol plavix without a prescription online clomid cheapest lorazepam prices lasix without a prescription order levitra online cheap cialis online online soma cialis no prescription buy propecia zoloft discount lowest price lasix cheap prozac phentermine generic cheapest levitra levitra pharmacy clomid pharmacy bactrim prices acomplia online cheap where to buy diazepam cheap generic levitra accutane sale tramadol discount cheapest doxycycline purchase acomplia online accutane online cheap cheap generic tramadol price of bactrim order lorazepam online order xanax online purchase levitra flagyl online valium for sale cialis plavix sale cheap levitra tablets price of zoloft purchase viagra online cheap generic zoloft flagyl discount prozac prescription soma pharmacy propecia order propecia online price of flagyl online levitra price of doxycycline bactrim propecia without a prescription acomplia prescription order synthroid zoloft online cheap flagyl sale buy synthroid cheap buy lasix without prescription zoloft without a prescription alprazolam sale buy tramadol without prescription prozac without a prescription flagyl generic buy propecia online cialis prices purchase lasix cheapest nexium purchase diazepam buy lorazepam without prescription buy cialis cheap lorazepam no prescription where to buy accutane xanax online zithromax discount prozac discount synthroid prescription lowest price bactrim discount zithromax accutane generic buy generic bactrim order valium online buy generic lorazepam cheap generic flagyl where to buy zoloft purchase accutane online discount phentermine plavix cheap zithromax cheap cheap generic lorazepam viagra cheap xanax online purchase bactrim online generic valium propecia online stores flagyl pharmacy lowest price valium buy synthroid without prescription cheap viagra online buy cheap lasix cheap doxycycline tablets levitra cheap online alprazolam diazepam pharmacy cheapest nexium prices purchase acomplia xanax pharmacy propecia pharmacy cheap accutane online valium without prescription cheap alprazolam purchase propecia purchase diazepam online cheapest phentermine prices generic zoloft order tramadol clomid online stores plavix no prescription price of synthroid cheap generic propecia cheapest tramadol order alprazolam online buy alprazolam without prescription buy cheap cialis discount levitra where to buy valium cheap prozac online cheap generic soma lorazepam generic buy flagyl cheap price of propecia lowest price soma order acomplia online lowest price viagra buy doxycycline without prescription cheap zithromax tablets flagyl no prescription diazepam without a prescription cheap levitra online prozac online cheap levitra without a prescription buy generic doxycycline buy prozac cheap phentermine for sale buy bactrim cheap pharmacy zithromax cheapest flagyl where to buy flagyl acomplia online stores buy lasix cheap buy cheap propecia online cheap soma cheapest accutane prices pharmacy alprazolam lasix pharmacy cheap zithromax viagra prescription zithromax without a prescription online accutane cheap lasix online acomplia generic cheap flagyl cheap clomid tablets order lasix online cheapest alprazolam prices buy nexium buy cheap clomid synthroid without a prescription accutane pills buy clomid diazepam sale bactrim sale lorazepam cheap doxycycline online valium pills buy soma cheap buy lasix phentermine online stores buy synthroid online online lorazepam lasix no prescription buy generic propecia xanax for sale cheapest zoloft prices buy phentermine cheap plavix online cheap bactrim cheap viagra tablets viagra without prescription cheap generic diazepam buy zoloft cheap order accutane online cheapest soma prices clomid cheap viagra prices phentermine cheap nexium pharmacy discount synthroid lorazepam prices buy xanax flagyl cheap cheap generic doxycycline buy cheap levitra prozac no prescription buy zithromax cheap discount lasix discount tramadol prozac without prescription discount cialis cheap lasix soma prices online phentermine buy propecia without prescription cheap diazepam online online diazepam plavix online cheap order bactrim where to buy soma cheapest xanax prices buy cheap xanax xanax prices cheap clomid online prozac online lowest price zithromax online bactrim cheapest cialis valium online stores synthroid online stores zoloft prices generic acomplia xanax cheap diazepam discount viagra online purchase tramadol online valium without a prescription order zithromax online doxycycline no prescription tramadol clomid for sale pharmacy soma viagra discount synthroid online cheap purchase propecia online viagra online cheap cheap valium cialis without a prescription discount prozac lasix online levitra online cheap cheap soma online buy levitra without prescription buy flagyl online buy cheap zithromax online acomplia discount where to buy plavix cheapest soma soma online cheap nexium without a prescription purchase alprazolam zoloft online tramadol no prescription cheap phentermine online cialis zoloft online stores phentermine online lasix pills valium sale cheap bactrim online clomid prescription generic viagra levitra pills purchase xanax online buy bactrim pharmacy plavix buy cheap diazepam accutane prescription buy cheap diazepam online buy nexium online cheap lorazepam tablets cheap alprazolam tablets price of valium buy cheap synthroid online discount bactrim lasix without prescription generic alprazolam flagyl without prescription online xanax viagra no prescription generic zithromax levitra prices generic cialis buy cheap phentermine online buy clomid cheap buy xanax cheap cialis online buy generic viagra doxycycline discount order clomid online propecia cheap plavix online purchase valium online cheap zoloft generic propecia lorazepam discount buy cheap soma online buy cheap prozac phentermine prices xanax pills online prozac prozac online stores acomplia pharmacy acomplia prices buy viagra lowest price doxycycline cheap acomplia online cheapest levitra prices buy cheap doxycycline buy cheap tramadol online propecia prescription zithromax generic buy tramadol price of plavix lowest price phentermine prozac sale buy alprazolam cheap generic clomid cheapest accutane discount soma purchase synthroid online buy generic plavix doxycycline generic purchase plavix xanax prescription valium generic bactrim online cheap purchase lorazepam online buy xanax online alprazolam online stores price of acomplia zoloft prescription soma pills generic levitra cheap synthroid discount zoloft alprazolam pharmacy viagra cheap cheap accutane cheap generic bactrim buy phentermine online buy flagyl buy levitra cheapest acomplia buy generic phentermine price of tramadol buy cheap zithromax cheap lasix tablets buy plavix cheap nexium discount tramadol pharmacy purchase accutane phentermine online cheap buy cheap acomplia online cialis cheap lasix for sale cheap flagyl online nexium no prescription cheapest lasix prices pharmacy xanax buy tramadol online alprazolam without prescription buy zithromax online order nexium viagra generic buy generic valium where to buy acomplia acomplia without a prescription buy cheap viagra pharmacy levitra order phentermine online buy flagyl without prescription buy accutane buy cheap alprazolam purchase zithromax online lowest price prozac lowest price accutane doxycycline sale bactrim without a prescription alprazolam online cheap cheap generic zithromax pharmacy bactrim levitra discount cheapest plavix prices buy cheap synthroid purchase doxycycline online buy cialis without prescription generic bactrim buy zoloft online synthroid prices propecia online cheap acomplia tablets buy cheap zoloft doxycycline pharmacy cheapest prozac cheap viagra cheap nexium online price of diazepam cheap generic plavix cialis prescription xanax online stores soma prescription plavix without prescription soma for sale lowest price zoloft cheapest zithromax prices cheapest zithromax buy generic alprazolam lorazepam for sale alprazolam generic cialis for sale cheap tramadol online cheapest cialis prices synthroid online order tramadol online buy viagra without prescription order viagra online zithromax no prescription order plavix online flagyl pills cheap cialis tablets cheap clomid diazepam generic buy generic nexium purchase alprazolam online flagyl propecia pills viagra without a prescription propecia for sale cheap cialis flagyl for sale prozac cheap diazepam without prescription zoloft sale order viagra accutane discount doxycycline for sale valium prescription lorazepam online bactrim discount cheapest valium order zoloft alprazolam cheap zoloft generic buy prozac without prescription purchase phentermine online lasix online flagyl cheapest propecia lorazepam sale order synthroid online valium online cheap purchase doxycycline cialis discount lowest price plavix purchase xanax zithromax prices pharmacy propecia buy prozac doxycycline cheap generic synthroid purchase tramadol pharmacy viagra cheapest xanax soma cheap generic accutane soma no prescription order lasix price of nexium buy valium without prescription buy cheap accutane xanax generic doxycycline without a prescription buy cheap levitra online synthroid no prescription cheapest phentermine valium online buy generic levitra cheapest doxycycline prices prozac for sale plavix online stores purchase levitra online lorazepam without a prescription zithromax online stores lasix prescription buy cheap cialis online buy valium online pharmacy zoloft pharmacy doxycycline price of accutane cheapest clomid prices clomid without a prescription valium cheap acomplia sale bactrim without prescription zoloft pharmacy levitra prescription tramadol cheap buy viagra cheap cheapest zoloft buy soma cheap propecia online flagyl online cheap cheap generic alprazolam cheapest lorazepam buy diazepam purchase soma soma without a prescription buy generic diazepam buy cheap viagra online cheap levitra cheap generic valium purchase zoloft order prozac plavix zoloft no prescription discount xanax pharmacy valium clomid discount cheap accutane tablets accutane without prescription soma without prescription soma cheap propecia no prescription propecia without prescription zithromax prescription pharmacy accutane cheapest viagra buy bactrim online diazepam cheap order acomplia buy generic zoloft order valium cheap soma tablets xanax sale buy generic soma viagra for sale cheap zoloft tablets lorazepam prescription diazepam prescription price of xanax nexium without prescription order diazepam online discount flagyl where to buy lasix pharmacy synthroid cheap nexium tablets buy cheap valium generic prozac buy xanax without prescription zithromax sale cheapest lasix bactrim pills lasix where to buy xanax diazepam online order xanax doxycycline pills purchase nexium phentermine pharmacy cialis pills buy doxycycline online buy soma without prescription lowest price levitra clomid alprazolam discount buy phentermine buy generic lasix buy acomplia without prescription cheap bactrim tablets discount lorazepam zithromax online cheap buy diazepam cheap generic soma order propecia generic diazepam order nexium online tramadol online cheap purchase plavix online lasix discount online viagra alprazolam prices phentermine discount where to buy levitra acomplia for sale soma online stores buy cheap bactrim bactrim online price of levitra generic accutane buy cheap accutane online order cialis online nexium for sale where to buy nexium price of lorazepam buy propecia cheap doxycycline online levitra sale cheap nexium cheapest flagyl prices cialis without prescription buy nexium without prescription discount accutane where to buy viagra zoloft pills where to buy doxycycline tramadol for sale buy zoloft tramadol generic cialis sale where to buy clomid online zoloft cheap synthroid online buy accutane online nexium prescription purchase flagyl flagyl prices buy generic prozac discount alprazolam diazepam no prescription buy cheap plavix viagra pills phentermine without a prescription buy valium cheap generic flagyl cialis generic online zithromax cheap generic nexium doxycycline without prescription lasix cheap online plavix buy plavix without prescription generic doxycycline plavix prescription buy acomplia cheap diazepam xanax no prescription discount clomid purchase valium online acomplia lowest price xanax tramadol prescription pharmacy acomplia lowest price synthroid order alprazolam

Yes, writing tests up front is time-consuming and not directly contributory to the final code. But writing the tests is like filling your auto’s tank with gas before starting a long trip. It will save you from the frequent stops you’ll have to take without it.

If you’re using a compiler, you’re likely already using automated testing as they perform static type checking. You have to declare the variable before using it, along with its type specifier. You have to use casts for parameters and assignments when the types don’t conform to the prototypes.

You’re content, for the most part, to use static types in your code because they eliminate an entire class of defects and reduce time you’d have to spend debugging for them.

Unit Tests and Assertions
Don’t use just unit tests to verify the production code works as expected, but also assertions within the production code to verify parameters and environment meet assumptions.

What to test
Interface - can be part of TDD
Parameters
Errors
Results



Marketing Action Plans for Blazing Your Own Path

28 03 2007

There are so many excellent items from Mark Mayerson’s site. The ones I’m passing along here are of interest to microISVs and other entrepreneur types, but I recommend you just subscribe because they’re all noteworthy.

Paraphrasing the first item, the heads of large media companies can’t tell what audiences want. So they produce all this content and then try marketing gimmicks and special effects to ram it down your throat.

Here’s the kicker:

They’re stuck having to guess what creative properties will attract that audience. If you can attract your own audience, you’ve beaten the system.

The point for entrepreneurs is not to follow the examples of the big guys, trying to sell another spreadsheet or social networking site, but to sell your own story. Then you won’t need to use pricing, or coupons or marketing gimmicks to win customers.

The last link to Mark’s site I plan to post for a while is a pointer to some really good specific marketing ideas from a guy named Scott Kirsner. Boiling it down, the principles behind his action plans are develop for niche markets and be part of the community you’re marketing to (and market to the community you’re part of).



Developing Niche Brands

28 03 2007

Mark Mayerson points to a great marketing piece which he argues should be applied to animation studios. But since the strategy is for large companies to create brands to give the impression of being smaller, it is even more likely that niche brands applies to microISVs, which are already small, as well.

Supporting the small, independent craftsman has always been a core value of society. Well, it became a social value after the advent of the Industrial Age because there was no alternative to independent craftsmen beforehand. And now globalization and fears of the rising power of multinational corporations deepen the sense of helplessness when dealing with large, bureaucratic companies. These feelings, combined with idealized, romantic notions of supporting indies, lead buyers to prefer the intimacy inherent in patronizing the little guy.

It’s an important, albeit subtle, reason why the Mac is gaining marketshare, and it can be an important leverage in marketing your products. Combining Long Tail product development (lots of niche products and brands) with the social epidemic of network economies (AKA The Tipping Point) can help independents prosper and remain so.

[Update - 2007/04/19] I found Chris Anderson had written a couple of Long Tail entries regarding software before. They and the comments and trackbacks they contain are a great reminder of the importance of product differentiation and mean a lot more work for the microISV to exploit the advantages being opened up to us.



Publicity for your efforts

28 03 2007

I found this blog posting through Mark Mayerson’s site.

It applies to any media, whether a blog or Internet site and larger media outlets such as television or magazines, in addition to newspapers.

Know the writer’s outlet and market interest. If it’s an interview, prepare the bios and other info they can incorporate into their article. If it’s a product review, incorporate some background info on your company, the product and the market niche. If it’s a business article, write a list of ways they can save money, make more sales, make people happy or whatever the writer’s audience needs to do to achieve success.

Simplify the writer’s job to where the article “writes itself.” Sadly, that means you’ll have to do most of the writing, but that way you’re more likely to get the press you’re looking for.



Measure Once, Cut Once

28 03 2007

Measurements are an integral part of the testing process. In manufacturing processes, they provide an indication of how the final product will turn out. If the temperature is too high, resins will become too fragile. If raw materials are left in the open air too long, the loaves of bread won’t have the right texture.

Note the variation that was acceptable at the most commercially successful, and highest quality, studio at the time. And yet they still measured raw output. Other studios enforced a more inflexible production quota (bean counters!), and their work suffered as a result.

Measurement is an indirect means of testing the velocity and quality of a process, and is as valid for software development as it is for animation.



Where are the Training Wheels?

28 03 2007

Ian Baird posted an interesting link in the #macsb channel last night. The author asks why we don’t make use of simulators and design tools when writing software.

There are several reasons why.

Programmers don’t want to change the way they work.
Mythical super-programmer. Cowboy. Lone wolf. We tend to adopt the hubris of our heroes even though we haven’t attained their level of achievement.

Major is Minor. Programmers don’t design software in an architectural sense. There is no grand scheme, no big wall of interaction diagrams used to document how classes and objects interact. We tend to design on a bottom-up basis. The design is embodied in the text we write. The documentation is the code.

Minor is Major. Programmers like to focus in discrete units of code we can parse at once. The smaller the unit we can interact with at once, the smaller the unit of code we write. Functions, or modules, have been shrinking as we’ve moved from punch-cards and printouts to TTYs to GUIs. It isn’t just that we’ve learned that reducing function size and behavior improves comprehension. The fact is the reduced visual workspace requires us to improve code comprehension!

Code operates linearly, or sub-linearly if you compact several statements onto a line or make abundant use of ternary operators. Programmers love to do that because it’s detailed. We love cute little tricks like obfuscation because they’re details. But it isn’t readable, and it isn’t professional.

Programmers are the detail-oriented, step-by-step kinda guys whose focus is on the specifics. We hate ambiguity. We have to understand things before we’ll do anything. This is why any design document on a system’s organization quickly degenerates into the use of linked-lists or DB schema or some such implementation details irrelevant during the planning stage. It’s why programmers argue incessantly over trivial issues and attempt to refute assertions with minutiae. It’s also why debugging involves figuring out the why one part of the system clobbers another: we forget the details of other pieces and how they interact.

This is the main reason why different languages rise to prominence over time: each offers a new level of detail the prior language did not. It introduces some abstraction, paradigm or need that is unmet in the old language and its repertoire of code.

Programmers are afraid to change the way they work.
We already have UML and Nassi-Schneider diagrams and flowcharts. Some programmers might draw one up for a quick back-of-the-envelope idea of how to get the function to work, but they’re not an integral part of the development process. The documentation isn’t kept around. The writing tools used by programmers is little better than the tools used by other writers of fiction. Look at the markings on a printout of code and you’ll realize there’s been little changed from the techniques used from before the time of Shakespeare. Why is this?

Programmers can’t change the way they work.
It’s because programmers are literally oriented. Both literally and figuratively. As our tools are text-based, the persons attracted to the profession are people who think literally, and not visually.

As much as programmers have changed the way other professionals work, there’s been little acceptance for the transformation of our own industry. Text-oriented tools attract text-oriented people who write more text-oriented tools and keep the cycle repeating.



Bullying FTW!

28 03 2007

All that is necessary for the triumph of evil is that good men do nothing. — Edmund Burke

Abandoning the blogosphere because of the presence of bullies and criminals only serves to satisfy and embolden them.

Pain is the deterrent to repeated offenses. Whether it’s emotional or physical, the effect of swift and proper punishment is to reduce the likelihood of the offender to carry out unwanted behavior such as this in the future.

But once the punishment has been dealt, drop the issue. Bullying the bullies will, in the long run, serve to justify their actions in their minds and aggravate their behavior.

Just remain vigilant against this behavior in the future and punish again if the individuals continue these despicable actions.



Der Fuerher’s Face

27 03 2007

I read about Der Fuehrer’s Face when I was younger.

Later, in high-school, one of my teachers had old radio programs on cassette and I got into Spike Jones Spike Jones. One of his tunes was called Der Fuehrer’s Face Spike Jones & Spike Jones & His City Slickers - Spike Jones: Greatest Hits!!! - Der Fuehrer's Face that I found hilarious.

Today I found the connection. Wow.



Understanding Tipping Point Principles in Developing Your Viral Marketing Campaign

26 03 2007

A Tipping Point is a pattern observed in nature in which some property or object slowly grows or is propagated among a population until it reaches some critical point or vector, after which its growth rate experiences a sudden rapid increase within the population.

It must be noted that the Tipping Point isn’t something that exists, but is a phenomena observed in some system as a result of a simple change, or compound changes, in the system.

For the TP phenomena to occur four elements must be present: 1. Some signal, force or influence to be transmitted. This signal may be a virus, an idea, or any creature of nature. 2. Some population or system of connected nodes in which the signal is propogated. 3. Some means of reproducing or propagating signals among the members of the population. 4. A force or effect which inhibits the reproduction of the signal or removes it from members of the population.

Your message, the signal you want to be copied throughout the network, must resonate in some way with a member of the population for it to be repeated to other members. The better tuned it is, the more likely it is to propagated, and even amplified. Often the original message gets distorted, filtered, reshaped, or altered in some other way when passing from one member to another. The change may be what is needed for the essence of the message to find ready adoption throughout the population, both being easier to replicate and circumventing the signal inhibitors in the system.

Sometimes, it isn’t a change in the signal which has the impact, but external factors: temperature changes, prices of commodities, international events that alter the importance of certain signals over others.

When you develop your marketing message, keep these four elements in mind. Test that your message is tuned to your market, is easily propagated and isn’t negatively distorted by the current state of the system.



Pair Programming is for Wusses

25 03 2007

I said it.

The sacred ritual of XPers is a relic and an obstacle to improving a team’s agility.

By way of explanation, let’s examine the definition of pair programming and its application.

In the first edition of Extreme Programming Explained, Kent Beck, gave this definition for pair programming:

A programming technique where two people program with one keyboard, one mouse, and one monitor. In XP the pairs typically change a couple of times a day.

(It used to be preached by the XP true believer that the pair must be physically present in the same location with one keyboard and one monitor to be effective, but this is no longer considered sacrosanct.)

The People, Projects and Patterns wiki gives an elaborated definition:

An ExtremeProgrammingPractice in which two engineers participate in one development effort at one workstation. Each member performs the action the other is not currently doing: While one types in UnitTests the other thinks about the class that will satisfy the test, for example. A single, unsubstantiated, unscientific, undergraduate’s survey has shown that, after training for the “PeopleSkills” involved, two programmers are more than twice as productive as one for a given task.

In this practice, the programmer operating the keyboard is often called the “driver” while the programmer considering a larger context for the code is “navigating” (as someone who follows maps and charts).

The key value-add of pair programming for agile development is communication: the ability for both programmers to share skills, domain- and system-knowledge and receive immediate feedback on the direction of their work. The state of the system is advanced as the skills and knowledge of the pair are raised.

All is Not Rosy in the Land of XP
Let’s examine the speed barrier posed by having both programmers being mindful of the development effort they’ve been assigned. As one programmer is driving the other is navigating, focusing on the code within the context of a greater part of the system. If he’s thinking about the bigger picture he isn’t focused on reviewing the keystroke-by-keystroke typing of his partner. So how often must he take the time to review the code written by his partner? Every other second? Every minute? Every half hour?

Sometimes, “Trust me.” is a suitable non-maskable interrupt, effective for a few minutes of coding while the navigator doesn’t know what’s being done. Those few minutes should be hours and days of which that programmer should drive his own stories and trust the tests and reviews and the training the other programmer has and the process itself will keep itself defective code in check.

Why Pair Programming Slows You Down

More People Requires More Communication
The fact you have at least one pair of programmers means they’re going to have to communicate. This is the key problem pair programming solves, but this method of communication is the bottleneck to doing it well. Since they don’t communicate via documentation, they’re going to have to sit in on each other’s work time. This adds some overhead of communication time to the work time.

Interruptions Hamper Productivity
When you are focused on one task, certain details are of more importance than others. As your mind ignores the details which aren’t essential to the primary objective you begin to function in the “flow” or “zone”. If you have to perform a mental context-switch to focus on the details of something other than your primary objective you can lose the intensity of that flow. This becomes far more frequent when paired with someone who is focusing on another aspect of the code or system.

Entropy and the Law of Diminishing Returns
As team members become more acquainted with the workings of the system, there is greater overlap of skills and knowledge and less insight to be gained from working on one development effort. This results in less productive use of each programmers’ time. It would be better to have each programmer work on different stories or different tasks for a given story.

Limited Scalability
With pair programming’s emphasis on communication, it readily becomes apparent that information will be slow to disseminate throughout a project when limited primarily to this practice. In addition, the more ambitious a project is, the less an organization is able to operate in an agile manner when constrained by pair programming. No matter how many experienced XPers you throw at a project, when you’re required to divvy them up into pairs you’ve locked your programmers into limited gains. Two is the bottleneck for communication and productivity gains rather than five or eight.

Insecurities, Arrogance and Disrespect Breed Competitive Friction
An antagonistic partner will undermine the effectiveness of what should be a cooperative endeavor. However, this point should only be considered a temporary issue for teams which are adapting to agile practices, or for members who should be considered temporary team members.

So Pair Programming is Evil?

Definitely not! It is a practice used by many fields, including software development, with great success. It should be common in every team as it has distinctive benefits for every development effort. In fact, XP uses pairing on occasions other than just for coding. A programmer will pair with a customer when writing stories. And a customer will pair with a tester to write acceptance tests. But pairing has limitations in benefits and effectiveness.

Pair programming is most effective:

  • When the skills of both programmers are slightly to moderately dissimilar.
  • When knowledge of the system between the two programmers is highly dissimilar.
  • When the story being coded hasn’t already been scripted, (i.e., the pair is designing on the fly).
  • When the team isn’t agile enough to break down assignments by functionality (e.g., test cases, coding, reviews).

Given that there are times when pair programming is effective, and times when it isn’t, it should seem reasonable to most to pair when it is more effective than programming alone, and not to when it isn’t. Because the key to agile development is being that: agile. The problem is when you fail to exercise common sense when using any practice, even ones enshrined in holy scriptures.

With whom should you pair? How often should you pair? and how long should a pairing session be?

“Begin at the beginning”, the King said, gravely, “and go till you come to the end; then stop. ”
— Lewis Carroll