No Matter What: the pitch

I talked to the YAC (our youth group’s leadership committee) tonight about Dave‘s “No Matter What” class. I started by asking if any of them had heard of Dave Ramsey (none had, except for Cheryll), and telling them that he had written several best-selling books and had his own radio show. Then I told them that Dave teaches people about personal finance, and asked if anyone had just fallen asleep upon hearing that. (Only one of the youth raised his hand.)

It went pretty well; I think all the adults on the committee thought it was a great idea, and after a bit of explaining, all the youth said it sounded like it’d be a good class to offer (as long as people could decide whether or not they wanted to take it). Then after YAC, when all the youth showed up for the regular youth-group meeting, Cheryll announced to everyone that we’d be offering this class, and the convincing began anew.

I made some handouts to bring to YAC, and I also brought some visual aids: five hundred-dollar bills, the crispest ones the bank teller could find. Half of our emergency fund: I figured it could survive outside our bank account for long enough to get people’s attention. I got the idea from Dave; he too uses hundreds to illustrate during his classes, and says they’re his most expensive visual aids (grin). They certainly worked at getting people’s attention! (I did have to explain a few times that these were not handouts, but I’d expected that…)

There were a pretty wide variety of reactions to all this stuff, actually. (And if I’d given it much thought, I would’ve expected that from this group.) A few interesting examples…

  • One of the YAC youth was immediately absorbed by the statistics and examples in the handouts I’d made, and later I saw him explaining them to one of the other kids in the youth group. (I admit, I did hand-pick the examples to be pretty compelling.)
  • Another said he thought the class sounded like a good idea, but that he personally wouldn’t be very interested in taking it — but when Cheryll told the entire youth group that we’d be offering this class (and was met with a predictable level of doubt), I noticed that it was this same kid who suggested that I show everyone the visual aids. (I did, and once again, they did get everyone’s attention!)
  • One of the kids in the youth group was pretty skeptical about the class — until I told him (truthfully) that if he took this class, there’s no reason he shouldn’t retire a multimillionaire. His immediate reaction was, “I’m in.”

I don’t know how many people will actually be interested in doing the class when the time comes, but really, it went over better tonight than I’d hoped. Cheryll is going to order the curriculum in the next few weeks, and Jennie and I will probably start teaching this stuff in January (after spending some time reviewing the material and deciding whether we need to tweak anything for this group). Once again, I’ll keep y’all posted on how things go.

Subversion branch

We did a branch in Subversion today.

It was great. We didn’t have to wait around for hours for it to finish. We didn’t have to tell everyone to stay out of VSS until further notice. We didn’t discover that the repository was corrupted and have to run a repair that took all day.

We just did the branch. It took maybe a second or two.

Subversion rocks.

Financial Peace for a Unitarian youth group?

I’m an adult volunteer at our churches’ youth group, and I’ve been thinking for a while that it’d be really cool if I could find a way to pass along some of Dave‘s money advice to them, to (hopefully) save them some of the grief Jennie and I are dealing with. I knew he had something called “Financial Peace Junior“, but it turns out that it’s aimed at elementary-aged kids (our youth group is junior high and high school, plus one college student).

I’ve poked around Dave’s site before, looking for curricula for different ages, and on one of my searches a few weeks ago, I ran across “Financial Peace for the Next Generation“, which is aimed at the right age group — but it’s meant to be taught in schools, where you see the kids every day, and it looks like an entire-semester class. Not the best choice for a youth group that meets once a week.

Well, I don’t know if this is something new, or if I just didn’t manage to run across it before, but today I started poking around the site and found “No Matter What“, which is specifically designed for church youth groups. It’s a 7-week class, and designed for a one-hour timeslot. The teacher’s kit costs $100, which our group could probably find. Perfect!

I talked to Cheryll, our youth-group coordinator, about it tonight, and she suggested that I bring it up when the youth leaders meet at the end of this month. She also asked if I’d be willing to teach the class, and I said you bet. Jennie also wants to help, work-schedule permitting.

The only hitch I see so far (aside from this being the first class I’ll actually teach without Cheryll’s help) is that “No Matter What” is designed for church youth groups — by which they mean, Christian youth groups (they’re apparently of the “what other churches are there?” school of thought). Jennie and I have been taking Dave’s “Financial Peace University” class, and while he quotes the Bible and talks about God occasionally, it’s not enough to bother either of us. But I suspect that “No Matter What” will push that aspect a little (or a lot) more, and our group is feisty enough that I’m afraid that might turn them off to it. From the promo materials I’ve looked through so far, it looks like the Christian bent may be pretty strong (among other things, they advise the leaders to “pray for your youth specifically to receive [the] lesson” and to “Make sure your teens understand that the only way to true Financial Peace is to walk daily with the Prince of Peace, Jesus Christ”).

But what really matters is how it comes across in the videos, and I won’t really know that until we order the kit. And even if it turns out that the presentation won’t fly with our youth, we can probably repurpose the content and ad-lib our own curriculum if we need to. (Scary though the prospect is. I’ve never taught any sort of class yet — OWL won’t start until January. This class probably couldn’t start until then, either. Though I’m not sure how I could be teaching both OWL and No Matter What during the same timeslot…)

At any rate, I suspect there may be some other Unitarians who are interested in this curriculum (and I couldn’t find any other pages talking about Dave Ramsey and No Matter What from a Unitarian perspective). So I’ll be sure to keep y’all posted on how it goes.

Leap of Faith

We’re doing it. We’re really doing it. We’re finally getting our money under control.

The budget saved our necks last week, when Jennie’s employer screwed up the entire company payroll and nobody got paid. (No, they haven’t fixed it yet.) We had to have an emergency budget meeting to figure out what we would do if her income stopped for the foreseeable future. Hopefully it won’t come to that, but that’s what we had to plan for.

We sat down to hack and scribble and hammer out a new budget. One that included the stuff we’d already paid, plus all the stuff we still needed to pay, and without Jennie’s income. And we got the first half of the month done, and it worked. It didn’t include everything we wanted it to, of course, but it covered food, shelter, transportation, utilities, insurance. It fit. I can’t tell you how that feels — to already be on as thin a budget as you think you can manage, and then have to cut some more, and do it, and have it work. I’m really starting to believe in this written-budget thing in a big way — in the past when something like this came up, we’d just shrug helplessly, say “I guess we’ll just eat every other week,” and go borrow some more money. But there’s something about writing it down, and doing it together, and committing to it in advance, that starts to bend the laws of physics.

I’m serious. We should not be able to cut this much out of our spending. I know; we’ve tried many times. And yet, we’ve done it twice since we started the written budget — once last month when we had to take Tycho to the vet, and then this month after the payroll debacle. We’ve been doing the impossible.

So we were sitting there, looking at that budget. The first half was re-done so it worked; it was time to move on to my second paycheck’s worth of income for the month.

One of the things we’d had in our original (pre-debacle) November budget was $100 to save toward our emergency fund. In the past, when things got tight, that would’ve been one of the first things to go; after all, what good is money in the bank if we don’t have a roof over our heads?

But I thought about Dave saying you have to pay yourself first. I thought about how much longer it would take us to get out of debt if we kept cutting things like the emergency fund, month after month. And I looked at the first half of our new November budget, the impossible already come to pass.

And I took a deep breath, and a leap of faith. And I said, “Let’s start by putting that $100 in for the emergency fund.”

And we did. And then — only then — we started filling in the rest.

And. It. Worked.

It worked. I still can’t quite believe it.

We won’t have enough to pay everybody, or to save up for everything that’s coming up. We won’t get to go see the new Harry Potter movie when it comes out. I doubt anyone will be getting any Christmas presents from us this year. But we’ll have food, and cat litter, and gas, and we’re paying the mortgage and the utilities and even most of our debt payments. We’ll have enough to pay the car registration next month. And $100 is going into the emergency fund.

I’ve often said that I don’t know whether I believe in God, but I do believe in faith. Faith in God, faith in a friendship (that one in particular), faith in yourself. Faith can move mountains. It can bring strength. It can change lives.

It is also, in the words of Mark Twain, “believing what you know ain’t so.”

What we’re trying to do — it’s impossible. But month by month, week by week, I’m seeing the impossible happen.

We’re going to get by. We’re going to get our emergency fund. And then we’re going Goober-intense on getting out of debt, so we never have to go through this again.

And we are never going into debt again. Not even for a car. Not even for a house.

We can do it. I’ve already seen it starting.

And I have faith.

So is disavowal going to become an annual ritual?


Anybody remember a little flap last year, over the beta license agreement for Diamondback?

Well, apparently nobody at Borland remembers it, because nobody actually fixed it. From section 6 of this year’s beta license agreement:

6. CONFIDENTIALITY. You acknowledge that the Product including its existence and features, and related information remains a confidential trade secret of Borland. You agree to hold this information in confidence, not disclose it to any person, and not use it for any purpose other than the use and operation of the Product as permitted under this License.

Look familiar?

Now, you know I’m going to install it anyway; you know us geeks and our toys. But think I’m allowed to be a little grumpy about it. Didn’t they fix this once already?

So anyway. By the time you read this, I will grumpily deny that I know anything about a new version of Delphi that might or might not be coming out. I don’t know anything about all this stuff I’ve been blogging about since the conference started. As far as I know, Borland isn’t coming out with another version of Delphi this year. And no, that isn’t a DVD in my pocket; I’m just happy to see you.

In fact, I have no idea why I just wrote this post. I don’t know anything about it.

(Unless, by chance, Mr. Swindell wants to fix it again…)

Closing session

  • Started on Tuesday with a surprise: a new CEO
    • Developer guy
    • Loves developers
    • Told everyone developers rule the world
    • Video on BDN
  • Will put up JBuilder and Delphi demos as well
  • Tempo – IT management and governance
  • “Project Maia” – Requirements engineering: turning Word-based requirements into something developers can actually use
  • Getting the external forces under control
  • Spirit of Delphi award: nominated & voted on by Delphi development team to a member of the community who eats, breathes, sleeps and bleeds Delphi, is active in the community, newsgroups, magazine articles, supermarkets.
    • This year: Pierre le Riche (developer of the FastMM memory manager)
  • Borland Developer Network (launched as beta in 1999 – still beta)
  • GetPublished
  • Conference proceedings online –

Delphi Design Patterns

Delphi Design Patterns

Marco Cantù


We have some interesting IDE builds floating around… Marco’s title bar says “Borland Developer Studio 2010”. At one point when he was having some problems with the IDE, he said, “Well, it’s an early beta.”


  • What is a pattern?
  • Sample GoF patterns
    • Implemented with some creativity
    • Applied to “everyday visual” code
  • Delphi 2006 and patterns

Goals of this talk

  • Overview of patterns in OOP
  • Explore a number of classic patterns from the GoF book
    • from the Delphi language perspective (which matters – some of the creational patterns, for example, aren’t necessary in Delphi)
    • providing some implementation samples

What are patterns?

  • Capture similarities in repeated building blocks: design solutions, not actual code
  • GoF book
  • Pattern layout: name, problem, solution, consequences
    • The code is there as a hint, not very important. These are design patterns, not code patterns.

Goals of Patterns

  • Better OOP
    • Many patterns promote loose coupling -> more flexibility
    • “Think before you code” approach
  • Better communication
    • Pattern names are very relevant
  • RAD shines but…
    • As apps grow, you need a better infrastructure, not just the plain VCL

Prototype pattern

  • Create a new object of the same kind of another object you have at hand
  • In Delphi you can implement a Prototype using:
    • Class references
      • If you don’t need to copy the data, you can just do Object.ClassType.Create
      • If you want to call the right virtual constructor, you need to cast: TComponentClass(C.ClassType).Create(C.Owner)
    • Streaming
      • AStream.WriteComponentRes(C.Name, C);
      • Create a new instance, then AStream.ReadComponentRes(C); (but if both have the same owner, watch out for Name collisions)
    • RTTI
      • RegisterClass[es] the classes you’re going to use
      • Then you can write a Clone method

Singleton pattern

  • Only one instance of a class
  • Very simple pattern, but very tricky to implement
    • Needs a specific setup mechanism
      • Or can you use a constructor as well?
    • Consider subclasses
      • Data in unit causes some trouble

Adapter pattern

  • Convert the interface of a class into another expected by the user of the class
  • Better than “if X is…”
  • Can be nicely implemented using interfaces
  • Examples:
    • Descend from visual controls, so you can add e.g. “Text” and “Value” properties to  multiple different controls.
    • Interposer class: descendant class that has the same name as the base class. Interesting way to force the runtime to create *your* TButton instead of the standard TButton. Yikes. (Seems like that would be really brittle! The compiler wouldn’t even tell you if you got it wrong.) (It would also be problematic in .NET, if both are in the same namespace.)

Façade pattern

  • Provide a simpler, higher-level interface to a set of interfaces in a subsystem, making it simpler to use and promoting weak coupling
  • In Delphi: a single interface for a collection of components hosted by a container (e.g., providing access to the field values of a dataset on a data module)
  • Shield you from the other guy’s implementation details (at least a little)


  • Replace a series of many objects with a single stateless one, with status information provided on method invocation: pretend you’ve created 10,000 of something
  • The DbCtrlGrid is the perfect example. It looks like it’s got many editors, but in reality it’s only got two

Proxy pattern (Marco writes it as “proxi”)

  • Provide a surrogate (placeholder) for an object (delaying creation cost, if any)
  • Delphi uses something like this for form handles, different reason (that reason being Windows 9x)
  • At design time, a proxy is created for the form you’re editing
  • Proxy components as “light” representations of components (e.g., a database table). Increases total memory usage if you do need to create everything, but decreases time and memory if you don’t.
  • Proxies in OPF frameworks
    • Lightweight objects with few DB columns

Iterator pattern

  • Provide a way to access the elements of an aggregate object sequentially, without exposing its underlying representation
  • Often used with container classes
  • Are iterators better than for loops on VCL lists?
    • Probably
    • The new “” loop is an out-of-the-box implementation of the Iterator pattern

Observer pattern

  • Define a one-to-many dependency between objects, so that when one object changes state, all its dependents are notified of this
  • One of Marco’s favorites, found in the VCL
    • Notification and notification subscription
    • DataSource (a broker that sits between the two ends, and manages the notifications)
    • Actions (I don’t think these are really Observer, since they’re “pull” rather than “push”)
  • Example: a MultiCast event handler
    • Eww, his “MultiClick” is a write-only property. Worse, setting it doesn’t replace the old value of the property – it accumulates. And magically ignores duplicates. None of which is intention-revealing. Very smelly code.
  • A “Real” Observer: demo

Delphi 2006 and Patterns

  • Available with Together support
  • GoF patterns implementations
  • Extensible with your own patterns

Miscellaneous conference catch-up stuff

I guess I haven’t blogged about Tuesday evening’s Meet the Team session yet. Last year, they did a presentation where each of the devs showed off their favorite new feature. They didn’t do that this year, which was kind of a bummer. All they did was have people standing around, near signs with the product names on them, and people could wander up and talk to them. I got involved in, or listened to, a few interesting discussions about everything from comment spam to the number of bugs Danny has fixed (and created). Not bad. They didn’t hand out any betas, though.

This afternoon, I was hoping to go to Chris Bensen’s talk on “C++ and .NET Interoperability”. Unfortunately, that session got canceled. 🙁 We’re not a C++ shop, but we have a large Win32 codebase that we’re looking at moving to .NET, and that move would most likely be done piecemeal, so interop is very much of interest. The description said the session would cover (among other things) mixing the VCL, VCL for .NET, and WinForms frameworks. Man. I was looking forward to that one.

I went to the computer lab this morning and played around with Delphi 2006. I’m liking the new features, especially the edit-completion stuff. I poked around briefly with modifying the existing templates, and was able to fix the template I complained about yesterday. Haven’t tried creating my own template, because it isn’t immediately obvious what all you can do in that XML file, and there’s nothing about it in the Help file yet.

On an amusing note, the IDE seemed quite responsive in the lab, and I found out why when I looked at the System properties… that computer-lab machine had three and a half gigs of RAM! (Please can I have some?)

Empowering Agile Development with CaliberRM

Empowering Agile Development with CaliberRM

Jerry Odenwelder


Test-first speaking 🙂 (they had to troubleshoot and test the recording software before the session started)


Likes agile – customer involvement, lots of testing


  • Individuals and Interaction: People are not pluggable units
  • Customer Collaboration: Customers are ultimate beneficiaries, so need to be involved
  • Working Software: is what adds value to the business
  • Adaptive: Change the process as needed.

Agile Requirements

  • User Stories
    • Can break down into one or many requirements
  • Describes a unit of work that contributes to business value
  • Created by, and owned by, the customer
  • Meets the PET criteria
    • Can be Prioritized
    • Can be Estimated
    • Can be and Tested

Why Use a Tool (instead of index cards)

  • Automation (cut/paste)
  • Disaster recovery
  • Reporting
  • Traceability
  • Distributed Development
  • Scalability
  • Customer is not available

CaliberRM Supporting Agile

  • Light Weight
    • Expert Client
    • Cross-Platform / Web Client
  • Works in your environment (Delphi, etc.)
  • Get the bureaucracy off your back
    • Document generation
    • Reporting
  • Everyone is on the same page
    • Central server

Managing User Stories

  • Rich text editor
  • Attach pictures
    • Take a picture of the napkin and put it in as a requirement
    • No zooming support in the current version
  • Embedded tables (e.g., Fitness)
  • Glossaries: business can write terms they’re familiar with, they’ll automatically be highlighted in the text, and when the programmer hovers over them, they find out what the acronym means
  • Could create a requirement type of “Backlog” and another called “Sprint Backlog”
  • User-defined attributes, e.g., complexity, iteration, requires spike


  • E-mail notifications (customize per group); registered interest
  • Threaded discussions
    • Record hallway discussions
    • If the customer isn’t immediately available, could post questions and get responses back
    • When you log into Caliber, you get a pop-up notification (can disable, can run explicitly later) showing which discussion items you haven’t read yet

Decrease time of meetings

  • Filtering: Remove data from grid that’s not important for this meeting; sort
    • Can save the grid settings and reload them later
  • Edit right there during the meeting

Maintains history of changes

  • Records how requirements change over time
  • Go back and review old version of requirements
  • Document Factory can produce documentation (which even includes the picture of the napkin)
  • History tab: top pane shows history of changes, bottom pane shows what changed in any particular rev
  • No way to require (at the server side) comments for each change

Manage Dependencies

  • Valuable for
    • Impact of change
    • Risk assessment
    • Planning
  • Important Agile Traces
    • Dependent requirements
    • Project tasks
    • Model components
    • Validation procedures
  • Tracing to
    • External files (might be a bad idea in Agile, since the files might change frequently)
      • External revision control system?
    • TestDirector
    • StarTeam
  • View trace matrix
  • When you change one item, the items it feeds into are marked as suspect, so you can go and review them


  • Isolate requirements for a release or iteration
  • Once a requirement has been put into a baseline, it can’t be modified through normal editing (you have to explicitly go into Baseline Maintenance)
  • Baselines support digital signatures (if you have compliance issues)
  • Once a baseline is locked (signed), it can’t be unlocked (for compliance reasons)
  • Can diff two baselines, or current baseline with old baseline


  • Supported to User-Defined Attribute level
  • Q: If you’re in an agile environment, do you need security? A: It might not be a bad idea to keep the customer from editing the estimates (grin). Maybe the developer shouldn’t be able to edit descriptions or iteration numbers. And if you’re working with a third-party vendor, you’d want to rein that in as well. The person who drives the meetings should probably have all access.


  • Change is inevitable; embrace it
  • Requirement Capture and Understanding
  • Planning and Risk Analysis
  • Tracking Progress
  • Post Mortems

Q: What happens if you have an unreliable network connection that dies while you’re working? A: Anything they were working on, but hadn’t saved yet, will be lost. The requirement they were editing will be locked until the session times out (or the admin logs off their session).


Q: How do you make sure the story gets QA’ed and documented? A: You would probably want to use user-defined attributes for that (possibly in combination with the built-in Status and Priority attributes). Find them by setting filters on the requirements grid.