Saturday, December 29, 2012

Judging Code

Sam Stephenson of 37 Signals wrote this post on December 13th, 2012 - You Are Not Your Code.

I didn't realize he was one of the authors of the Prototype framework or even that he worked at 37 signals (until the bottom of the post). The other point I wanted to make is that I don't think this is specific to "open-source" work either.

"Developers working together to build shared infrastructure: it’s the fundamental tenet of open-source software. Any motivated programmer with an idea and the ability to implement it can solve a common problem, share the solution with the world, and reap the rewards of future improvements by peer review."

It's not just open-source software - it's ANY software. Every product or project you work on typically involves working together, even if it's by simply pitting your own crazy ideas against each other. You solve a problem and then you get reviewed, whether it be by peers, superiors or, far worse, the purchasing public.

When building software, you make trade-offs. On a recent project, we had to move the prototype quickly into production because it was clear that it would take too much time to recreate it from scratch. For another client, work that was supposed to last for four years (while waiting for a new product) has lasted over fifteen. When you look back at your old code, you likely cringe at some decisions were made - but that was then, this is now.

I can feel his pain though  -
"The reality is that Prototype helped lots of people despite its flawed foundation. But its time had come and gone, and I eventually realized it was time to move on.
It was hard not to take Prototype’s failure personally. Critical blog posts felt like a full assault on my values. And seeing friends use other libraries made me feel like my work was a waste."

It's a great read - and as he notes :

"... you are not your code. A critique of your project is not tantamount to a personal attack.... It is simply the result of a regenerative process, driven by an unending desire to improve the status quo."

As I noted above, I don't believe this is exclusive to the open-source world or software. Sure, companies are judged based on their products; but more importantly, they are based on their service to customers. But as individual developers, your code should always be open to criticism, by yourself or by others.

What is an example of a perfect line of code? Is it:

print "Hello World"

(why are you using double quotes, why do I need to say Print, why is it in proper case?)

Hey, Kevin Ragsdale has a series of posts on how ugly FoxPro is --- I would expect that none of the Fox team takes offense to his posts. They created a canvas - what you do with it is your business.

Ayn Rand once said "Judge and prepare to be judged"

It's how you react to that judgement or criticism that shows your character.

Thanks Sam - great post.

Thursday, December 27, 2012

A Quick Plug: Whitey Board

Yes, it's a very politically incorrect name but Whitey Board is AWESOME!!!

I purchased two because the office where I'm currently working doesn't give consultants their own white board (and meeting rooms are hard to find).  Who uses white boards anymore? After seeing supposed consultants and business analysts struggle using a SmartBoard or any of those other intelligent white boards AND getting tired of deciphering things on a smaller screen, I needed something anyone could use and didn't need to sit around a computer screen to look at it.

Bonus #1: INEXPENSIVE (24$ - I bought two 2x3)

It came in rolled up tubes and stuck onto the nearby wall in minutes.

Bonus #2: Super easy to put up anywhere

You can unstick and re-stick it anywhere.

Bonus #3: Roll it up and take it with you

If you're looking for a solution for discussing ideas in a group, check it out.

Of course, there are some downsides:

1. The provided dry-erase pen is useless. Buy some better ones.

2. Because it doesn't have edges, you may want to create your own border so that your "drawing" doesn't bleed over to the edge. Lucky for me, the wall I posted it on is easy to clean.

If I had a larger office, I would look at some of their other cool offerings like the Ghost (clear) Whitey board and the large board (4ft x 6ft).

Saturday, November 24, 2012

Always Be Releasing: one week iterations

In reviewing older posts, I came across this little gem that had never been posted but is always particularly relevant to development today. I posted a more thorough outline on my process blog. It's a short post but hits on a key point for developers and anyone involved in a project that seems to be going on and on:
I burn out when I'm not releasing.
One of my clients recently started one week iterations.
If you're feeling burnt out, take a step back and think about something you can release this week.
I was asked "do I feel the one week is too short a time?" Surprisingly, I said No. The one week iteration ensures there are no "beware the man in a dark room" syndrome but it also allows for very little time for re-design and refactoring. Programmers that like to tinker and sit back and re-design over and over again really don't work well in this one week iteration process.
it's not "what am I working on this week" but "what am I going to release this week"
A release has a lot of moving parts...but it enforces a well-oiled machine since everyone has to release their code every week. We are using a schedule that says: - Monday morning release , - Backlog Meeting Monday - Feature Go/No-Go Wednesday - Final check-in Friday (with time to fix stuff over the weekend or before Monday) On the minus side, if you have people on your team who aren't delivering or moving as fast, you really feel it on the Friday. But that's a plus too - because it forces you to move slower to get everyone up to the same speed. On the plus side, it makes Mondays much more exciting.

Friday, August 31, 2012

New FoxShow extends Southwest Fox Early-bird Deadline

Check out the latest FoxShow teaser.

While waiting for the final version of an interview with Doug, Rick and Tamar regarding Southwest Fox 2012, the organizations threw in a little bonus.

I'll sweeten the pot. The first five that register and mention the FoxShow will get $50 sent to them via Paypal from the FoxShow as well.

Monday, August 06, 2012

Make 99% Invisible Visible

I mentioned 99% invisible on my last FoxShow - it's a fascinating and amazing show, talking about design, typically in architecture. For those who build software, what IS interesting is how design impacts a variety of things. Subtle things, like how if you close your eyes, a lane change feels like a 90% degree turn or just a quick flick of the wrist. Or how four uber-creative guys decided to ensure certain words were ensconced in metal. Or even more fun, what really should happen when patent-violators go bad.

However, more to the point, 99% Invisible is on KickStarter, a web site to help businesses or groups fund things through the crowd. The show started looking for some money to help broaden its scope so it can do more shows. But they hit that target almost instantly. Now they are trying to do something  a little more fun ---- reach 5,000 "backers". They're almost there (4,600 at this writing) with 4 days to go.

You don't have to give a lot of money --- in fact, if you listen to the show and don't like it, then don't bother. But if you do like it, why not pledge $5 or anything? (if you give more than $30, there are some "gifts")

Why give? Well, if you like the show, the original goal was to try and make more episodes every year, by helping one of the interns be able to work regularly on the show. That goal was hit within 24 hours. Now with increased backers, there are other goals: more episodes, make video episodes, who knows.

One of the best things of the show is that it is re-listenable. From the web site, "They’re produced to stand up to multiple listens and reveal more each time they’re heard. The ultimate goal of 99% Invisible is to make radio that inspires mindfulness and wonder in all the things in the built world."

If that doesn't sound like something (or anything) that could improve your software design, maybe you're not listening (or looking) hard enough.

Friday, July 06, 2012

Talking Lianja with Barry and Hank

Last month, I had the opportunity to talk with Barry Mavin and Hank Fay about Lianja, Barry's new tool for building a single application for Desktop (Windows, Mac and Linux),  Web and Mobile.

It's based on QT but what Barry has done is pretty damn incredible - a full development platform where  you can code in Python, PHP, Javascript and yes, FoxPro. So you're not just cross-platform in terms of OS but you're also cross-language. You can even mix code so one part can be written in JavaScript while another can be written in VFP. And Yes, it is eXtensible.

The FoxShow Episode is now available.

Wednesday, June 27, 2012

Learning from Kent Beck

Here's a great post that I'm sure others have seen and posted. Three guys had the opportunity to do some prototyping with Kent Beck, the creator of TDD and thankfully, one of them, documented it. I haven't ready Kent's implementation patterns book

The entire post is very long and detailed but I wanted to post some key takeaways as they apply to pretty much any project.

Make your code readable.  "Code is primarily means of communication."

KISS. "Apply simplicity at all levels."

Flexibility "Programs should be flexible in the ways they change, they should make common changes easy or at least easier. "

Approaches to coding. When thinking about Agile, people start creating sprints of 2 weeks or less. When prototyping, an even quicker sprint came up - "what would be the demo we would like to show at the end of the day. And his next question was what test to write."

Write tests that test needed functionality, at a high or unit level. "Speculating about failure points can be just as wasteful as speculating about design."

Write Code in the Test, then Refactor. (I know, think about it. I actually started doing this when I was first learning TDD and thought - "is this really what I'm supposed to do?") " Instead of thinking about how it should be organized (what classes to create, where to put them, whether to use a factory class or a factory method), why not initially write the code directly in the test method? You can always factor out the code later."

Focus on one thing at the given time. " If you notice along the way something else that needs to be done – giving a method a better name, removing a dead code, fixing an unrelated bug – don’t do it, put it on a task list and do it later. "

Symmetry in Code. "Symmetry in code is where the same idea is expressed the same way everywhere it appears in the code."

The entire post is a great read.

Sunday, June 10, 2012

Awesome Tech Conference + Tablet = Great Reason to Register

Doug Hennig and Rick Schummer just posted about Southwest Fox's new registration incentive. Pre-register before July 1st, and you may win a Samsung Galaxy, iPad or Kindle Fire - something to suit your needs whether you be an Android, iOS or just an avid reader.

With pre-registration, you also get a pre/post con and a chance for $150 scholarship or Stonefield Query . Last year, there weren't a lot of pre-July 1 registrations so the chances of winning are HUGE!!!

As an aside, one of the sponsors of SW Fox is Lianja and I recently had an opportunity to talk with its founder and will be sharing that interview on the FoxShow later this week.

Saturday, June 02, 2012

Bit by a 7 year old Internet Explorer bug, er, feature

I arrived on the client's floor and didn't even have a chance to walk into the office.
"Stop everything - we need to solve this problem"

Sounds serious.

After deploying an existing ASP.Net application to a new server, a basic run-through test is typically done, making sure that everything is working. This time, however, nothing would work. The site would load, but as soon as the user did anything, it would return them to the launch page. We tried a different site and it worked fine. So it must be the configuration of IIS --- that was the general consensus.

What was happening was that the session variables used in the application were simply not being registered. So if you issued a Session("Variable") = "Andrew", it didn't error out but it also didn't set the variable.

But it wasn't. The kicker came when we installed Chrome and tried the site - it worked fine!
Now, I'm a big fan of browsers but I don't think the solution to a problem is always "switch to ...." (unless it's IE 6).

StackOverflow to the rescue - I found this link - which seemed to describe the problem - "ie8-does-not-keep-session-variables".

Then in the comments was this innocent little note:
Blocking cookies when the host contains underscores is a known issue in IE.– EricLaw -MSFT- May 27 '11 at 20:03

As it turns out, it's not just a "known issue", according to the KB article:
"A potential security vulnerability exists in Internet Explorer versions 5.5 and 6.0 in which a malicious user could create a URL that allows a Web site to gain unauthorized access to cookies that are stored on a client computer and then (potentially) modify the values that are contained in these cookies."

IE 5.5 and 6 --- the actual KB article is from 2005.  So it must have been fixed, right? It seems kind of strange that every other browser doesn't have this issue, except ----


This behavior is by design.

The problem? The testing server was named with an underscore in it.

The workaround:
To work around this problem, use one of the following methods:
  • Rename the domain name and the server name, and use only alphanumeric characters.
  • Browse to the server by using the Internet Protocol (IP) address rather than the domain/server name.

Renaming the server name is something that every sys admin loves to do.

Thankfully, the testing could proceed with the IP address.

This is the first time I've ever come across this problem - but then again, I don't typically name servers with an underscore in it. But having been bit once, you can bet I'll be on the lookout.

What old bugs have you been bitten by?

Sunday, May 27, 2012

SwFox 2012 Ceil Silver Ambassador is Jun Tangunan!

Doug just noted that Jun Tangunan will be the 2012 Ceil Silver Ambassador for this year's Southwest Fox conference. Jun blogs at and has some really cool ideas with his ssClasses for Visual FoxPro, some fun and some more product centred.

Congrats Jun and hope to see you in October!

Friday, May 18, 2012

H600 Wireless Headphones Gotcha

Just a note on the Logitech H600 found from eHow but the comment was buried and only available via the Google Cache so I thought I would repost it here.

I'm using an H600 with a MacBook Pro. It stopped charging and I didn't know why. I came across this gem:


My Logitech Headset 350 Won't Work |

had trouble with my h600 logitech headset not charging. I just got a steady orange light. I couldn't find much help online but what I did do was unplug my headset turned the computer off for about 5 mins and even unplugged the computer. I tuened it back on , plugged in my headset and viola! it started to blink slowly and is now charging. I hope this helps someone else.

So I took the USB wire out , tried it on a AC charger (didn't work) but then went down and plugged it into my PC - it started recharging as expected.

I'll update this to see if it completely dies again. I hope not - I've been having terrible luck with all my wireless headsets (Blueant died, Plaintronics died and my original Logitech did too).

Friday, April 27, 2012

A Solution's Perspective

There's an age-old image of project management that looks something like this:

And there have been various adaptations of it --- one I found recently (and appreciated) is this one from Jan Tielens:

What is the actual process that a "solution" goes through? The client dreams up an idea or has a problem that needs to be solved. They attempt to describe it to someone who then attempts to build it. At the risk of anthropomorphizing a concept like a solution:

The Birth: this is more like it. I'm not just a little thought in someone's head anymore - I'm going to be great. I'm going to solve the world. Now I just have to figure out...

The Terrible Twos: OK...I can go a variety of ways - I just need to focus on what I want to do. What?!? Who are you? Oh...I have to do it this wait, now who are you?!? This way instead? Argh!!!

Primary School: So I have to do this so I can really be what I want to be. That sucks. I guess you know better - you've done it before. But why can't I.....that works, doesn't it?

Teenagers: No - stop - I'm not listening. I can do it this other way...oops, no I can't. Let me try it this faster way...oops. Damn! I'll pretend I didn't hear the other people telling me I couldn't do it that way.

Technical School: Oh...I can also build that...and that...and that...but I really want to build something a little simpler...

College: Fine. I'll do it your way. Oh, I can't just put a tire on a branch --- I have to put three ropes and a swing mechanism because...oh, I should put three swings so everyone else can swing too...ok. Isn't that really complicated? Oh - I should write all this down. Won't that slow me down? Ohhh....that will make me look smart.

First Job: Hold on...let me take a step back. Maybe there's another way....nope that won't work. You mean, I have to pay someone for this?  But I can do it myself....or maybe...not. You know, I should keep a journal of all this stuff.

Second Job: Remember when I thought I could do that....well, now I'm doing something else..but I really want to go back and finish it, I didn't really keep up with my journal because I went through so many steps before.

Bad Contracting: OK. I couldn't do it myself that way- so I'll ask some others to help (now, they get to go through the same steps as above only they BILL me). After I pay you, will you show me what you did and what didn't work? No? What did I pay you for? Why did I spend all that money or all that time?

Good Contracting: OK - I couldn't do it myself - can you do it for me? You've done it before? OK - great.  Please just build me what I want. No....this is what I want...OK, this is what you're giving me. How long will this take? Really?!?

Mentoring: OK - I couldn't do it myself - can you show me how you've done it before? Thanks...umm...this might be a little complicated...let me write it down so I remember what we're doing.

Realization: Hold on. Let me take a step back - hit the reset button. What do I really want to do? Let's try it THIS way. Keep it simple.

Upgrades: This is great - You know what would be really cool? If I could just do this. Let me try that.

Sharing: Look what I did?!? You want to join in? Sure, come on in and join the fun.

Sharing Upgrades: Yes, you can all play but only one at a time. Why? Because it was originally for me, only. That's what I wanted. I suppose it would be great if I could have three swings for all of us, but why not just build three separate swings?

Maturity: If only I had kept a single focus. If I knew then what I know now, I would have done d,e,f instead of x,y and z. It wouldn't have cost a fortune.

Mid-life crisis: Maybe I should try and rebuild it from scratch....on second thought.

Bad Senior Years : Hey, young whippersnapper. You can't do it that way. You young ideas - you never really think things through, do you? When I was your age...

Good Senior Years: Hey, young whippersnapper. I don't think it will work that way - let me try and show you how we can do it. I had written up some steps on this...where are they? I can't find them. You know, I'm too old for this...let me try and remember how I did it. Sure, I'll write it down for you.

Sound familiar? It should. What's funny is that when writing this, I can identify a real business process, colleague or technology step in each paragraph. Scalability? Do you really want three people on your swing on a single tree? You want a swing - do you really want to build scaffolding when all you want is a single swing? Kind of reminds me of the 37 Signals Scaling commentary.

Who do you resemble?

In future posts, I'll discuss different ways of getting to success regardless of where your project is.

Friday, April 20, 2012

Using Gmail? - you NEED this

If you are using gMail and ever wondered what your usage is really like, check out gMail Meter.

What does this do? Well, it may help you change your email habits by showing your patterns.

The link from LifeHacker is here

You create a new spreadsheet in Google Docs, name it Gmail Meter and then run a script from the Script Gallery.

Then let the script run. It can take a while to run but you can just let it go, it will send you an email when it's done with all of the stats. What kind of stats? Here's just a smattering of the stats:

Very cool!

Monday, March 19, 2012

Southwest Fox 2012 is two conferences in one!

A new year  - a new Southwest Fox!!

Save the dates for Southwest Fox and Southwest Xbase++ 2012! The conferences take place October 18-21, 2012. This year we have two conferences as one great event at the same location. Southwest Fox has always served Visual FoxPro developers an opportunity to learn and extend their skills, and network with fellow developers. Alaska Software is working on PolarFox, a product that keeps the Visual FoxPro language alive in their next generation tool. 

Southwest Fox - Home

Sunday, January 01, 2012

Why FoxPro Matters: Development

Every developer has a starting point. It isn't necessarily the first time they wrote a line of code or the first computer they worked with. Rather, it's the first time they "got" it - the first time, they were able to put the separate pieces (the data, the code, the interface, the entire experience) together, not just for a client but for themselves as well. It's the light-switch moment - the kindling of the passion. Some developers write code their entire life but never find a connection to data. Others become pure DBAs - they don't write application code; but rather focus on how the database interacts with others. But most applications rely on the convergence of the two, the content and the delivery, to create the final solution.

When I meet a developer for the first time, I usually ask what they like to work with, what part of the development process gets their juices flowing. This helps me identify the best method of optimizing their strengths. There are a few common responses:

a) doesn't matter - the sign of either a developer who's given up or hasn't found their true passion
b) code - best to focus on logic
c) data - great opportunity for analysis and conversion
d) both - versatile
e) setup/configuration - tweaker!!

But the responses are also dependent on the languages and tools they have worked with in the past. Some languages are natural for this. They encourage data and code to work together. FoxPro is one of those tools. I have yet to meet a FoxPro developer who doesn't fall into the d) category above. When an architect talks about metadata tools, most FoxPro developers "get" it - because they are used to the meta-data that surrounds data, be it in the DBC or third party tools.

This isn't to say FoxPro doesn't have its faults - but rather that its strengths revolve around the convergence of content and delivery. Years ago, that wasn't always the case. Programmers focused on the intricacies of the code, rather than the delivery. Today, there are many other tools and frameworks, especially in the web world (Ruby on Rails and other MVC come to mind), that focus on that same convergence.

That convergence can be what separates success from failure and the tools that help ensure and promote a strong understanding and correlation between the two are usually the right tools for the job.

For me, FoxPro has focused my attention on how data works with the solution. There's a reason why I see an application in terms of its data and how users can get to that data and turn it into valuable information. If information is currency, then understanding how data turns into information is worth its weight in gold. FoxPro's value legacy will be in the developers who have that understanding and share it with their clients and their colleagues.

VFP ODBC Drivers - Argh

Looking for VFP ODBC Drivers can be a pain. I know they are only VFP 6 (talk about old) compatible but when you need to connect to VFP tables via ODBC, you need to find them, which can turn into an exercise in frustration. The Microsoft site itself says they aren't available and in fact, the only one you can find is included in an MSM (Merge Module) that needs a setup to distribute them.

So once I found the MSM file for it, I created a setup for this (with some install notes for accessing it) which is available here.

Microsoft may not care too much about VFP Developers any more, but there are enough of us out there to do so.