Go straight to MVC2, and skip webforms!
I'm a mostly-C programmer who has recently (over the last 6 or so months) picked up a good deal of experience with PHP, PostgreSQL, jQuery, and HTML. I plan to learn Ruby on Rails in the near future.
I guess the best place to start would be (if you haven't already): learn you a jQuery. Although working with jQuery (along with CSS and HTML) will teach you crucial web development skills, it will also be an enlightening experience. In my opinion, jQuery has one of the best APIs on earth.
There's not much to say in the area of SQL databases. PostgreSQL and MySQL are the leading open-source SQL RDBMSes, though there are many others. If you already know SQL, you will probably feel at home in just about any SQL implementation.
How well do you know PHP? Have you made any PHP-based websites that work in concert with a SQL database? After getting a feel for PHP doing simple stuff, you may find that you're writing more code than you really should have to (e.g. simple table pages taking 300 lines of code). This is where frameworks come in.
Joomla! and Drupal are two major PHP-based content management systems (CMS). CMSes revolve around articles; just write some articles, and the CMS will figure out how to display them. They can be extended with plugins that you write in PHP, and you'll pretty much need to write plugins if you plan to have arbitrary applications on your site using a CMS. Because CMSes tend to be a good fit for many websites, I guess they're the "frameworks" of the PHP world.
I plan to learn Ruby on Rails next because it's designed for high productivity. Until I learn it, I really can't say much about it.
Given your background, and given that you have stated that you are looking at the future for a position in non-Microsoft technologies, then I would suggest your best place to start would be to learn more PHP.
You mention that you have some PHP knowledge already, so that would be a good foundation to move to a good PHP framework such as Zend; CakePHP; CodeIgniter. All three of these frameworks utilise an MVC approach, which is only going to make your life easier on bigger projects. Whether it's worth it for smaller jobs is something you need to decide.
Couple that with some MySQL or SQLite database development and you're already most of the way there as far as server side is concerned.
When it comes to front end stuff, again there are a raft of frameworks available to make development life easier. The most common options (hence the easiest to come across samples and help) would be the JavaScript frameworks, jQuery and MooTools. Whilst many people see these two frameworks as being interchangeable they are and they're not, depending on what you want to achieve.
Aaron Newton has put together a great site which summarises and highlights the differences (and similarities) between these two popular choices.
There are also a large number of CSS frameworks available if you want to go down that route, such as 960 Grid System and YAML.
IDE-wise, well it depends upon your development platform. I use both Mac OS and Windows, but for different things. I tend to do most of my web work on the Mac and use Coda with MAMP, but that's more personal choice than anything else.
On the Windows side, I don't think you can go wrong (IMHO) with Visual Studio. I use VS.PHP for PHP coding which gives you all the power of VS when writing PHP, which saves oodles of time. But again there are a raft of options to choose from, all of which come down to personal taste, and to a degree budget - although never rule out something just because it costs a few quid/bucks. If it's going to make you more productive in the long run then it'll save the cost of itself pretty quickly.
I was in your shoes a few years ago. My suggestion is: learn the basics of web programming by building your own web framework.
It's not that difficult, and it will make you really understand the different layers in a web stack. If you use a specific language and environment for this you'll gain good experience in those. In your case, Python on Linux sounds appropriate.
- Write a simple TCP server that listens on a port and returns some "hello world" string. You can use Python's SocketServer. Not all browsers will display it without the HTTP headers.
- Make that server return a proper HTTP response (you can hard-code the HTTP headers). You could use Python's SimpleHTTPServer, but then you'll miss out on the precise structure and relevance of the HTTP headers.
- Learn HTML and return a proper HTML page.
- Write a trivial URL router. Examples:
- One that routes a URL to a function returning HTML, similar to Dango's URL dispatcher.
- One that maps using reflection (e.g. maps '/Foo/bar' to class
Foo
, methodbar
), similar to CherryPy's url mapping.
- Use a templating engine, such as Mako, Genshi, or Jinja2, to generate the HTML.
- Add an SQLite DB.
- Add a URL to your app that returns some JSON response, using Python's json module.
- Learn some JavaScript, with or without a framework (preferably both), and use it in the page for some AJAX (with the JSON URL above).
Now you have an extremely basic, but functional, full web stack. You can write a trivial application to see it working, e.g. a blog engine.
Up until now all the steps are language and platform agnostics.
The next steps would be to flesh out your framework with more standard Python components:
- Replace your TCP/HTTP server with WSGI, and change your layers above to hook into the WSGI API. This means that your stack will run on almost all web servers (even Google App Engine, apart from the DB component), and you'll learn the API well.
- Replace your routing with a standard routing component, like Routes or werkzeug.routing. Search the web for examples of integrating these with other frameworks to help you out.
- Use a DB layer such as SQLAlchemy instead of accessing the DB directly.
IMO, you now have a complete education in web framework basics. Whichever real web framework you try next, you'll have a great understanding of everything working behind and in front of the scenes, which will give you leverage in tweaking anything you'll need.
I believe this can be done over the course of a few weekends, just to remember to keep it very rough around the edges. This is a learning exercise, and if you don't resist the urge to polish it you will spend an incredibly long time on it.
My two cents:
- Learn HTML and CSS thoroughly. These are the very basics.
- Learn Javascript and jQuery. jQuery makes life so much easier.
- Learn some basic Ruby. This is to enable you to leverage more power out of Rails, rather than just starting with a framework.
- Try Ruby on Rails. It is designed for rapid development, and does lots of the little things for you.
My suggestion is to go off the mainstream, and study Erlang.
Why?
- It's a language designed for concurrency, distribution and fault-tolerance, which are important qualities for a server-side application.
- It's not "more of the same": Erlang is a functional language which supports asynchronous message-passing. It presents a chance to study new programming skills while working in a real-world environment, not in an academic context.
- The Erlang standard library and public code-base includes many smart designs for scalable applications, and there's a lot to learn from it.
- Great web frameworks and facilities, such as Nitrogen, CouchDB and Riak.
- Entirely Open-Source.
- Comes with it's-own built-in debugger and other auxiliaries, so you are not too dependent on a specific IDE.
I'm know that Erlang is not well-accepted in the market. However, I find it a great personal skill. It forces you to think more clearly about parallelism and events, thus helps you to design better scalable applications.
If you want to land a job working on open source, you're quickest route is to become a contributor to a project. Start by contributing bug fixes and work your way up. There's nothing that goes further in the interview than,
Q: You don't have much Open Source experience. Do you know the Foo Framework? A: Yes, I'm a core contributor to that Framework. I've been working on it as a side project.
You can't be an expert in all open source projects, but being an expert in one can get you a job.
Some ideas:
pick a project that will be popular, not end of life. This may be easier said than done, so there's some risk you'll pick the wrong thing. But remember-- having an active development community is actually a major contributor to the success of many open source projects.
Figure out what you're MOST interested in: Ask yourself what you're most passionate about: How close to the front-end do you want to be? There are emerging CSS frameworks, lots of interesting Javascript work evolving, as well as all the server side and new database approaches.