Wednesday, April 22, 2009

kaizen and kakushin

I read Mark Shuttleworth's blog entry about meta-cycles this evening and was taken back in my mind to an entry I wrote in September of 2007 about Toyota.

My issue with the "6 month cycle" has always been three-fold:


  1. the number 6 is a project specific detail and should not be pushed on every project because it won't fit every project (Mark notes he works on projects with 1, 3 and 6 month cycles; other cycle are also possible, of course); what we're really talking about it timed releases made with a relatively high level of consistency

  2. The discussion is often coupled with the idea of coordinating different projects to the same cycle, which is really a different sort of conversation altogether with "length of the resulting release cycle" being an implementation detail within it

  3. it's only one half of the equation, with the missing half being the non-high-level-of-consistency-time-interval releases; too often it was an either/or discussion where if you were doing one you couldn't have been doing the other



Both halves together make up the kaizen (continual incremental improvement) and the kakushin (continual leaps in innovation), and Mark notes that both are needed and can work together well. In fact, it seems that as the discussion continues, Mark and I see things increasingly similarly in general.

(Odd/intersting side point: I recently came across the concept of a "kaizen blitz" which happens to be exactly what our "developer sprints" are. Neat.)

Mark asks some questions, and since he asked I thought I'd share my personal answers to some of them:

'Is it true that the “first release of the major cycle” (KDE 4.0, Python 3.0) is best done as a short cycle that does not get long term attention?'

It's not he only way of doing it, but if the starting of the major cycle represents the end of a period of major innovation, it's only sensible to expect there to be a period of cooling off, dust settling and refinement. The point of making such a release is to draw a line in the sand saying "from here, be engage in the process of kaizen with earnest".

One can also do first major releases that don't bear these hallmarks very strongly at all (KDE 3.0 leaps to mind as an example of that), but then it isn't a kakushin release.

Being able to discern the difference between a release that is the result of kaizen versus one that more embodies kakushin is the key to whether that initial release should be "sat on" for a while or immediately pushed to production. The people to ask are the people doing the work.

Wait, though .. what does that mean, "people doing the work"?

In a FOSS project it's a combination of the people laying down the code / documentation / translations / art / etc and the people who rely on those technologies in their own projects. So KDE 4, as a concrete example, wasn't "ready" until application developers were confident with the platform, proven by basing releases of their own apps on it, and until production environment needs were met. So depending on who you are, 4.1 or 4.2 marked that point of "readiness".

With KDE 3, 3.0 was "ready" for all intents and purposes. 3.5 was miles better, but that's the point of kaizen and should not be confused for previous releases not being "ready".

This all implies that there is communication which is heard, listened to and delivered without unreasonable expectation. With 4.0, our communication was too often ignored, which erodes trust in both directions, and communication we received in return was often pejorative. The pejorative nature of it was mostly due to the lack of realization that 4.0 was the start of another period of kaizen (something we did for 6 years with KDE3) and the mid-cycle of a kakushin period.

There needs to be a way to allow releases like this to happen without it become a hail storm for all involved, and I personally believe that means generating an understanding of these two different but complimentary cycles and trusting people when they say "let's get busy with this, but it's going to be shaky in the short term" without freaking out about it.

We also need to not leave our users and developers high and dry: that's why we announced a year of KDE 3 releases at the KDE 4.0 release event right in the keynote. Back to Mark's questions:

'How do short term (3 month, 6 month) cycles fit into a broader meta-cycle?'

I think that really depends on the goals of the meta-cycle and the resources you can bring to bear to it. In general, however, there should be a lot more kaizen than kakushin type releases. Software needs revision to approach greatness, and in FOSS we do our revision in the open rather than behind closed doors. How many short term releases are "needed" and how they fit into a broader cycle is a bit like asking "how many licks to the center of a tootsie-pop". Well it really depends on how hard you lick it and how patient you are. :) This varies from project to project, and even within a project over time.

Compare the position of "GNOME is decadent" to "GNOME is all about 6 month cycles forever!"; they were both "right" for the project given its context when those positions were taken. It will shift, and to deny that is to deny the nature of existence itself.

This isn't a nice easy answer, I know. It means we can't draw cute little boxes on paper from here to eternity and have it all "figured out"; it means we need to do continual assessment. This is harder and requires more trust (or, to put it another way, is a more anxiety inspiring aproach ;), but it fits reality, one that is based on "continuousness of process".

Some people will need to plan long into the future, though. Distributions are one such group, needing to say things like "here's when our next long term, enterprise release will be" well in advance (this is implied by giving a life span to the current enterprise release, in fact).

So how do we balance those two needs? Personally, I think it can be solved by communicating with an appropriately long horizon. What does that mean?

Well, let's take the made up example of Frubagge. It's a hot new piece of technology that solves a really important gap in the Linux stack: the ability to read Dr. Seuss books with proper cooperative support from the kernel. Now, maybe we can already read books, but Dr. Seuss books with their anapestic tetrameter are a bit odd and we can do better. Frubbage just might be the key to unlocking it all. It also might not be. Distros need to know.

So maybe one or even a number of distros could say something like, "We're going to make Frubbage the default Dr. Seuss reader in one year's time in our main line releases. We're adding it as an experimental, will-eat-your-babies-and-steal-your-shoes, option." Then they would need to keep to that distinction and not get over enthused and confuse people by implying that the the experimental configuration is the main line stable release. Clarity and consistency, like good parenting.

Then all the book reader app devs out there need to pay heed and should start poking Frubbage and adding support in their apps. Maybe one group does a release with Frubbage support in 3 months time, and another will take 9 months to do the same. With a year's horizon, it's all details and none of it matters.

More importantly, those app developers now have a responsibility to speak up about Frubbage if it's somehow broken and then those distros need to pay heed to that. If the brokenness can be addressed and then is addressed, things go ahead as planned. If they don't, then the Frubbage horizon is either extended or dropped altogether.

This way the Frubbage project gets to "force" those persnickety app devs to kick its tires, the distros get what ends up looking like a coordinated release and the user doesn't get Frubbage unless it's "ready". Nobody loses, except maybe our proprietary competition as we start hitting on all cylinders and stop screwing up our platform on a regular basis. ;)

Most interesting, this doesn't require coordinating release cycles or punishing kakushin just because someone else is looking for kaizen that week.

My approach, as outlined above, is certainly not the only one and I admit it's probably a bit more Sun Tzu Planning than Gantt Chart Heaven, but I think it would work and work a lot better than what we have now.

Back to Mark:

'If it’s 2 years or 3 years, which is better for you?'

My answer: yes.

Honestly, from this high in the stack I don't care, just pick one and communicate it and then let us communicate back as to which release should hit that. Give me access to your spreadsheet so I can pencil in the KDE release version for you with reasoning and rational. If you want two years, awesome. If you want three years, awesome. KDE will be doing more kaizen than kakushin in that time period anyways, as we gracefully coast down the backide of our current kakushin cycles.

(To clarify: when I refer to the "backside process" means taking full advantage of the big initial arcs of the Pillars such as Nepomuk. Finally getting network transparency fully completed for Plasma components is another backside-of-the-initial-kakushin; not to be confused with the kaizen of making panel popups animate, for instance.)

As long as I know which it is, I can offer guidance. If our releases don't line up perfectly, that's OK, nobody's going to die. If your release concept is compelling, I might try and make my line up for that event. Cooperation as friendly negotiation.

Back to Mark:

'Does it make sense to have low-level, hardware-related things on a different cycle to high-level, user visible things? Or does it make more sense to have a rhythm of life that’s shared from the top to the bottom of the stack?

Would it make more sense to stagger long term releases based on how they depend on one another[?]'


I don't see how I can take advantage of new hardware features in my application until I can get my hands on them, nor can I see how KDE application developers could port to KDE 4 until they could get their hands on it.

There is some reality stuff that gets in the way here:


  • there's too much going on for me to build everything from source all the time, so I do rely on binary packages for a lot of stuff which means waiting on actual releases that can then be packaged for me.

  • I don't have the time to bleed on everyone's project's cutting edge, so except for very critical things to me I wait until there's at least a pack of bandages that comes with the release. I don't need stability, I just need the first aide kit to come included. ;)

  • I don't want to wait for everyone to "be ready", because if the hardware guy can't release until I support it in my software that's going to suck for him: he needs to get on with his life too without me holding up his show because of coordinated releases; and the "show" is all about getting releases out in the wild



So if we had a constantly safe-enough, built from sources on demand base system and we were happy not doing quick releases of our stuff except to each other within our own little circle of happy coder friends, I don't see a non-staggered system working.

A non-staggered system could work, but we'd likely see Microsoft-esque releases: few and far between, and still half-baked when they first come out anyways.

'Is there any established theory or practice for this?'

There's lots said in business management and the social sciences about these kinds of processes. It's why I try and go to at least a few non-software events per year and read as much as I can afford to in these areas: they are solving similar problems and typically have a lot more experience (in both the good and bad directions) than we do. Software is a young industry, and modern FOSS is the baby brother in the family. The good news is we can learn from older siblings and don't have to reinvent it all.

We'll still screw up, I'm sure: we're learning, together, after all; but we can look at what others do. The ideas of kaizen and kakushin and how to combine them were not born from the software industry, let alone, FOSS, for example.

So, executive summary of my personal opinion on it all:


  • We do need regular releases of continuous improvement

  • We also need regular releases of major innovation, which will likely cause bruising that will be healed in time with the regular releases of continuous improvement

  • We can blunt the impact of major innovation bruising on the user and vastly limit platform risk through processes of check/balance coordination (the Frubbage example)

  • Staggered releases: realistic; lock-step releases: not realistic

  • We can 'fake' lock-step releases by coordinating sufficiently openly, cooperatively and in advance as to what we (as a whole production line, top to bottom) are going to deliver as final products to market



It's mignight now .. so I'm going to take my tired butt to bed and dream of our next kaizen laden KDE release, 4.3.

Cheers...

15 comments:

notanavragelosr said...

Well put, Aaron.

I never really saw the big deal with (K)ubuntu, and never really hopped on the bandwagon. But, a lot of people have. Meaning people usually listen when Mark Shuttleworth says something (for better or for worse).

Luckily, though, Mark seems to listen to others. I'm glad he has people like you to engage in dialog with.

XAvAX said...

Awesome post. One thing I see somewhat differently from how you /stated/ it, though from a deeper reading this seems to be what you mean, is the nature of whether a release is "kaizen" or "kakushin". Rather than it being a binary state, it seems to be more of a continuum. I see, KDE 4.0, for instance, as being closer to the "kakushin" end, while 4.2 is closer to the middle and 4.2.3 is closer to "kaizen".

By the way, I couldn't help looking up "kaizen" and "kakushin" in Kiten to decompose the kana:

kaizen (かいぜん, 改善) composed of 改 (kai: reformation) and 善 (zen: virtuousness, goodness)

kakushin (かくしん, 革新) composed of 革 (kaku: leather, hide) and 新 (shin: new)

So "kakushin" is really talking about that "new-car smell" I guess XD

Aaron J. Seigo said...

@XAvAX: exactly! thanks for helping clarify that. :)

Aaron J. Seigo said...

@XAvAX: ah, regarding kakushin, it's apparently actually a re-take on "kaikaku" which apparently has taken on unwanted (for the topic) additional connotations in Japanese vernacular.

interesting article on it:

http://www.gembapantarei.com/2006/12/and_now_we_have_kakushin_sigh.html

Diego Rondini said...

> that's why we announced a year of KDE 3
> releases at the KDE 4.0 release event
> right in the keynote.

4.0 = jan '08
3.5.10 = aug '08

Is 3.5.11 on schedule or did you forgot about the "year of KDE 3 releases"?

Aaron J. Seigo said...

@Diego: "Is 3.5.11 on schedule or did you forgot about the "year of KDE 3 releases"?"

we announced the 2008 releases for KDE 3, with the intention of seeing at the end of '08 what the state of things was.

there has been little addition to KDE 3 since the 3.5.10 to warrant another release, and so it was not renewed for a 3.5.11.

bzhboy said...

About those breakthrough but immature (for users) releases like kde4.0, I got an idea. I'm not sure is a good one though :

- Those release can not be called alpha or beta, because it is not what they are : they are stable but lack some feature and polishing.
- "x.0" is a good name from devellopers point of view, but we saw how it raises expectation about it.

So here's come the idea : why not introduce negative version number : when kde4.0 was release it was possible to know it would need 2 releases to go to a mature enough release (ok I'm perhaps a bit conservative here : kde4.1 was fine for me. But let say 2 release). So we could have called :
- kde4.0 -> kde4.-2 (or kde4.m2)
- kde4.1 -> kde4.-1 (or kde4.m1)
- kde4.2 -> kde4.0

It would have made it pretty clear that those where not "feature parity" (with kde3.5) release.

The other good thing with this is that it would have made more news about kde4.2, just when the project is ready for broad adoption ( I think a "x.0" version is more appealing for journalists).

Mike said...

Great post Aaron. Nice to see someone bringing these techniques from other industries into helping KDE rock even harder.

Keep up the good work!

darkadept said...

Excellent post. These concepts help broaden my mind about the projects I'm working on. I like seeing the entire software development/release process out in the open, from the tiny nuts and bolts to the ideas and discussions about grand scheme release cycles.

When I look at proprietary software I see blobs of ooze plopped out at odd intervals with no knowledge of of when the next blob will appear or how well it will actually work.

Keep up the good work KDE team!

mutlu said...

Great read; very thoughtful and stimulating.

Aaron, you are a great KDE president. You have done wonderful work. Thank you for that.

alien said...

@bzhboy
Even with that version scheme, I can bet on my notebook that "regular" users would have _still_ downloaded it and complained their ass off and nothing would have been different. With the "ooh, I saw 4.x but did not see the 4.-2... they should really name it differently" trolls. But that is history, eagerly awaiting for KDE5. :-)

@aaron: Very nice post. I can see myself using these terms when explaining things to my friends!

Aaron J. Seigo said...

@alien: people who would download it on their own or use their distro's "will eat your babies, we meant it" distro line (i like how debian does that bit with no ambiguity, btw) would likely have complained but that's ok. they are a small # of people and took an active choice.

where we (the entire community, not exclusive to kde) is that 4.0 managed to get pushed out to people in mainline releases whether they really wanted it or not.

that was a huge fubar.

this is also why version #s won't fix a thing: it's not the numbers, it is what gets picked up at what point in time and in which kind of OS release for distribution, by default, without user intervention.

no numbering system will fix that. we see this same problem with different details and effects with all sorts of software, from networkmanager version bumps to radical xrandr changes midstream to pulseaudio to kde 4.0.

it's not about version numbers, it's about communication (which is both saying and listening, and doing so bidirectionally) from the most upstream projects right through down to the user pools (of which there are several distinct ones)

shanerich said...

Here's my take, as a user (your perspective as a developer would be completely opposite): I want the most up to date stable front-ends possible over a well-tested, stable back-end.

Kubuntu provided the exact opposite of that requirement during 2008 - witness the debacle of bluetooth support ("hey, let's put a back-end in that supports more devices, pity the user can't take advantage of that as the front-end doesn't work with it"). Or the constant race to have the latest Xorg or kernel, often resulting in lost/broken functionality. My Deity! Of all the things to be cutting-edge on - hardware and interface subsystems!

Any good engineer errs on the conservative side. Note that conservative doesn't mean "old", rather: "stable". I hold up KDE 4x and Jack audio as examples of needing to be a little conservative at times, cutting-edge at other times.

If I were in such a priveledged position to have the ear of Mr. Shuttleworth, my answer to all of those questions would be: "Regressions should never be introduced to the public. And if they occur, all efforts should be directed at fixing those problems before moving on".

Azag said...

hey aaron, do you check the plasma wishlist from bugs.kde.org?
Is a surprise to me that the most voted wish are things like "Different wallpaper on each virtual desktop" with 1119 votes.
I have summited a couple of wishes that I think are more interesting than the wallpaper thing.
https://bugs.kde.org/show_bug.cgi?id=188448
https://bugs.kde.org/show_bug.cgi?id=188449

Michael D. Roy said...

As a user, I agree with you 100%.

"We can 'fake' lock-step releases by coordinating sufficiently openly, cooperatively and in advance as to what we (as a whole production line, top to bottom) are going to deliver as final products to market"

A person in Mark Shuttleworth's position is undoubtedly most interested in developing that last point.

Here's something that takes that idea to a logical extreme: if all the major distros could get together and make their major releases as one, basing them on a core set of the same versions of the same packages, and calling their efforts "insert project name," they could each focus on specific groups of users/customers of their choosing. They could market the linux platform as a whole, together through "insert project name" and point people to the distros that most fit their needs. That would really strengthen our market visibility and help coordinate product delivery on solutions for various market niches.

In turn, I think there could be a huge uptick in linux market share. Take a look at microsoft.com. See their "partner and customer solutions tab." An answer to the question "what can your product do for me" is set out right there in simple terms. Linux hasn't got anything like that, just the individual distros, but you can only find a distro if you already know what you're looking for. Why is that, and does it have to be that way? Do what works for closed development, but keep the benefits of the open model. If picking up market share and new customers is the goal,I think this "top-level" coordination and communication, both internally and externally is the missing link.

As unlikely a scenario as that may sound, I think its proposition is supported by your response to "'If it’s 2 years or 3 years, which is better for you?'"

The development half will work even better, and autonomously too, if only there exists a strongly coordinated message from "further up" the deployment chain. The less jumbled, and more focused (read _centralized_) that message is, both to developers and to the market, the better the result.

Achievement of such a goal might be impossible or undesirable - a lot of people would have to set aside a lot of differences and agendas, or risk quite a bit of community upheaval. Large bureaucracies also tend to be inefficient - just look at Microsoft for an example of that one too!

I think that the key just might be to keep project and distro autonomy to the greatest extent possible. Make it just another project everyone works on together, rather than a new identity forced upon everyone. If done openly and done "well," it just might work. After all, it already works at the project level - why not at the greater platform and community level too?