Monday, August 13, 2007

Life with Three Kids

Carrie sent me this. It's an excellent taste of what having three kids can be like:

http://yonkogirl.blogspot.com/2007/06/life-with-three-kids.html

Movie Review: Facing the Giants

Our pastor is going through a sermon series on the book of James. Possibly at his suggestion, our small group watched Facing the Giants in lieu of a lesson last night. Here's my review:

Short version: LOVED IT!!!

Long version:

Acting: It's true that it wasn't all that great. However, the only time it annoys is during the first 15 minutes. That's when the plot is waiting on character development before it can get rolling.

The plot: Truly amazing. Yes, parts of it are too predictable, twists notwithstanding. But it's still enjoyable to see how the plot develops, and it is a great feel-good movie. However, the movie's best strength is in showing how faith and works meet. Coach Taylor's message to the team is that if they give their very best, praising God regardless of the outcome, God will honor the effort.

A pivotal moment early in the movie (no spoiler here) is when Taylor blindfolds player Brock Kelley and has him give his best effort doing the "death crawl". Brock thinks he's trying for the 50-yard line, which is 20 yards farther than he believes he can go. He ends up realizing he is capable of much more when he focuses only on doing his best.

The entire movie is an excellent lesson in putting your faith into action, and in how God wants your very best - no less, and no more. My only regret is that it shows Coach Taylor as an effortless leader. He clearly struggles with faith, but appears to have no trouble at all communicating his vision - there is no "giving your best" shown in his effort to lead and teach his players. Still, I managed to sense that struggles can be intellectual as well as physical, and that "leaving it all on the field" doesn't just mean physical exhaustion.

Overall: VERY highly recommended, especially for those struggling with job decisions or with issues of faith vs. works.

Saturday, July 21, 2007

The Value of Old Friends

I am surely the worst of friends.

If you're in my life on a daily basis, I can be (or I assume I am) as friendly a guy as you would want. But if you're out of sight, you're out of my mind. I am HORRIBLE about letting the very best of my friends fade out of my memory. My memory is not good, but it's really not that bad, either. I don't know why I don't call or email or visit, but I don't. And as I let them slip from my memory, I find I am losing something important, something of myself that I will greatly miss if it's gone.

For some reason, I have come to realize the mistake I'm making. So over the last few weeks I have been calling, visiting, and emailing the friends that are the main characters in so many of my best memories. Some have moved from Home, as I have, and some of those are quite far indeed. Others are still there, going on with different lives. But they're all somehow part of me, a part that I now know that I miss very much.

Tonight I was again reminded of how much I need my friends. One of the friends I grew up with came to my parent's house for dinner while we are in town visiting. She brought her two children - one of which I've met, the other (the 2-year-old) I have not. We talked about her life, and we talked about ours, the conversation suffering from neither the searches for wayward children nor from the years since we'd last talked. I was amazed at how easily the conversation came for her, my wife, and especially for me.

Last week I visited another of those old friends while visiting Home. Yesterday I called my best friend, and a bystander could not have known that it had been months instead of hours since I had heard his voice. I'm not the most emotionally articulate guy. My wife calls me moody. So maybe this post is a symptom of another mood swing.

But I've found something. Remembered something. And I think I know what it is, too: Home.

Anybody up for a game of spades? Play to 1000, no red twos, blind low is 200, bags, ...

Thursday, July 12, 2007

Domain-FIRST Design

I'm still working my way through Domain-Driven Design by Eric Evans. While the "captivation" factor has gone down, the "interest in subject matter" factor has gone WAY up.


I just read his chapter on Aggregates - twice. And I may go back and read other chapters again, too. There were two major revelations for me in the chapter on Aggregates.

The first was the subject matter of the chapter. It is a totally new concept to me. I had never really considered "partitioning" the domain model into regions of guaranteed logical integrity but between which the rules may be lazily enforced. I saw at once that this was both a very useful concept, but also very foreign to me, giving me my first reason to re-read the chapter.

But the most important revelation was that it finally dawned on me that he's not talking about domain-driven database schema. In my mind, he's talking about domain-first design.

I "cut my teeth" in fast-and-furious ASP-land. All I was doing for five years was designing small databases (less than ten tables), and exposing them through ASP pages. I always started with the database design, and my mind never strayed far from it. There was neither reason, application, nor time to do proper three-tiered or n-tiered design, since I was literally just binding controls to tables. I learned about three-tiered design during this time, and I tried more than once to apply it, but in my little databound world I couldn't make it fit.

Now, I'm in all-grown-up-.NET-land. Objects. Proper three-tiered design. But my databound mindset hasn't left me. When interviewing for my current contract, they asked how I'd approach designing an application. I answered honestly: I'd start with the database schema, and work my way up. Even five chapters into Domain-Driven Design I was thinking in terms of domain-driven database schema. When Evans talked about limiting certain relationships to one-way as a way to save work, I wondered what he was talking about - you could always join tables, regardless of which table's key you were selecting by. When Evans talked about Entity vs. Value objects, I struggled, thinking that Value objects would still need to be stored in a table, and making me wonder how you could tell the difference.

In the chapter on Aggregates, Evans finally broke through. The examples he gives are of multiple users of a large, distributed system comprised of objects in memory. And Evans specifically draws a contrast between handling update conflicts at the database level and at the domain-layer level. And that's when I got it. While I have ALWAYS designed my software starting with the database schema, Evans is trying with his book to give me a different starting point - the domain layer. He wants me to envision the ideal object model first, write it and unit test it, even before designing a database schema.

It will require discipline - real effort - to design anything without regard for database schema. To think in terms of objects and relationships, apart from tables and primary and foreign keys. I'm going to revisit the design I spent a week without kids hammering out at home. I may go back and re-read other chapters, this time applying them to object design instead of database design. And I'm going to grow as a developer, because I finally see the light.

Thank you Eric Evans!

Tuesday, July 03, 2007

Relaxing at High RPM

I may be the first guy in history to say this (the first guy to admit it?) - I'm borrowing my mother-in-law's sports car this week.

My mother-in-law - that quiet, unassuming little lady - just bought a Mazda Miata. For the gas mileage (yeah, right).

She then made the mistake of taking my wife and kids with her husband to Iowa for a week.

She may never see the Miata again.

It's my first real experience with a sports car. (Purists: Maybe you don't think it's a sports car, but I sure think it is :-) Claustrophobic, hot (the gearbox), noisy, rough, and touchy. Sometimes I think I'm riding on gravel in a shopping cart because of the suspension. But it's FUN!!! It rockets away from red lights, and that 50-50 weight distribution makes me look forward to turns. How I'll ever go back to my positively boring Honda Accord I'll never know. But Carrie tells me I need to cool my jets, that it's "not the right time" for us to get a two-seater. >sigh<

Yesterday she called and asked what I was doing. "Going for a drive," I said. She wanted to know where I was going. Then she wanted to know why. I think she's been a mom too long - she's forgotten that it can be fun to just drive on a windy rural road and enjoy the wind, the trees, the hills, and the turns. She never really understood what I was doing. I never cared.

Anybody want to buy a used Accord?

Thursday, June 28, 2007

Interesting Take on an Interesting Email

I subscribe to the CodeBetter.com blog. Very interesting stuff (if you're a programmer).

Apparently an email that was circulating around in Microsoft has leaked out. It's a "transcript" of a conversation between a Microsoft manager and their new hire - a former Google employee who had worked at Microsoft before. The topic of the conversation is comparing Google's work environment with Microsoft's. It's been commented on a thousand times. Now I've finally seen it and read it.

Here is a CodeBetter post commenting on the email. (There's a link to the email at the top of the post.) I pretty much agree 100% with his conclusions. See what you think:
http://codebetter.com/blogs/eric.wise/archive/2007/06/27/google-not-for-me.aspx

Best Software Design Tool EVER

I'm reading Domain-Driven Design. Fascinating book. Written by a strong proponent of agile development methods, one of which is Extreme Programming (XP).

I'm also still thinking about writing a personal project management app. Something to help track the many things on my work plate, and all the details involved in each (especially paperwork), while leaving enough of my small mind to actually be productive.

So I decided to combine these two interests. I still consider reading the book to be my primary activity at home. But, needing a break from the book last night, I decided to try an XP-inspired technique and do some design on the project app.

So I got some index cards, and started a domain model.

I worked in pencil, knowing that I'd be making changes. And, sure enough, I was erasing enough that I stopped to get a "click eraser". But I was working very quickly - making cards for the objects I already knew about, and quickly filling in holes I didn't realize I had. Then I went through and added properties to each, and labeled each as either a value object or an entity. Last, I took up half the living room floor to lay them out to spacially view the relationships. This led to more properties and objects, as the relationships became obvious.

I've never had so much fun designing software.

I realize this was the easy part. Writing the classes, sorting out the logic, and finding bugs in the model have yet to be done. And the other layers must be written, too. (I dread UI more than infrastructure, but neither is fun.) But that's when you start to see results, too. I enjoy writing unit tests (or, rather, seeing them pass) because of the sense of accomplishment - the software I wrote actually works! And even the first iteration will save me time and confusion at work.

I worked on a Ruby on Rails version of this for months. But I abandoned the project, because learning Rails while designing a complex app in a relatively new language/environment was just too much. I expect that using my familiar environment of gvim, nant, mono, and nunit on my MacBook will limit my work to the app itself, and Domain-Driven Design will help me manage the app's complexity. (No, it's not an enterprise-level app. But for one guy to do at home, especially with three kids, it's a lot.) I also have several ideas for expanding the scope of this software. I don't know how to plan for that level of complexity with Ruby. I do know how to plan for it with C#.

I'm actually excited about this project now! I'm looking forward now to planning a few iterations (2-3, most likely) and working on the first to see how iterative development works for me at home.

Now where did I put those index cards...

Friday, June 15, 2007

Ubuntu Studio

OK, I'll admit it - I'm a little slow. I just now found out about the release of Ubuntu Studio.

This could become my favorite OS, bar none. Especially in light of the media work I do for my church. I'll do what I can to get at least them to devote one machine to Ubunto Studio in the A/V booth. At the very least, it would be perfect for recording services. I'm definitely going to install it at home.

Screenshot tour here.

Wednesday, June 06, 2007

Celtx - Open-source Production Writing/Collaboration

I'm sure both of my readers are well aware that I serve my local church with various technical media needs. I have become increasingly aware that open-source software can meet most software needs for a church, even a media-centric church like ours.

The latest bit of software I've run across is Celtx - software for pre-production writing, organization, and collaboration. Not only is the software itself free (under the Mozilla Public License), but the collaboration website (pc.celtx.com) appears to be free as well.

My wife is in charge of a family-oriented worship service our church has after the adult morning service. I expect that this software could save her some time, both in the writing/editing of the scripts, but also in collaborating with the others involved - the Children's Ministry director, our pastor, actors, and technical people.

I haven't played with it yet, but based on the video tutorials, it looks like a great addition to my open-source software library.

Tuesday, May 29, 2007

One Hour Per Day

Dig into Blender. Get Cinelerra to compile on the MacBook. Read Domain-Driven Design. Write my build-management app. Find more pictures to delete. Take more pictures.

…or…

Spend time with my wife.

I get (or should only use) one hour of time for myself every evening. Sometimes more, sometimes less, but after chores that’s usually what is left. And yet I’ve got all these great things that I would like to get done:

I want to dig into Blender because a) it’s a great tool, and b) I really want to generate a first-rate virtual walkthrough of the new building. Even if I just settle for rendering photorealistic interiors, there’s a lot of time to be spent learning the tool, modeling, texturing, lighting, etc.

I want Cinelerra to compile because it’s probably the best video editor I’ll own for under $300 (if you can ignore the file format problem). That it costs no money at all is even better. However, it certainly isn’t free. I’ve already spent a HUGE amount of time trying to get it to work, so far without success. By the time I finally get it working, I’ll be able to spend $100 for Adobe Premiere Elements for Mac and be done with it, anyway.

I want to read <b>Domain-Driven Design</b> to a) help with my build-management app, but mostly b) to help with my career. It looks like the kind of design book I’ve been needing to read. And after that, there’s the Fowler book. Then LINQ. And I can always practice by developing a tool that will help at work – my build-management app.

And photography is probably my life hobby. Even when I “stored” the camera in the bedroom, it came back out after a week. I just can’t leave it alone.

But, of course, I am married to a beautiful girl. I really enjoy spending time with her: talking with her, laughing about the day, planning for the next, and all the other things that husbands and wives do.

One hour per day.

It is kinda funny, but also infinitely wise that God provided two great ways for us to reveal,.judge, and improve our character – money and time.

We get as much money as the world thinks we’re worth, and each person is (rightly or wrongly) valued differently. How we spend our money, however, is a function of character, not income. Both upper and lower economic classes have people with both good and bad character. And their checkbooks usually tell the tale.

But God gave each of us the same number of hours in a day. Twenty-four of them. None is richer, none is poorer; we all have the same amount of time in a day. Sure, you could say that some have more days than others. But no one knows how many days they have left. So we’re stuck with the time we have today.

When the better priority sleeps next to me every night, why do I feel so driven to get it wrong?

Wednesday, May 23, 2007

Florida Was AWESOME!

Sorry about the utter lack of activity over the last couple of weeks. We were in Florida last week - St. George Island, to be specific. Heavenly. Did absolutely nothing but swim and take pictures. Some friends from Memphis (Collin and Vicki) came with us, and Collin brought all his photography equipment. Being able to play with a studio flash and softbox for a whole week was truly...illuminating. Got some great pictures with it, and had fun at the same time. And it sounds like I got him hooked on Lightroom in the process.

Anyway, I'll be posting pictures later. I'm still excited about Cinelerra (trying to get it to compile under OS X right now), and I'm also rediscovering Blender. But I'm still catching up both at work and at home, so I must leave again for a bit.

Later!

Wednesday, May 09, 2007

Cinelerra - The Wow started last night

I’ve finally gotten Cinelerra installed at home, and I am in love.

A couple of nights ago I finally got Cinelerra to compile on my Ubuntu Fiesty installation on my desktop. (The instructions I was following didn’t mention the gettext package as a requirement. I may email the author.) And after some file format confusion, I started playing around and going through the HV manual.

As I began to learn about and understand the interface, I realized just how powerful of an editor Cinelerra is.

I’m really looking forward to what they call “two-window editing.” I’ve never done editing like that before (except in the backwards implementation that is iMovie HD). It’ll be an adjustment from the straight-up timeline NLE I’ve been using (Vegas Video). But I was impressed with the two-window editing idea, really impressed with the keyboard shortcuts (especially the numpad-based shuttle controls), and I was also pleasantly surprised at how easy color correction was. I have some reservations about adding transitions (since I’m so accustomed to automatic crossfades when I drag one “edit” to overlap another). But I expect my editing workflow (and my output) to improve dramatically.

While I haven’t done anything “serious” with it yet, I’ve got a project for church that I’ll probably start in a couple of weeks. It’s good enough that I might just install Ubuntu on my MacBook just to play with it on a more powerful machine. I may even convert my desktop’s 300GB SATA drive to EXT3 (which is read/write under XP with the right driver), just so I’ll have room to do proper editing.

Friday, May 04, 2007

To Read: Two DI frameworks

I really need to make time to read about these frameworks:

Spring.net
The Castle project

Three-Girl Circus

It looks like my sweet wife has finally written her first blog post! While I'm no big-time blogger, it's cool to see her get started. I'm really looking forward to reading her blog, even though I live in the circus!

Anyway, check out my link to the Three-Girl Circus at right to see what she has to say.

Domain-Driven Design

I finally bought Domain-Driven Design, and I got it yesterday. I'm still just in the first chapter, but it really is a fascinating book. Evans isn't giving a lecture on design; he's telling stories from his experience, and letting the stories educate the reader. And he's such a good storyteller that not only am I learning quickly, but I actually hate to put it down! I expected to learn and be interested, but I never thought a book on software could be this engaging.

As you may have seen from the flurry of posts I've been submitting recently, the topic of better software design has been stirring in my head for a few months now. I'll elaborate on that in another post. It is sufficient for now to say that my purchase of Domain-Driven Design was exceedingly well-timed. Despite my recent lack of faithfulness to God, He seems to be heaping grace upon me anyway - educating me and helping me in my career despite myself.

God never ceases to amaze me.

Thursday, May 03, 2007

Technique Digestion

Try the following policies on for size:
  • GAC - Only interfaces and the DI container engine ever get put in the GAC
  • Interfaces - All application- or layer-boundary interfaces should go into the GAC. Application interfaces may share the application's namespace, but the application's interfaces must reside in a separate assembly. The interface assembly(ies) must go in the GAC; the implementation assembly(ies) must NOT go in the GAC.
  • DI Container - Goes into the GAC, and has machine-level config info telling it which class versions implement which interface versions. Should support interface version redirection, preferably by reading policy files stored in the GAC.
  • Domain interfaces and implementations should follow the same rules as an application's interfaces and implementations.
  • Domain classes and interfaces should NOT share either assemblies or namespaces with application-specific logic. This will allow them to evolve independently, and makes domain object reuse across applications much easier.
  • Both domain objects and application- and infrastructure-specific services must always be instantiated via the DI container, or returned from factories that reside in the domain class's assembly.

Technique Indigestion

Gnawing questions:

Why do we tie domain objects and service interfaces to specific applications, sometimes all in the same assemblies and namespaces?

How can application interoperability survive the evolution of the business' domain knowledge/model? When applications finally get rewritten, they're typically also renamed, and frequently application borders are redrawn. This happens largely due to evolution of business domain knowledge. How can application interoperability survive? One answer: The new app can implement the old app's interfaces w/ proxies - in their own namespaces and assemblies - that consume the new app's interfaces. While the temptation in a DI-enabled environment might be to just have the new app directly implement the old interfaces, that presents a growing burden on successive iterations of software. Better to have independent proxies that can cascade, and that can be dropped as needed.

Think about what best practices would incorporate all of the following in enterprise-level apps:
  • Dependency Injection
  • Interfaces
  • Domain objects
  • Namespace boundaries
  • Application boundaries
  • Assembly boundaries and version numbers
  • What should be in the GAC, and what should not
Think about all this while reading Domain-Driven Design in Florida.

MacBook Hard Drive Upgrade Successful (part 2)

It's kinda funny, the psychological effect that RsyncX has had on me. Maybe funny, maybe not.

I've been planning to write my own sync program (yes, called Sync) in mono for quite some time. And my intent has always been to maintain a mirror of my Lightroom database and pics.

Now, RsyncX can maintain a bootable mirror of my MacBook's whole hard drive.

I don't know what to design anymore.

I still find myself out of habit re-entering the design process for Sync whenever I get a minute or two of spare CPU time. And right about the time I have to return my attention to whatever I'm supposed to be doing, I remember RsyncX, and realize I've just wasted several minutes of downtime.

Maybe I'll pick back up that project build-management design I was working on during my infatuation with RoR.

Or, maybe, I'll just read a good book.

MacBook Hard Drive Upgrade Successful


I must confess I was a little scared about upgrading the hard drive in my MacBook. Apple's computers are things of beauty, not collections of parts lacking a soul.

But thanks in large part to the ease-of-use and shocking functionality of RsyncX, it was easy to make a bootable backup on an external drive's partition, swap the hard drive, and boot to the external backup for the restore.

Kudos, Apple and RsyncX! Now I've got my entire Lightroom library on the internal drive!

Hello 2007 (yawn)

My dear, sweet wife has been reading blogs by Christian moms for several weeks now. She has recently decided that our family should have a blog, too. And her sudden interest in blogging finally reminded me that I have a blog.

So, to remind myself what blogging feels like, here's my first post in eleven months.

Cheers!