Thursday, August 30, 2007

Book Review: Rich Dad, Poor Dad

OK, so it's an old one, originally printed in 1997, but it's been popping up on lots of my blogs so I figured I would give it a read. Truth is, I wish I had read it in 1997, when it was new and I was 17, then it would've been news to me.

The book itself is basically the explanation of his life with two "dads" (the second dad is actually his best friend's dad, but we get the point). One dad is "highly educated" but never rich; the other dad is your prototypical "dropped out of school, got wealthy" type of guy. He typefies the behaviour of both fathers into a "Rich" and a "Poor" mentality. The book is a basically a compare and contrast of the two philosophies centered around his six lessons that his Rich father taught him. The lessons are:
  1. The Rich don't work for money

  2. Why teach financial literacy?

  3. Mind your own business

  4. The history of taxes the power of corporations

  5. The rich invent money

  6. Work to learn - don't work for money

OK, so they don't all sound like lessons, a bunch of them actually sound like chapter titles (hello #4?) and they are. But hey, the history of taxes? The power of corporations? Man sounds pretty complex, pretty powerful... yeah... it's 10 pages long, maybe like 4000 words, it reads like a short essay without the footnotes or references.

Still we can do justice to the history of taxation in America in 10 pages, right? Not really, not when half of it has to be tied in to your vision of the world. And that's the fundamental failing of this book, it's basically 200 padded pages of pump you up, go out and learn. He's basically all about eschewing the establishment and focusing your learning on how to make money. He's very focused on stating how the "old ways" of school, work (house, car, kids) and retire are all gone, without really mentioning that they were never there in the first place.

He talks about how schools don't teach what it takes for people to be independently wealthy as if schools actually had that purpose in mind. We don't build schools to teach the leaders of tomorrow, it's not really a secret, we run schools to build more efficient peons, but hey one visit to my high school would've made that evident. My family had dinner table discussions about this stuff in high school. The smart kids make it through despite the system not because of the system, we knew that, I knew that, I still went to University. Then again, we also talked about the general death of pensions and the "pointlessness" of retirement (see Die Broke). Yeah, so maybe he's right, the smartest kids learn stuff at home as well as at school, but then, my parents aren't Rich either.

Long story short (not that the book is very long), Kiyosaki has some potentially novel ideas. There are tons of people who have never thought in the ways that Kiyosaki is espousing. So I guess that's good for them, it's just terribly unfortunate that he's not really a good writer. His book is like fragments thrown together where the same stories are repeated and the same points belaboured. It's like a series of bad essays with no supporting documents and no footnotes and the same point to all of them: become more financially savvy and you will become "Rich" instead of "Poor". But he doesn't bother with history, he just gives you the short "Kiyosaki"-esque version, he mentions the gold standard in passing and never follows up. He talks about his Cashflow game in basically every chapter but doesn't bother to even provide an Appendix with details or rules of the game. Some of paragraphs read like rewrites of paragraphs from other sections (they probably were), he just repeats himself so much.

And maybe that's my big issue with the whole book. Kiyosaki is not trying to provide you with "information" so much as "inspiration". He wants you to read his 200 hundred pages and subscribe to his philosophy. Some call this their PF bible, but to me it is to personal finance what Rocky is to boxing training; it's all sizzle, no steak. Of course, great steak needs some sizzle, just like great boxers need heart, but reading this book won't make you rich, it'll just make you want to be rich.

If you want to actually be rich, then look elsewhere, he simply doesn't provide any more details: pay yourself first, make your money work for you, hire people smarter than you, blah, blah, blah. He doesn't list a book on hiring skilled people; or point you to specific books on where to start investing and where to finish investing; or send you to guides on being frugal; he doesn't give you the top 10 wealth ways of ordinary people. All of this important, actual information, is left as an exercise to the reader. He just wants you to agree that he is right about wealthy people. He simply doesn't provide any real direction on any of these things, he's not interested in teaching PF 101 he just wants you to agree that he's right and then he wants you go out and teach yourself.

Yes Mr. Kiyosaki, you are correct. There it's done, now go read something with information like Tom Hopkins: "How to Master the Art of Selling" or Stephen Covey's 7 (or 8) habits.

PS: If you want to know a lot more about the Gold Standard, look here, and check out the first two videos. They have propoganda issues, but it's a good run at understanding money and the banks and the actual history behind the whole deal.

Monday, August 27, 2007

Paying down the mortgage early?

OK, there have been a couple of posts on the blogs that I read discussing the benefits of an early mortgage paydown vs. an alternate investment.

And me, well I'm kind of a chump, so I ran the numbers quickly. For reference, this is a 200k fixed mortgage at 6% over 25 years. Here's what the monthly breakdown looks like for the standard mortgage. That Purple Stuff is the money the bank is taking for interest which, as you may know, is mostly taken first. And the Light Tan stuff is what you're actually paying down. For the last two, I've taken an equal size payment (~$4600), off the principal at different points in time. So that Blue Strip on the last two is the amount of interest that you save each month as time goes on.

When you pay down interest early on, things change like so:

Paying things down late gives you something like this:

Now, the original posters were talking about applying extra money against the principal and calculating the interest saved as a percentage of that principal. So if I paid down 10k on a 6% mortgage with 10 years left, I'd basically be saving $600/year or $6000 in interest.

However, the graphs would seem to imply that something terribly different is going on here, I mean, you can only save chunks of the purple stuff and if you're paying down the mortgage later rather than sooner, there's a lot less purple stuff to save on.

Imagine it this way: say you took out 100k @ 10% for 10 years and made your regular monthly payments ($1321) for a full year. Then, magically at the end of the year you win the lottery and pay down the house in one swoop, how much would you pay? A quick run to my information source, indicates that you still owe $93.8k, you were going to pay $58.5k in interest on that mortgage, but you paid $9.7k in interest in the first year alone, the bank took 16.6% of the money you owed them in the first year. In fact, in the next year, they would've taken $9.1k which was 15.5% of what you owed them, or 18.6% of what was left. By the end of two years, they have 32% of what we owed them, that's 32% in only 20% of the time.

So let's back off and go to our equation. Both posters are saying: if I drop 10k on a 10% mortgage I'll get a return of 10% times the number of years, and I'm saying that the calculations are flawed. So we'll use the 100k @ 10% for 10 years example to make life easy, if I put down 10k, it will "earn" 1k/year. Let's say that I get to my final year and decide to put down the 10k. With 12 months to go, we've paid 57.7k out of 58.5k in interest and we owe 15k on the place.

Wait, hold on right there! we're supposed to save 1k in interest, but we don't even have that much owing in interest. If I put down my 10k, I'll still owe 5k on the house, but I won't have saved 1k in interest, there's not even 1k in interest to save! What if I do it the previous year? At this point I owe 28.6k on the house and I have 3k left in interest to pay. So now the model is telling me that I can save 2k (or 2/3 or the remaining interest) by paying 10k of the 28.6k principal that I still owe (or more than 1/3)?

If the numbers seem weird, it's b/c they are, I mean, they're clearly wrong. You're not going to save 66% of the interest over 2 years by paying down 35% of the principal, that's pretty clear.

What's going on here is equally clear, if you're at the end of the 10% mortgage, you're not actually paying 10%. In the last 2 years of the 100/10/10 example, you will normally pay 31k into the mortgage and only 2.3k will go towards interest, i.e.: you only pay 2.3k/28.6k or about 7.5% interest. If you're in the last year, that number drops to like 5.5%. Here's the "effective interest" chart:

At the start of year 2, the 100/10/10 mortgage owes 93.8k, but will only pay 9.1k, which is actually just under 10%. So where did the original posters go wrong? Well, you can't "save" 10% interest if you're only paying 7.5%. The other problem is that the 6% is relatively small, so it's easy to gloss over the math. In the 200k @ 6% for 25 examples (the first graphs), you're actually paying between 5.15 & 5.95% "effective interest" for the first 22 years, so you can basically just gloss over the number (even if it's wrong) b/c you're still within a percentage point. If interest rates go to 10%, then suddenly you're losing whole percentage points and the bad math becomes evident.

So after a few hours of number crunching, what do I think? Well, the basic premise of both posts is actually still good: where am I going to get better returns? And the simple answer is that all things equal you'll get better returns from whatever is paying/charging the higher "effective interest rates". (where the "effective" part is key)

However, right now, things are pretty muddled b/c today's interest rates are yesterday's mortgage rates. This is complicated by tax law. You see, in Canada, we get tax breaks for RRSP investments and in the US you get tax breaks for mortgage interest. So in Canada if you have room to contribute to your RRSP (they do have caps), then you actually get an immediate 20-40% return on putting the money in the RRSP. In the States you'll only get a tax break for a certain period at the beginning of the mortgage, and then the interest will become too small. All in, the numbers could really "go either way" so there's no clear winner.

Personally, I'd rather have the money in something liquid and diversify. "Cash is King" and your home isn't bringing in any cash (unless you're renting rooms). Give the cash to someone who can make you more cash and if you're still itching to pay down the home then use the income from that cash to help with payments. At least this way you're making and spending money rather than just spending it. That way you can redirect the cash flow if you need to.

Tuesday, August 21, 2007

Coding Horror: Leading by Example

Coding Horror: Leading by Example

I read Dennis's story and just had a flashback to some "olden days", FTA:

I was recently brought in to help a software team get a product out the door, with a mandate of helping with some web app code. I've been trying my best to integrate with the team, trying to earn some credibility and respect by making myself useful.

I've been forwarding various Joel On Software essays to all, recommending that the office stock up on Code Complete, Peopleware, and The Mythical Man Month, and I make an effort to point out everything I believe could be done better. I regularly browse through the source repository to find ways that other members could be working better.

When other developers ask for my help, I try to maximize my input by broadening my assistance to cover the way they're developing, how they could improve their typing form, what naming standard they use, to advocate a better code editing tool, and to give my educated final word regarding the whole stored procedure/dynamic SQL debate.

Despite all of this, I keep facing resistance, and I don't think the team likes me very much. Many of my suggestions aren't adopted, and several people have replied with what I suspect is thinly veiled sarcasm.

What's going wrong?

Well, I'd start with the fundamental problem: People are resistant to change. Inertia is not just a physics concept it's a people concept. If you are asking a team to change in any way, they won't like you very much.

Dennis is working from the fundamental concept that his teammates are actually interested in becoming all-star programmers. From the sounds of it, Dennis is fundamentally wrong. He's probably right, his team probably doesn't like him b/c he's making them look quite bad. But that's OK, most programmers don't want to be all-stars, that's just the way it is. I work with a team that has some star programmers, but goodness knows that they don't read the magazines we have sitting around, nor do they visit the boss's extensive library or follow blogs like Coding Horror or Hanselminutes. They care, but not quite that much.

What really makes things worse for Dennis is that he has years of doing the stuff that makes an all-star programmer. Excellence is a habit, it's not some sudden burst of inspiration. Even the geniuses with seemingly sudden bursts of inspiration have generally built that up with their daily activities. Dennis has more suggestions than even the dedicated can reasonably perform in a year. I mean, just reading Joel Spolsky's books and Code Complete and Peopleware and Mythical Man Month, that's like a 6-9 month journey.

Even if you could physically read all of those books in 2 weekends, you need months of work-time to actually process and apply that information. Dennis here was brought in to save a project and is probably making good money to do so. If he wants to make a better team, he'll need management's approval for some Professional Development time during 9-5 and he'll need a specific plan of action.

Creating an all-star programmer takes months and years, not weeks.

So you can do three things:
  1. Accept that people don't like being one-upped from their "comfortable" positions, especially the types you find in big corporations or union positions.
  2. Find a way to improve morale first so that people want to learn out of pride rather than being forced to learn out of shame.
  3. Ensure that management respects and supports your efforts and that you're making way more money than the "unwashed masses".
After that, just do what you do best, you can't replace great programmers.

Monday, August 13, 2007

Donating Money

Here's a big response to Million Dollar Journey's post on Charity MERs.

I haven't been really big on donations and it's part MER, part philosophical. I used to work for the YMCA (which is basically a charitable organization and pays that way), but I continued to work there even after getting a pay raise elsewhere b/c it had the greatest people to work with.

From an MER perspective, big charity organizations have all kinds of overhead issues and donating money to an group means that you're effectively empowering that group to take decisions you may not agree with. If I donate $500 to the Cancer Society, where does that money go? If I have a deep-seeded belief that future research money should go into retro-virals (say b/c I don't "believe in pills"), the Cancer Society may not share that belief, heck they may spend most of that money researching new pills and chemotherapy mixes, which is exactly what I don't want them to do.

Take a look at the Red Cross during 9/11 (and other crises on a smaller scale). Millions of dollars were donated to the Red Cross as part of a knee-jerk reaction but nobody knew where it was going or what it was for, they just donated.

And this is where we venture into the philosophical.

Why am I donating to the Cancer Society or the MS Society or Breast Cancer or any of these Hospital Research Foundations?

"Curing" cancer is undoubtedly a noble goal, but why do they need my donations? Don't they already get government grants, aren't we already paying for these in some way? And if we're not when do we switch it over? Why do we authorize big drug companies to do Cancer Research when they have conflicting interests with the public good? Drug companies spend 15% on R&D and 85% on Marketing & Advertising and they have no interest in curing people b/c it's not good for their investors. Cured people do not bring in as much money as people who "remain sick" while they're not using your drugs. Now any publicly traded company is required by law to be acting in their investors' best interests. So we're actually requiring drug companies to behave in a manner that isn't good for public health AND we're applying free market concepts to a system that isn't ruled by supply and demand (see Hospital Bills in the US).

When I donate money to a "healthcare"-related field, I'm basically just throwing more of my money into the already bloated and poorly-designed healthcare field. So obviously, I have some philosphical reservations about making donations (despite losing 2 family members to cancer in the last 2 years).

By the same measure we get groups like Make Poverty History (no, you're not getting a link), that hire on tons of big stars but have this horrible, unsustainable plan. I want to make this clear, I spent one hour on their site, a site dedicated to "Making Poverty History" and I did not find one definition of Poverty, not one. Most systems use some type of sliding scale: i.e.: everyone making less than X is poor, but that makes it pretty tough to eliminate poverty b/c it's a sliding scale! They have a goal that is basically impossible (like the War on Drugs), so they don't get any of my money!

Same goes for most of the "help the poor" type of groups. Given the unfit definitions of "poor", giving money to these organizations is pretty sketchy. I mean, we're already paying money into the welfare (EIA) system and numerous government subsidy programs at the provincial and federal level. So we're already donating tons of money to help those less fortunate, shouldn't we be more scrutinizing of the programs we're already paying for before we offer more money?

Truth is I haven't donated money in a few years, b/c I just can't find people I'd like to give to. My fiancé and I have discussed Kiva a couple of times, and that's probably my only good lead, b/c you're not actually giving, you're helping people help themselves.

At the end of the day, I've come to a pretty simple personal conclusion: I don't believe in giving money (with maybe Kiva as the exception). I believe in giving time and stuff, especially for those who are less fortunate. Money is corruptible (very liquid) and often hard to trace. Money is not the type of thing we want to give those who are less fortunate. We want to give a means of survival to those who are less fortunate so that they can earn the money to support themselves.

I don't want to send a million dollars to Kenya to build a new school. I want to send a boatload of building supplies and a pair of contractors to help the Kenyans build their own school. Heck we could even earmark the money to pay the Kenyans. I don't want to give money to a country that just lost 100,000 people in a landslide, they don't need money. They need a flotilla of medical supplies, foodstuffs, blankets, clothes and building materials and that's what they should get.

Wednesday, August 8, 2007

The evils of over-engineering

My reply to a great Slashdot comment:

Ugh, Java frameworks...Somebody needs to drag the people who make these things in a room, erase their memories, and make them use what they have created...

The end result is you end up with what should be a fairly simple task (like OO-relational mapping) have 400 page manuals because it ends up doing every little thing that people want to do. In the time it takes you to choose the right framework, download and install the binaries, wade through the required config files, sift through the quickstart, and actually get familiar with how it is done, you could have just written and tested the tedious JDBC code to load and unload an object from the database.

You know, this seems to work both ways. Ever worked with a homebrew framework that didn't have good exception-handling or some type of passable tracing? The other end of the spectrum from these IBM Java guys are the people who still hardcode strings everywhere in the system and hand-code ALL of their stored procs and data access layer.

There are actually two problems here:

  1. The Principle of Least Threshold

  2. Enterprise Hubris

From the top, Javaheads like your above description are trapped in the Enterprise way of thinking. And hey they're building apps that will process more transactions in one day than many other small business apps will ever process. They have the right to be a little proud, the problem is that they're not very good at "scoping downwards". These frameworks all scaled up and came together, but now they have 400 pages of documentation and 12 different config files and everything is interdependent b/c they didn't want to lose functionality.

Even written a good business logic layer (BLL)? Nor have I, nor have like 90%+ of programmers, but it's ok, most of them never need it. The BLL is just useless abstraction for the typical database front-end that we develop. BLL just gets smushed in with Entities and UI b/c it's pointlessly complicated to develop on all but the biggest systems.

On the flip side, you get the Principle of Least Threshold, which is my term for the phenomenon where the perception of quality is limited by the highest level quality one has experienced. There are millions of small developers out there (VB 6 was the second most-used langauge at one point), who have never worked with any thing close to these monstruous Struts frameworks. So they don't understand them and they don't need half of the functionality and they can't spend 4 months figuring out how the system works, so they just build their own system one piece at a time and keep re-creating the parts of the wheel that they actually need.

I'm living this, our Data Objects framework doesn't have tracing. Nobody cares but me, b/c I'm the only one who knows what a godsend it is to have instrumentation code. Just yesterday, wasted 2-3 hours diagnosing a problem that would've taken 10 minutes if we'd had minimal tracing (queries?).

Of course, the real solution lies between the two camps. The Javaheads with the arcane infrastructure and architecture knowledge need to enable mechanisms to scale the complexity of their frameworks. The other guys need to start pushing from the other direction. But most of all the leaders in the field need to learn to embrace differences and change (man that sounds corny).

When anyone starts spouting off about good software or bad software, they must at least identify the scale of the software with which they are working (and when was the last time we saw that). Unacceptable mistakes in an Enterprise Framework are just ignored in a 12-user system. In fact nearly every piece of code posted to the web is unacceptable in an Enterprise environment, b/c it fails to catch errors or instance tracing or define attributes or use fully qualified types or validate inputs or even comment in a way that is compatible with JavaDoc/NDoc/Sandcastle.

A twenty line class in an Enterprise app could have 80 lines of associated "overhead code" that just plugs the class into the framework. Is this elegant and beautiful or just clunky and cumbersome? That answer could vary by system size, by programmer skill or even by personal taste. But no one seems to want to acknowledge this reality. The small guys call the Enterprise guys "clunky" and they in turn call the small guys "clumsy". So in the end they just ignore each other and throw rocks in each other's general direction and nobody stands and up and says "Hey guys, it's a continuum, it's not black and white, our solutions can only be inspirations for yours."

We need new leaders. The guys in my CoDe & MSDN magazines aren't sitting around handing out three different solutions of different complexity for the same problem. They're writing one-solution articles to solve problems that happen at all kinds of levels. How do you store user-specific data in a web app? Well in this article we'll talk about how you can solve this problem using my framework that doesn't actually work with your chosen method of storing data... if stuff isn't in an SQL Server-persisted Session then you're SOL... blah... blah... blah..." thanks guys. These are the same guys that write articles showing drag 'n drop data connections and then wave their hands about storing encrypted connection strings in the config files or using parameters to protect from injections.

Point is, we as programmers need to get off our high horses and actually learn about other people's problems so that we can learn to develop beautiful solutions to the problem rather than just solutions.