On Tue, Apr 7, 2009 at 10:11 PM, Avinash Lakshman
<avinash.laksh...@gmail.com> wrote:
> The part that is very disconcerting are the following:
> (1) If one becomes a committer one is not expected to blitz through the code
> base and start refactoring everything.

There are two reasons I refactor.

One is, I always try to leave the code better than I found it.  This
helps fight technical debt.  In a project the size of cassandra you
have to do this or you end up with fragile code that you cannot change
without introducing regressions.  Usually this is not because the
original code was bad, but because the requirements changed as the
project grew and now there is a better way.  Or sometimes there is an
idiom better suited to a situation that the original author was not
familiar with.  That's okay too; nobody's perfect.

An example of this is r762440, replace String.indexOf != -1 with
String.contains (review by johano).

Two is, if I am going to introduce a new feature I will try to
refactor first without changing behavior in such away that the feature
becomes easier to add.  This breaks the changes up into smaller pieces
which are easier to review and easier to validate against regressions.
 (The more things you change at once, the harder it is to find which
caused a problem.)

A specific class of this kind of change is merging copy/pasted code
into method calls.  Duplicate code makes it hard to add features
because you have to know about the duplicates and remember change all
when you change one.  There is a lot of this in cassandra.  Examples
include r762440, r762440, r762440.  (This specific area of the code
did bite me while implementing remove; that's what the "os x error"
thread on google groups was about.)

So there is a method to my madness. :)

> In any organization one doesn't just go about ripping out everyone
> else's code for no rhyme or reason. That will offend anybody. I personally
> would not go about ripping someone else's code apart if I had become
> committer. It is just that respect ought to be there.

I think there may be cultural differences here.  It is not a sign of
disrespect to think that I can improve your code or anyone's. :)

> (2) This is something that I have said many times over. Certain things are
> the way they are for a reason.

And others are not.  For instance, there's a lot of classes that still
implement Serializable, but that's misleading because you roll your
own serialization now.

Or for something more meaningful, the code-by-copy-paste examples.

It's just not reasonable to say "don't touch anything, it's all done
for a reason" when there are clear counterexamples right there in the
code.

I don't see any alternative to your becoming involved in the review
process so you can tell us when something really is important, such as

> For example when I say ConcurrentHashMap is a
> memory hog I say it because we have seen this in practice. How does it
> manifest itself? I obviously do not recall since all this was over a year
> ago.

So I replaced those with NonBlockingHashMap.  The system is working. :)

> No one can claim to have run tests the way we have in the last year and
> a half. One cannot just run some simple test and say well I do not see the
> problem. I am not dumb.

Again, maybe there are cultural differences here...  Todd was asking
out of curiosity and a desire for more information.  Often knowing how
you arrived at a conclusion is as useful or more so than the
conclusion itself.  (Otherwise you run the risk of encouraging cargo
cult programming.)

> My understanding was that new committers come in and start with some feature
> implement that and then slowly start looking into what more they could do
> going forward.

That's what happened... in December.  I've had a lot of time to look. :)

> It is NOT come in and refactor the hell out of the system
> because you like something to be in a specific way.

I think I addressed this above, but I'm happy to discuss specific
commits in more detail.

-Jonathan

Reply via email to