Fog Creek Software
Discussion Board


"You wonder why I write so many notes on drawings? I am glad you asked. Because I once had to rewire 3000+ watts somebody allowed on a 15-amp circuit. Because I've seen big headers with butt joints. Because I've known some guys to use bright nails on decking. Because I've known of houses - big houses - built without using a level. Because I've witnessed the same concrete steps screwed up not once, not twice, but three times running. Because I've reviewed plans of others where three doors conflict in the same space. Because I worked nearby painters in very cold, very dark, very wet houses. Because I've seen wood flooring come off a wholesaler's delivery truck and go straight to chop saws and nailers. Because I've seen drains that'll only draw when water runs uphill. Because there's a builder in my neck of the woods that commonly passes off 8d nails for 10ds and 10ds for 12ds. Because I really have measured a 6-month old mansion's kitchen floor deflected 5/8" on 4'. Because there really is a roof over a cathedral ceiling in Maryland that's been replaced 3 times in 8 years, and in the ninth year is rotting out again even as I write this. That's why."

Don't know who the quote is from.  It can be found here: 

Engineering is the process that manifests design into product.  Craftsmanship belongs to design; engineering to development.  Quality, cost and speed are artifacts of engineering; Form, function, taste and appeal are artifacts of design. 

One is no good without the other.  Like it or not, software will be far more engineering driven in the future, just like with any other major product - cars, buildings, electronics, etc.  Design belongs to art, houses (although less and less so) and '57 Buicks (beautiful, but you need to keep a wood block on the accelerator to keep them running). 

Jack Hughes
Tuesday, December 2, 2003

I'll disagree that design will become less and less of an issue.  More and more I see complex systems being interwoven, only to come crashing down because someone didn't have the foresight to imagine a certain scenario.  Although we may not have as many hardcore "engineering" problems now that 4th generation langauges are more common, but putting an elegant, scaleable, modular and flexible system together is still just as much of a challenge as it was 10 years ago. 

Tuesday, December 2, 2003

The whole enterprise IT thing is about engineering. IT managers don't want to deal with design issues. They want that to be the vendors problem. Ideally: Make ourchase decision, apply the required resources for the prescribed amount of time and you get predictable results. Pure production with interchangeable resources. The last thing they want is a craftsman.  They're not there yet.

Tim O'Reilly calls it the Enterprise black hole.  At a recent conference, the MS employees and others were only interested in how a technology plays in the large corporate merger space.

IT: a method of extracting large sums of cash from large corporation.

Tuesday, December 2, 2003

Regarding the file copy example:


My first instinct with this would be to see if it can be done with non-blocking IO. In GTK it is possible to add event handlers for files that are ready to be read from or written to, i'm not sure if this is possible with Windows. So maybe setting the file to non-blocking, ataching an event for ready-to-read would be the way to go.

This would require some experimentation, it may well be impossible, but if it worked the code would be simpler than launching another process. It might easily take as long to write, but would then be more maintainable.

So craftsmanship doesn't always equal bloat.

Ideally this sort of thing (juggling non-blocking files and GUI events) could be wrapped up in a nice simple library or language. Then even the internal HR application could use it.

Paul Harrison
Tuesday, December 2, 2003

What a coincidence. I interviewed for a contract job a couple weeks ago. They gave me a C++ programming test to code a multiplayer word game called Ghost (e.g. ), where at least one of the players was required to be played well by the computer.

I grabbed a random, multi-megabyte, public-domain dictionary off the web to use as data. The app paused for a long time while it loaded the dictionary into the trie, so i did exactly what Joel talked about in #3. It was a single class called GhostLoader, and it was a fairly small amount of code (the cpp is 117 lines including white space, comments, debugging statements and asserts). The ctor launched the load function in a thread and took a callback function argument to be notified of loading progress. The cancel function just set a volatile bool which was polled by the load function.

Joel, you've probably already done your loader by now, but if you want the code to this game to use as an example, i can send it to you.


Tom Park
Tuesday, December 2, 2003

"My first instinct with this would be to see if it can be done with non-blocking IO. I'm not sure if this is possible with Windows."

It is. It's called Overlapped I/O, although I'm guessing that it's not really possible from VB6 without dropping into some other language for the heavy lifting.

Brad Wilson (
Tuesday, December 2, 2003

Overlapped I/O can be used quite easily from VB. But it isn't supported for file I/O on Windows 9x so it isn't a solution here.

Stephen Martin
Wednesday, December 3, 2003

...mmm - I've an alternative story on craftsmanship vs engineering.  I'd like to add I don't know as to the truth of the story but it was told to me by a fitter (my Dad actually) and it does illustrate a mindset.  It goes:

In the War (WW2), the best aircraft engine was the Rolls-Royce Merlin and it was decided that Pratt & Witney in the US should make them under license.  They got copies of everything they needed - all documentation and the rest - and a Rolls enginner to do Q&A.  But the first ones they made were crap and the guy from Rolls knocked everyone back. 

When it was investigated it was found that the tolerences were too loose and they couldn't understand how engines with tolerences so lax could possibly work.  So a delegation went to the Rolls-Royce factory to sort it out.  And on the tour they watched every cylinder and piston (12/engine) be fitted and matched by hand by a man who did little else. 

Whilst the spec was loose the tolerence on every piston/cylinder pair was a fraction of that documented. And similar hand-finishing ran throughout the engine. In the end the tolerences had to be reworked so that  P&W could actually make one.

As to who was right - Rolls or P&W  - that's another argument.  Dad had no doubts but then he referred to the engineers at his factory in less than glowing terms - the phrases "sitting on their arses in a nice warm office" and "wouldn't know which end of a spanner to hold" stick in the memory.

A cynic writes
Wednesday, December 3, 2003

This phenomenon is well-described by Trevor Blackwell, on the difference between his homemade balancing scooter and the Segway.  (see ).

Joe Ganley
Wednesday, December 3, 2003

*  Recent Topics

*  Fog Creek Home