Seven Things that distinguish Lift from other web frameworks

119 views
Skip to first unread message

David Pollak

unread,
Jan 21, 2011, 9:08:19 AM1/21/11
to liftweb
Marketing is hard.  Creating concise messages is super hard.  Having 3 seconds to explain to someone why your product is better and then losing their attention is the way things work.

I've spent a lot of time working out why Lift is better than any other web framework.  I've boiled the list down to Seven Things:
  1. Lazy Loading
  2. Parallel page rendering
  3. Comet and Ajax
  4. Wiring -- declare interdepencies between page elements
  5. Designer friendly templates
  6. Wizard -- multipage input screens with full back-button support
  7. Security
Each of the above taken in isolation is something that Lift does that few other web frameworks do (e.g., you can use JBoss Seam instead of Lift's Wizard) and Lift does each one better than any other web framework.  But taken together, they tell a compelling story about why Lift is different.

I've put together http://seventhings.liftweb.net as a way to not only list the Seven Things, but also to give code examples.  Even if you're not a Scala coder, you will be able to see the concise, elegant way that each of the seven things is expressed in Lift.

And as Lift becomes a polyglot framework, as Lift supports JRuby and Java and other languages, there will still be Seven Things that differentiate Lift from all other web frameworks.


Mads Hartmann Jensen

unread,
Jan 21, 2011, 9:23:18 AM1/21/11
to lif...@googlegroups.com
bravo. 

--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

Sander Mak

unread,
Jan 21, 2011, 9:30:19 AM1/21/11
to lif...@googlegroups.com
Cool, making a statement like this helps a lot indeed.

Small thing: the code samples all seem borked in IE8: http://imgur.com/654gK

Are you using the same highlighter as for Simply Lift HTML? Because
that looks ok in IE8.

David Pollak

unread,
Jan 21, 2011, 9:31:41 AM1/21/11
to lif...@googlegroups.com
On Fri, Jan 21, 2011 at 6:30 AM, Sander Mak <sand...@gmail.com> wrote:
Cool, making a statement like this helps a lot indeed.

Small thing: the code samples all seem borked in IE8: http://imgur.com/654gK

Are you using the same highlighter as for Simply Lift HTML? Because
that looks ok in IE8.

I'm using the same code formatter as http://simply.liftweb.net

I'll look into the IE 8 issue.
 



--
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Blog: http://goodstuff.im
Surf the harmonics

Sander Mak

unread,
Jan 21, 2011, 9:33:39 AM1/21/11
to lif...@googlegroups.com
The only (visual) difference I see is that the Simply Lift code
samples have kind of bounding box, whereas the Seven Things samples do
not.

Sander Mak

unread,
Jan 21, 2011, 9:40:24 AM1/21/11
to lif...@googlegroups.com
And on a more topical note: why did you choose the ordering the way it
is? It seems that the list starts of with two cool, but relatively
minor features in the grand scheme of things. I would expect the list
to start with the highest impact features from development
perspective. Although the impact and importance of a feature is of
course subjective, how about:

1. Comet & Ajax
2. Designer-friendly templates (aka 'view-first'/'no logic in view',
which stresses another important feature of the templating mechanism)
3. Wizard
4. Security
5. Wiring
6. Lazy loading
7. Parallel page rendering

Paul Dale

unread,
Jan 21, 2011, 9:55:00 AM1/21/11
to lif...@googlegroups.com

Very cool. Just in time for the scala+lift workshop I'm running Monday! :-)

Jim Barrows

unread,
Jan 21, 2011, 10:11:49 AM1/21/11
to lif...@googlegroups.com
I know 7 is kind of a "magic" number... but I would still add one more.. all of the above makes MAINTENANCE of a modern RIA webapp easier.  Development is faster, but not at the expense of the most expensive portion of software....

Struts, Spring, Seam are all great on the development end.... and suck rocks on the maintenance end.
--
James A Barrows

Christos KK Loverdos

unread,
Jan 21, 2011, 9:45:17 AM1/21/11
to lif...@googlegroups.com
Thank you David.

This is a great list ! presales-ready.

--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

-- 
   __~O
  -\ <,       Christos KK Loverdos
(*)/ (*)      http://ckkloverdos.com








David Pollak

unread,
Jan 21, 2011, 10:20:33 AM1/21/11
to lif...@googlegroups.com
The source is available.  If there are formatting changes, I'm open to doing a pull from your repo.

David Pollak

unread,
Jan 21, 2011, 10:23:48 AM1/21/11
to lif...@googlegroups.com
It turns out that the first two are the most important for a certain class of content sites that are aggregators of other content.  They are not "corporate" check-list items, but they are both visually impressive and super-important for a class of prospective Lift adopters that has money and is more leading edge that corporate.

Stefan Langer

unread,
Jan 21, 2011, 10:30:06 AM1/21/11
to lif...@googlegroups.com
I personally see security under the first two.

2011/1/21 David Pollak <feeder.of...@gmail.com>:

Maarten Koopmans

unread,
Jan 21, 2011, 2:29:38 PM1/21/11
to lif...@googlegroups.com
Maybe add a similar list "5 ways to Lift" on getting up and running?

--Maarten

Andy Czerwonka

unread,
Jan 21, 2011, 2:46:16 PM1/21/11
to lif...@googlegroups.com
so very cool - i was just having a conversation with a potential team member on why I chose Lift for my project - I could have simply pointed to this site.  Great stuff - can you link it off the main website?  Something more permanent than "Latest Happenings"?

Amador Antonio Cuenca

unread,
Jan 21, 2011, 2:58:45 PM1/21/11
to lif...@googlegroups.com
Thanks a lot, I'll review it later. 

At this moment I've decided to create a project (Incomes control system) with Lift and Postgres, I prefer to use it instead Rails because I think that Lift is much better.

Regards,

--
TSU. Amador Cuenca

David Pollak

unread,
Jan 21, 2011, 5:20:14 PM1/21/11
to lif...@googlegroups.com
On Fri, Jan 21, 2011 at 11:46 AM, Andy Czerwonka <andy.cz...@gmail.com> wrote:
so very cool - i was just having a conversation with a potential team member on why I chose Lift for my project - I could have simply pointed to this site.  Great stuff - can you link it off the main website?  Something more permanent than "Latest Happenings"?

You mean like the first paragraph on the main page:

What is Lift?

Lift is the most powerful, most secure web framework available today. There are Seven Things that distinguish Lift from other web frameworks. Lift applications are:

Already done. ;-)
 

--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

Søren Bramer Schmidt

unread,
Jan 21, 2011, 5:40:23 PM1/21/11
to lif...@googlegroups.com
Great list.

I couldn't resist putting this on hacker news with a catchy title.

Sander Mak

unread,
Jan 22, 2011, 3:29:36 AM1/22/11
to lif...@googlegroups.com
On Fri, Jan 21, 2011 at 11:40 PM, Søren Bramer Schmidt
<sor...@gmail.com> wrote:

> I couldn't resist putting this on hacker news with a catchy title.

Nice, lot's of interesting outsider perspectives there. Got more
upvotes than I would've thought.

pwagland

unread,
Jan 23, 2011, 4:15:57 AM1/23/11
to Lift
Hi David,

Great list, and indeed some of these things are why I am now starting
to play with Lift ;-)

Two things which I noticed on the "wizard" demo.

1. The Ajax demo only has pages 1 and 3, at least on my Safari
browser. Page 2 is missing. It is in there in the "POST" version of
the wizard.

2. This might be a generic thing in the wizard, but is not what I
expected, if you go back, and then forward, then any values that you
had entered on the forward page are lost. This can be most
inconvenient, is there any way to get the data on the "future" tab to
be preserved so that when you go forward to it again, it is still
there?

To give a concrete example of 2.
In step 1 of the wizard you fill out the name and age, in step 2 you
fill out the parents name, and then realize (for whatever reason) that
you had filled in the wrong name in step 1. So you press previous, and
correct the name, before pressing next again. At this stage you are
back on the second step, but the data that you had filled in is lost.

Cheers,
Paul

On Jan 21, 10:08 pm, David Pollak <feeder.of.the.be...@gmail.com>
wrote:
> Marketing is hard.  Creating concise messages is super hard.  Having 3
> seconds to explain to someone why your product is better and then losing
> their attention is the way things work.
>
> I've spent a lot of time working out why Lift is better than any other web
> framework.  I've boiled the list down to Seven
> Things<http://seventhings.liftweb.net>
> :
>
>    1. Lazy Loading
>    2. Parallel page rendering
>    3. Comet and Ajax
>    4. Wiring -- declare interdepencies between page elements
>    5. Designer friendly templates
>    6. Wizard -- multipage input screens with full back-button support
>    7. Security
>
> Each of the above taken in isolation is something that Lift does that few
> other web frameworks do (e.g., you can use JBoss Seam instead of Lift's
> Wizard) and Lift does each one better than any other web framework.  But
> taken together, they tell a compelling story about why Lift is different.
>
> I've put togetherhttp://seventhings.liftweb.netas a way to not only list
> the Seven Things, but also to give code examples.  Even if you're not a
> Scala coder, you will be able to see the concise, elegant way that each of
> the seven things is expressed in Lift.
>
> And as Lift becomes a polyglot framework, as Lift supports JRuby and Java
> and other languages, there will still be Seven
> Things<http://seventhings.liftweb.net>that differentiate Lift from all
> other web frameworks.

pwagland

unread,
Jan 23, 2011, 4:23:28 AM1/23/11
to Lift
Ignore point one… I didn't read the page source, and I see that I
probably entered different ages for the two examples, so that one
worked as expected.

However point 2 still stands.
> > I've put togetherhttp://seventhings.liftweb.netasa way to not only list

Timothy Perrett

unread,
Jan 23, 2011, 5:23:36 AM1/23/11
to lif...@googlegroups.com
Really interesting mix of feedback there, probably some useful things to be learnt about newcomers to scala/lift in the comments :-)

Søren Bramer Schmidt

unread,
Jan 23, 2011, 8:17:26 AM1/23/11
to lif...@googlegroups.com
One of the more interesting was a pointer to nitrogenproject, an Erlang based framework that has a comet implementation that on first glance looks to be on par with that of Lift.

Andy Czerwonka

unread,
Jan 23, 2011, 10:08:44 AM1/23/11
to lif...@googlegroups.com
Right on... exactly like that.

David Pollak

unread,
Jan 23, 2011, 1:06:04 PM1/23/11
to lif...@googlegroups.com
On Sun, Jan 23, 2011 at 5:17 AM, Søren Bramer Schmidt <sor...@gmail.com> wrote:
One of the more interesting was a pointer to nitrogenproject, an Erlang based framework that has a comet implementation that on first glance looks to be on par with that of Lift.

There are a fair number of frameworks that have some level of long polling support.  I've seen internal documents where different comet implementations are compared and Lift and Python/Twisted are the only two that actually work consistently and scale reasonably.  Lift is the only one that (1) multiplexes multiple comet components over a single connection without developer intervention (2) the properly manages version deltas (sending the correct updates when there are more than 1 change to be applied between) and (3) properly deals with per-browser connection limits so there's no connection starvation (basically, if there are too many HTTP connections open to the server, turning long polling into short polling so there's always at least on HTTP channel available from the browser to the server for the likes of Ajax requests or newly opened tabs to connect back to the server.

I discuss this issue in depth at:

http://www.quora.com/What-are-the-advantages-and-disadvantages-of-the-different-comet-architectures


 

--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

David Pollak

unread,
Jan 23, 2011, 1:08:56 PM1/23/11
to lif...@googlegroups.com
On Sun, Jan 23, 2011 at 1:23 AM, pwagland <pwag...@gmail.com> wrote:
Ignore point one… I didn't read the page source, and I see that I
probably entered different ages for the two examples, so that one
worked as expected.

Point 1 and point 2 are the same.

Because screen 3 can initialize based on the inputs in the prior screens and because it's possible (in the non-ajax mode) to copy/paste URLs so that multiple branches of the same Wizard can be happening at the same time, it's not possible to capture future state for replay because there's no way to predict if the future valid state for the specific screens.
 
--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

Francois

unread,
Jan 23, 2011, 1:14:27 PM1/23/11
to lif...@googlegroups.com
On 23/01/2011 19:06, David Pollak wrote:
> [...]

That's really interesting. I knew that Lift comet support was excellent
and super simple to use from an user point of view, now I better
understand the myriad of little (and not so little) things that are
managed for me.

Thanks,


--
Francois ARMAND
http://fanf42.blogspot.com
http://www.normation.com

Søren Bramer Schmidt

unread,
Jan 24, 2011, 4:30:55 PM1/24/11
to lif...@googlegroups.com
Thank you for clarifying this.

Naftoli Gugenheim

unread,
Jan 25, 2011, 2:06:30 AM1/25/11
to liftweb
How do you get the source code copied to the war?


On Mon, Jan 24, 2011 at 4:30 PM, Søren Bramer Schmidt <sor...@gmail.com> wrote:
Thank you for clarifying this.

David Pollak

unread,
Jan 25, 2011, 9:05:06 AM1/25/11
to lif...@googlegroups.com
On Mon, Jan 24, 2011 at 11:06 PM, Naftoli Gugenheim <nafto...@gmail.com> wrote:
How do you get the source code copied to the war?


sym link from the src/main/resources to the scr/main/scala
 

Indrajit Raychaudhuri

unread,
Jan 25, 2011, 9:49:31 AM1/25/11
to lif...@googlegroups.com

David Pollak wrote:
>
>
> On Mon, Jan 24, 2011 at 11:06 PM, Naftoli Gugenheim
> <nafto...@gmail.com <mailto:nafto...@gmail.com>> wrote:
>
> How do you get the source code copied to the war?
>
>
> sym link from the src/main/resources to the scr/main/scala

Or it can done via SBT. I'll keep this in mind when doing the
archetype/template update.

- Indrajit

>
>
> On Mon, Jan 24, 2011 at 4:30 PM, S�ren Bramer Schmidt
> <sor...@gmail.com <mailto:sor...@gmail.com>> wrote:
>
> Thank you for clarifying this.
>
> --
> You received this message because you are subscribed to the
> Google Groups "Lift" group.
> To post to this group, send email to lif...@googlegroups.com

> <mailto:lif...@googlegroups.com>.


> To unsubscribe from this group, send email to
> liftweb+u...@googlegroups.com

> <mailto:liftweb%2Bunsu...@googlegroups.com>.


> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=en.
>
>
> --
> You received this message because you are subscribed to the Google
> Groups "Lift" group.
> To post to this group, send email to lif...@googlegroups.com

> <mailto:lif...@googlegroups.com>.


> To unsubscribe from this group, send email to
> liftweb+u...@googlegroups.com

> <mailto:liftweb%2Bunsu...@googlegroups.com>.


> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=en.
>
>
>
>
> --
> Lift, the simply functional web framework http://liftweb.net
> Beginning Scala http://www.apress.com/book/view/1430219890
> Follow me: http://twitter.com/dpp
> Blog: http://goodstuff.im
> Surf the harmonics
>

Naftoli Gugenheim

unread,
Jan 25, 2011, 3:24:39 PM1/25/11
to liftweb
Neat trick! I may want to borrow your ShowCode snippet if it's okay.

David Pollak

unread,
Jan 25, 2011, 7:00:29 PM1/25/11
to lif...@googlegroups.com
On Tue, Jan 25, 2011 at 12:24 PM, Naftoli Gugenheim <nafto...@gmail.com> wrote:
Neat trick! I may want to borrow your ShowCode snippet if it's okay.

It's under and Apache 2.0 license.  You are encouraged to use it!
 

pwagland

unread,
Jan 29, 2011, 12:06:15 AM1/29/11
to Lift


On Jan 24, 2:08 am, David Pollak <feeder.of.the.be...@gmail.com>
wrote:
> On Sun, Jan 23, 2011 at 1:23 AM, pwagland <pwagl...@gmail.com> wrote:
> > Ignore point one… I didn't read the page source, and I see that I
> > probably entered different ages for the two examples, so that one
> > worked as expected.
>
> Point 1 and point 2 are the same.
>
> Because screen 3 can initialize based on the inputs in the prior screens and
> because it's possible (in the non-ajax mode) to copy/paste URLs so that
> multiple branches of the same Wizard can be happening at the same time, it's
> not possible to capture future state for replay because there's no way to
> predict if the future valid state for the specific screens.

That might be true, however if you do open multiple branches of the
same wizard the results seem to stomp over each other anyway. And I
accept the point that future values might be rendered invalid, or
unneeded, by changes in the previous steps, however they could just as
possibly not be rendered invalid. It could be possible to call isValid
to determine whether the current values are still valid, and, if they
are, use/show them, and if they are not, then don't, or even better,
show them, but state what the error is.

David Pollak

unread,
Jan 29, 2011, 12:11:07 PM1/29/11
to lif...@googlegroups.com
On Fri, Jan 28, 2011 at 9:06 PM, pwagland <pwag...@gmail.com> wrote:


On Jan 24, 2:08 am, David Pollak <feeder.of.the.be...@gmail.com>
wrote:
> On Sun, Jan 23, 2011 at 1:23 AM, pwagland <pwagl...@gmail.com> wrote:
> > Ignore point one… I didn't read the page source, and I see that I
> > probably entered different ages for the two examples, so that one
> > worked as expected.
>
> Point 1 and point 2 are the same.
>
> Because screen 3 can initialize based on the inputs in the prior screens and
> because it's possible (in the non-ajax mode) to copy/paste URLs so that
> multiple branches of the same Wizard can be happening at the same time, it's
> not possible to capture future state for replay because there's no way to
> predict if the future valid state for the specific screens.

That might be true, however if you do open multiple branches of the
same wizard the results seem to stomp over each other anyway.

No, they don't.
 
And I
accept the point that future values might be rendered invalid, or
unneeded, by changes in the previous steps, however they could just as
possibly not be rendered invalid. It could be possible to call isValid
to determine whether the current values are still valid, and, if they
are, use/show them, and if they are not, then don't, or even better,
show them, but state what the error is.

If you can build an actual algorithm and implementation that does it right, I'll make you a committer and you can own this section of code.  If not, then I think you should trust a person that's been building variations of dependency management for 20 years now (a bunch of commercial spreadsheets) that it's a problem that's not solvable.
 

--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to lif...@googlegroups.com.
To unsubscribe from this group, send email to liftweb+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

Reply all
Reply to author
Forward
0 new messages