- Madeline: Daddy, what's macaroni and cheese?
- Me: I don't know... it's macaroni with cheese on it?
- Madeline: No, daddy, it's mac'n'cheese!
A co-worker recently blogged about a classic metaphor of the “iron triangle” whereby the three conflicting pressures of resources, scope, and time are interlocked. The rationale goes that only by loosening one of the pressures will you be able to affect the other two.
This metaphor is usually used by those who have the unlucky task of managing software development projects. It works wonders when presented as an inspiration to motivate the team at sprint launches.
It is when teams try to apply this metaphor in practice, they often find that the triangle is not as flexible as they were led to believe. The date is non-negotiable. Scope? No, customers expect a certain feature set. Can we get more people? The ramp-up is too time-prohibitive and besides we have tons of other projects that we need to deliver, so… no.
Despair. Death march.
Happy Happy Fun Times
The only way out of this morass is honest, deep, challenging conversations and creative thinking. More often than not, code is the least complicated part of the solution.
As I’m fond of saying, if it was easy it wouldn’t be called “work” it would be called “happy happy fun times.”
I think the iron triangle still applies, though to figure out how to move each of the corners, we need to zoom in.
Talent - Some people are just naturally better problem-solvers. You know who they are in your company. Bring as many of them as you can find.
Experience - People have varying degrees of familiarity with the system or the business domain. They will help smooth out rough spots when first starting out. But be sure to balance this with some total n00bs to spread the good knowledge and bring in fresh perspective.
Personality - I’ll go ahead and say it even though it may be unpleasant: you want a dynamic team, not a bunch of loners forced to sit next to each other. You want people who are good at communicating both verbally and non-verbally. You want people with a generally outgoing demeanor. Cultivate these qualities, work on them, challenge your people to loosen up.
Width vs Depth - It’s understandable: customers expect certain new functionality, sales is clamoring for shine and customization. But consider how deep does each feature need to be. Is there a simpler approach you can take to satisfy end-user’s need? Ask yourself what you would do if you only had a week to implement this feature? A day? 4 hours? An hour? Take that hour and build a working prototype of your idea. Show it to your product owner. It will never be good enough to ship, but it will force the product owner to rethink whether they leaked too much instruction to the team as to what they expect to see. This will also force you to actively participate in discussions and deeply understand the user’s need.
Dependencies - If you think the user-interface card depends on the logic card which depends on the database card, stop! You’re heading into a swamp. Features depend on each other, deployment layers do not. Each card should consider the full flow of user experience: from user interface, to logic processing, to data persistence, and back. Start with minimally viable parts of the flow: instead of a fully featured form, start with a form with just one field. Follow it up with dependent cards that build on top of that form. Stay strong when cowboy engineers push back with “…but it’s just a couple of dumb fields, it’s so simple” — that’s how complexity creeps in.
Visibility - Time and time again I’ve seen engineers (myself included) grab onto the work they understand very well and burn through it, with eyes glazing over when product owner mentions areas that sound complex. It’s only human nature: we’re afraid of the unknown. Fight that ferociously. Demand that your product owner lay out the entire project in front of your team. Work towards deeper understanding of all areas. Split off into sub teams to build prototypes for each area, form intelligent questions, find conflicts, do whatever it takes to ensure that everyone can describe everything the team is working on without BSing. Having this information upfront is absolutely invaluable as milestones start approaching.
Embrace Deadlines - I love time constraints. They force everyone to cut out the crap and harness the adrenaline rush to reduce their work to bare essentials, no more no less. If you’re pissed that people keep setting dates for you, get in front of them and set even more aggressive limits for yourself.
With the time pressures as your guide, you can NOW start thinking about how to start pushing the corners of the iron triangle.
A fluidly functioning team full of outgoing people will be able to absorb additional people with little problem. These new people will be able to start becoming productive immediately because you can give them features that don’t depend on other features and because the features you give them will be well-defined and understood by the larger team.
With everyone feeling free to challenge every requirement and thinking of what is minimally viable, you will find most of the system spreading out very fast yet staying malleable because this wide set of features is still very shallow. Now you will be in an enviable position to decide more strategically which parts of the system you want to continue enhancing.
You won’t even notice that the deadlines have come, and they will be nothing more than a pleasant surprise.
Reagan lowered the individual tax from 50% to 28% while at the same time raised taxes for the most wealthy.
On Oct. 22, 1986, President Reagan signed into law the Tax Reform Act of 1986, one of the most far-reaching reforms of the United States tax system since the adoption of the income tax. The top tax rate on individual income was lowered from 50% to 28%, the lowest it had been since 1916. Tax preferences were eliminated to make up most of the revenue. In an attempt to remain revenue neutral, the act called for a $120 billion increase in business taxation and a corresponding decrease in individual taxation over a five-year period.
Following what seemed to be a yearly tradition of new tax acts that began in 1986, the Revenue Reconciliation Act of 1990 was signed into law on Nov. 5, 1990. As with the ‘87, ‘88, and ‘89 acts, the 1990 act, while providing a number of substantive provisions, was small in comparison with the 1986 act. The emphasis of the 1990 act was increased taxes on the wealthy.
On Aug. 10, 1993, President Clinton signed the Revenue Reconciliation Act of 1993 into law. The act’s purpose was to reduce by approximately $496 billion the federal deficit that would otherwise accumulate in fiscal years 1994 through 1998. In 1997, Clinton signed another tax act. The act, which cut taxes by $152 billion, included a cut in capital-gains tax for individuals, a $500 per child tax credit, and tax incentives for education.
Clinton, who was a fiscal conservative, raised the total tax rate to get in front of the deficit but cut taxes on specific taxable items.
Did you know which President grew government spending by the lowest percentage of any other President (inflation adjusted)?
Then W came in and cut taxes quite a bit, especially for the top 1%. the problem was not with the tax cuts. the problem was that W started spending money like a drunken sailor and never stopped. He understood the “lower taxes” part of the conservative and pro-economic montra that is well understood by the majority of economists, but, he completely missed the boat on the “cut spending” part that must go along with the “lower taxes”. We have been in a steep economic decline since and Obama is following W’s playbook on spending except but is trying to reverse the tax cuts. It’s funny how Obama refers to his “predecessor” as if W did something different than he is now, in terms of spending.
Bottom line. A country cannot grow it’s economy from government programs. It’s counter intuitive. Taking money from citizens and companies to create jobs for other citizens doesn’t pass the 10th grade economics test.
Those are my thoughts for what they are worth.
Ubuntu’s fresh-off-the-presses Natty Narwhal 11.04 release comes with the new window manager named Unity. Unity is a modern, sleek user experience and I enjoy it a lot (haters gonna hate).
Problem lies in that Unity (formally known as Unity 3D) demands decent graphics hardware to show you all the transparent, shadowy and smooth-floating deliciousness.
But what if you’re running on a low-end/old computer which has not yet been blessed with a modern graphics adapter, or will never get a chance to (small-factor, etc)? And what if you still crave all the usability components of Unity?
Unity 2D to the rescue. As its name implies, Unity 2D is a slimmed-down version of Unity 3D. It gracefully preserves all the building blocks of Unity 3D, but sacrifices a bit of the eye-candy. To a pragmatist, this is a highly sufficient solution!
So here’s how you do it.
I tried these with Natty 11.04, on a 2001-era Compaq Evo desktop that I picked up certified refurbished for around $100 at a local computer chain. This baby has a 2Ghz Pentium 4 CPU, 1Gig of RAM and a dinky integrated graphics adapter that is just powerful enough to say hello to the monitor. These worked for me with no problem. Your mileage may vary.
On Ubuntu 10.10:
Add additional repository to so that Ubuntu’s installation manager can locate the Unity 2D packages:
sudo add-apt-repository ppa:unity-2d-team/unity-2d-daily
Update the listing of known packages (using the new repository above):
sudo apt-get update
Install Unity 2D:
sudo apt-get install unity-2d-default-settings
On Ubuntu 11.04:
Install Unity 2D:
sudo apt-get install unity-2d
Now log out. Select your name, type in your password. WAIT DON’T LOGIN YET! At the bottom of the screen, to the right of the keyboard selection is the window manager selection. You should see option for Unity 2D. Select it. Now login.
Unity goodness should surround you.
[Updated with clarification from whiprush via reddit: Unity 2D is available for installation out of the box in 11.04].
There’s something very peculiar about Consolas font that makes it look gorgeous at odd font sizes, and dopey at even ones.
I really like using event-like method names that react to changes, e.g.: if (widget_changed) OnWidgetChanged(w);
"Enemy of The State" started as a biographical film about Rich Hickey. @clojure
The best thing about .Net 3.5 SP1 wasn’t LINQ but the set of rich extension methods added to IEnumerable