Community Involvement

Over the past year or two - through attending local user groups, regional conferences, and starting to use Twitter - I have enjoyed increasing my social network and expanding the IT community in my world.  I’ve met some amasingly smart and fun people that I’m glad to know.  And Twitter helps me keep in touch with these folks in ways never possible before.

It’s time to give a little bit back to the community.  Inspired by Jeff Blankenburg’s blog post: Celebrate Contribupendence Day! encouraging people to write recommendations for 5 people.  So that’s what I’ve done.  I’ve been pretty busy with the new job, summer & life in general, so I’m getting this out there a couple months later than anticipated.  But better late than never! 

Here’s the collection of my 5 Linked-In recommendations:

Mike Busch

Even though Mike was a fairly recent college graduate when I worked with him, he far exceeds the technical competence I would expect from other developers at his level of experience.  He not only does well at his work, he also takes the time to help out others with, and learn things within his areas of expertise.  Mike does a good job understanding and following the methodologies used by the team, and stepped up when asked to lead the team through a weekly code-review walkthrough on at least one occasion.  I enjoyed my time working with Mike.

Brian Disbrow

As a project architect, Brian does an excellent job of balancing his focus between technology, business, and the needs of his team members.  He is able to switch gears between talking about the details of the project, and talking about the big picture more effiently than most people I know.

Brian does a lot to help a team be successful.  He is willing to make decisions he feels are best for keeping the team moving forward, and stand by them even if the decision is not a popular one.  Brian has an acute understanding of the struggles and concerns of his team and works to improve upon these issues whenever possible, even in the face of opposition or, worse yet, indifference.

Brian is also an exemplary teacher, exhibiting patience and enjoyment in the process of helping people learn, regardless of their skill level.  He has the ability to easily recognize the level of assistance that an individual requires for a particular task, and is able to adjust the level of help he provides accordingly.  He is able to recognize team members’ strengths and weaknesses and to help people use their strengths while improving upon their weaknesses. He goes beyond just being approachable by making a point to ask people periodically “Is there anything I can help with?”

Kevin Munc

I worked on a project with Kevin where he was the tech lead on the project.  He is very intelligent, learns new things very quickly, and frequently shares his extensive knowledge with others around him.  This coupled with his ability to retain detailed knowledge about his past experiences make him an invaluable and highly competent tech lead.  His ability to think outside the realm of the way things have always been done in order to try a new approach is a major asset to the team.  He is easily approached and always willing to take the time to help people accomplish tasks and work with them to weigh options and figure out the best solutions to problems.  Kevin does a wonderful job making decisions on core best-practices that the team should follow to provide a high quality product. 

Dean Stautberg

Dean is the type of software developer who is able to both focus on the details of what he’s working on, as well as step back and see the big picture of the problem when necessary.  He is constantly keeping his eyes open for new technologies, ideas and tools that will help do things better or more efficiently than before.  He takes time to try out lots of different things in this quest, and is happy to share what he’s learned with others. 

Dean is very approachable when co-workers or other peers have questions, and he is patient and clear when helping others learn.  He is good at brainstorming and thinking of new things to do, or different ways to approach a problem if something isn’t working.  I would not hesitate to work with Dean again on future endeavors.

Ed Vaflor

Ed Vaflor is one of the best managers I have worked with so far in my career.  He is able to relate well to the people he manages.  He is able to see beyond politics into the reality of a situation, and come up with action plans and help others forumulate plans to move forward based on that reality. 

Ed communicates openly and freely about what he observes, thus promoting trust and openness from those around him.  It is my feeling that those around him want to work hard for him because of the rapport he creates.

Posted in community. Tags: . 1 Comment »

eRubyCon 2008

eRubyCon 2007 was a great time in Columbus Ohio last year, and I will be attending eRubyCon again this year!

eRubyCon. August 15-17, 2008

Acclimating to a non-file-locking version control system

If you’ve always worked with version control systems that use file locking (where only one person can have a file checked out at at time, such as Visual Source Safe, PVCS or Clear Case), then getting used to a non-file-locking system (such as CVS or Subversion) is quite an adjustment.

It’s a change in the way you think, that starts with a change in terminology. Here’s a list of some terminology differences and best practices for use with non-file-locking systems.

TERMINOLOGY

  • Add – Used to add new directories and files to the repository. Must be followed by a “commit” to finalize the change. Also note that a “commit” without an “add” will not include the new file or directory to the repository.
  • Checkout – A one-time only action to retrieve all the code in the repository, and put it in a local working directory.
  • Commit – Similar to “update” in other version control systems, this command is used to copy changes from the local directory to the repository. If adding new files, you must do “Add” before commit.
  • Repository – the remote copy of your code base controlled by the CVS or Subversion server.
  • Update – Similar to the term “check out” in other version control systems, this command is used to get the most recent changes from the repository, and put changes in your local working directory. This does not lock any files, nor prevent anyone from making changes to any files. If two people have made changes to a file, CVS/Subversion will attempt to merge the two files locally, and notify you if there is a conflict. This way, you have the most recent changes, and they will still be there when you commit your changes.

DAILY USE

  • Always do an “update” before beginning your work, to make sure that your local working directory has the most recent code.
  • Make your code changes.
  • IMPORTANT: Before “committing” your changes, do an “update” once more to make sure you get any changes since your last update,

    • If someone else has been making changes to this file, and they committed their changes first, you will have to merge their changes in with yours before committing.
    • If you “commit” your changes without updating first, and someone else made a change to a file you changed, you will overwrite their changes! This is not a good way to make friends on the team :)
  • After retrieving the latest code from the repository, it is a good idea to re-run any unit tests to make sure that your new code still works along with the new code just retrieved.
  • If you have created any NEW files, you must first “add” them to the repository, or they will not be included when you “commit” your code.
  • Finally, “commit” your code changes, both new files and modified files.

BEST PRACTICES

  • Update Often! Most people check email several times a day. It is not a bad idea to get the latest code changes from everyone else several times a day. This will help more quickly identify things like API changes that would result in compiler errors, etc. The bigger the team, the more important it is to keep updating to the latest version of the code.
  • Commit Often! No need to wait until you’re completely done with something before checking in.  There are several advantages to committing often.
    • More often you commit your code, the sooner everyone else on the team will have your changes.  If 2 people work on the same file, and you commit your changes first, it is the 2nd person’s responsibility to merge them together :)
    • Committing frequently also means you will be committing smaller chunks of code, rather than giant blocks of code changes that touch many files.  This reduces merge conflicts later, and reduces the chance that someone else will have to ask you about your changes if they are merging their code with yours.  Smaller chunks of committed code are much easier to merge!
    • In addition, it can be a good backup for yourself.  If you reach a good stopping point where things work to a certain degree, commit that code. If you do this often, and something gets screwed up, it makes it very easy to revert to what you know was a working version of code and start over, without losing a lot of changes.
  • Do not commit broken code!  Your can commit your code even if what you are working on is still a work in progress. However, you should still follow a few rules of thumb.
    • Do not commit code that does not compile!
    • Do not commit code that causes unit tests to break.
    • Even if your code may not fully work yet, do not commit code that causes something else that was working before to break.
Posted in code. 8 Comments »

My big move: from Java to Ruby

I’m pleased to announce that effective 6/9/2008 I have accepted a Ruby/Rails job with MedWiz Technologies. I’m taking the leap from Java, which I’ve done for over 9 years now, into Ruby, which I’ve been interested in for over a year. I’m very excited, somewhat nervous, but very much looking forward to this new opportunity and step in my career!

Posted in Uncategorized. Tags: , . 7 Comments »

JSTL and boolean values

I just realized something I did not know about the JSTL <c:if … > tag recently.

I had assumed that the item in the conditional test had to be either a Boolean object, or some other expression that would evaluate to a boolean primitive type. But JSTL is also smart enough to handle the String value “true” as a boolean as well (I didn’t know that before!)

As a Boolean object, this results in putting fish in the water:

In the Java:
request.setAttribute(“aquariumHasWater”, Boolean.valueOf(someMethodThatReturnsBooleanPrimitive()));

In the JSP:
<c:if test=”${aquariumHasWater}”> <aquarium:putFishInWater /> </c:if>

As a String, JSTL is smart enough to know the String value “true” and deal with it as a boolean

In the Java:
request.setAttribute(“aquariumHasWater”, Boolean.toString(someMethodThatReturnsBooleanPrimitive()));

In the JSP:
<c:if test=”${aquariumHasWater}”> <aquarium:putFishInWater /> </c:if>

Many times we have methods that return primitive boolean values.

Since primitives are not objects, we can’t put them in the Session/Request/etc. We have to convert it to some Object. A Boolean. Or A String. So I got to wondering, which way is better? Does it matter?

So I dug into the way it works (thanks to the JAD decompiler) and figured out that ultimately, the String value is “coerced” (org.apache.taglibs.standard.lang.jstl.Coercions) into being a Boolean object, by calling Boolean.valueOf() on the String. So, it would be slightly more efficient to just call Boolean.valueOf() on the primitive to begin with, rather than calling Boolean.toString() on the primitive, only for the taglib to turn around and just call valueOf() itself.

For anyone curious enough to see this coercion code, here’s a portion of the coerceToBoolean() method taken from the org.apache.taglibs.standard.lang.jstl.Coercions class:

public static Boolean coerceToBoolean(Object obj, Logger logger) throws ELException {
  String s;
  if(obj == null || "".equals(obj))
    return Boolean.FALSE;
  if(obj instanceof Boolean)
    return (Boolean)obj;
  if(!(obj instanceof String))
    break MISSING_BLOCK_LABEL_70;
  s = (String)obj;
  return Boolean.valueOf(s);

  ... // more

}
Posted in code. Tags: . Leave a Comment »

Terminology: Man-Crush

This, like a lot of topics here I suppose, is not specific to anything technical. But being in an IT field, I’ve heard the term “man-crush” a lot and find it interesting and fun to talk about :)

Mostly, I think it’s funny. What changed it from “funny” to “interesting” in my mind, happened at CodeMash this past year (like many interesting conversations that happen outside of the scheduled sessions) when I had to define the term to someone who had never heard it before! Take a minute… think about it… what can you come up with?

.

.

.

.

My definition of the term was something like: when you admire someone so much it’s like you have a non-sexual crush on them. You want to talk to them, be around them, and learn as much as you can from them. A “technical crush,” if you will.

Brian Prince at CodeMash had a definition I liked even better: when you admire someone so much you just want to hug his brain!

The top-rated definition on urbandictionary.com defines the term as “When a straight man has a ‘crush’ on another man, not sexual but kind of idolizing him.”

And since then I’ve seen shows (new and re-runs) that have also used the term:

From “Seinfeld”:

“George has a ‘non-sexual crush’ on him, he’s like a school girl around him”

From “Men in Trees”

“You have a man crush!”

“I don’t have a crush on him. I just want to be him.”

If I recall correctly, the reason I brought this up in conversation at CodeMash, was to pose a question for the group to ponder and respond:

Can a person have a non-sexual, “technical crush” on someone of the opposite gender?

I think it’s definitely possible. I believe I have. The group had differing opinions. I recall one guy mentioning a female business partner that, in his opinion, fit that category. Yet another guy had the opinion that with some guys it’s never non-sexual.

Who knows?

I’m curious if anyone else has opinions on the matter. Or if anyone else has any other, better terminology.

  • Can a woman have a “man-crush” on a man or would you call it something different?
  • “Man-crush” seems to have a nice ring to it, but if a woman admires another woman technically in that way, you can’t really say it’s a “man-crush” right?
  • I tried it out, but “woman-crush” doesn’t have the same ring.
  • My term “technical-crush” is closer, but I’m not quite sure it captures the meaning.

I would love to come up with a better term that fits multiple admiration scenarios, and captures the full meaning. I’m still thinking.

The Invisible Bear Trap

I was reading something recently that was making a point that angry women are frightening to men. Way more than angry men frighten men. Ironically, the very next day I was having lunch with a couple of male co-workers, and one of them made a very similar statement. I can’t recall exactly how it came up. But what interesting timing!

I was still mulling over what I’d read in my head, so this spurred me to ask some questions to get the opinions of the guys at lunch.

Why do you think that is?
One of them said that growing up, he was used to his dad yelling at him all the time, like if he was doing something he shouldn’t be. His dad would yell, it was short, then it was done. On the other hand his mom didn’t yell much at all. But when she did, she was REALLY mad. So her version of angry was a lot worse than his dad’s.

The other one calls this “the invisible bear trap”: when he has no idea his wife is mad, and then out of the blue she bites off his head like this invisible bear trap that comes out of nowhere.

Women don’t want to seen as “bitchy.” And we hate when we’re having a bad day because of any number of reasons, and get written off as having PMS or something (As if guys never have bad, frustrating days that have nothing to do with biological causes? Come on! :) ) And I’ve seen women in leadership roles who forge through barriers to get things done, and get labeled a “bitch” for doing so. I’ve seen guys have to do that same (or worse) kind of forging through roadblocks, and not get called any kinds of bad names behind their back. Sometimes, to avoid such accusations and labels, a lot of women will try to be “nice” and “quiet” instead, and just go-along with things. But by not talking about issues and playing nice, things build up, sometimes to a boiling point. And that’s where the invisible bear trap comes from. All from just trying to be nice and “ladylike.”

Agression vs. Assertion
The most logical solution would be to not bottle things up, and assert one self when needed. The problem with this is that the line between agression and assertion is blurred.

Aggressive, adj. (from dictionary.com):
* boldly assertive and forward; pushy
* Inclined to behave in an actively hostile fashion
* Assertive, bold, and energetic

Assertive, adj. (from dictionary.com):
* confidently aggressive or self-assured; positive: aggressive; dogmatic
* Inclined to bold or confident assertion; aggressively self-assured

Notice how some of the definitions for “Agressive” use the word “Assertive” in the definition. Likewise the definitions for Assertive use the term “Agressive” in the definition. No wonder this line is blurred! Look closer at the differences and you will see the definition for “Agressive” containes the word “Hostile”, while “Assertive” contains the word “positive.”

People should strive to be assertive, not agressive; positive not hostile. But I’ve definitely seen assertive women get bad-mouthed for being agressive or argumentative. Not as often do I hear men badmouthed for assertive or argumentative behavior. Yet, I’ve heard men get praised for argumentative, “won’t take crap from anyone” behavior.

Are you more afraid of a women getting angry at you, vs. a man getting angry at you?
The consensus of the lunch group was yes. Nobody likes anyone to be angry with them. But the guys said that the thought of a man getting angry was a lot easier to take than a woman getting angry.

For comparison, I asked one of my female friends the same question. For her, it’s equally scary no matter who is angry. I agree with her, absolutely hate for anyone to be angry with me! Although I might slightly fear a man’s anger more than a woman’s. A man is typically louder, for one thing. I fear louder women, too. But, while it’s a generalization, men are typically stronger physically than women, and if verbal changed to a physical fight the woman doesn’t stand a chance. (NOTE: I am NOT saying that I’ve ever feared physical violence in the workplace! I am only saying the thought that *if* it did, there’s no equal ground, can subconsciously cross the mind. And if that might cross my mind, imagine the mind of someone else who grew up facing physical violence in the home!) These thoughts aren’t usually a factor, not until an argument gets heated or the more assertive ones are talking so much I can’t get a word in.

In addition, one of the guys at lunch added that he’s not only more afraid of woman’s anger than a man’s. But also he is more afraid of getting angry TOWARD a woman than toward another man.

So if women don’t speak up so they don’t come across agressive, and men are afraid to voice their anger toward a women, then aren’t men and women BOTH bottling things up in relation to each other?

That can’t be healthy. Doing the same thing, because they’re afraid of each other? Where does this come from? Fear of how they will react?

The unknown is always fearful. Maybe people feel like they can more accurately gauge how someone of the same gender will react to soemthing. But if you don’t know how, or why, the other person will react, it’s scarier for sure. For the most part I can probably gauge a woman’s behavior more accurately than a man’s, because I can understand better some of the reasons behind the behavior. This may more likely be a cross-gender misunderstanding, but there’s always exceptions to the rule. I can think of female people I’ve known in the past who I could never gauge what was going to tick them off. We were just coming at the world from opposite corners of the universe. I found it easier to just keep my distance from them and speak up as little as possible around them.

Bear trap example
What about times when I want to or need to speak up and can’t?

At lunch, I decided to look back at a specific recent example where I got pretty angry about something, and both these guys happened to be arond when it happened. This is a good time to figure out what I could have done differently and could do better in the future.

A few weeks ago, someone came over to ask me something. Then we needed some more information or input and the 2 guys joined in as well. As the 4 of us talked, I noticed the first guy had the wrong idea about the way something was supposed to work. I tried to step in and correct the misconception, so we could move on with the discussion. As I did, people seemed to all be talking at once. And so I would concede and be quiet. Yet as I observed, the conversation kept on in the wrong direction based on the wrong initial assumption. “If only I could correct that, this discussion would go a lot easier,” I thought to myself. I tried to say something again. Still, everyone talking at once. I shut up. This happened several times. Each time I conceded, trying to be polite and not interrupt and let people finish. Yet by being polite, I was also getting frustrated that I was not being heard. Finally, I got a chance to say what I needed to say! Then I got interrupted with what seemed like a dispute that what I was saying was wrong, when I hadn’t even finished what I was saying! And that was the last straw. And I said “Can I finish a sentence!?” It was not nice. It was not pretty, nor polite. But after that, everyone shut up and I got to talk uninterrupted. Indeed, what I had to say did clear some things up, and the conversation continued. Why did it take all that so that I could say my piece?

I think this is a good example of the need to try to be more assertive earlier on, to avoid the agression later on. So I pondered out loud, what could I have done differently to get a word in edgewise?

One of the guys said he noticed he kept interrupting and so he stopped talking too. (I told him if he noticed that, then the bear trap shouldn’t have been so invisible, haha!) But not everyone’s so observant. After some further discussion I realized that while I always stopped talking, the other person just kept talking until I finally stopped. So I concluded that a good thing for me to try would be to not back down so quickly but keep talking longer than I would have previously, and see how that works out.

Trying out the new technique
Later, during that same lunch, we had moved on to a completely different topic and I got a chance to try this out. In this case, I wasn’t saying anything that important, but I was talking when someone else started talking. As I was just about to stop talking and let the other person speak in my stead, I consciously decided to keep talking. I didn’t work. So I kept talking. Still didn’t work. Then, as I kept talking I said “I’m going to keep talking, I’m still talking, but I guess this doesn’t really work does it?” Nobody heard me say that. At that point, I finally conceded. I shut up, we finished our lunch, and I went quietly back to work. In a way it was kind of funny, I guess because it wasn’t important. But it didn’t work.

I’ve been making a consious effort not to let one failed attempt determine that it never works. I’ve tried it MANY more times since then. At least a few times a day. I’ve only had it succeed where I get to keep talking once. And I felt bad, like I was interrupting the other person – I felt rude.

The downside of trying so hard, is that it is more frustrating than it was before. It only takes 1-2 times in a row of really trying to speak and it doesn’t work, where it takes several times in a row of conceding and not trying to get as frustrated. So I’m looking for a new technique. The only thing working for the time being is to do something else to get my mind off it, and let the interrupters talk among themselves. They will usually address me again specifically when they’re done and ready for my input again. That might keep me sane for awhile. But I think I can do better than that. I’ll come up with some new ideas.

Leveraging the fear
Earlier in the lunch discussion, there was talk of whether men’s fear of angry women more than angry men could, unfortunately, contribute to the proverbial glass ceiling for women. Typically your manager has to be more assertive than your peer does. That’s what manager’s have to do. (I said assertive, not agressive.) But who wants to work for someone they’re scared of? That’s my question. And it’s a weird, maybe sad question to ponder.

I can’t help but think about how a male-authored book I’m reading, and 2 men I work with expressed the same sentiment, that this general fear isn’t going away any time soon. Even if a few people start communicating more and become better at distinguising assertion from agression, I still don’t think this fear is going away any time soon. So it seems like there’s got to be some way to leverage this in a way that’s beneficial to everyone! I’ve heard men talk about women managers and company owners who they respect, and who get things done. If they fear these women, it must be some kind of healthy fear that works out somehow, I don’t know. I respect these women, and know it can be done. I guess it gives me hope that I can be successful without being labeled a “bitch.”

The life & times of JSP custom tag libraries

First off, I must say that I have used this diagram of the JSP Tag Lifecycle  so many times: http://www.examulator.com/images/iteration_tag.png It has been an invaluable resource.  If some of the events I’m talking about in this post don’t make sense in the big picture, take a look at that diagram.

I recently came across something interesting that I didn’t know before. Sometimes the doAfterBody() event handler does not get invoked within the lifecycle of custom JSP tags that extend TagSupport. Once I figured out when and why, it seems obvious. I just never thought much about it before.

I was creating a custom tag that could optionally take parameters (similar to the way jsp:include tag does). I created a parent tag (aquarium:hasfish) and a child tag (aquarium:param) to be used like this:

<aquarium:hasfish>
   <aquarium:param species=angelfish />
</aquarium:hasfish>

Event handlers for aquarium:hasfish are invoked in this order:

1. doStartTag()
2. doAfterBody()
3. doEndTag()

It is important that the aquarium:param child tag is evaluated before the aquarium:hasfish parent tag does what it needs to do. In other words, since the child tag lives in the body of the parent tag, the body of the tag must be evaluated before the parent tag does anything.

This is how this works:
1. The child tag executes, takes the param value, sets the value on it’s parent tag, and it’s done.
2. the parent tag then does its processing and can use the param value set by the child in step 1.

For the child tag to execute first, the parent tag must wait to use the param until the child tag in the body has executed. Event handlers for BOTH tags together are invoked in this order:
1. doStartTag() for aquarium:hasfish
2. doStartTag() for aquarium:param
3. doEndTag() for aquarium:param
4. doAfterBody() aquarium:hasfish
5. doEndTag() aquarium:hasfish

The param value is not available yet in step 1 when doStartTag() is invoked. The parent must wait until Step 4 doAfterBody() or Step 5 doEndTag() before it can use the param. So it doesn’t matter if you put the parent tag’s code in doAfterBody() or doEndTag(), just pick one, right? Maybe. Read on…

——————————————————————-

If we aren’t interested in passing a parameter, these two examples are basically equivalent….

<%-- no parameter example 1 %-->
<aquarium:hasfish>
</aquarium:hasfish>
<%-- no parameter example 2 %-->
<aquarium:hasfish />

….or are they?

For the most part they are equivalent. Both examples are empty tags without any tag body to evaluate. But when you look at the life cycle of a custom JSP tag that extends TagSupport, there’s one subtle difference.

The second example evaluates the following event handlers in this order:
1. doStartTag() for aquarium:hasfish
2. doEndTag() aquarium:hasfish

What happened to doAfterBody? doAfterBody() doesn’t get invoked in the example 2. Even though there’s an empty body in example 1, there is no body in the example 2. So, doAfterBody() isn’t invoked because there’s no body after which to be invoked.

Makes sense, no body == no after body. Keep in mind if you have custom tags in your application that may or may not have something in the body.

What’s the lesson here?
———————–

1.

<aquarium:hasfish />
/* doAfterBody() not called */
<aquarium:hasfish>
</aquarium:hasfish>
/* doAfterBody() is called */

2. make sure to put the parent tag’s functionality in doEndTag() NOT doAfterBody() if there’s a chance that your tag could be used like

<aquarium:hasfish />

instead of

<aquarium:hasfish>
</aquarium:hasfish>
Posted in code. Tags: . 1 Comment »

Women and the IT community

Several months ago, I was challenged with the idea of trying to do something to get more women involved in the local CRB (Columbus Ruby Brigade). I’m not really sure what to do. I don’t lead groups. I don’t recruit. I rarely even notice when I am the only woman in a group of people until someone else points it out to me. I was thinking: “hey, if it doesn’t matter to me then why does this matter at all?” So I oscillated between not knowing what to do, and not sure why it even mattered if it was done. But I thought that if I’d been encouraged to do something, I should at least investigate and attempt to come up with some ideas.

One way that I like to gather ideas is to talk to others, get opinions, see which opinions I like best, and expand on that. So I decided first to talk with Dianne Marsh at CodeMash 2008. I was told less than a year ago that I reminded someone of her, so I assumed we were probably somewhat alike in several ways, thus I figured talking to her might be a good place to start.

I have tried to sum up what was talked about on the subject at CodeMash, as well as interject some of my own thoughts. Summaries of CodeMash are changed to blue. My additional thoughts remain in black.

So, one evening at CodeMash, I introduced myself to Dianne, and as we spoke I posed the question: how would one go about getting more women involved in a local user group? One of her first answers was: why target women, why not just focus on increasing attendance in general? Yes, I thought, it seems we were on the same page going into the discussion. There was not a lot of time to talk then, so I went to one of the expert panel timeslots at CodeMash when I knew Dianne would be there and we could continue the conversation. Before talking about women specifically, one of the things we discussed was: what are some reasons that people don’t attend user groups in general? And we talked about what to do, and what not to do to gain people’s interest.

SPECULATION ABOUT WHY PEOPLE DON’T ATTEND USER GROUPS

Is it worthwhile?

One idea was that it is worthless if a user group that claims to be technical really isn’t. There’s so much to do, so much competing for our time, we have to pick what is worthwhile. In addition, evening and weekend events are difficult for women who have families. But that issue is more general than just to women now: men should have the same issues with that as women do. It is really more of a challenge for young families.

Confidence

Dianne mentioned a study done at Carnegie Mellon University where people rate themselves first, followed by taking a skills assessment. The findings were that women usually rate themselves lower than the men, even when the skills assessment showed that person much more adept than the rating given to herself. So, perhaps women tend to be less comfortable because they lack some of the confidence that men typically have.

We’ve all heard that women tend to get paid less money for doing the same jobs as a man. I may not be too popular for saying this, but I feel in many situations this comes down to confidence. Men are more likely to ask for those raises, and seek those promotions, figuring the worst they will probably hear is “no.” Ask and you shall receive, and conversely if you don’t ask you may not receive. A tightfisted employer will give smaller raises, if at all, to those who do not make noise about it. Not all employers are like that, but those who are that way bring down the averages for those demographics who don’t ask – which I think are more likely the women.

Sexism?

Do a lot of women experience sexism in groups of men? I don’t feel like I, personally, have experienced all that much sexism in my life. Am I just lucky? I can’t say I have never experienced it, but not very much.

* There was the CS professor I had in my introductory programming classes in college. Having barely known how to use a computer upon entering college, I often felt I had a lot of catching up to do, and went to the professor’s office hours probably more than the average student. Yet I’ll never forget the time I was having particular trouble with one assignment. I was in my professor’s office on a Friday afternoon. After answering the questions I had at that time, he said that if I had more problems over the weekend, his wife would not be home all weekend, so I could call him at home. And he gave me his home phone number. I’m pretty sure I stopped going to his office hours after that, and must have muddled through any trouble I had with my assignments after that on my own.

* Then there was my database professor in college. My friend’s roommate Jeremy and I were both in this class. We lived in nearby apartments so we studied together a lot, and would arrange to go to the teacher’s office hours together a lot when we had the same questions. I can recall several occasions where the professor would specifically and very blatantly make eye contact with Jeremy and not even glance at me when periodically asking “does that make sense?” I felt that if I didn’t understand I had to interrupt in order to say so, and even then I felt like I was inconveniencing the professor to ask any questions at all. He didn’t seem to mind when Jeremy asked for clarification. I don’t know if it makes a difference in his attitude that this professor was older, probably a couple of years away from retirement at the time. But it’s a theory.

Other than that, I can’t recall any blatant sexism, or times when I have felt really uncomfortable that I’ve encountered. And I don’t really understand feeling uncomfortable being the only woman in a group. I guess I see it as something that bothered me when I was younger the same way a lot of things bother you as a kid and you grow out of it. Feeling “different” is a much bigger deal as kids than it is to most of us as adults, I believe.

Do people feel comfortable?

Maybe it is more of a problem of comfort level. When you go somewhere new, whether it’s a party, playing on an recreational sports team, church, a user group, or anywhere where there’s a group of people, it’s much more intimidating if you don’t know anyone else who will be there. So, add to that another level of unknown: not knowing the demographics of the group – whether it’s not knowing if you’ll be the only “nuby,” the only female, the only anything – that can make it that much more scary.

I can recall occasions in my younger years (elementary school or junior high) where some event was going on, and I would check with female friends of mine to make sure that I wasn’t going to be the only girl in attendance, or participating in a particular event. That’s not a concern of mine anymore. It doesn’t bother me at all, now. Yet, in the last year I have had female friends of mine on occasion ask me if I was going to attend some event because they did not want to be the only woman. And when they did this, it caught me off guard a bit, and surprised me that it even mattered to an adult whether she was going to be the only woman in a group. Perhaps in my field of work, where I am usually surrounded by more men than women on a daily basis, I have gotten so used to it that I forget what it’s like for it to matter whether I’m the only woman around or not.

Can I think of any times when I have felt uncomfortable?

The only time I ever feel like I don’t fit in with a group of men, is when I’m in a group where everybody is trying to talk at once, and the only way to get a word in seems to be to interrupt others who are speaking. Yet, in general when I am speaking and get interrupted, I feel like it is because people didn’t really want to hear what I had to say. So I make it a point not to interrupt people since I really hate being interrupted and feeling like what I am saying is not important. And as a result of not interrupting, I’ve noticed that sometimes my point of view does not get heard at all. More recently, I have found ways around this. For example, if I feed my opinion to someone with more of a voice in the group, and do that after the fact in a one-on-one situation, often this will get my opinion shared with the group through someone else eventually. Maybe I don’t “get credit” if it is a good idea, but that’s only bothersome if I care enough about getting credit for the idea. If the goal is for the good of the team, it doesn’t matter who speaks the idea as long as it gets said. Even though there are days when it feels like men interrupt conversations more than women do, truly it is not always men who interrupt, though. While some men are more likely to interrupt than others, so are some women more likely to interrupt than others. Likewise, I know many men who don’t make a habit of interrupting others.

What makes me more comfortable?

I think that sometimes, for whatever reason, people have lower expectations of me. And here’s my secret: sometimes I think I contribute to that on purpose. If a group of people are having a conversation, and see a quiet woman sitting there observing and not saying very much at first, I think that can lower expectations: expectations of what a person will contribute, expectations about their intelligence, and expectations about their competence.

It’s really easy to judge a book by it’s cover. No offense to you guys, but think about this: if a guy told you he wanted to decorate your house, you probably would not expect the decorating to turn out all that great. However, I know there are guys who do have a good eye for decorating. But, with your expectations that most guys don’t much interest or experience in decorating, if the guy decorated your house it would be easy for him to exceed your expectations even if the decorating was just “OK,” would it not?

Oddly enough, sometimes low expectations make me feel more comfortable. This is because if expectations are low, then I’m more likely to meet or exceed those expectations. Oh sure, sometimes it backfires if someone cannot or will not shed first impressions. But I am typically a lot more comfortable in situations where I feel I have a chance at exceeding expectations, than ones where I feel like I’ve been oversold and I’m likely to disappoint.

WHY DOES ANY OF THIS MATTER

Back at CodeMash, just to spur discussion, I posed the questions: What is the problem with lack of women in IT, or at user groups anyway? Why do we care? People are interested in what they’re interested in, and if they’re not interested in something then why force it? And what about other minorities? For example, I think I only saw about 3 African-Americans at CodeMash. There were a lot more than 3 women.

Some of the answers I got were thought provoking. Things like:

It’s not really a problem as long as there’s not a false barrier to entry, or decision not to be interested is based on false information.

Enrollment of women in CS has dropped since the mid 80’s. This is proportionately, not just based on general enrollment in CS rising or dropping. Dianne mentioned that she has gone to speak at high schools before, and that high school girls are often surprised by women in IT. They are often surprised by her because she does not fit the stereotypical “computer geek” profile in many ways.

Or perhaps just offering programs which introduce women to IT, Math and Science fields early in high-school, in a more relaxed environment would do wonders for spreading knowledge about the industries and dispelling commonly-held myths that women “aren’t suited” to work in those fields.

Diversity in the IT community helps everyone. That’s why we care. Our products have a lot of potential to be better if we have more diverse thoughts ideas brought to the table, that can only be produced by having different people and new ideas involved in the process.

WHO’S DOING IT CORRECTLY NOW? WHAT TO DO ABOUT ALL THIS?

One observation made in the CodeMash group was that there seems to be a higher female attendance at CodeMash than there is in general in IT. He was right, it’s true. One thought on that was that some of the people you see at CodeMash are recruiters, and recruiting has a slightly higher female population than IT. However, that doesn’t really account for all of the women that we saw. In fact, I don’t think we had any real solid conclusions as to why this observation was true.

Another point made was that there does not seem to be nearly the gender bias in India that we have in the US. We spent time questioning whether the Western societal stigmas about women in IT were a contributing factor to fewer women being in IT than, say, India. Or, whether there was a bias in the higher education systems (like colleges), or even lower education systems (high school and lower) in the US, and whether such biases prod women into non-IT/Math fields.

Role Models

Another thought was that maybe more of a role-model approach is necessary. As mentioned above, Dianne said she has spoken at high schools. She said that she feels it is important to talk to kids in high school or even younger to try to fight stereotypes and misconceptions about IT that might diminish interest in technical fields. For example, you can promote that your job isn’t just about sitting in a cubicle all day coding, and never talking or interacting with other people.

Dianne posed the question: “who influenced you?” I didn’t really get a chance to think about or answer this question at the time, but I spent some time thinking about that later on. For me, it was partly my mom pointing out to me that when my younger brother and I played together as kids, he was the idea person and I was the how-to person. He would figure out what we would do or make, and I would figure out what materials we needed and steps we needed to take to accomplish his idea. My mom pointing this out to me helped inspire me to consider engineering-type fields. Among other things, unfriendly software for course registration in college helped inspire me to consider writing software myself. And co-workers at the computer lab help desk where I worked in college, who would talk down to others that were not at the same level as they were, inspired me to learn what I could and try to help newer people learn what I had learned, but do so in a much more friendly way.

CONCLUSION

So how can we possibly increase attendance at user group meetings? Some ideas….

Make it worth people’s while.

Make people feel comfortable. Maybe I can find ways to show people that there are women who are already involved in the group. Whether that’s to try to post to the mailing list more often, or start writing a technical blog (which is the basis of what inspired the blog you’re reading now!) Or just make an effort to talk to and get to know newer people who show up for the first time, even when I’d rather be talking to people I already know and haven’t seen for a month.

Try to maintain a diverse group so others are less likely to be the only woman, or the only anything.

Role models. If you’re excited and passionate about being there, it’s a contagious attitude. Feel comfortable. Have confidence. Find your voice.

JSTL empty operator

A teammate and I were foiled by an interesting JSTL quirk this week. The code looked something like this

<c:if test="${not empty aquarium.fish}">
    <!---- feed the fish or something ---->
</c:if>

THE PROBLEM

The problem was, the fish were being fed whether the aquarium was empty or not.

The code

<c:if test="${!empty aquarium.fish}">

behaved the same, weird way. But we were sure, either way, that our syntax was correct. So that leaves only one question: WTF?

We know that we’re receiving an instance of aquarium from a method call developed by another team. We know that getFish() returns a java.util.Collection. Other than that we don’t care about the implementation, we just want our fish. In theory.

So we dug into the code for the other team’s getFish() method, and found out that our Collection is actually implemented as a HashSet. And JSTL behaves a little weird with respect to the empty operator: it does not work with java.util.Set. Incidentally this isn’t a problem in JSTL 1.1 or 1.2, and unfortunately we’re stuck using JSTL 1.0 for now. So unfortunately this forces us to know how this Collection is implemented in order to know how to handle it.

WHY?

As of JSTL 1.1, “… the Expression Language now belongs to the JSP specification (JSP 2.0).” [from the JSTL 1.1 spec]

Since versions numbers don’t always line up such that it’s clear what is compatible with what, here’s a view of which JSTL versions go with which JSP versions:

JSTL 1.0>JSP 1.3;  JSTL 1.1>JSP 2.0;  JSTL 1.2>JSP 2.1;

Now let’s compare the specs for the empty operator

From the JSTL 1.0 Spec:

To evaluate empty A:

  • If A is null, return true,
  • Otherwise, if A is the empty string, then return true.
  • Otherwise, if A is an empty array, then return true.
  • Otherwise, if A is an empty Map, return true
  • Otherwise, if A is an empty List, return true,
  • Otherwise return false.

From the JSP 2.0 and 2.1 Spec, which are identical in this regard:

To evaluate empty A:

  • If A is null, return true,
  • Otherwise, if A is the empty string, then return true.
  • Otherwise, if A is an empty array, then return true.
  • Otherwise, if A is an empty Map, return true
  • Otherwise, if A is an empty Collection, return true,
  • Otherwise return false.

The difference is the last comparison. The older version uses the List interface, the newer uses Collection interface. List is a sub-interface of Collection, so anything that’s a Collection but not also a List will not work in JSTL 1.0. For example:

  • The “empty” keyword in JSTL will work for things like List, ArrayList, LinkedList, Vector, etc.
  • The “empty” keyword in JSTL will not work for Set, HashSet, TreeSet, etc.

REFACTOR

There’s 2 options around this.

1: upgrade.

2: If that’s not an option, there is another workaround.

The nice thing about “empty” is that it will check for both null and empty lists for you. Our workaround had to be a little more verbose:

<c:if test="${aquarium.fish != null && !aquarium.fish['empty']}">
    <!---- feed the fish or something ---->
</c:if>
Posted in code. Tags: . 11 Comments »