Something that will, sadly, not be a secret to many of you: Some people are awful.

Even if you think it’s acceptable to be a rude arrogant jerk to people in private, (and would you want, as queer person, to work with someone you know donates heavily to prevent marriage equality, even ‘in private’?) it’s very hard to argue that it’s OK in professional life.  Open Source is no longer just a fun hobby; it’s a professional reality that you will use and (hopefully) contribute to Open Source.  Unfortunately there are people in many many projects, often in significant roles, that will say things that are cruel, hurtful, that erase and trivialise people’s identities and personal triumphs and disadvantages.  They’re being bullies ‘at work’.  That’s super NOT OK.

One of the best ways to make communities professional and welcoming to beginners, as well as enhancing diversity, is to adopt and enforce a Code of Conduct.  Ashe Dryden answers all of the questions you might have about why and how far better then I could, but I want to re-enforce five things:

  1. Having a (good) Code of Conduct makes your project more welcoming to everyone willing to not be a prat.  Diversity is at the heart of the Internet
  2. Code of Conduct violations are not about being offended, they are about being unprofessional
  3. You may have a right to freedom of speech but there’s no right to freedom of consequences
  4. If there’s ‘no problem’, then there’s no harm in adopting a Code of Conduct!  (Spoiler: there totally is a problem)

And number five:

  objection.text = "but you're discriminating against my right to discriminate!"
rescue RediculousCircularObjectionException => e
  objection.objector.judge :pretty_harshly
  objection.objector.rebutt "Really? Really. You think that's a coherent argument?"

You know who’s not awful? Coraline Ada Ehmke.  She’s actually really great.  She’s proposed a Code of Conduct for Ruby Core (and wrote the original Contributor Covenant) and you can find that proposal here.  All y’all with Core Ruby accounts should go support it.

What do we have to lose?  Awful people, that’s what.  HUZZAH!


In my first Sound and Fury post I flat out said that people who leave negative Open Source comments are bad people and sucky developers.  This isn’t a retraction, I still totally think that.  I just wanted to share.

This here project is a brilliant solution for FLOSS.  Echo Chamber adds commenting forms that never post anywhere but local storage.  The hate-vomiting suckmonkey thinks their petty, egocentric bile is being heard and no-one else even knows it exists.  No server load.  No moderating.  Blissful, peaceful silence.

My comments, BTW, are actually on, so feel free to start a discussion with me here or on Twitter as @DylanLacey.




Internet Comments, am I right?

They’re occasionally a useful source of discussion (usually in curated communities or niche content) but mostly, they’re a swirling cesspoll.  The comments are where people write hateful, toxic vitriol.

On YouTube this is often in the form of attacks on the presenter.  Open Source projects, though, tend to get more… religious.  Your product isn’t their favourite product and thus must be purged.  They want a feature from the thing you made and gave them for free and DAMN HOWDY if you aren’t the worst person alive for not giving it to them.  They don’t understand how to use it and so you must perish.

If you leave pointlessly negative comments on Open Source projects, screaming demands or trashing the free work people have done for you, then as far as I’m concerned you suck as a developer and you’re a bad person.  I have more respect for the noobiest of noobs then I do for people who piss all over others in Open Source.

I’d never hire anyone who made their team-mates feel bad when they wouldn’t do something optional for them.  I’d never hire someone who yells at others rather then fixing bugs, who acts like they’re entitled to things, who can’t interact professionally in public situations.  As far as I’m concerned, you’re not a good developer if you do those things, you’re a terrible staff member who happens to be OK with development.

Being a good Open Source citizen in the venues you use it is, in my mind, a defining characteristic of good devs.  “GitHub Resumes” aren’t useful just because they show your work style but because they show your workplace style.  How you’ll get along with others.  Whether I can trust you to not ruin my team.  If you’re helpful and good at communicating and compromising and not a complete dickhead.

(Corollary: If you defend people who do this because they’re productive or talented or useful for the project, you’re also a sucky developer and a bad person.  We don’t let famous surgeons ignore ethics no matter how brilliant.)


Print Media is somehow still a thing

Even print media about rich people making more money is still a thing, which probably says something about who those people are and their attitudes to change. Yes, that’s an Old White Men joke.

But print media knows the end is nigh and has moved online as well as being available in print, and Fortune magazine is no exception! It’s even writing articles about these shiny new technical whatzcalits, like a recent article, ‘Why APIs will save your business from getting “Uber-ed”‘.

Oh, sweet fish sauce, that article. It’s… you don’t… I started making fun of it on Twitter then quickly realised there was just too much and you, Dear Reader, would be better served by a blow-by-blow commentary. Fair Use Away!


Why APIs will save your business from getting “Uber-ed”
It’s no longer about what you build alone. It’s about how you smartly incorporate what others have built.

I am seeing a technology shift that only happens every 10 to 15 years – one in which companies will become “composites” of other companies.

(Like how, 10 years ago, Apple become a composite of Swarovski, Swatch and 90s era Sony, or how Alta Vista became a composite of Betamax and Crystal Pepsi)

Uber is a perfect example. It didn’t have to build its own mapping, payment, or communications services. Instead, Uber is a composite of what it considers the best of those programs and more — Google Maps, Braintree (payment), Twilio (for mobile SMS), Oracle, etc. Uber was able to quickly connect to these systems using little pieces of code called APIs.

(Yes, the API itself is a tiny chunk of code you just put in your own code and magically, billing happens)

MuleSoft is in the business of APIs, and today’s announcement of MuleSoft’s latest $128 million financing round at a $1.5 billion valuation is evidence that this trend is more than gathering steam. [Disclosure: I am an early venture investor in MuleSoft.]

(Disclosure: The only way I can made money from my API middleware As A Service investment is convincing you all that your existing APIs are in fact legacy ‘integrations’ instead)

Companies pursuing API-led connectivity strategies include MasterCard, Unilever, Nestle, Tesla, Intuit, BSkyB, Verizon, News Corp and Sutter Health. This shift it is only possible because of a once-in-a-generation convergence of megatrends: cloud, mobile, and the “Internet of things.”

(API-led connectivity strategies: much better then those old ‘protocol’ and ‘carrier’ based ones.  Also mega is _last_ generation’s slang.  The hipster generation prefer ‘whatevertrends’)

If you’re not taking full advantage of this trend, your organization could be “Uber-ed” and out-innovated, just like the taxi companies have been. Uber has upended the global taxi industry in large part by using APIs masterfully. In just a few short years, Uber has become seemingly ubiquitous and is reportedly valued at $50 billion. The old-world taxi companies are struggling to compete with this API-savvy juggernaut. You don’t have to be in the transportation industry to be Uber-ed. Any business without a viable API strategy stands to be altered on this scale.

(This is so blatantly wrong it’s being funny _for_ me.  Taxi services weren’t out-innovated because of Uber’s mystical oneness with the API universe. They were out-innovated because they didn’t try to innovate at all. They still don’t; Their reaction has been to try to legislate, sue and bully Uber out, not try to fix their product and compete.  This is like saying a greasy sidewalk hotdog grill gets less customers on a date then a fancy restaurant because the restaurant’s supply chain is faster)

Why CEOs Should Care

(They shouldn’t)

Companies are currently spending more than $590 billion per year to integrate existing, disparate systems. Traditional businesses rely on large sales forces, paperwork, and fax machines to generate revenue with customers and through partners. This is expensive, time consuming, and scales only as fast as the sales force grows. Today’s startups eliminate much of this friction, time, and cost by building their solutions with best-of-breed components, which they access via APIs, or “application program interfaces.”

(So existing disparate systems, they don’t have APIs, they have ‘integrations’. Because they’re old, see? APIs are jazzy and sexy and new. So new, we only literally just now got a definition for them, halfway through this article! Until APIs were invented last year, absolutely every business was unscalable and did everything with FAX.)


Using APIs as building blocks, Uber was able to go to market far more quickly and nimbly than its competitors. What’s more, in August 2014, Uber launched a publicly-accessible API that would become the foundation for their digital ecosystem, allowing companies like OpenTable, Google and United Airlines to embed Uber into their apps.It’s a mutually beneficial arrangement: Uber reaches more customers and establishes new revenue streams, while app providers like United Airlines, Open Table, Google Maps and others can offer a transportation service to their customers and profit from it at the same time.

(Again the fallacy that sexy startup VC backed API based data-viagra, and not being thoroughly better, are what made Uber work. This time, thought, it’s because you can get a pizza on the way to the airport. What’s the deal with Airline food AM I RIGHT?)

Contrast this with Hertz, Avis, and other rental car agencies that have been United Airlines partners for decades, but are nowhere to be found in the United mobile app. That’s because these rental car companies don’t have an API (or at least not one that’s public). OpenTable, Google Maps, Starbucks, and dozens of other apps offer the Uber service — but not services from Uber competitors like Lyft — so there is definitely a first-mover advantage in each market.

(…You literally just said that lack of an API is why United’s business partners aren’t in their mobile app)

Another simple but enormously successful example is UPS, founded 108 years ago. UPS has captured a large share of the parcel-shipping market for the burgeoning online commerce sector by publishing an API – just a few lines of code – which makes it easy for shopping sites to integrate shipping seamlessly into their online check-out process.

(Again this ‘few lines of code’ thing. Every word in the phrase ‘an API – just a few lines of code –’ is bullshit. APIs can take thousands of lines of code to write and powerful ones, hundreds of lines to consume. That’s completely ignoring that APIs aren’t actually code, any more then a delicious cooked steak is DNA)

The “Connected Era” is Happening Now

There are progressive management teams productizing their company’s value-add as a service via APIs now, allowing any connected business to instantly become a customer or partner.

(I think I just went partially blind from buzzword poisoning)

Everything and everyone will be connected digitally – including customers, employees, partners, and even “things” like appliances and cars – all through APIs. How a business wins or loses is increasingly dependent on how well they connect to external third party apps, devices and services.

(Connecting to things now acceptable as a substitute for competence, performance, price, utility or human rights)

More Examples

News Corp Australia’s CIO Tom Quinn last year declared a “cloud first” strategy that gets rid of hundreds of applications residing in the company’s data centers. This shift requires big changes in the way IT is delivered. Said Quinn: “Technologies are changing so fast, and new systems are coming onboard so often, that you don’t want to be locked into a big monster piece of tech. We are not holding the business ransom to detailed, intricate, costly in-house development in order to get things hooked together.”

(No, now you’re holding it to ransom with services you can’t customise, by forcing (possibly good) process change on unwilling staff and by risking services being sold, absorbed or shut down.)

With APIs, you can hook, and unhook, to the best available software and services on your own timetable.

(Making in house systems talk uses ‘big monster piece of tech’, is very hard, messy. Making cloud services talk uses APIs, is somehow much easier despite doing the same thing, simple. Providing those services don’t go bankrupt, don’t have downtime, support the operations you want via API, are reliable, don’t break the API randomly, don’t communicate insecurely, have well managed downtime, support request caching and retries…)

Sutter Health is a large hospital network in California serving more than 10 million patients each year. It created an app in three months with APIs,

(Did they build an app which they built an API for, or did they build an app that used existing APIs?)

versus nine months without, to help diagnose and better treat an autoimmune disease.

(Were the time savings due to actions Sutter Health took, or just made possible by the systems they’re using being more modern?  Also, how do you know how long it would take them without the APIs? Do you have an API to contact the parallel universe where they don’t use APIs to ask Sutter Health how long their app took to develop, and if so, how do the people in that universe communicate with your API, given they don’t use APIs?)

Previously, accessing information across multiple data sources used to be a huge challenge. Now it’s possible to get real-time access to healthcare data. The Sutter Health app connects disparate data—from EMRs to administrative systems—and can display this data on any device.

(Some false correlations here. News Corp moved its support software into the cloud to avoid lock in and APIs let you connect different apps which might avoid lock in SO NEWS CORP USED APIS! It used to be hard to access multiple sources of data (apparently) and now you can get real-time access to data and Sutter Health’s app was delivered 6 months faster (apparently) SO APIS LET YOU MAGICALLY ACCESS ANY DATA IN REALTIME!)

So whether you’re the CEO of a Fortune-500 company or small business, building a company from scratch or reinvigorating a well-established one, you owe it to your stakeholders to explore what APIs can do for your business.

(So please go shout at your CTO to buy the first _enterprise grade_ API-based product he can find: mine)

Gary Little is a general partner at Canvas Venture Fund, an early-stage venture-capital firm based in Menlo Park, CA. He serves on the boards of Adara, Evernote, MuleSoft, PeopleMatter, Sonatype, and Totango.

(And yet he still doesn’t seem to fully grasp what an API is.)

My Summary

This article, man.  It seems to fundamentally misunderstand what an API is, treating them like a chunk of code that can be applied to any system to make it vomit money. All of the effort of making or implementing to an API is handwaved away. It draws this imaginary distinction between system integration of older & non-cloud products (which apparently don’t use APIs for some reason) and integration with cloud products (which do).

Plenty of older systems have APIs. They’re just shitty. Even if you use a modern service it’s not like lego; you have to tell the API what to do, and if you are linking cloud products you often need a 3rd party system to host the glue code linking them together and implementing your business rules.  And there’s going to be just as much business rule logic for a new API as an old one;  It’s only things like data marshalling and synchronisation that most truly non-API based legacy integrations are bloated by.  There’s just often a LOT of that.

That’s disregarding that you need to have APIs offered by the systems you want to integrate.  If your core business app is from a 3rd party and has no API you’re screwed.  If your billing system isn’t out of contract for 15 more years and doesn’t have an API you can’t exactly add one without assistance.  There’s no magic panacea for crap systems.  Good systems have good APIs, but lots of otherwise perfect systems don’t.  You can’t forcefully add them.  The better version of this article avoids treating APIs like a miracle (and all the logical fallacies).  It focuses on flexible and well-written systems, with open APIs and data formats forming one part.  But it also focuses on using industry standard business processes, the importance of offering an API to, at least, your business partners, and providing enough value through it that people want to consume it.

The entire article reads to me like a PR piece, trying to get CEOs in a buying mood for ‘APIs’ like they’re pieces of hardware, in the hopes that they’ll investigate the author’s VC baby as an ‘Enterprise’ option.  Even if this isn’t the case… It’s just a load of bollucks.


An interesting blog post by Nathaniel Boehm called Our Job is to Talk to People (An excellent title by the way, and the thing which originally drew me to the post) talks about asking “why” all the time. Why do you believe that? Why did you do that? Why do you need that functionality?

It’s an excellent question and core to providing software that’s actually good, although sometimes your users will be less thankful because of it. Habits and false beliefs are rampant in business, from gurus who won’t admit they got lucky to people whose jobs are to take the requirements from the customer and give them to the engineers who know they’re useless and are horribly defensive about it. Every company wants to think they’re different, and that often means they think their business processes have value.

Which. Is. Bullshit.

There is so much ceremony and good intention paperwork (From the good people at Road to Hell Pavers, Inc) bogging down most workforces, either through stubborn natures, unawareness of modern techniques and/or what software can bring them, and sometimes just because no-one has switched manual processes to automatic ones. Even geeks are prone to this: How many times have you not automated something because of an edge case you could simply detect and do manually, saving you 99% of the effort? So yes, UX (and software in general) can provide great stuff for people and make their lives better. The opportunity to do so is the most rewarding part of my job.

But there’s a negative version of the same Why principle. It’s Can’t, and can’t is very very common. Especially amongst incumbents. People LOVE to tell each other that things can’t be done, and what’s fucked up worse, we’ll listen to them! We let someone whose job we want to improve tell us that the thing we want to fix is a special little snowflake and couldn’t POSSIBLY be done by a soul-less machine.

Friends and family will find reasons to tear open your ideas by the arsehole, telling you that what you want to achieve isn’t possible. They’ll even dress it up in sensible sounding pronouncements about the time it’ll take to achieve, or how it’s going to cost too much. You’ll be wasting your time. You’ll be breaking the law. The most insidious reasons will be appeals to higher authorities, or totally fucking insulting. It’s illegal. If someone was going to do it BetterThenYou Pty Ltd would have already. Surely someone else provides it? That sounds like a lot of work. Sound familiar?

Not only are people not supporting you, some of them will be actively kicking you in the nuts, then pissing on you while you’re down. Half of those reasons (And I use the term in the same way airlines use the term food) are implying you’re an drooling, incapable fool, and the others that you have the creativity of a paper bag. These douchbags are supposed to be on your side! And unless your entire family are a pack of rabid naysaying hatebots desperate to see you fail (And you’re not a Rinehart, are you?) they’re not even trying to pull you down, they’re just falling prey to the same sort of canty malaise everyone seems to have. Some of it might be concern that you’ll fail and regret it and some of it, I’m sure, is jealousy that you’re persuing something you want to rather then sitting back in their cesspool of a life.

It may be apparent I hate being told I can’t do something.

Competitors also engage in canty behavior, but there it’s understandable. “You can’t open a bank out of a garage”/”You can’t offer virtual CRM instances”/”You can’t sell shoes online” are a two part combo of not wanting you to succeed, and being stuck in a rut (as discussed above). First they ignore you, then they mock you and all that. They want to reassure their own customers and themselves that they’re a better choice, and they you’ll probably go bankrupt and really, it’s better not to try, m’koy?

Fuck em. You can use great software and UX to make the world a better place, and make shit for yourself that cants tell you you, erm, can’t. So do it. Piss the cants off… You’ll get something awesome as a side effect.


What is wrong with this guy’s tutorial?  No thoughts?  OK.

How about this guy?  (Who is possibly even more egregious.)

I’ll give you a hint.  Even ScottGu is doing it.  In fact, he’s kinda responsible.


*{Sigh}* It feels better to have that out there.

Code belongs in Controllers.  Constraint Code belongs in Models.  Views?  They’re meant to be templates, and just templates.  Code should be limited to conditionals and loops, but only where those loops might change their display formatting.

Helpers are where you’re supposed to put formatting functions and template manipulation code.  Helpers are also usually not just littered all over your damn templates because Hey, they’re View Related right?.  Wrong. Also, I hate you.  Sure, it’s up to the individual developers to follow MVC principles, but most people are sheep.  You’re just encouraging them to write shitty applications.

There are some cures.  If you put your helpers in your App_Code folder, they’re fairly self-contained (although the syntax is still disgusting).  You can declare them as extensions to HtmlHelper (Same link as before).  And, using Single File Generators you can turn them into reusable libraries (Thanks David Ebbo!)  Just please, please, don’t put this crap directly into your views.


Hyperbole is the best link bait.  The Best.

Elevator pitches are how you describe your product/service in the time you’ve got in an elevator… 20 seconds or less.  They’re supposed to be short, exciting, concise and accurate.

So, when I was talking about Dan. U. Hipster, I gave examples of the ways some of his services pitch themselves.  These elevator pitches are toxic.  They make people do two things:

  1. Decide your application is already old hat
  2. Invite comparisons to the existing, more featureful application
  3. Mark you as being uncreative and uncommitted
  4. Show your application as a copycat, not an improvement, and may even miss the point of the original

OK so that’s four things.  That’s because they suck so bad.

You don’t want to describe your application as being like anything else.  If it’s like something else, what’s going to overcome inertia and get people using YOUR product?  Why aren’t investors going to assume that the competitor will just duplicate your features, since you’re already so a’like’ .  How can you avoid getting into a manic race to catch up?

Sure, you might be the wonderful magical startup that overcomes all the odds… But lets face it, you can’t even put in enough effort to describe your service without relying on an existing product.  Doesn’t exactly scream “I AM LIKELY TO SUCCEED!”

Some examples of which comparisons to avoid.  Add your own in the comments, bonus points if you’re using them for your own service.  Let me know, so I can short your stock.


Tag Clouds are the Spirit Fingers of the modern web.  They’re showy, they’re well used and they’re totally, utterly vapid.


Tag Clouds, for those of you still using Netscape and Windows for Workgroups, are a way to give “Semantic Order” to a set of “classification data”, based on its “relative strength” to the other items.  So basically it’s a “wet dream” for the sort of “Web Theoretician” who “hasn’t a fucking clue” and “mis-uses quote marks”.

Having problems?  Good, you’re not polluted yet.  Say you’ve got a concordance:  a set of information (Tags applied to posts on a blog, ingredients used in a recipe) and the number of times it’s used in a set of data.  Render your tag cloud by making the most used item the biggest.  The next most popular is the second biggest.  And so on, until “Peruvian Rock Fish Feces” is rendered so small it’s not even worth printing because like your meal, it makes the cloud look muddy.  For instance, if I was to create a cloud for “Emotional Problems of Twilight fans”, it would look like this:

"Big fan?  Too bad, your fandom sucks"

What's wrong with Team Jacob/Edward/Emotionless Sack Woman

So, you know what they are.  There’s variations of when the cutoff of insignificance is, how exactly the cloud is formatted (More popular?  Bold!  H1!  Bring back the Marquee Tag!).  Some clouds taper away depending on the number of entries, as above, and some just cut off anything below a certain significance:

Do I make you horny, baby, yeah, do I?

Fonts Most Overused By Boring Designers

Why they Suck

Most of the use-cases of these Web2.Blow pustules are based on classified content, and eyes across same.  The more people look at something, the bigger its presence in the tag cloud gets.  So, popular things become easier to access, and unpopular things become less accessible.

The problem boils down to this:  tag clouds show was other people think is cool, in a way that re-enforces its coolness at the cost of other content.  We have a word for people who put down others to make themselves look better.  Many words.  The polite word is “Bully”, the more accurate ones are “Arsehole” and “Douchebag”.  In this instance it’s an external party doing the judging:

Look at THIS content!  It’s much better then all the OTHER content, which will give you herpes.  HERPES!

Dan U. Hipster

Dan U Hipster (D-Hip to the friends who think they’re gangsta!) is a graphic designer, ‘technologist’ and wanker.  He loves buying new technical toys (As long as they’re sufficiently pretty), being mayor of his local coffee-shop on Foursquare, buying free-trade teas and his PT Cruiser, because it’s “So Ironic”.

He signs up for new social services and immediately draws comparisons of the form ServiceX is like ServiceY, (but for DifferentMarketZ|Except with AnimalA|Only Better|With More Hats!), eats out more then at home because he’s mildly scared of his range, and reads more blogs, tweets and f-splats (You’re not cool enough to know what they are) then breaths he takes.

He is, in short, a wanker, from his hat (At jaunty angle, but not a beret until they’re so old it’s ironic) to his “ghetto” sneakers (Which cost upwards of $400USD).  He loves tag clouds.  He loves them so much.

<title>Smart Service Queensland: Payment</title>
<link rel=”stylesheet” href=”/payment/AQ/static/AQ.css” type=”text/css”>
<link rel=”stylesheet” href=”/payment/AQ/static/ssq-sii.css” type=”text/css”>
<script LANGUAGE=”JavaScript”>

flipSupported = 0;
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);
if (browserVer >= 3) {
flipSupported = 1;
}     else {
flipSupported = 0;
if (flipSupported) {
// this should preload the image
newWaitImage = new Image;
newWaitImage.src = “/payment/AQ/images/pleasewait-ani.gif”;
function showWaitImage() {
if (flipSupported) {
document.images[“waitimage”].src = newWaitImage.src;

<body leftMargin=0 topMargin=0 rightMargin=0 MARGINHEIGHT=”0″ MARGINWIDTH=”0″ bgcolor=”#FFFFFF”  >

<!– BEGIN of AQ Page banner –>

<script language=”javascript”>
<!– begin script
function MM_jumpMenu(targ,selObj,restore){ //v3.0
if (restore) selObj.selectedIndex=0;
// endscript –>
<table border=”0″ cellspacing=”0″ cellpadding=”0″ width=”100%” >
<td rowspan=”2″ align=”left” valign=”top” height=”70″><a href=”http://www.qld.gov.au”><img src=”/payment/AQ/images/logo_queensland_government.gif” width=”254″ height=”70″ alt=”Click here to visit the Queensland Government home page” name=”qldgov” border=”0″></a></td>
<td class=”nav” align=”right” colspan=”2″>
<div align=”right” class=”navbarlinks”>
<p><a href=”https://www.smartservice.qld.gov.au/AQ/”><span class=”navbarlinks”>Home</span></a>&nbsp;<font color=”#000066″>|&nbsp;</font>
<a href=”https://www.smartservice.qld.gov.au/AQ/display/feedback.htm?pageID=PaymentServer%20%25%3E”><span class=”navbarlinks”>Contact&nbsp;us</span></a>&nbsp;<font color=”#000066″>|&nbsp;</font>
<a href=”https://www.smartservice.qld.gov.au/AQ/display/Copyright.htm”> <span class=”navbarlinks”>Copyright</span></a>&nbsp;<font color=”#000066″>|&nbsp;</font>
<a href=”https://www.smartservice.qld.gov.au/AQ/display/TermsAndConditions.htm”><span class=”navbarlinks”>Terms&nbsp;and&nbsp;conditions</span></a>
&nbsp;<font color=”#000066″>|&nbsp;</font> <a href=”https://www.smartservice.qld.gov.au/AQ/display/Privacy.htm”><span class=”navbarlinks”>Privacy</span></a>&nbsp;|
&nbsp;<a href=”https://www.smartservice.qld.gov.au/AQ/help/help.htm”><span class=”navbarlinks”>Help<img border=”0″ src=”/payment/AQ/images/spacer.gif” width=”8″ height=”8″></span></a>
<img border=”0″ src=”/payment/AQ/images/spacer.gif” width=”1″ height=”1″><br>
<div align=”right”><br>


<td align=”left” width=”547″>&nbsp;</td>
<td class=”maintext”  valign=”bottom” width=”220″ align=”left” nowrap height=”25″>
<table width=”220″ cellspacing=”0″ cellpadding=”0″ class=”navbarhdg” border=”0″ align=”right” height=”25″>

<td align=”center” width=”220″ nowrap class=”maintext”> <span class=”navbarhdg”><img src=”/payment/AQ/images/ssq.2line.jpg” width=”144″ height=”34″ align=”right”></span><img src=”/payment/AQ/images/spacer.gif” width=”8″ height=”8″>


<tr bgcolor=”000066″ >
<td colspan=”3″ align=”left” bordercolor=”000066″ height=”54″ background=”/payment/AQ/images/img_qld.gif” alt=”A colourful montage of images relating to Queensland”>&nbsp;</td>
<table border=”0″ cellpadding=”0″ width=”100%” cellspacing=”0″ vspace=”0″ hspace=”0″>
<tr  class=”navbarlinks”>
<td valign=”middle”  class=”navbarlinks” bgcolor=”#FFFFFF” bordercolor=”#FFFFFF” nowrap height=”20″ align=”right” >
<span class=”navbarlinks”>
<p>You are here:</p>
</span> </td>
<td  class=”navbarlinks” colspan=”3″ bgcolor=”#FFFFFF” bordercolor=”#FFFFFF” height=”20″ >
<table width=”100%” cellpadding=”0″ cellspacing=”0″>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ ><a href=”https://www.smartservice.qld.gov.au/AQ/”>Select service</a></td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ >Enter details</td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ >Review details</td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ ><a href=”https://www.smartservice.qld.gov.au/AQ/display/orderConfirmation”>Review order</a></td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ >Invoice details</td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/img_bluearrow.gif” width=”10″ height=”7″ align=”right”></td><td class=”navbarlinks” align=”center” height=”20″  bgcolor=”#FFCC00″>Payment</td>
<td class=”navbarlinks” align=”center” height=”20″><img src=”/payment/AQ/images/spacer.gif” width=”2″ height=”1″></td><td class=”navbarlinks” align=”center” height=”20″ >Receipt</td>

<table border=”0″ height=”25″ cellpadding=”0″ width=”100%” cellspacing=”0″ vspace=”0″ hspace=”0″>
<td width=”90%” valign=”bottom”>
<div align=”left” class=”navbarhdg”><img src=”/payment/AQ/images/spacer.gif” width=”8″ height=”1″></div>
<td width=”10%” valign=”bottom” class=”navbarhdg”>
<div align=”right”>$38.80</div>
<!– END of AQ Page banner –>

<body leftMargin=0 topMargin=0 rightMargin=0 MARGINHEIGHT=”0″ MARGINWIDTH=”0″ bgcolor=”#FFFFFF” >
<form method=”POST” action=”https://payserv.citec.com.au/PaymentServer/processPayment” onsubmit=”var v = document.getElementById(‘creditCardNumber’).value;
if (v && !(v.indexOf(‘4’) == 0 || v.indexOf(‘5’) == 0)) {
document.getElementById(‘ccNonVisaMCerror’).style.display = ‘block’;
return false;
} showWaitImage();”>

<table id=”ccNonVisaMCerror” style=”display:none”>
<td nowrap=”” valign=”top” colspan=”3″> <span class=”boldtext”>There was a
problem processing your payment.</span> <br/>
<span class=”normaltext”>The following errors were reported</span></td>
<tr valign=”top”>
<td width=”15″>  </td>
<table cellspacing=”0″ cellpadding=”0″ bordercolor=”#800000″ border=”1″ bordercolourdark=”#800000″ bordercolorlight=”#800000″>

<table border=”0″>
<tbody><tr valign=”top”>
<td><img height=”15″ width=”15″ src=”/payment/AQ/images/img_infodot.gif”/></td>
<td valign=”top”><span class=”errorbold”>Invalid Card Type  </span><span class=”errornormal”>� only MasterCard and VISA cards are currently accepted on this site.</span></td>

<td nowrap=”” valign=”top” colspan=”3″><font class=”normaltext”>Please check
the information supplied and try again</font></td>

<input type=”hidden” name=”paymentAmount” value=”3880″>
<input type=”hidden” name=”merchantName” value=”AQ”>
<input type=”hidden” name=”merchantAuditID” value=”14803591″>
<input type=”hidden” name=”continue” value=” Pay via credit card “>

<table width=”76%”>
<td colspan=”3″ class=”normaltext” height=”37″><p>Enter the cardholder name as it appears on your credit card, your credit card number and the expiry date. Press continue for Smart Service Queensland to charge $38.80 to your credit card account.</p>
<p>Should you wish to have your receipt and any related documents emailed, please enter your email address. Smart Service Queensland will not utilise your email address for marketing purposes.</p>
<p>An asterisk (<span class=”alert”>*</span>) indicates mandatory fields.<br></br></p></td>
<td width=”23%” valign=”top”>
<table border=”0″ cellpadding=”2″ width=”142″>
<tr >
<td nowrap colspan=”2″ bgcolor=”000066″ class=”boldtextWhite” height=”25″>Payment&nbsp;Details</td>
<td nowrap class=”maintext” height=”33″>Payment amount:</td>
<td align=”left” nowrap class=”maintext” height=”33″><font face=”Arial, Helvetica, sans-serif” size=”-1″ class=”maintext”>$38.80</font></td>
<td width=”58%” valign=”top”>
<table border=”0″ cellpadding=”2″ width=”100%”>
<td colspan=”3″ bgcolor=”000066″ class=”boldtextWhite” height=”25″>Credit
Card Details</td>
<td class=”normaltext” height=”28″ nowrap=”nowrap” width=”130″>
<span class=”maintext”>Cardholder name:<span class=”alert”>*</span></span>
<td class=”maintext” align=”left” width=”271″>
<font face=”Courier New”>
<input type=”text” name=”cardholderName” size=”26″ maxlength=”26″ value=”” >
<td class=”normaltext” height=”28″ nowrap=”nowrap” width=”130″>
<span class=”maintext”>Credit card number:<span class=”alert”>*</span></span>
<td class=”maintext” align=”left” width=”271″>
<font face=”Courier New”>
<input type=”text” id=”creditCardNumber” name=”creditCardNumber” size=”17″ maxlength=”16″ value=”” >
<td class=”maintext” nowrap=”nowrap” width=”130″>Expiry date:<span class=”alert”>*</span></td>
<td class=”maintext” align=”left” nowrap=”nowrap” width=”271″>
<font face=”Courier New”>
<input type=”text” name=”creditCardExpiry” size=”6″ maxlength=”5″ value=”” >
&nbsp;<span class=”maintext”>(in the form of mm/yy)</span></td>
<td class=”normaltext” height=”28″ nowrap=”nowrap” width=”130″>
<span class=”maintext”>Email address:</span>
<td class=”maintext” align=”left” width=”271″>
<font face=”Courier New”>
<input type=”text” name=”emailAddress” size=”26″ value=”” >
<td valign=”bottom” width=”19%”>
<td nowrap=”nowrap” valign=”bottom”>
<!–Start Verisign script–>
<table border=”0″ cellpadding=”2″ cellspacing=”0″ width=”135″>
<td width=”135″ align=”center” valign=”top”><script src=https://seal.verisign.com/getseal?host_name=payserv.citec.com.au&size=M&use_flash=YES&use_transparent=YES&lang=en></script><br />
<a href=”http://www.verisign.com.au/ssl/” target=”_blank”  style=”color:#000000; text-decoration:none; font:bold 7px helvetica,verdana,sans-serif; letter-spacing:.5px; text-align:center; margin:0px; padding:0px;”>ABOUT SSL CERTIFICATES</a></td>
<!–End Verisign script–>
<td nowrap valign=”middle” width=”23%”>&nbsp;</td>
<td nowrap align=”left” valign=”middle” width=”58%” ><img src=”/payment/AQ/images/img_accepted_cards.gif” width=”165″ height=”39″ alt=”We accept Visa and Mastercard.”></td>
<td width=”19%”></td>
<td nowrap valign=”middle” width=”23%”>
<input type=”submit” value=”Continue” name=”Continue”>
<td nowrap align=”left” valign=”middle” width=”58%” >&nbsp; </td>
<td width=”19%”></td>
<img name=”waitimage” src=”/payment/AQ/images/spacer.gif” width=”426″ height=”63″ alt=””>


<table width=”100%” cellpadding=”0″ cellspacing=”0″>
<td height=”2″ bgcolor=”000066″ bordercolor=”000066″><img src=”/payment/AQ/images/1×1.gif” width=”8″ height=”2″></td>

Tag Clouds let him reenforce his belief that the content he cares about is important.  After all, he just clicked on that tag, because he was interested, and his peers were interested too!  The size of the tag has nothing to do with it!  Being on top of the curve is important to DUH, so he’s pretty pleased that Tag Clouds let him inform others of what the curve is, and also catch up if he’s a bit behind.

See, the crowd determines what’s cool and what’s clickable!  That’s SO Web-2.0, exactly what DUH craves (When he’s not craving free-trade soy lattes with caramel syrup and sprinklings of chocolate and Escitalopram).  He’s cool, his peers are cool and they’re reacting to each other in real time.  Suck THAT, everyone even slightly older or less hip then him!

What he hasn’t realized is that Tag Clouds have the ironic function of PREVENTING the crowd from deciding what’s really important.  See, humans like to follow the curve, generally:  DUH isn’t cool just because he knows what’s hip, he has to make sure you know he knows what’s hip.  He needs to find new content then make that content get LOTS of eyeballs across it.  Tag Clouds make him think that that’s what he’s doing:  Picking unique new content and having it become visibly more popular.

Why They Suck

What he might have overlooked is that it’s already popular.  He’s been given a larger clickable area and had his attention drawn, making it more likely he’ll click on it.  Of course, this just makes it more popular, bigger, bolder and more clickable.

This is even worse for people who like to be different (Like DUH, except WITHOUT wanting followers).  The very thing that makes their favourite content pages new and funky just makes them more likely to become boring and repetative.  Every new eyeball is drawn to the biggest tag first, ensuring it remains big.  They’re not being unique, they’re being crowdwhored.  All the other content is drowned out for what’s popular, and what’s popular is what’s already popular.  Just like Top-40 music based on sales, it becomes self-enforcing, boring and septic.

The only place tag clouds are useful is to demonstrate activity of a nature other then page views.  If you show commits to Github to demonstrate project activity, or bugs logged for a Jira project, then they might be useful.  But they still demonstrate the popularity problem:  A popular project gets more users out of curiosity, they make more commits or more bugs and the cycle continues.

Just Don’t

Don’t pollute your pages with spirit fingers.  Stand on your contents merits, not the size of your links.


We are a pretty immature industry, especially when we attach “Engineering” to our profession.  We have WHOLE YEARS of experience existing, compared to medicine, law, prostitution, building, publishing and almost everything else.  So I read this article with interest.  Although the parallel with practicing vs studying medicine is interesting, what I found most agreeable (Because really, that’s why people link to things on the Internet, to ‘prove’ themselves right or have a rant) was the notion of quackery.

Imagine, if you will, the following scene is set in a large conference.  Outside a lecture theater is a curious man in suspenders, a striped hat and cane, carrying a pack of index cards.  Tucked behind his ear is a sharpie.  The walls around the doors are covered in charts showing constantly growing bars, and tacked up in a row is a set of cards with writing in thick black ink.

Roll up, Roll up, see Professor Scrum Von Agile’s Amazing Process Improvement Paradigm!  All comers welcome, .Net, Rails, C, PHP, All can benefit from Professor Scrum’s patented methods!”

A crowd of people have gathered to watch the man gesticulate and frolic (Frolicking is a mandatory course at quack school).  Already a nervous line of people have drifted forward, wanting to see what help they can get for their

Ailing projects, dis-satisified customers, aimless engineers, all can benefit from special intervention using Professor Scrum Von Agile’s Dancing Index Card system!”

One project manager is siezed and made to sit in a chair while the doctor analyzes his symptoms:

  • Feature Bloat
  • Constant Change Requests
  • Build Problems
  • Low Quality
  • Dis-satisfied Customers
  • Erectile Dysfunction
  • Bloaty Head

Aaaand a One!   Aaaaand a Two!   Aaaaand a THREE!”

The doctor waves index cards around the PM, drawing intricate shapes in the air.  Assistants rush around with graphs showing ever increasing feature lists and ever decreasing costs.  The PM starts to get dopey by the rush of endorphins from actually seeing progress! … Or perhaps the Sharpie fumes.  Points are Estimated.  Stories are Carded.  With a flourish of whiteboard markers and a ‘feel-good’ trust fall, the PM’s project is declared Cured! Of what, we’re not quite sure.  Possibly project issues, possibly dis-satisfaction.  Certainly his wallet has been Cured! of some of its cash.

Waterfall, Requirements Specification and Documentation!  All have been tried with the success of Sisyphus.  No More!  Professor Scrum Von Agile and his Dancing Index Cards can be At Your Service!  Come in now for an exclusive training course, or grab the Professor Scrum Von Agile and his Big Dancing Index Card Kit, so you can brag to all your friends!”

The crowd rushes forward to buy…

BS?  Professor SVA is.  Is his process?  Well… Sometimes.  Sometimes it works because it’s good, and often it works as a side effect of being mindful.  If you’re trying to analyze how well you’re going, you will get better at it.  So if you’ve only ever done waterfall because Hey!  That’s how you do it, moving to another process is more likely to bring you success.  Just like Quack medicine would sometimes work (Because, perhaps, one of the binding agents was full of sorely lacking vitamins), Quack software processes sometimes deliver value.  Some of them may help you become a better developer, a happier person, a more worthwhile employee, or deliver better software.  Some of it is directly helpful, and some is incidentally helpful.

The reason it’s helpful is the same reason some Quack medicine were helpful, side effects; Vitamins, if you will.  The inherent value in the product you’re using is more valuable then the “magic ingredient” supplied with it.  If you’ve never washed your hair and you start using Madam Du Plonge’s Licenced Dandruff Tonic to get rid of your Aspen-like flakes, I can guarantee your hair will start being nicer… Because you’re washing it, not because of the magnetic vibrationsMs Du Plonge (Who’s actually an ex seamstress called Emma Hogstwat, wearing a wig she stole from a gypsy) claims her tonic emits.  If you switch to Ruby on Rails because you like the language more, you’re likely to become more productive because you’re enjoying it more and it’s m0re expressive.  It’s not because you went to this awesome Rails course!, it’s because (for you) Rails is better.

I believe Agile methods work.  All the Agile processes, however, are not equal.  They don’t work because of the process, they work because of the principles(vitamins) involved in that process.  Agile is all about focusing on the result.  Make sure you’re doing work the customer wants.  Always try to build systems that can be delivered in an iteration.  Monitor your work.  Have tests.  None of that is about index cards, or feel-good meetings, or strict adherence to a process.  It’s all about doing more of what your goal is, which is writing software the customer needs.  If you move to a new process that requires you to buy specially formatted index cards to put stories on, I can guarantee that the improvements you see aren’t because of those cards.  It’s because you’re breaking your work up into units that the customer needs, and delivering them in small, usable chunks.

Quackery is all about the process more then the result.  It’s about buying the Quack’s books, their framework, their courses, their pre-printed cards, their tool or their consulting time.  The more you buy, the more successful you’ll be!  Quackery is not restricted in software to processes, oh no, it’s everywhere.  There are language quacks.  There are framework quacks.  There are process quacks, recruitment quacks, tutorial quacks and system quacks.  It’s like a Peking Duck restaurant in the House of Software.

In part we’re vulnerable because we’re so young, and in part because we’re flighty.  We’ve not yet learned what works well in every case, what we can do right in all situations.  Plus, if it’s new and shiny, we probably want to be involved.  We want to do Ruby instead of Java.  We want to use JQuery instead of Prototype.  We want to have Story Cards instead of massive Requirement Specs.  We want Relational Databases, Locational Check In and Twitter integration, along with beanbag chairs.  It’s also sexy to tell your friends

Hey, still compiling code?  Huh.  We use a direct assembly technique backed onto a cloud computing platform to manipulate a RESTful architecture to publish JS to accomplish our results.  But, whatever works for you.”


Some of it is because we’ve been sold it.  Some is because we think it’ll help us.  The Quacks are persuasive, they’re hard to spot.  And most of all, their products are shiny.  But you can lose time, money and customers playing along, and for what?  Valueless fluff around good systems, useless ideas polluting your thinking capacity, and being able to say to our friends, “Hey, look at my Big DICK“.

Sounds like a crappy “Cure” to me.  I’d rather take my vitamins.


I’m really digging our process driven, “Agile” style development method at work.  It’s lowering the interruptions, making decisions more transparent and leading to less pressure on individual people to get stuff done.  Agile seems to (heaven forbid) describe a set of techniques that actually work.  The down side of my work scenario is that it’s reminding me of some situations where the processes were called Agile (But really aren’t).  They all ended up either cargo-culted cluster-fucks (CCCF’s) or, through failure, tainting the ideas held by the loose, chunky pudding of ideologies called Agile such that they’ll never be accepted.  You don’t want your “improved” process re-enforcing your old process, because you’re only changing because your old process doesn’t work, right?  …right?

I am not an Agile expert. I’ve not written a book, I don’t make all my money from “Agile” consulting, I don’t run training courses, pep talks, stand up classes. I don’t even have a certificate printed on a bubble-jet from a 2-day Agile ‘Induction’ run by someone whose last system was implemented in MS Access because ‘it has a GUI!’

My experience with using with comes entirely from being a developer, following Agile practices and generally being Awesome.  Am I the last word?  No.  Do I have opinions?  Damn straight!  Am I gonna present them as fact?  You Betcha.

The sad thing is, some of the stuff that happens when companies try to adopt an Agile mindset clearly shows that all they’ve heard is the good stuff, and they’re trying to ignore the hard stuff.  Perhaps it scares them to have no control, perhaps they’re hoping to trick their developers into giving them the benefits without having to fulfil their parts of the bargain, or perhaps they honestly don’t get what the point is, but figure that cargo-culting might reap some magical benefit, ala the Half-Arsed Agile Manifesto

A brief tour shall now ensue of ways to tell you have an agility failure:

Mid-Sprint Scope Changes

Yes, OK, we get it:  Some times, you have to make a change in direction, and you need to make it now.  So close to now, in fact, that you can’t wait until the end of your particular iteration to get that piece of work changed, you need it to happen immediately.  For instance, the place I work has an online business with operating hours until midnight.  Our biggest value add for our customers is our superior service.  So if something is preventing them from getting the information they need, we drop what we’re doing to fix their issue.

But that doesn’t mean that you can just add extra work because you want it.  Agile techniques are not magical incantations to enable your developers to produce nine woman-babies of work in one month.  It’s about delivering tiny chunks of completed stuff.  If you suddenly decide that hey, your project won’t be usable with the new functionality your developers are building, and you need more, that doesn’t mean you can just add more stuff.  Your developers committed to giving you a set amount of stuff;  Making them deliver more stuff because you didn’t ask for the right stuff is unfair, and disingenuous.  Most of the time, two weeks won’t kill you.

Changes are Free

This is related to mid-sprint scope changes, but to me it comes from a different source.

Often, product owners will get into a habit like this: 

  1. Before every iteration, the product backlog is groomed
  2. The team selects work, plans it in, begins their iteration
  3. Suddenly deciding you want something else, you interrupt the developers on day 4, asking them to do something else instead because it’s now a higher priority
  4. In the next iteration, restore your previous task to its former importance
  5. Repeat steps 1 – 4 all the time.

Basically, never stick to your decisions, because Hey, your team can just re-plan, right?

No.  Fuck That.

One of the Agile values is ‘courage‘, which a quite wanky but perfectly encapsulates the idea they’re conveying:  You need to trust you’re doing the right thing.  When it’s lacking, you don’t get the value you need because you keep hedging your bets.  Such as, changing what you want the sprint team working on, not because of a critical need, but because you don’t want to wait for the end of the sprint to start them working on it.

Suck it up, make decisions and stick with them.  Don’t piss all over the developers because you’re not willing to be firm in your decisions.

Allocating Tasks to Team Members

This one is pretty simple.  The P.O sends instructions like:

Please have J.R. Developer work on X this sprint.

Or  they check out the sprint plan, and say:

 “If you swapped J.R and M.S’ tasks, they’d be finished faster and you could get more done.

Or they notice that someone has less work in terms of time and say:

What else is S.D. doing with their time?  They could also do this and this and this…

Team members don’t promise shit.  The team as a whole promises to do work, and that’s it.  Maybe someone will have lots of free time, and maybe that’s by design so they can help others.  Perhaps you’re deliberately allowing someone a go at a challenge that’s not in their comfort zone, because that way you won’t build silos or get bored.

Setting deadlines mid-sprint

Oh god.  I could rant for years about this.  I’ll try to restrain myself, however.

Sometimes work will come in that is needed part-way through a sprint, such as a legal compliance issue, a customer fix or a timing issue with an external provider.  Often, however, it’s simply a case that the Product Owner has decided that damn it, he’s going to have his new toy by next Wednesday, so help me!  This is particularly prevalent when there is a release cycle out of whack with the sprint iterations.

Iterations have a build in deadline:  The end of the iteration.  That’s pretty much it.  Adding another deadline is disruptive, annoying, and usually pointless.  Let your developers complete their work, then release it.  If something is OMFGURGENT!!!!1!!!ONE! then ask for it sooner or don’t plan it into a sprint.

Stand-ups which achieve nothing

This can be fairly hard to diagnose because people are used to meeting accomplishing nothing, but here’s a cheat-sheet:

  1. No-one ever questions anyone else
  2. People are late or absent and no-one gets concerned
  3. Task Descriptions never change
  4. No-one ever asks for help

Stand-ups are designed to increase communication.  Passive listening isn’t communicating.  If you’re not challenging assumptions, asking about failures and requesting help, you’re just acting Agile.