Tuesday, March 23, 2010

Subversion Vision Conference in NYC

I'm in New York City for the Subversion Vision Conference. Follow my daily progress reports via the Submerged blog.

Wednesday, March 17, 2010

Flaming Dragons

Another season of youth soccer is upon us. Gavin's decided to take up piano this season, but Aidan is happy to have moved up to Harrisburg Parks and Recreation's 5/6 age bracket, the first in which the kids get to play actual soccer games.

The two guys I coached with last season on Gavin's team — Darryl Strack and Bobbie Middleton — have moved up with their kids to the 7/8 age bracket and are coaching together again. I ran into them last weekend, where I learned that their team had chosen the name "Flaming Dragons". I had a lot of fun with these guys last Fall with our Soccer Monsters team, including designing a team logo which we had made up into stickers and iron-on patches. So when Bobbie asked me last Saturday if I'd be willing to do the same for their new Flaming Dragons team, how could I pass that up? When eating lunch later day, I scratched out a rough idea in crayon (on the table top at Supper Restaurant) for the logo:

Then, I spent a few evening hours this week converting that simple drawing into a real vector artwork file:

Meanwhile, Aidan's team has chosen the name "Hot Lava". Not … really … sure what to do about that one just yet.

Monday, November 30, 2009

Subversion background (leather w/ punched holes ala Betts)

When preparing my presentation for this year's SubConf conference, I was looking for a background that wasn't so … run-of-the-mill. I stumbled upon a post at "The Art of Adam Betts" (at http://www.artofadambetts.com) that advertised a really cool background graphic. After checking the site over to make sure that I could in good conscience make a derivative work from his piece of art, I snagged the sucker and did exactly that:

(Adam, I seriously hope you're cool with this. If not, a thousand pardons and I'll certainly pull this post and any related graphics.)

Wednesday, November 25, 2009

Reflections of a Newbie Youth Soccer Coach

This past weekend, my sons' youth soccer seasons ended. My oldest practiced and played in a division for 5- and 6-year-old kids, and I assisted his head coach. My youngest practiced in a division for 3- and 4-year-old kids, and I was the head coach of his team. I wanted to write up some thoughts about the seasons from a coach's point of view. As you read these, if they sound more like parenting advice, there's a reason for that: many times over the course of the season, I noticed (and noted to others) parallels between coaching to parenting. I found that many of the basic principles commonly applied in one role remain valid and useful in the other. Mind you, I'm certainly no expert coach. Not by a long shot. (For that matter, I'm no expert parent, either.) But these are some of my observations, and I'm hoping that perhaps something here resonates with other folks who — like me at when this year began — have never coached at all.

Teams are best built atop friendship

An observation I made at during the Spring soccer season was that by the middle of the season, the players on the team I was helping to coach (which, as in the Fall season, consisted of 5- and 6-year-old boys and girls) still didn't know each others' names. This bothered me deeply, because at a minimum it meant that the players couldn't communicate effective to or about each other. But it also meant that somewhere between showing how to dribble a soccer ball and how to perform a proper throw-in, we as coaches had overlooked the simple fact that children are social beings. My son has a distinct “cautious observer" personality type. Until he's comfortable around his peers, he'd rather just watch to see if it's safe to engage. Not even knowing your peers' names does not encourage comfortability.

This season, we as coaches worked to remedy this problem up front. A helpful parent took a team photo, and we labeled it with each child's name, had Wal-mart print up enough copies for everyone, and distributed them. During practices we often encouraged the players to cheer for each other by name. The result was noticeable (to me, at least). There was much more of a team spirit on the field and off, and sometimes it was actually difficult to get my son away from the fields because he was having so much fun playing stuff other than soccer with his friends after practices and games.

What's my point? People matter — more so than winning, more so than ball control skills, more so than anything else at all. (Unfortunately, I fail to remember this critical truth myself sometimes — both on and off the field of play — much to my own embarrassment and the detriment of valued relationships.)

"Fundamentals" begins with "fun"

The assistant coaches on my youngest boy's team were amazing. One of them was introduced to me as a guy with a ton of soccer-related creds. Quite honestly, I was a bit intimated by this fact. But if there's one thing that he and the other coach taught me this year, it was that if the kids aren't having fun, it doesn't matter how well they can kick and throw a ball. What good is teaching good dribbling if at season's end the kids say, "Soccer's a drag — count me out"? For kids at this age, fun is closely tied to many things:

  • avoiding repetition — no child can tolerate doing the same thing for long periods of time. Mix it up a bit, Coach.
  • avoiding down-time — It only takes a few moments of waiting in line before a young child times out. You can almost watch as their attention span threshold is reached, and then away their little minds go, off to La-la Land. If you can, avoid line waits and repetition by splitting the team into smaller groups at various stations of differing activities.
  • simple rewards, oft-given — I was introduced last season to these little 1" iron-on motivational patches with pictures of soccer balls in various colors, stars, etc. We gave each kid that showed up at practice and stayed for the duration one of these patches. Kids respond positively to the promise of even simple rewards like that, or the promise of playing a favorite game at the end of practice. As it turns out, they don't mind trying harder when trying harder is fun.
  • team spirit — This season the teams were allowed to choose their own team names. My oldest boy's team chose the "Soccer Monsters". I wasn't so thrilled by the name, but nonetheless spent a few evenings designing a team logo just for kicks. The other coaches and parents loved it, and by the end of the season that logo showed up on 3" iron-on embroidered patches, stickers, a vinyl signboard for the parental cheering section, and even a sheet cake! Everyone loved the "brand" we built around the Soccer Monster name. And repeatedly the coaches and parents reinforced not just the value of individual contributors, but also the value of the team as a whole. The stereotype of the coach's kid who gets all the attention was completely absent — every child took his or her turn on the bench in every game; every child got a chance to play every position on the field over the course of the season; and every child gracefully dealt (most of the time) with being asked to do something that wasn't their favorite thing because it would benefit the team.

I owe a deep debt of gratitude to the other coaches and parents who routinely helped to make soccer fun for my kids and their peers.

Never underestimate a child's potential

If you had told me what I would be seeing some of my 5- and 6-year-old players doing at game time at the beginning of the season, I would have laughed in disbelief. While many other teams were playing "bunch ball" (all the kids swarming around the ball like so many angry bees), ours entered even their first games with an understanding of the various positions, their roles in those positions, and the importance of performing in their roles instead of just roaming around the field without a purpose. By season's end, I was finding that the kids could handle some game play maneuvers that I thought were pretty complex, such as one defender falling back to help the goalie when the other needed to head off an approaching attacker. I found myself often saying in disbelief things like "But these kids are only six years old!" and "But this is his/her first season of soccer!"

One of the other teams had a kid who, despite being one of the smallest players in the division, had amazing ball control and the sweetest little slide tackle you ever saw. And you didn't see many, because I think he's the only kid who attempted them in this age group. Every time he did (our team played against his team twice) I smiled a huge smile and thought (or said aloud) "That's awesome!" His dad was his coach, too, but when asked him about his kid's skill, he indicated that it was self-developed. Call me naïve, but that's amazing to me.

Now maybe these are just exceptionally talented children. But I have to believe that the key to this phenomenon is to never stop asking more of the players. At any given moment, a particular player is going to have a great grasp of some concepts and skills, a pretty good approach to others, be relatively weak at still more, and have never been introduced to the rest. Keep a sliding window of instruction with those kids so that they are always trying stuff they are likely to fail at along with the stuff that they do with grace and ease. What other self-developed skills are hiding inside our children just waiting for us to affirm them into the mainstream? What other skills are they ready to learn but can't because we underestimate their chances of success? This leads me to my next point.

Failure can be the best instruction

Instruction is extremely important. There is always something else to learn, develop, or improve, so ideally instruction never stops. The Harrisburg Youth Soccer program is a decidedly instructional league, favoring instruction to competition in an attempt to develop well-rounded players who love the game enough to play competitively at older ages (when they can emotionally handle serious competition). But instruction without the freedom to try and fail is stifling.

If every time one of my sons reaches for a glass of water on the table I criticize how fast he's reaching, whether he's planning to use one or both hands, whether he looks to be picking up the glass or sliding it between all the other obstructions on the table surface, and so on — if I micromanage his every move, he learns exactly one thing: the way Dad wants stuff done. Not taught in those moments is the most valuable lesson of all: why Dad prefers that approach. My son doesn't understand that it's Dad's experience with the physics of our Universe that leads him to prefer a particular approach to drinking from a glass. And he never will until he experiences some of that physics himself.

Now, I'm not saying that there's no value in that type of instruction. Certainly the opposite extreme of never sharing your own experiences with kids and leaving them to learn solely from their own experiences is just an abdication of parental responsibility — inefficient, unloving, and sometimes downright dangerous. But an absolutely critical aspect to any learning situation is experience, and specifically experience failing. Kids don't need protection from everyday failures because everyday failures teach some of the strongest lessons more quickly and more thoroughly than constant hand-holding ever can. Kids need a safe place to experience those failures, reassurance that in failing at a task they haven't failed as people, and encouragement to get up and try again.

By the end of our soccer season, the majority of our kids knew how to perform nearly any action that would likely be asked of them during a game. Early in the season, we hand-held. We did our jobs as coaches and taught them the finely detailed mechanics of these actions. But as the season progressed, we gradually shifted to a model of letting the kids make their own decisions and deal with the consequences. And if one of them messed up and did something incorrectly, both the player and the attempt were affirmed as valuable.

In the free software world, this is similar to way that new project members are often brought on board. First, a would-be project member submit patches for the software — technical descriptions of how the software should be changed to add a feature or fix a bug. The patches are reviewed by existing project members for accuracy and efficient, for attention to the rules of the project, and so on. If the patch meets the standards, it is committed (by an existing member) as a change to the software itself. If it doesn't, the patch is sent back with recommendations on doing it better. Over time, a talented developer will submit better and better patches the first time around, earning the trust of his or her mentors. And at some magical point, the mentors realize that it's no longer worthwhile for them to pay both the cost of reviewing the work and of then actually committing it on behalf of the patch submitter when instead they could let the submitter commit his or her changes first and then receive review afterwards. As coaches, our goal should be to progressively transition each child from a model of pre-emptive review (at significant cost in valuable time) and into one of post-facto review (which is far more efficient and allows the kids to celebrate victories they've earned for themselves).

Friday, November 20, 2009

Revisionist History


Remember the Subversion 1.0 celebration T-shirts? Alas, there are no `svnadmin dump' and `svnadmin load' for cottonware.
As you might have read elsewhere, the Subversion project has recently been accepted in the Apache Software Foundation's Incubator. As part of the process, we'll be migrating all kinds of goodies off of Tigris.org — which has been the project's home (and a good one at that) for the past near-decade — and onto Apache-hosted servers. Last weekend we took the first of those steps by migrating our version control history. I managed the Subversion side of this migration, prepping the data for delivery into the ASF Infrastructure team's able hands.

But I wanted to do more than simply move our Subversion history from one place to another. See, when Subversion began, it was a bunch of source code living in a CVS repository. When the source code compiled into something trustworthy, we let Subversion hold it own source code. (For the record, we were never given cause to regret that decision.) But at the time we made that change, there was no reliable and simple way to convert CVS history into Subversion history like there is with cvs2svn today. So we just exported the latest snapshot of our main development line, imported that into Subversion, and dealt with the severed history. However, this repository migration — which was going to be disruptive anyway — presented an opportunity to stitch together our old CVS history and our Subversion history. So I did. Here's how:

  1. Using cvs2svn, I converted all CVS history to Subversion and deposited it into a temporary repository, svn-from-cvs.
  2. Now, the CVS repository data contained some trailing changes that were created after the switch to Subversion back in 2001. Most of those were commits to www/ (which we manually mirrored for a while based on our Subversion commits to trunk/www/). A couple of them were things like system-wide automated tweaks to www/robots.txt made by CollabNet folk. Also, we had real tags and branches in our CVS repos that we didn't bring with us into Subversion. So I dumped the first 3654 revisions from svn-from-cvs — the pre-switchover changes only — and loaded that into the stitch repository, svn-complete.
  3. To historically preserve the fact that apparently we didn't care too much about those old CVS tags and branches, I committed their deletion from svn-complete (but left the branches/ and tags/ top-level directories themselves).
  4. Since the first revision of our project's Subversion history (in the main svn repository) was a massive import into trunk, that would have clashed mightily being loaded atop already-existing files and directories in svn-complete. So instead checked I out svn-complete/trunk@HEAD, then exported svn/trunk@1 atop it. The local mods were the small delta between what we got outta CVS on August 31, 2001, and what we put into Subversion. They were mostly the result of $Date$ keyword formatting differences. I committed those local mods, which now brought svn-complete into sync with svn@1' except that svn-complete still had empty tags/ and branches/ directories (which were added in r532 and r1237, respectively).
  5. I dumped -r2:531 of svn, loading the result into svn-complete.
  6. I skipped r532 (the revision in which we created our tags/ directory) from svn, instead adding a no-op placeholder revision to svn-complete.
  7. I then dumped -r533:1236 of svn, loading the result into svn-complete.
  8. Once again, I skipped r1237 (the revision in which we created our branches/ directory) from svn, instead adding another no-op placeholder revision to svn-complete.
  9. Finally, I dumped the rest of the svn history (r1238:r40515), loading those revisions into svn-complete.

The result was a single repository (svn-complete) of 44170 revisions (3654 from CVS, 40515 from Subversion, and 1 cleanup revision) that contained all of the Subversion project's version control history, starting with the inception of the project. It's this data that I handed off to the ASF Infrastructure team.

The ASF Infrastructure team took this repository's data and loaded it into the ASF repository (with external commits disabled to prevent interleaved commit history). At the time that this history was loaded into the ASF repository, that repository already had 836419 revisions in it. The next 3655 revisions represent the Subversion CVS history (plus a fixup revision). This means that any historical references found in Subversion's source code, issue trackers, mailing lists, etc. that refer to pre-migration revisions (which are easy to spot, as they are all quite a bit smaller than 800000!) may be found in the ASF repository by adding 836419 + 3655 = 840074 to the revision number.

We as a project are still really finding all the places that this change of address (and revision numbers) will affect us. I can assure you that the last place I expected it to hit was my clothes closet, though!

Friday, November 13, 2009

Name-dropping Jesus

Don't you just love it when you personally benefit just by knowing someone else? Maybe (just maybe) you're considering an order of some trophies for your eldest son's soccer team, and one of the other dads on your youngest son's soccer teams says, "Oh, you should check out Awards Express — I always get my stuff from them. They turn around high-quality orders quickly and professionally. Tell 'em Tray sent you!" And instantly, you feel like some kind of V.I.P., empowered to trade on someone else's good name and reap the benefits of their relationships with a mutual contact.

That's kinda the way prayer works for Christians. I was thinking tonight about how I was taught that prayers are supposed to end. You know, some variation of "In Jesus name, Amen." This isn't merely the result of some ancient meaningless ritual passed down through the generations. It's the way Jesus told us to pray. In John 14:12-14, He tells us that after He returns to His Father (which, if you haven't noticed, He already did), He will do whatever we ask in His name. We find similar statements in John 15:16 and later again in John 16:23-26. Basically, Jesus is hearing our complaints and concerns and needs and desires, and He tells us, "Hey, I know exactly who you should talk to about this stuff. My Father is the best in the business. He can hook you up. Tell him I sent you."

Now, if ever there was a name worth dropping, the Son of God's is the one. But sometimes I wonder if the following happens when I pray:

[Tinkling sounds of bells rapping against the closing door.]

God: Yes, can I help you?

Me: Uh, yeah. I'm looking for solutions to some of Life's problems.

God: Oh, well then you've come to exactly the right spot. I designed Life — nobody knows how it works better than I do. Now, I could take a small bit of offense that you would claim the product is flawed. I can assure you that it isn't. But as it turns out, I'm also really good at forgiving, so let's just move past that. What did you have in mind.

Me: Well, I was kinda thinking that maybe you could cause X to happen. That would really work out well for me.

God [clearly uncomfortable]: Hrm. Well, that's not really how I had things planned for you, but...

Me: Yeah, I know. See, something tells me that there's a purpose for my life that's bigger than just me, but I really, really want to just get X. I just think that makes the most sense for me.

God: You seem pretty confident about this request. Are you sure you've come to the right spot? I'm usually pretty picky about making sure that the work I do is for everyone's benefit.

Me: Oh, yeah, I'm sure. Your Son sent me; told me you were the best in the business.

God: Oh! You know my Son?! Well that changes everything. You two are close? Good friends? Maybe you guys work together?

Me: [clearly uncomfortable] Well ... I wouldn't exactly say we're close, really. I met Him some years ago, and we see each other from time to time. He's good friends with my wife's grandparents, so, you know, practically part of the family, sorta, I mean, not that we ask Him over for Thanksgiving or anything, but...

[Extended silence. Awkwaaaaard.]

Maybe I should strengthen my friendship with Christ before using His name for my gain, huh?

Go back and read John 15:16. Better yet, check out some more of the context by looking at John 15:14-17:

14 You are my friends if you do what I command. 15 I no longer call you servants, because a servant does not know his master's business. Instead, I have called you friends, for everything that I learned from my Father I have made known to you. 16 You did not choose me, but I chose you and appointed you to go and bear fruit — fruit that will last. Then the Father will give you whatever you ask in my name. 17 This is my command: Love each other. — John 15:14-17 NIV (emphasis added)

Think my fictitious scenario above exaggerates too much? I'm not so sure. See what Jesus says in Matthew about folks trading on his good name without the fruit to justify it:

18 A good tree cannot bear bad fruit, and a bad tree cannot bear good fruit. 19 Every tree that does not bear good fruit is cut down and thrown into the fire. 20 Thus, by their fruit you will recognize them. 21 "Not everyone who says to me, 'Lord, Lord,' will enter the kingdom of heaven, but only he who does the will of my Father who is in heaven. 22 Many will say to me on that day, 'Lord, Lord, did we not prophesy in your name, and in your name drive out demons and perform many miracles?' 23 Then I will tell them plainly, 'I never knew you. Away from me, you evildoers!' — Matthew 7:18-23 NIV

Are you just name-dropping Jesus? Man, sometimes I do. I've witnessed the power of prayers made in His name and in a spirit of obedience, but I confess that many times my name-dropping is just bogus. I need to work on that — need to work on my friendship with Christ, need to work on my obedience to His commands, need to work on bearing fruit, and need to work on loving my neighbor — because I definitely don't want to experience any awkward encounters with God. How about you?

Thursday, November 12, 2009

Harrisburg Area Land Use Planning kick-off meeting

Tonight I attended my very first civic community meeting, a kickoff meeting focused on the Harrisburg Area Land Use Planning effort. The meeting was a couple of hours in length, and drew what I would guess to have been about 150-200 people (though I'm really bad at estimating such things). I thoroughly enjoyed myself there — enjoyed seeing other folks in attendance that I know, enjoyed meeting some new folks (including our town's mayor), and enjoyed feeling like I was participating in something of value to my community. I learned several things about my town that I didn't know beforehand. And overall, it was a good opportunity to just listen to what others in my community think about the direction our town is heading.

Harrisburg, NC has in recent years been at odds with itself about land use. Our residents are fortunate to have some of the highest personal income levels in the area, and the town offers some of the lowest tax rates in the area. But we're growing like mad, and that necessarily has town planners busy, you know, planning to accommodate that growth. But how that growth happens has become a bit of a sticking point. It's easy to find folks with extreme opinions about the matter. Many oppose "big-box" commercial development, citing concerns about increased traffic, crime, and low-paying jobs probably filled by folks that can't afford to live in the town itself. Many others are begging for the entrance of large-scale commercial development, hoping that tax revenues from such places will fund the town's growth so that increased personal property taxes don't have to. Some read the phrase "bedroom community for Charlotte" with disdain; some with delight. Reconciling these viewpoints will certainly prove challenging for those tasked with doing so.

I look forward to the next meeting in this series, though I'm more than a little concerned that as the presentations and discussions progress from the general to the specific, these will devolve into battles of opposing viewpoints. Tonight's meeting intentionally cast absolutely no direction, at all, for the town. And yet there were already plenty of folks willing to voice strong opinions about how things ought to be, some of which were definitely assuming a defensive position. That's really not helpful. If you are a Harrisburg resident and happen by some misfortune to have wound up on this blog post, please, please do your fellow citizens the courtesy of not assuming that they want to ruin your quality of living — while a perfect solution that pleases everyone might not be possible to achieve, you can be pretty sure that forsaking honest communication for bickering will hinder the creation of even a tolerable solution.

(Oh. And no, Mom and Mom-in-law, my attendance at this meeting does not mean that I'm gearing up for a bid on a Harrisburg Town Council seat. It was just another way to connect with our community. Sorry to disappoint.)