views:

361

answers:

14

At work, I build web apps using a pretty vanilla Java Enterprise technology stack. Ths includes some sort of SQL database, EJBs, JSP/servlets, etc., all running under JBoss. Then there's the usual jQuery and CSS footwork in the browser.

I'd like to start working on a small, personal project in my free time, mostly as a way to gain exposure to something I don't get to do at work. I'd like to keep it reasonably relevant - that is, not developing a desktop or smartphone app - which means I'll be writing a web app. I have enough ideas about what I want to create, but I'm not sure of what technologies would make a project as exciting, rewarding, and edifying as possible. Making myself more hireable is also a plus, though not a primary goal.

It looks like there are a few good options server-side that would be totally new to me. I'm especially looking for something that's different from the JEE stack. Minimal overhead (such as configuration) is a plus, since that's one of my biggest frustrations working in the JEE world.

  • Python + Django: I've done a little bit of Python scripting, but nothing serious.
  • Ruby + Ruby on Rails: I don't even know what Ruby syntax looks like.
  • Google App Engine: not sure how different GAE for Java would feel. Maybe GAE for Python?
  • Something else I haven't thought or heard of?

Client-side, I will almost certainly be sticking with jQuery, but I wouldn't mind trying out a UI toolkit (other than jQuery UI and YUI, both of which I've used before).

Given my experience, what web framework(s) (or stack, or whatever you want to call it) should I use? Any other advice on something I may have missed?

A: 

http://www.topcoder.com/ is a great place to do this sort of thing. You can find projects and begin developing/designing.

Also, check out Facebook Puzzles and try to solve those... some can take you a while :) You can use a bunch of languages to solve these puzzles, among them Python and Ruby.

Hristo
Sorry if this wasn't clear - I'm not looking for a project to join.
Matt Ball
Ahhh... Well my apologies for the misunderstanding. If you're interested in taking a look at the Facebook puzzles, I'm sure there is something to learn there (I know I'm learning a lot as I'm solving them, but I'm still a student). If not, then my answer is useless and I will take it off. Let me know what you think :)
Hristo
+10  A: 

Depends on just how different you want it to be. For something very different indeed, try Weblocks, http://weblocks.viridian-project.de/welcome , a Common Lisp web application framework. It might not get you terribly more hireable, but learning Lisp is a very, very good way of taking the next step as a programmer in general. Plus the fact that Javascript in general, and with jQuery in particular is actually a kind of Lisp in disguise, so you'll immediately start to see similarities, and your Javascript will benefit hugely.

Edit: Why Lisp? If you haven't done so already, go read a few Paul Graham articles, starting with this one: http://www.paulgraham.com/icad.html

If that feels too radical, I think you should still learn a new programming language. In your points above, you could probably combine Python+Django with Python & GAE, since you can run various versions of Django on GAE. The latest version already has Django, but if you want to push a little more technology-wise, try Django-nonrel ( http://www.allbuttonspressed.com/projects/django-nonrel ). Experimenting with GAE will have the added benefit of getting you started with 'NoSQL' databases.

Edit 2: While we're on the topic of functional programming techniques in a web app context, here's two examples of the functional aspects of Javascript showing up really nice:

I've personally used MochiKit to great effect and are just about to start using Underscore.js in my first production project. I think it (Underscore.js) looks very promising and I'm especially impressed that it has an online unit test suite with benchmarking included. Very serious indeed.


Edit 3, to summarize: slept on it, and my condensed advice is this: going from mostly a Java EE stack directly to Weblocks might actually be too large of a jump for a project that you want to invest real work in (i.e. the actual outcome of the project has a larger importance than the pure learning aspect). But I think you should try it and do some kind of proof of concept in it, just to get that out-of-the-box experience.

I think you should do the real project in Python & GAE, most probably with some version of Django, see second section. But whatever stack you choose, treat the project as something of a playground where you try out technologies that are new to you as a programmer in general.

For example, try to get deeper into TDD with webapps, see for example this question: http://stackoverflow.com/questions/2013758/how-to-start-doing-tdd-in-a-django-project . Javascript can be tested to, typically with QUnit ( http://docs.jquery.com/QUnit ) or perhaps with this less conventional but powerful Python toolchain: http://pypi.python.org/pypi/oejskit . Disclaimer: I'm marginally affiliated with this project) These techniques were very helpful for myself at least.

Jacob Oscarson
I absolutely agree about learning a new programming language - and Python is certainly still "new" for me. One of the draws of using GAE would be letting Google worry about hosting my webapp. That way, I could use the end product more like a real webapp and less like a throwaway project - and that's actually one of my goals.
Matt Ball
Yeah, the fact that Google does all the sysadmin things for you is probably an even larger pro for GAE than their frameworks/languages proper. Especially for me who like quite a few developers really dislike doing to much sysadmin'y stuff.
Jacob Oscarson
Thanks for the Lisp article, a good read. Just for the record, though, I have done some functional programming, primarily Scheme and OCaml, in a college CS course ~2 years ago. But it was certainly nothing like writing a webapp! I'm intrigued.
Matt Ball
GAE + Django looks like a pretty strong candidate. At work we have basically zero automated testing (not my choice, unfortunately, but at least we're a small shop) so using this as a platform to learn TDD with webapps sounds like an awesome suggestion.
Matt Ball
+3  A: 

If you want something Different (tm), you could try Seaside? Can't really vouch for it from experience, but from what I've read about it it seems like a quite radical departure in thinking.

That said it probably gives you more or less zero hireability. For that you could try the minor players in Javaland like Wicket or Stripes+Freemarker.

Sii
What makes you say that Seaside is good/cool/whatever? I've never heard of it. Just looking for more details.
Matt Ball
Also, I'm really not inclined to write MORE Java code.
Matt Ball
A negative is that it is going to make you not enjoy the java enterprise stack that much anymore. For even more fun, deploy seaside in Glass (glass.gemstone.com) (and develop in Pharo)
Stephan Eggermont
Seaside allows you to eliminate a lot of the repetition you see in most web frameworks.Seaside is really easy to get started: download a one-click image from www.seaside.st and read book.seaside.st. For understanding the IDE, read Pharo By Example. (.org). I prefer the glass tutorials for an introduction over the book.
Stephan Eggermont
As for the coolness, from what I remember having read about it, it's component-based. This allows for the code to be structured similarly to a desktop application, letting you do things like link "directly" to callback methods, and composing these stateful components into pages / applications. It's also continuation-based, which I think implies it does the above in a less abstruse way than JSF, making it actually tractable to develop your own components.
Sii
I mentioned the Java frameworks because pretty much everything that's not Java / .NET makes you less hireable, and the big-name frameworks in Python and Ruby are conceptually a rehash of the frameworks in Javaland. (That's not to say that they're not an improvement, but the main attraction it that they're comfortable and productive, not interesting.)
Sii
A: 

I have similar goals and i have decided for GAE. Started with Python, but now i am in love with Java+GWT.
Different can be too much, you can get your brain f***ed http://en.wikipedia.org/wiki/Brainfuck :)

Julio Faerman
A: 

You've mentioned a few choices in your question, but I'd question why you have to settle for just one?

I've used a number of different languages and frameworks, and did something similar a while back. I took a small web app, and developed it using a couple of different stacks - in my case, Ruby and ASP.Net web forms. I tracked my learning time, and when I was done compared the overall amount of code.

It was a really good learning experience - I won't spoil things by sharing my conclusions, but if I were to do it again today I'd probably use the asp.net MVC framework instead of webforms. I will say that the quality of the learning resources, and the ability to find useful information, has a huge impact on your productivity.

Anyways, consider taking a small app and implementing it using a bunch of different stacks.

chris
Any particular reason for doing this? Which combination would you specifically recommend? Also, I don't run Windows at home, so using ASP.NET would probably just add another level of non-value-added complexity and headaches.
Matt Ball
Well, if you're looking for "value add" - presumably to your career - take a look at the local job market, see what looks interesting to you, and go from there. I will say that RoR was a lot more fun than anything else I've tried recently.
chris
Fun is good! ` `
Matt Ball
A: 

Another nice one would be cappuccino. It feels like programming an OS-X client application in Cocoa and objective-c, but it is web. The structure of the frameworks, like cocoa, is much better than that of the java or .net ones.

Stephan Eggermont
Why is the structure better? I'm not trying to be argumentative - I'm just looking for concreteness.
Matt Ball
Much beter implementation hiding
Stephan Eggermont
A: 

You might want to take a look on the Go language: http://golang.org

Maybe some functional programming (Haskell, Clojure, Scala)?

Yorirou
+1  A: 

I think you should take a look at Scala language as a language to learn. I've just started learning it and totally love it! There is a great online book to learn scala. If you are a java programmer, you will pleasantly surprised at how concise, elegant and succinct it is. Its both a functional as well as OO language. It runs on a JVM (a .Net version is also available)

Because it runs on a JVM, scala programs have known to run on Android, Google Appengine

For your web development needs there's also a scala based lift web framework. I've not started looking at it yet but soon will when I finish with the book.

naikus
A: 

I have enough ideas about what I want to create, but I'm not sure of what technologies would make a project as exciting, rewarding, and edifying as possible

I think nobody here will be able to tell you what will make you excited about something. It's personnal and therefore, here is what I would do if I was in your situation:

I would create a list of all possible technologies I heard about (I think you already started this list in your question.

After that, I'll try them all, one by one, and will listen to my feeling why working on them. If you feel much excited, rewarded and edified for one of them, you just found it !

Oh and just to tell you that the last time I go really excited by a technology, it's when I discovered Arduino. But this has (almost) nothing to do with web development.

Pierre 303
A: 

If I were doing the same I'd start with Python and a framework, either Django or Pylons, this way you get local and the ability to deploy to GAE which has to be a good addition to anyone's skillset.

Out of your list I've tried most of them and found that

  • Ruby was hard to read, but liked the overall structure but only for a new development as I tried to use it to work with an existing database, and fell foul of the wrong side of convention over configuration as my databases don't follow the right convention. So I gave up.

  • Python is good

  • GAE is where I'd start

I'd like to be someone who gets Lisp, I don't and have tried a few times. I can see from Emacs (which I've been using for >10 years) that Lisp is powerful and lets you do loads, I just don't get it. I've read Beating the Averages which makes me want to master Lisp, but everytime I try my brain implodes. Maybe one day it will come...

Client side you can look at Knockout a JavaScript library that makes it easier to create rich, desktop-like user interfaces with JavaScript and HTML, using observers to make your UI automatically stay in sync with an underlying data model.

Server technologies that I've investigated and marked as possibly interesting are:

  • YII PHP framework, convention over configuration.
  • Symfony again looked good, convention over configuration.
  • bivio OLTP Platform (bOP) is a transactional Model-View-Controller (MVC) application framework. Seems like a neat concept and a different approach.
  • Pylons as an alternative to Django.

Interesting distractions.

A small selection from the list of articles that I think all developers should read.

Richard Harrison
A: 

For a mind expanding experience, it might be worth taking a look at Clojure. It's a modern LISP for the JVM - so your Java experience will give you a helping hand. I've recently been developing a game as a hobby project in Clojure and really enjoying the change of scenery (yes, you will eventually learn to love the parentheses.... :-) )

Some fun features:

  • Emphasis on functional programming
  • Great support for concurrency with immutable, persistent data structures
  • Interactive development with a REPL

There's also a fantastic little web application stack called Compojure that is a lot of fun, here's a complete sample server app from the wiki:

(ns example 
  (:use compojure)) 

(defn html-doc 
  [title & body] 
  (html 
    (doctype :html4) 
    [:html 
      [:head 
        [:title title]] 
      [:body 
       [:div 
    [:h2 
     ;; Pass a map as the first argument to be set as attributes of the element
     [:a {:href "/"} "Home"]]]
        body]])) 


(def sum-form 
  (html-doc "Sum" 
    (form-to [:post "/"] 
      (text-field {:size 3} :x) 
      "+" 
      (text-field {:size 3} :y) 
      (submit-button "=")))) 

(defn result 
  [x y] 
  (let [x (Integer/parseInt x) 
        y (Integer/parseInt y)] 
    (html-doc "Result" 
      x " + " y " = " (+ x y)))) 

(defroutes webservice
  (GET "/" 
    sum-form) 
  (POST "/" 
    (result (params :x) (params :y)))) 

(run-server {:port 8080} 
  "/*" (servlet webservice))
mikera
I have to say - from a bunch of the answers I've been getting here, Lisp is looking pretty cool.
Matt Ball
+1  A: 

Jump to Cloud Computing. Try Hadoop, Hbase, Hive or Mahout

These technologies also make you more hireable.

Harsha Hulageri
A: 

If you want something totally different try Azure and C#

edit1

From wikipedia: Microsoft's Windows Azure Platform is a cloud platform offering that "provides a wide range of Internet services that can be consumed from both on-premises environments or the Internet"[1] (though the platform itself is not made available for on-premises deployments[2]). It is Microsoft's first step into cloud computing following the launch of the Microsoft Online Services offering. In short, it's Microsoft's platform as a service.

My 0.02ps Its a way to build apps that run on the cloud - similar to app engine and so on. The reason I suggested it was because you wanted to do something different from Java (this would be C#) and its a new platform.

obelix
Would you mind elaborating on that? Why would I choose that over any other option? I've never heard of Azure - what is it?
Matt Ball
+1  A: 

What about making a RIA using just: Flex 4(mxml + as3) + Python(or java) + GAE? that's the combination I'm using for my current project and it seems quite great ;)

Totty