Friday, May 09, 2008

re: re: ramblings on 6 month cycles and Plasma

Toma took the time to reply to my blog entry on the six month cycle. He raised some ambiguities that I could probably clarify on a bit.

"First point is the very complex reasoning of the available time to do new features with a six months release cycle, which according to Aarons calculation means that half of the year we are in non-feature development. I don't understand that. "


As Toma calculates, 4 out of 6 months are spend in feature development. At least that's what the schedule says. A common pitfall in management (of any sort) is to keep your eyes on what is written on paper (the theory) and not glance up to examine what's really going on in reality. Reality is that right after a release I spend time doing the following three things:

  • Catching my breath a bit (let's call that a day or three, so not significant)

  • Responding to bug and wishlist reports; these tend to pick up right after a release and I like to spend the start of each cycle working on the x.1 release that is going to come out soon after the x.0 release. This is usually a significant time sink in the first couple weeks.

  • Surveying the landscape, revisiting the feature plan and figuring out exactly what will be done in this next cycle. This is impacted by the results of the last cycle as well as the ever evolving needs and desires for the product. This too takes time and prevents immediately diving in to new feature development


It is not unusual, in my experience, for working on bugs, wishlists and drafting the next cycle's hit list (which hopefully is based partly on an already laid out set of goals, but must also include what got punted as well as shifted priorities) to take a few weeks of time. Therefore, I don't expect a ton of new feature development in the first month of a cycle. This is born out by what happened this first cycle around, and matches with my experience from past projects as well.

That means that effectively we have 3 months of feature development. Sure, what's written down in the theory (the schedule) says 4 months ... but I live in reality, and therefore management of my resources should too.

"I hear you scream that svn branches suck."


No arguments from me there ;)

"moving it to git repositories will give you a lot more overhead and merging that all back at intervals to KDE's svn will frustrate you as well."


Not if we don't do any development in KDE's svn and simply use it as a release dump. There are decent scripts out there to replay git commits into, e.g. svn. This would be a lot easier if KDE were using git as well, but really .. I don't want to start the vcs discussion here. This is about release schedules, the tools that we use making that harder or easier to cope with is another discussion altogether.

"With git you usually merge a completed feature, making the diff too large for people to check on the mailinglists. At least I prefer ten smaller commits to review than one big one."


We use review board for this and it works just fine, actually, especially for larger patches. We can always replay the git commits one by one if we wish, but really that too is a detail. With development happening in a separate repository, we can do all our small commits in usual chunks there and then merge back to the release branch however we see fit.

This is where I get really uncomfortable, though: to solve the issue with an inappropriately sized cycle, I end up moving the development away from the KDE infrastructure which is totally counter productive from the perspective of shared development. This particularly hits us when it comes to internationalization (i18n), but more on that in a minute.

That alone makes me hesitate. I feel like I'm between a rock and a hard place on this one. The rock is a poor choice of release cycle for my work in plasma, and the hard place is our current vcs tool being too poor at merging branches to even consider using it as a solution to the release cycle problem.

Ugh.

"After the period merge back, people using KDE's svn will make build fixes, etc. That will need to sync back to the git repository."


The number of such commits would be trivial and easily tracked even manually. Still not wonderful, but I'd rather optimize for mainline development speed than occasional build and bug fixes.

Note that I already read every commit to the plasma codebases (libplasma, plasma, krunner, extragear, ..) so this is already factored into my work life.

It actually isn't the build fixes, however, that will be a paint. It's the translations: those are scripted to work against our shared svn repository and those would need to get sync'd back and forth regularly. Supporting i18n scares me in this scenario.

"I'm sorry, but if you want more hacking time, this is not the way to go in my opinion."


Merging from a mainline devel git repository to an virtual read-only release branch in one big go is 15 minutes work. Watching for code commits from svn and syncing those back isn't a big issue either, and also mostly able to be automated.

So I think you're vastly overstating the overhead this would incur on my part. Unfortunately, it would really hinder i18n and raise the bar for new people to get involved (another repo you have to know about and another vcs that you have to know how to use).

It's really interesting how this choice in cycles results in degrading one or more of the following: existing development efforts, new comer involvement and i18n. Yes, I know it all looks good in theory ... but history is littered with failures due to deciding based on theory instead of what the theory actually means in practice.

I also disagree with the general remark that a 'six month cycle' does not work for you in this project. How on earth is it possible to judge that, when the very first cycle is not even completed.


Well, this isn't exactly the first project I've ever worked on. =) As for plasma itself, I've seen what this cycle has done and have already spent some time mapping out the next one; I fully expect the next cycle to be a repeat in many ways of this one. So, lots of good development, but lots of punting combined with sprinting to get features in under the wire. This is really the funny thing about the choice of "6 months": it's short enough that timing matters a lot, but not short enough to be suited for fast iterations in development.

It's a lot like trying to avoid stepping on the cracks in a sidewalk where the slabs aren't quite a multiple of your natural stride: you can do it but you end up losing your rhythm and looking like a bit of a goofball in the process.

"I always learned from my mother (hi mam!) that I need to give it a try for a couple of times before deciding it does not work."

That's good advice from your mother. I'm sure she'd also tell you to learn from the mistakes and successes of others, to not repeat errors you've made in the past and to repeat your successes whenever possible. It's not like creation cycles are a new science.

It may be the first time KDE's tried to stick consistently to such a short cycle period, but it's not my first time around.

"The schedule is not set in stone and if you have reasons to change things, mail the release-team."


If I had an idea of what would both work globally and also wouldn't result in me sinking days of my time into a discussion and decisions process I would. Right now, I'm not sure what the best solution is for all of KDE. I honestly haven't gotten to that point in thinking about it. I just know that for the project I'm most deeply involved in, it sucks. That doesn't mean it isn't perfect for other aspects of the project; as I said in my original blog this is a "one size does not fit all" sort of issue, and I suspect 6 months might work just fine for kdelibs.

If you're wondering why previous release cycles didn't cause such angst, it's because if a cycle is longer than you need or short enough to match natural short-term iterations it's not a big deal. KDE always tended to have longer-than-strictly-needed cycles which made them fit really well a broad cross section of the project and, I would argue, thereby actually increasing the development pace.

It's really hard to argue with the pace of KDE3 development.

So, I've no concrete solutions for the problems mentioned in Aarons blog,


Damn! And here I was hoping someone smarter than me would come up with the brilliant and obvious solution ;)

I can understand that a new project requires a lot of setup for the infratructure, but when that's done things will get easier.


This is the "it will eventually be done" theory. That theory works really well for projects which have a fairly limited scope (so a limited amount of internal pressure) that gets applied in an environment that is mostly static (so little to no external pressure). Unfortunately, Plasma has both huge ambitions (so lots of internal pressure to keep moving) and competes in what is right now one of the more competitive and evolving areas (primary user interfaces and the bling that makes them sing) which means lots of external pressure to keep moving.

I'd be very surprised if core Plasma development settles down within two years time. While we may not be mucking with existing code (source and binary compat being what it is), there is a lot left to be added.

Anyways, thanks, Toma, for taking the time for a well reasoned reply. Hopefully the above gives you a bit clearer idea of what thoughts are rattling around my wee little head.

10 comments:

Leo S said...

Still doesn't make any sense to me. You say:

I fully expect the next cycle to be a repeat in many ways of this one. So, lots of good development, but lots of punting combined with sprinting to get features in under the wire. This is really the funny thing about the choice of "6 months": it's short enough that timing matters a lot, but not short enough to be suited for fast iterations in development.

How would that get solved with a different release cycle. You say 4 months would be better, but that just gives you less time for feature development, or less time for stabilizing, take your pick.

No matter how long or short your cycle is, you're always going to have to punt features or race for a deadline. That's a characteristic of time-based releases. Changing the interval makes no difference.

Aaron J. Seigo said...

"Changing the interval makes no difference."

that's obviously untrue, since having a 1 week cycle or a 2 year cycle for KDE would be pretty insane. =) obviously there is a range that works.

"You say 4 months would be better, but that just gives you less time for feature development,"

no, i'd probably do 2.5 months of dev, 3 weeks of stabilization, repeat. not a huge amount of time, but much closer to the 'natural' cycle. things in plasma core tend to take anywhere from a few days to a month or so to get into svn in a mature fashion.

give some space for start time scatter and unforeseen distractions or obstacles and 4 months per cycle is pretty close to "single revolution"; 9 months is enough to fit a couple whole revolutions of the cycle in. but 6 is just awkward.

then there's the punt issue: with a six month cycle a punt means another 6 months before it can ship (essentially a total of 12 months including the one it got punted from).

4 months means 8 months, pretty much the same as a 9 month cycle.

9 months means 18 months, but the chance of punting is much lower.

getting features out as they occur is really important to both user and developer.

so it's really about the 'natural' project feature cycle span compared to the release cycle span.

as the release window grows, the odds that features wanted to be worked on for that dev cycle will happen within that window of time .. as the window shrinks, you get more fine grained releases (fewer features per) with a lower punt penalty (though a higher chance of punting).

6 months feels very much like a compromise that leaves us with a smallish dev window and a longish punt penalty.

i think 6 months makes sense for getting a 4.1 out quickly; i'm not sure it makes sense for every subsequent release we do, however.

Leo S said...

>> no, i'd probably do 2.5 months of dev, 3 weeks of stabilization, repeat. not a huge amount of time, but much closer to the 'natural' cycle. things in plasma core tend to take anywhere from a few days to a month or so to get into svn in a mature fashion.

Ok, you're the expert on the "natural cycle" of plasma. But right now you said you do 3 months of feature dev in 6 months. So 50% feature dev, 50% stabilization, recovery, and planning.

With 4 month cycles, you anticipate 2.5 months of feature dev.. Well now you're at 62% feature dev and 38% stabilization and planning. So you would be shifting priorities as well as moving to a faster cycle.. Not a bad thing, just saying there are two issues, and you could shift the feature/stabilization ratio without changing cycle length.

Aaron J. Seigo said...

"you said you do 3 months of feature dev in 6 months"

which is an artificial limitation. the last two months of no feature devel are forced upon us by the release schedule. even if we have tidied up every bit (ok, imagination time ;), we spend two months sitting there twiddling our thumbs.

what this leads to, then, is piles of features going in during the window for features (3 months-ish worth) and trying to stabilize it all later on.

i'd *love* to have something like 2 weeks of dev, then 3-4 days min of stabilizing (longer if it takes longer, of course); rinse, repeat.

this doesn't make sense, though, when held to a rigorous 6 month cycle with no features in during the last 2 months.

we could do it, but we'd lose even more of our feature commit time ... it just encourages bad behaviour and rewards things like "push that feature in at the last second!"

if instead we could have a regular rhythm and just commit at known good points ... that would be so much nicer. but that means sort of stepping outside of trunk/ for pretty much all development, and svn just doesn't allow that. =/

a bunch of us have been talking about it today on irc though, and some interesting ideas are coming up.

Kevin Kofler said...

I really don't understand why it can't be left up to the component maintainer when to feature freeze. That way you could work the way you suggest (2.5 week cycles, even during the last 2 months up to the release), other modules could use the current schedule, smaller modules with a single maintainer could drop the stabilization phase entirely. IMHO the maintainer should be responsible for having something releasable on release day (and get flooded with all the bug reports if he/she fails ;-)), how they arrive at it should be their business.

By the way, a hint for SVN merges: use the --ignore-ancestry switch. Without that, SVN will try to be "smart" when merging files with a common ancestor (i.e. branches), and often not quite do what you expect. With that switch, it will really work how you expect merges to work (take the difference between A and B and apply to C).

Dread Knight said...

LaunchPad and bzr ftw! ^_^

Anonymous said...

git ftw

chani said...

yeah... I find myself totally ignoring bugs that, well, bug me - and trying to push features in while I still can, which isn't good... partially 'cause I may not have *time* to fix those bugs later... :P I'd really prefer to give my new features some extra polish while I have all the details in my head, before moving on to something else, but then I wouldn't get to do some features that I really really want to have in 4.1... it really is encouraging bad habits...

mschlander said...

Everyone seems to agree that fixed schedules are the way to go. Me to. So no need to discuss that part I guess.

So how long should the cycle be?

Seems to me that everybody's struggling to reach their goals (and users's expectations) for 4.1, not just plasma.

It also seems that the 6 month cycle, is harmful to the motivation for backporting fixes to maintenance releases for the previous version.

Has anyone come out and said they can't live with a longer cycle?

Just change it to a fixed cycle of 8 or 9 months instead. Starting after 4.1. Or maybe give the 6 month cycle one more chance and re-evaluate after 4.2.

The only reason that 6 months work for GNOME is probably that they hardly develop any new features. How can 6 months be good for marketing if there are hardly any new features to get excited about?

I really wonder if you're not making a big fuss about a relative non-controversial issue. Is anyone really in love with the 6 months?

Aaron J. Seigo said...

"Just change it to a fixed cycle of 8 or 9 months instead."

I'm actually hoping for the more radical solution of development cycles are divorced from each other.

I don't want to care what the release cycle is. It'll never be "right" for everyone. So make it right for those who use releases, and find a way to let those who make what goes into those releases happy.

Which would, at least for me, be continuous development-stabilize-development cycles.