Over the last few weeks, I've had some really excellent interactions with Lift users, some on the Lift list and some privately (mainly because Lift users were exchanging proprietary code with me.)

We all want to improve Lift.  We use it, we give feedback, and we improve Lift... the code base, the documentation and most importantly, the Lift community.  The Lift community's primary point for interaction is the Lift Google group: https://groups.google.com/forum/#!forum/liftweb  That's the best place to ask questions, give feedback, learn and stay connected with the other awesome folks who make up the community.

Recently, a Lift user sent what I consider to be the prototypically ideal request for help: https://groups.google.com/d/topic/liftweb/KNhdu-IqVy4/discussion

He had a non-trivial task that was some Scala and some Lift.  He framed his question by clearly stating his goal.  He put together an example project and posted his question.  He took the extra time to frame his question in both words and code so that it was understandable.

I was able to look at his question, pull and run his project, and answer his question in about 20 minutes, and this is less time than it typically takes me to read and respond to much more trivial questions.  The Lift community now has another example of taking non-trivial data and mapping it into a display.  Thanks Diego.

Another excellent interaction came from Bufferine: https://groups.google.com/d/topic/liftweb/E3ynTtW7fKM/discussion Her request was in the form of "when I apply this CSS Selector Transform, I expect both rules to apply, but only one rule is applied" along with a simple example.  Her post was also a clearly defined use case that underscored the value of the change she was asking for.  Her post led to an enhancement the way the CSS Selector Transforms work and helped evolve this feature in Lift.

Lift users have also shared the source of their projects with me so I can see how the whole project hangs together as well as seeing patterns in code that can be made more concise with APIs.  It's also an opportunity for me to see excellent coding styles and learn new Lift tricks myself.  If you have a Lift application in production and want to share the code with me, please contact me privately to show me how you've built a production app.

I highly these interactions because they are examples of folks interacting with the Lift community to make Lift better.

Further, asking questions helps you get answers, but also helps the whole community and the Lift committers learn about the challenges facing developers.  This allows us to:

  • Improve documentation to highlight common usage patterns.
  • Add new features that turn frequently used patterns into simpler patterns.
And if you ask a "how do I" question, you might learn a pattern that others developed that you might not otherwise see.

I also want to point out some mechanisms that are most likely not to get a desired result (a question being answered, an improvement to Lift):

  • Tweeting about it.  Twitter is great for a lot of things, but if you've got a suggestion or improvement to Lift or a question, bring it to the Lift google group so the whole community can share in a rich discussion.
  • Not answering a question posed in response to your question.  We may ask about the Lift version you're using, your operating system, JVM version, etc.  It turns out that these things often make a difference.  If you want help with something and the person volunteering to help asks a question in furtherance of answering your question, then please answer the question.  If you want help from someone, then helping them give you help will only make the process faster and easier.
  • Not putting together example code when asked will pretty much disqualify you from getting an answer from me.  If you're going to push the work of putting together a running example onto me, then you're trading your time for my time and I'm already offering to give you my time for free.  Put another way, you're telling me that my volunteer time is worthless... and if it's worthless to you, then I won't spend any more on you.
  • Copping an attitude.  This includes phrases like "Surely...." "Isn't it obvious..." "I said this once when we were at XXX together..."  Things may be obvious to you and maybe you'll be able to help the rest of the community to see why your approach is better than what's available now.  Further, when I'm on the road, I meet hundreds of people.  While I try to take notes about conversations, I will forget things.  So, unless we've discussed something on the Lift group and it results in a ticket being opened, please do not expect it to be part of Lift.
To put the above another way, we are working together to improve Lift.  We're all volunteering our time to the effort.  In order to maximize the value of our collective time and effort, there are mechanisms for communicating and for sharing the burden of making Lift itself and each Lift-based application the best that can be.

When you show that you think you question is important enough to write a little extra example code, the community will value giving you a better response more.  When you work a little harder, the whole community will work a little harder to help you.  When you're a little more polite, the community will be a little more polite.  But the opposite is also true.  So, let's all go the extra step to communicate in a way that improves the results for all of us.