RSS

Tag Archives: Ponderings

Cool


When it comes to software – the word “cool” has been used so often, and – and I just can’t do it.

There are a few applications that are mind bending in how useful they are, how they connect dots that were never connectable before, but for the most part, I cannot bring myself to utter the word “cool” about most of the software out there.

I’ll tell you why – and as always it begins with a short story.

Back in – well, a few years back… my sister and I worked for a little software company that had been started by a couple of college dropouts and was being run in a small town just east of Seattle.

She and I had both also managed to drag our parents out of what we thought was the stone age and had gotten them a computer, and we spent hours, days, weeks going over and over and over with them what an “icon” was, the concept of “clicking and dragging”, and the realization that “just because you didn’t see it, doesn’t mean it’s gone.”  I’m sure some of you out there have worked with your parents in this way.  Doing “support” calls, leaning back in your chair, eyes closed, one hand holding the phone, the other holding your head, the bottle of aspirin nearby, trying to project this voice of calm and reason to a parent who simply doesn’t “get it”.

Now – understand – this is not to slam parents or their generation.  Oh, Lordy – That’s the last thing I’d want to do.  The thing that’s difficult is translating what you know and take for granted into something that’s so unfamiliar to them (if they can’t see it and feel it, it must not be there, right?) to something they can relate to and understand – without having them go over the edge in frustration.  I’ve had a couple of calls with my mom that lasted two hours (almost as much time as it would take to drive down there, do it, and drive back) – and they were often things we in the IT world would call ridiculously simple – copying and pasting, for example, was one thing my mom’s had trouble with.  But try explaining it to someone without using computer terms – to someone who grew up in another country, another culture, who’s never actually copied and pasted – and it becomes a bit of a challenge, and you have to make sure the concept itself is clear before you try to explain the mechanics of it.  She’s got a device that allows her to browse the Web from her TV as well as that computer we got her – and of course the commands for one can’t be consistent with the commands for the other – so that makes it hard to assume that something will just simply work as you expect it to.  It can get frustrating – on both sides.

But a little note – nay – reminder for anyone out there who gets frustrated at explaining something technical to your parents – well, I can’t speak for your parents specifically, so I’ll speak generally:

These are the folks who quite literally dealt with your crap.  These are the folks who changed your diapers, who changed work schedules to take you to or be at your school events growing up, who fixed thousands of sack lunches, who helped with last minute school projects, who listened to your dreams as you became a teenager, and did what they could to keep food on the table, and a roof ­­­over your head… And they smiled that proud, gut wrenchingly bittersweet smile parents get as they watched your car – or bus – or whatever – leave that one time that neither of you really knew would be the last time you’d ‘live at home’ – A little bit of a support call to help them out is the least I can do.   I do not for one moment regret the time spent on the calls I get from my mom on computer problems.

After about a year and a half, mom and dad knew how to use the computer, the “support calls” were fewer, and they were actually able to write letters and stories and the like.  It was kind of a neat feeling – almost like the shoe was on the other foot – me watching them “grow up” – so to speak, instead of them watching me.

But one day, at work, when a developer wanted to show me something new he’d written – I just about flipped.

See, he’d written this snippet of code, that did something… and to this day I can’t remember what it was – but he ran it, showed me what it did, and then said, with eyes just beaming with excitement, “Tom, isn’t that COOOOOOOOL?”

I understand that feeling.  I’ve written little snippets of code that solve problems in rather ingenious ways – but even as I sit here, writing this, I still remember that sinking feeling I had in the pit of my stomach when I heard him say that…

Given where I worked, and given what I knew of software development, I knew that this little “cool” thing would make it into an operating system at some point, and soon.

And it would fundamentally change how my parents had to work.  And it would mean more telephone calls, to explain something that someone had changed.

Not because it made something better.

Not because it made it easier.

Not even because it made it faster.

But because it made something “cool”.

See, there seems to be a misunderstanding of the purpose of writing software.

My take is that you write software to use it.  And if you use it at work, it should make your work faster, more efficient, more streamlined.  If you use it at home, it should solve problems and make it take less time to do things (think putting together a photo album, balancing your checkbook, or trying to find out where your 401K went).

Here’s the deal: Software Should Simply Work.

Period.

Make it do what it’s supposed to do first.

If developers write code with the understanding that it is to be used by people, and that it should make their lives easier – then they have it nailed.

If developers write code only to show off their prowess, or only to show off their ingeniousness to other developers, then they’ve forgotten who their audience is, and that misses things entirely.

So… what’s ‘cool’?

An application that solves a problem and does it well.

That’s cool.

An application that is easy to learn and intuitive for a first time user, and at the same time, just surprises you with deeper and deeper little snippets of usefulness that solve a problem you didn’t even know you had, just as you realize you have it.

That’s cool.

Oh – and last but most certainly not least: An application that works consistently enough like the old version of the same application so users don’t have to relearn everything they’ve learned to be as efficient with the new version as they were with the old.

THAT’s cool.

I don’t want shiny sparkly crap in my software.  I don’t want context sensitive menus where I have to know what I’m looking for in order to find it (hint: the whole ribbon thing did nothing to increase productivity for a long honking time.)

And there you go.

Software should be written for the user, and with the user in mind.  Anything that gets in the way of that, no matter how glitzy, no matter how sparkly and shiny – misses the point altogether.

—–

…and there is a post script to this story…

Last year, my mom was working on her Christmas letter – in Microsoft Word, and she wanted to send it to someone to do some proof reading.

Before, she’d had to go through a web interface on her computer to get to email – and sending the text of a document involved copying all the text in the document, opening the web email interface, creating a new outgoing mail, putting in the address, tabbing a couple of times, typing in the subject, one more tab, then a paste.  It worked, but it was pretty convoluted.

Then I got Outlook Express configured on her box, so now when she wants to send a document, it’s a matter of going up to the file menu in Word, choosing send, typing in the name, and then hitting the send button.

The first time she did that she was floored.  “That’s so EASY!” and then, remembering this story, she changed that just a bit…

“That’s so COOOOL!!!”

And she’s been rubbing it in ever since.

So even though the people who made Outlook Express 6 work with Word 2003 on Windows XP are probably long moved on from those projects, a note of thanks to the architects, devs, testers, PM’s, and managers who shepherded those things all the way through to RTM:  Ya done good.

Advertisements
 
1 Comment

Posted by on November 4, 2011 in Uncategorized

 

Tags: , ,

It’s just ones and zeroes, right?


So I was debugging some rather frustrating code the other day, and it got me to thinking – and I know, it’s dangerous, but still, I did it…

I knew that the whole thing about our lives as computer professionals involves ones and zeroes.  So I thought, “Hmmm… I wonder what this code would look like if I translated it into binary? And how easy it would be to debug?”

So I did that, and was overloaded with a bunch of binary, so then took a simple backup script and translated that.  The result, below, is what the computer sees when it executes this little backup script.

Note: what’s below, translated from t-SQL into binary, is code that worked.  (yes, you’ll have to scroll for a bit, but there’s some human readable stuff in the middle, and some more at the end…)

01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00001101 00001010 01100100 01100101 01100011 01101100 01100001 01110010 01100101 00100000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00001001 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110011 00110000 00101001 00001101 00001010 01100100 01100101 01100011 01101100 01100001 01110010 01100101 00100000 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110011 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110001 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110001 00110000 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00100000 00101000 00110101 00110000 00101001 00100000 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100011 01101101 01100100 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00001001 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00101000 00110100 00110000 00110000 00110000 00101001 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110010 00110101 00110000 00101001 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110100 01100001 01110010 01100111 01100101 01110100 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110010 00110101 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01101110 01101111 01110111 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00001001 01000011 01001000 01000001 01010010 00101000 00110001 00110100 00101001 00100000 00100000 00100000 00001101 00001010 00001101 00001010 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00100000 00111101 00100000 00101000 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01110110 01100001 01101100 01110101 01100101 00100000 01100110 01110010 01101111 01101101 00100000 01100100 01100010 01100001 00101110 01100100 01100010 01101111 00101110 01010011 01100101 01110010 01110110 01100101 01110010 01010000 01110010 01101111 01110000 01100101 01110010 01110100 01101001 01100101 01110011 00100000 01110111 01101000 01100101 01110010 01100101 00100000 01100100 01100001 01110100 01100001 00100000 00111101 00100000 00100111 01010011 01100101 01110010 01110110 01100101 01110010 01001110 01100001 01101101 01100101 00100111 00101001 00001101 00001010 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00100000 00111101 00101000 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01110110 01100001 01101100 01110101 01100101 00100000 01100110 01110010 01101111 01101101 00100000 01100100 01100010 01100001 00101110 01100100 01100010 01101111 00101110 01010011 01100101 01110010 01110110 01100101 01110010 01010000 01110010 01101111 01110000 01100101 01110010 01110100 01101001 01100101 01110011 00100000 01110111 01101000 01100101 01110010 01100101 00100000 01100100 01100001 01110100 01100001 00100000 00111101 00100000 00100111 01001001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01001110 01100001 01101101 01100101 00100111 00101001 00001101 00001010 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00100000 00111101 00100000 00100111 01000101 01011000 01000101 01000011 01110101 01110100 01100101 00100111 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 00001001 00111101 00100000 00100111 01101101 01100001 01110011 01110100 01100101 01110010 00100111 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 00111101 00100000 00100111 01011100 01011100 00100111 00101011 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00101011 00100111 01011100 00100111 00101011 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00101011 00100111 01011111 00100111 00101011 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00101011 00100111 01011111 01100010 01100001 01100011 01101011 01110101 01110000 00100111 00001101 00001010 01010011 01000101 01010100 00001001 00001001 01000000 01101110 01101111 01110111 00001001 00001001 00001001 00111101 00100000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01000011 01001111 01001110 01010110 01000101 01010010 01010100 00101000 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00101000 00110101 00110000 00101001 00101100 00100000 01000111 01000101 01010100 01000100 01000001 01010100 01000101 00101000 00101001 00101100 00100000 00110001 00110010 00110000 00101001 00101100 00100000 00100111 00101101 00100111 00101100 00100000 00100111 00100111 00101001 00101100 00100000 00100111 00100000 00100111 00101100 00100000 00100111 00100111 00101001 00101100 00100000 00100111 00111010 00100111 00101100 00100000 00100111 00100111 00101001 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00001001 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01001110 01100001 01101101 01100101 00001001 00001001 00111101 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00101011 00100000 00100111 01011111 01100100 01100010 01011111 00100111 00100000 00101011 00100000 01000000 01101110 01101111 01110111 00100000 00100000 00001101 00001010 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 01000000 01100011 01101101 01100100 00100000 00111101 00001001 00100111 01100010 01100001 01100011 01101011 01110101 01110000 00100000 01100100 01100001 01110100 01100001 01100010 01100001 01110011 01100101 00100000 00100111 00100000 00101011 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00101011 00100000 00001101 00001010 00001001 00001001 00001001 00001001 00100111 00100000 01110100 01101111 00100000 01100100 01101001 01110011 01101011 00100000 00111101 00100000 00100111 00100111 00100111 00100000 00101011 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00101011 00100000 00100111 01011100 00100111 00101011 00100000 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01101110 01100001 01101101 01100101 00100000 00101011 00100111 00101110 01100010 01100001 01101011 00100111 00100111 00100111 00100000 00101011 00100000 00001101 00001010 00001001 00001001 00001001 00001001 00100111 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110100 01100001 01110100 01110011 00100111 00100000 00001101 00001010 00001101 00001010 00001101 00001010 01010000 01010010 01001001 01001110 01010100 00100000 00100000 01000000 01100011 01101101 01100100 00100000 00001101 00001010 00001101 00001010 01001001 01000110 00100000 00100000 00100000 00100000 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00111101 00100000 00100111 01000101 01011000 01000101 01000011 01110101 01110100 01100101 00100111 00100000 00001101 00001010 00100000 00100000 00100000 01000010 01000101 01000111 01001001 01001110 00100000 00001101 00001010 00100000 00100000 00100000 00100000 00100000 00100000 00100000 01000101 01011000 01000101 01000011 00100000 00101000 01000000 01100011 01101101 01100100 00101001 00001101 00001010 00100000 00100000 00100000 01000101 01001110 01000100 00100000 00001101 00001010 00001101 00001010

And this piece of code won’t work…

01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00001101 00001010 01100100 01100101 01100011 01101100 01100001 01110010 01100101 00100000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00001001 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110011 00110000 00101001 00001101 00001010 01100100 01100101 01100011 01101100 01100001 01110010 01100101 00100000 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110011 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110001 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 00001001 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110001 00110000 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00100000 00101000 00110101 00110000 00101001 00100000 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01100011 01101101 01100100 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00001001 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00101000 00110100 00110000 00110000 00110000 00101001 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110010 00110101 00110000 00101001 00100000 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01110100 01100001 01110010 01100111 01100101 01110100 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 01110110 01100001 01110010 01100011 01101000 01100001 01110010 00101000 00110010 00110101 00110000 00101001 00001101 00001010 01000100 01000101 01000011 01001100 01000001 01010010 01000101 00100000 01000000 01101110 01101111 01110111 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00001001 01000011 01001000 01000001 01010010 00101000 00110001 00110100 00101001 00100000 00100000 00100000 00001101 00001010 00001101 00001010 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00100000 00111101 00100000 00101000 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01110110 01100001 01101100 01110101 01100101 00100000 01100110 01110010 01101111 01101101 00100000 01100100 01100010 01100001 00101110 01100100 01100010 01101111 00101110 01010011 01100101 01110010 01110110 01100101 01110010 01010000 01110010 01101111 01110000 01100101 01110010 01110100 01101001 01100101 01110011 00100000 01110111 01101000 01100101 01110010 01100101 00100000 01100100 01100001 01110100 01100001 00100000 00111101 00100000 00100111 01010011 01100101 01110010 01110110 01100101 01110010 01001110 01100001 01101101 01100101 00100111 00101001 00001101 00001010 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00100000 00111101 00101000 01110011 01100101 01101100 01100101 01100011 01110100 00100000 01110110 01100001 01101100 01110101 01100101 00100000 01100110 01110010 01101111 01101101 00100000 01100100 01100010 01100001 00101110 01100100 01100010 01101111 00101110 01010011 01100101 01110010 01110110 01100101 01110010 01010000 01110010 01101111 01110000 01100101 01110010 01110100 01101001 01100101 01110011 00100000 01110111 01101000 01100101 01110010 01100101 00100000 01100100 01100001 01110100 01100001 00100000 00111101 00100000 00100111 01001001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01001110 01100001 01101101 01100101 00100111 00101001 00001101 00001010 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00100000 00111101 00100000 00100111 01000101 01011000 01000101 01000011 01110101 01110100 01100101 00100111 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00100000 00100000 00100000 00100000 00001001 00111101 00100000 00100111 01101101 01100001 01110011 01110100 01100101 01110010 00100111 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00100000 00100000 00100000 00100000 00111101 00100000 00100111 01011100 01011100 00100111 00101011 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00101011 00100111 01011100 00100111 00101011 01000000 01110011 01100101 01110010 01110110 01100101 01110010 01101110 01100001 01101101 01100101 00101011 00100111 01011111 00100111 00101011 01000000 01101001 01101110 01110011 01110100 01100001 01101110 01100011 01100101 01101110 01100001 01101101 01100101 00101011 00100111 01011111 01100010 01100001 01100011 01101011 01110101 01110000 00100111 00001101 00001010 01010011 01000101 01010100 00001001 00001001 01000000 01101110 01101111 01110111 00001001 00001001 00001001 00111101 00100000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01010010 01000101 01010000 01001100 01000001 01000011 01000101 00101000 01000011 01001111 01001110 01010110 01000101 01010010 01010100 00101000 01010110 01000001 01010010 01000011 01001000 01000001 01010010 00101000 00110101 00110000 00101001 00101100 00100000 01000111 01000101 01010100 01000100 01000001 01010100 01000101 00101000 00101001 00101100 00100000 00110001 00110010 00110000 00101001 00101100 00100000 00100111 00101101 00100111 00101100 00100000 00100111 00100111 00101001 00101100 00100000 00100111 00100000 00100111 00101100 00100000 00100111 00100111 00101001 00101100 00100000 00100111 00111010 00100111 00101100 00100000 00100111 00100111 00101001 00100000 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00001001 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01001110 01100001 01101101 01100101 00001001 00001001 00111101 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00101011 00100000 00100111 01011111 01100100 01100010 01011111 00100111 00100000 00101011 00100000 01000000 01101110 01101111 01110111 00100000 00100000 00001101 00001010 00001101 00001010 01010011 01000101 01001100 01000101 01000011 01010100 00100000 01000000 01100011 01101101 01100100 00100000 00111101 00001001 00100111 01100010 01100001 01100011 01101011 01110101 01110000 00100000 01100100 01100001 01110100 01100001 01100010 01100001 01110011 01100101 00100000 00100111 00100000 00101011 00100000 01000000 01100100 01100010 01101110 01100001 01101101 01100101 00100000 00101011 00100000 00001101 00001010 00001001 00001001 00001001 00001001 00100111 00100000 01110100 01101111 00100000 01100100 01101001 01110011 01101011 00100000 00111101 00100000 00100111 00100111 00100000 00101011 00100000 01000000 01110011 01101111 01110101 01110010 01100011 01100101 01110000 01100001 01110100 01101000 00100000 00101011 00100000 00100111 01011100 00100111 00101011 00100000 01000000 01100010 01100001 01100011 01101011 01110101 01110000 01101110 01100001 01101101 01100101 00100000 00101011 00100111 00101110 01100010 01100001 01101011 00100111 00100111 00100111 00100000 00101011 00100000 00001101 00001010 00001001 00001001 00001001 00001001 00100111 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110100 01100001 01110100 01110011 00100111 00100000 00001101 00001010 00001101 00001010 00001101 00001010 01010000 01010010 01001001 01001110 01010100 00100000 00100000 01000000 01100011 01101101 01100100 00100000 00001101 00001010 00001101 00001010 01001001 01000110 00100000 00100000 00100000 00100000 00100000 01000000 01110010 01100101 01110000 01101111 01110010 01110100 01100101 01111000 01100101 01100011 01110101 01110100 01100101 00100000 00111101 00100000 00100111 01000101 01011000 01000101 01000011 01110101 01110100 01100101 00100111 00100000 00001101 00001010 00100000 00100000 00100000 01000010 01000101 01000111 01001001 01001110 00100000 00001101 00001010 00100000 00100000 00100000 00100000 00100000 00100000 00100000 01000101 01011000 01000101 01000011 00100000 00101000 01000000 01100011 01101101 01100100 00101001 00001101 00001010 00100000 00100000 00100000 01000101 01001110 01000100 00100000 00001101 00001010 00001101 00001010

Why won’t it work?

Because it’s missing an apostrophe.

So if that’s a bunch of ones and zeroes that have to be in the right order just to back up a database – how many ones and zeroes need to be in the right order to keep our databases and systems running right?  I mean really, if you think of your T-SQL code, then the SQL executables and the binaries there, and the operating system it rides on, and if your systems are clustered and virtual, you’ve got your clustering layer, and your virtualization layer, and all the software and firmware of your SAN, not to mention the app that might ride on top of your code.  It actually gets pretty mind boggling that it all works at all, and makes it that much more important that the code we as SQL folks write, is flawless.

Given that we often think of the big, complex things about SQL, I thought I’d just bring a small bit to your attention.

Take care – be safe out there.

Oh – By the way… the code is below:

select  @@servername

declare @servername     varchar(30)

declare @instancename   varchar(30)

DECLARE @reportexecute  varchar(10)

DECLARE @dbname         varchar(100)

DECLARE @backupname     VARCHAR (50)

DECLARE @cmd            VARCHAR(4000)

DECLARE @sourcepath     varchar(250)

DECLARE @targetpath     varchar(250)

DECLARE @now            CHAR(14)

select @servername = (select value from dba.dbo.ServerProperties where data = ‘ServerName’)

select @instancename =(select value from dba.dbo.ServerProperties where data = ‘InstanceName’)

SELECT  @reportexecute  = ‘EXECute’

SELECT  @dbname         = ‘master’

–Note: I’ve got a set of shares set up on all my servers, so tend to write backup scripts as below.

–You may need to change that to a path that’s valid on your system to get this to work.

SELECT  @sourcepath     =

‘\\’+@servername+’\’+@servername+’_’+@instancename

+ ‘_backup’

SET     @now                  = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(50),

GETDATE(), 120), ‘-‘, ”), ‘ ‘, ”), ‘:’, ”)

SELECT  @backupName     = @dbname + ‘_db_’ + @now

SELECT @cmd             =     ‘backup database ‘ + @dbname

+ ‘ to disk = ”’ + @sourcepath + ‘\’+ @backupname

+ ‘.bak”’ + ‘ with stats’

PRINT  @cmd

IF     @reportexecute = ‘EXECute’

BEGIN

EXEC (@cmd)

END

 
Leave a comment

Posted by on September 30, 2011 in Uncategorized

 

Tags: , ,

Coding for Georgiana…


A number of years ago, in my first job in IT, I worked for a local health care cooperative automating the data gathering of an outbound call center.

That sounds nice and sophisticated.  What really happened was that I worked in a group with a bunch of little old ladies –meant in the dearest sense you could mean it – they were little, and old, and ladies.  Imagine working with your mom or grandma to get the picture.  They made calls to new members in the various regions to inform them of the possibilities they could expect with their new membership.  My job was to automate the data gathering of the department.  Each telephone call was logged, categorized, and eventually summarized so the region could be billed for the work done on their behalf.

How this was done was simple: Paper, pencil, and a bunch of little hash marks: IIIII IIIII IIIII,

My job – summarize it so those hash marks could be turned into money at the end of the quarter.

I sat there with a solar powered calculator adding hash marks for weeks every quarter while a $2000.00 computer sitting on my desk burned electrons.  So automation became necessary, but automating it so a bunch of little old ladies could use it – correction – would use it – was key.

I’d been told that for this data gathering project, I would not be allowed to use a database, I would have to use Microsoft’s Excel.  And so, technically, I had to make Excel look and act like a database, but more importantly, I had to get these little old ladies (who can be mighty stubborn, I might add) to go from things they could see and feel (pencil and paper) to things they couldn’t (electrons).

One of the little old ladies was named Georgiana.  She had been diagnosed with ADD, and was quite aware of it, so she worked hard, with stacks of post-it notes all over to help keep herself on track.  She also was an absolute delight to work with, and would tell me any time some code I wrote didn’t make sense.  Conversely, if it did make sense, and she understood it, she would let me know – and then I knew everyone else would understand it as well.

So Georgiana became my canary in the coal mine.  She would not only tell me when she didn’t understand how some functionality was supposed to work, she would also tell me when the others had trouble.

And as a result, that trouble, whatever it was, would get fixed.  In human terms, they’d understand it better.  In business terms, their productivity would go up.  In human terms, they’d have less frustration.  In business terms, there’d be fewer impediments to them doing their jobs.

All because the code was written with the customer in mind.

I wrote thousands of lines of code for that project.  It eventually became a distributed data repository, on two separate, totally incompatible networks, that could quite literally only communicate via email, so the calculations happened via Excel macros, daily reporting happened via distributed Excel, Outlook macros and Novell Groupwise automation, and summarization and reporting at the end of the quarter was done in Excel and Word.  This took the generation of the report down from weeks to two hours, a major accomplishment – but it became very clear to me that no matter how wonderful, how exciting, how shiny, sparkly or technically brilliant the code was, if I didn’t listen to my customers – if my code didn’t solve the problems they were facing on a daily basis, then they wouldn’t use it.  If it didn’t do what the customer wanted, then all the effort I put into it was a complete waste of time.

And over time, I realized that more and more, the code I wrote was written with a little old lady in mind.  It’s been 15 years now, but in every line of code I write now is a little bit written for my friend Georgiana.

 
Leave a comment

Posted by on April 29, 2011 in Uncategorized

 

Tags: , ,

Databases and Frat Houses…


I had to explain to a colleague why database autogrow and autoshrink were a bad idea, so I did, he laughed, but got it, and so I went back to my desk and hammered this out – no editing, just hammering…

DATABASES AND FRAT HOUSES

Okay folks, so here’s a basic example of why you want to have your database the right size to start with, and why setting things to “autogrow” and “autoshrink” is a bad idea.

Ready?

Let’s say you go to – oh, say, the Local University, and you live in a frat house with 39 of your closest friends and associates.

Let’s also say that this frat house has parties on a rather regular basis, like, every Friday and Saturday night, and about 100 people show up.

Now if the house is big enough, you set up tables, snacks, “beverages”, and music, and people have a good time, in addition to getting plastered, puking on the lawn and so on – (but that’s outside the house, so we’ll deal with puking on the lawn in another issue.)

So far so good, right?  People have places to congregate, dance, chat, do all that other stuff that happens at frat parties, and so on.  No problem… The house is big enough, might be a little crowded sometimes, might be full of hot, sweaty bodies during the party, but basically, it’s a party, everyone’s having a good time, and no one will remember much of it on Saturday morning.

Except for those guys lying on the front lawn, but again, that’s another story.

Read the rest of this entry »

 
3 Comments

Posted by on April 19, 2011 in Uncategorized

 

Tags: , , , , ,