
Ask HN: What should I learn next? - enduu
For the better part of the last 2 years I&#x27;ve been freelancing part-time as a Wordpress developer, focused mainly on building custom themes and modifying existing plugins. Naturally, this meant PHP was the thing to learn, since I was already familiar with HTML&#x2F;CSS, and 99% of the time, a bit of jQuery on the side was just enough to get the job done. However, after taking a break for a couple of months in order to focus solely on school, I&#x27;ve realised something pretty scary: I actually suck at programming.
What I mean by this, is not that I can&#x27;t code ( I&#x27;ve pretty much learned programming by myself and am passionate about it ), but the fact that this entire time I&#x27;ve been half-assing it, and now I find myself in a place where I&#x27;m not really good at anything. I mean, I know a little bit of C that I picked up in school ( although no OOP ), enough PHP in order to be able to write simple functions that hook into Wordpress, a little bit of Ruby I picked up while building a Rails app, and although I am pretty good with HTML&#x2F;CSS I&#x27;m definitely not up to date with the latest technologies.<p>So now, after graduating high school and making the decision to get into full-time freelancing, I&#x27;m faced with the following dilemma: What would be the the best thing to learn next? I am interested in web development ( although it&#x27;s not excluded I&#x27;m going to learn iOS dev. too sometime in the future ), and after a lot of research I still have no idea what&#x27;s the right way to go. Foe example, I know I could get serious about learning Rails ( or Django, for that matter ), but then from what I&#x27;ve been reading more recently, javascript ( and javascript-based MVC frameworks ) are the next big thing, and that&#x27;s what I should focus on.<p>I know this is a pretty subjective matter, but I&#x27;m hoping there are some general guidelines which will help me make the best decision. Thank you!
======
fusiongyro
Postgres. Get a book by Joe Celko (SQL for Smarties, for instance) and really
learn relational databases. They're not going anywhere. Any job you take, you
can bet there's a relational database back there somewhere. Postgres is free
and will surprise you less than any other. If you're very good at SQL, you
will write a lot less code in the middle tier to post-process data on the way
out. You won't be hindered by a lack of OO understanding--in fact, it may
benefit you since you won't face the O/R impedance mismatch. Once you're good
at SQL you'll be a lot less worried about other things in the backend, and the
declarative nature will help you reason better. It will pay dividends no
matter what step you take after that.

~~~
buckbova
I'm going to agree, as a Sr Database Architect, that once you have these
skills and some experience under your belt you will never want for jobs.

There is one huge caveat. Sometimes it is so boring that I often daydream of
attempting trephination on myself.

~~~
ianstallings
But man do you guys make a killing. Holy astronomical salaries batman!

------
ianstallings
I'm going to be really generic here and say:

1\. Learn a high-level OOP language. Java, C#, etc.

2\. Learn a functional language. Haskell, Lisp, ...

3\. Learn an imperative language. Such as C.

4\. Learn an "in between". e.g. SQL.

5\. Look for outliers. e.g. Aspect oriented programming, Eiffel (DBC).

Basically learn the different paradigms around programming and the common data
types that span almost all languages. Learn when and where to apply those
paradigms and the strength of each. Knowing those things will help you adjust
to the future fairly well.

I'll give you an example of that in action. I learned some Common Lisp in my
spare time. I then went on to use C# in 2000. So when Monads were eventually
introduced in C#, I knew how and when to use them. My other colleagues at that
time, their eyes glazed over for the most part. What was this new fangled
contraption? It wasn't new at all, it was old school.

Knowing specific frameworks inside and out can be advantageous, but can also
lead to a very narrow vision. If you make yourself well rounded, it leads to a
very flexible skill set. You see something and you say "oh, that's just like
X" and you dive in. I know you want to be a web development bad ass. But a lot
of the knowledge to make you one is _outside_ of the web.

Then, if you're feeling frisky, dive into hardware.

~~~
weavie
Whilst learning these languages, don't just learn the syntax.

Get some good books on algorithms and data structures. Learn these really well
and then study the languages to find out you can implement them.

Each language will lend itself to certain structures. Learn them.

~~~
ianstallings
You just reminded me of something I left out - patterns and anti-patterns.
Knowing those might be just as valuable because then you can recognize and
adapt quickly. For example MVC is basically the same across all platforms,
with minor differences.

------
JonnieCache
Build something with no connection to the web whatsoever, eg. a platforming
game that outputs ascii to the console, or a spellchecking engine, an
emulator, or whatever. Make several versions of it, trying out radically
different ways of conceptualising the problem in code. This stuff can sound
intimidating if you've only done webdev, but it isn't at all as hard as it
might seem.

Having a broader experience of the world of software will give you a wider
range of skills and a wiser perspective on the web stuff that pays the bills
these days. You'll be able to look at some horrible design and say "duh, that
should be a finite state machine" and presto you've just wiped out a whole
load of complexity.

Webdev is sort of a ghetto, the more "outside" knowledge you can bring to it,
the more effective and the more employable you will ultimately be.

EDIT: also, become an automated testing deity ASAP. Just do it. You'll wonder
how people can code without it.

~~~
shicky
how do you become an automated testing deity? Any recommended resources?

------
parfe
I think you'd most quickly benefit from
[http://learnpythonthehardway.org/](http://learnpythonthehardway.org/) or
[http://ruby.learncodethehardway.org/](http://ruby.learncodethehardway.org/)

It sounds like you haven't really moved much beyond googling for code snippets
to solve specific problems. Work through one of the above books so you pick up
some vocabulary and get introduced to a range of concepts.

A lot of the other comments are overly ambitious with their suggestions. Start
small and learn Ruby or Python. I recommend staying away from frameworks such
as Rails because of the high overhead of required knowledge that won't really
benefit you as a programmer in general.

~~~
fantnn
I completely agree, most people I've ever encountered asking "What to learn
next" don't really understand what they think they know. There are 100
different directions you can go from if you actually had a decent
understanding of php/html/css; exploring the PHP source code, learning more
about the network protocols that http/https requests operate on top of, web
application security and security in general, browser implementation of css
rendering/javascript engines/sandboxing, all of these things are natural
extensions of web development, and are really just the tip of the iceberg.

------
davedx
Personally, for me, it's been JavaScript. I started freelancing with PHP. The
second to last freelance project I had was Java backend with AngularJS
frontend, and the tricky bits were all in the frontend. Now I've been working
freelance for the same company on several projects since June, doing 100%
JavaScript; mostly frontend, with bits and pieces of nodejs, grunt and so on
for tooling.

To get off to a good start I suggest learning how encapsulation and modules
are done in JavaScript (e.g. prototype, the module pattern, possibly also
node's exports or something like requirejs). This will allow you to actually
build large JavaScript projects without them turning into a Frankenstein's
"everything in a single file in jQuery's document.ready" monster.

Try to focus on learning the language and its features and not get lost in
DOM-land (use libraries or your framework of choice for manipulating the DOM
unless you have a very good reason not to).

Learn all about how to read and manipulate data using XmlHttpRequests, web
services, REST, JSON and so on. This will be invaluable for any projects that
have third party dependencies, which will be most of them these days.

Spend a little time learning about which frameworks are better for rich
desktop-style browser apps (hint: probably the bigger ones, like Angular or
Ember), and which are more suited to lightweight apps that will also run
nicely in mobile or other embedded devices (hint: probably the smaller ones,
like Backbone).

Polish your jQuery knowledge. It will be popular and useful for a long time
yet, and it's a big library with lots of extremely handy functions and
features.

Maybe pick up other useful "utility" libraries like underscore.

Finally, if you're interested in driving code quality and keeping clients
happy and regressions at bay, I suggest you look into automated unit and
integration testing. Again here there are large, complicated tools like karma
and smaller, lightweight "test logic only" libs like jasmine. If you're like
me, you will get lots of enjoyment and satisfaction figuring out how to wire
up node, grunt, jshint, phantomjs and (your test lib of choice) to get a
single command build/deploy/test script. If you're likely to work in a team,
get that script running in a CI server for bonus points.

If you have any questions hit me up on davedx@gmail.com, happy to help! :)

~~~
w1ntermute
I'm doing this right now - evaluating Angular vs Ember, then picking one to
focus on learning well.

> probably the bigger ones, like Angular or Ember), and which are more suited
> to lightweight apps that will also run nicely in mobile or other embedded
> devices (hint: probably the smaller ones, like Backbone

Is it inadvisable to use Angular/Ember for mobile? I hadn't heard this before.

------
danaw
Honestly, get a job. What has taught me most about programming is having new
problems to solve that required new skills, techniques and tools. The best way
to "fund" your development is to find someone who will pay you to solve their
problems.

I started out of school doin front-end, then the next project I started with
frontend and then had to learn Django. Job after that was all Django/frontend.
Then, Django to Rails. Now im doing Node/Go/hardware/etc. Each job paid me to
learn new languages, adopt new techniques and find better ways to solve
problems.

I'd hop on Craigslist or one of the millions of freelance sites and contact a
few potential jobs that you think you can pull off but would require you to
learn a bit. It may seem a bit haphazard compared to a more academic approach
but it will be more of a realistic growth curve compared to the realities of
the freelance world.

Also, side projects are a great way to experiment.

Think of it as "job driven development".

------
aethertap
If you have the financial resources to do it, I'd recommend spending some time
exploring other parts of business and computer science. There are some really
great free resources out there for learning (coursera, udacity, etc.). The
reason I say that is that having some solid fundamentals will give you more
flexibility in terms of what you can do, and it'll also let you try some other
potential career paths on for size.

If you can spend a couple of years at the start building breadth in your skill
base, you'll be able to gracefully adapt to changes in your lifestyle, the
online market situation, and other things that come up. I know a couple of
guys who jumped in full bore kind of like it sounds like you're talking about,
and they eventually found themselves pigeonholed into a single career for
their whole lives, because as life went on their obligations accumulated to
the point where they could no longer afford the interruption in income that a
career change would mean (because they would have to learn basically
everything over again). So, if you can keep your expenses minimal and pay them
with your freelancing work, I'd say just try to get some foundational business
management and computer science knowledge under your belt.

As far as what tech/language/etc will give you the best bang for the buck in
today's freelancing market I have no idea. Regardless of that though, I'd say
that learning Internet marketing seems like the most important thing you can
do to ensure success. This is something I failed to understand at the start
and I'm paying for it now.

------
3pt14159
Get serious about learning Rails, then get serious about learning EmberJS. If
you are good at both of those you will be in a great place when it comes to
building web apps.

------
mildtrepidation
Looking for "the next big thing" is a crap shoot.

If what you want is all the consulting work you could ever possibly do, then
learning more PHP will get you that. Stick with Wordpress and/or pick up
Symfony, CodeIgniter, just about anything except Zend (and for the love of all
things holy, do NOT go anywhere near Magento if you value your sanity).

If you're OK working a bit harder to find gigs but likely making more from
them when you do (and facing less competition), Ruby/Rails or Python/Django
would be good choices. You could go for more obscure languages and frameworks,
but at that point you may have a hard time selling your services.

Starting with iOS (or Android) is also something to consider. People often
don't realize that, when you get into full-stack web development, you have to
be proficient with many technologies and software packages just to get a site
working, tested, and deployed. While you'll likely end up having to expand
into more than just ObjectiveC or Java fairly quickly when you work with
mobile (don't get stuck in the PhoneGap/Appcelerator rut), a basic mobile app
on either platform will be simpler to build and manage than a basic dynamic
website.

------
enduu
Ok first of all, holy crap, I can't believe this actually hit the front page,
definitely wasn't expecting that. Thanks again for all the input, I couldn't
have asked for more.

Ultimately, I'm still not 100% sure, but after going through all the comments
a couple of times, I think I've finally made up my mind. For the next month /
couple of months, I'm going to slowly get back into freelancing while giving
PHP a serious go. Although PHP may not be my first choice, I realise now this
is actually the right one since WP development is going to be my main source
of income for the next 6-12 months, so I need to get really good at it. Aside
from that, I plan on sharpening my front-end skills and trying out a couple of
other stuff as well such as SASS and Git.

After I feel I'm comfortable enough with PHP, I plan on trying out the Laravel
framework, and see if I actually like it as much as Rails. Either way, I'm
definitely going to learn Ruby as well ( I've already finished "Learn to
Program" by Chris Pine some time ago ), and eventually spend less time on WP
in order to finally master Rails. In the end, I'm hoping to give up WP
entirely and work only on RoR projects ( either my own or by freelancing ).

I know a couple of you guys were suggesting that I should focus on things
which are not related to web development at all, and I see your point, but
honestly I simply can't get excited about that stuff at all. Maybe later on
I'm going to feel different about it, but for now I'm focusing solely on web
development.

Also, regarding SQL, that's something I may've left out in my original post,
but fortunately I am pretty familiar with MySQL, I even studied it in school.

------
pcx66
I think you should first explore Computer Science in general. You should start
with a good programming language, a high-level, beginner-friendly, very web-
favored one. Pick Ruby or Python. Then grab courses on Algorithms, Databases,
Computer Networks and an other area you wanna explore. You don't need to
complete them, but just get a feel of what they have in store for you. Make
sure you write some code as part of the Algorithms course.

Web development is not just using frameworks. There is real Computer Science
involved for building and maintaining any substantially complex web-app. Apart
from this, there will almost certainly be domain-specific knowledge required
for a complex web-app.

If you get a hang of programming, and love the CS concepts you are trying to
learn, you can then build a career path accordingly (may be college?). If you
are dis-inclined, then you can get to learn Rails/Django, and keep free-
lancing.

I think at the age you are in, you should not miss out on getting a chance to
learn some serious CS.

------
saltcod
As someone in what feels like your exact same boat—though a bit older— I'd say
just pick one. It makes the most sense to me, personally, to pick Python or
Ruby or PHP (Laravel or similar) and learn how to actually program. I think
choosing this path will introduce you all sorts of other stuff — rest, user
input, security, modern front-end tools like LESS, etc.

Even sticking with WordPress could yield a good result for you. WordPress and
PHP are constantly criticized for a number of different reasons, but the
reality remains: WordPress and PHP occupy a huge chunk of a huge market.

I've personally identified this to be one of my biggest failings — not being
able to actually program. At first I thought it was about language, and so I
tried PHP (about 100 different times), I tried Ruby a few times, Python, and
finally, JS. It turns out that all of these languages require the exact same
thing — they require you to think like a programmer.

The furthest I got with it was with Ruby. I went through the entire Ruby
course at Codecademy, read a lot of the Bastards Book of Ruby (fantastic), and
even used Ruby to get through some Project Euler projects. By the end of a few
good months of moderate input, I was absolutely still not a programmer, but I
felt like I was beginning to think more like one.

So that's one piece of advice — if you want to learn to program, I think you
actually need to decide on a language/framework and settle in and learn how to
program. Learn how to think like a programmer, which is to say that it isn't
about syntax and how each language does things slightly differently, but
rather, is about process and patters and abstraction.

The other piece of advice is to be careful with freelancing. Paying the bills
and learning to code don't necessarily go hand in hand. Spending 4 nights a
week writing a WordPress theme for a client project really won't make you a
better programmer. If I've learned anything, it's this. I've made some great
supplemental money doing freelance work and I've learned a ton about
WordPress, but I often think about the time I've put into it, and wonder what
if I'd put that same time into learning and working on projects to further my
ability to actually program.

And finally, the last piece of advice — try stuff out. Try JS, Python, Ruby,
WordPress, Drupal, try setting up a VPS at Linode. Try everything you can to
get sense of what feels right. I think that will help with your decision as
well.

Good luck!

~~~
taternuts
I have a couple friends that are trying to learn how to program and they are
constantly bouncing from java to python to javascript to whatever else, and it
really does them no good because they never sit long enough to learn the
fundamentals of programming, just the basics of that given language. You
really do have to work with one language for awhile and get comfortable with
that language/environment and how to use it to solve problems. Once you get
decent at this, then bouncing to the language du-jour is easier, more
enjoyable, and you take away a lot more from it ('oh wow cool, in language X I
had to do this, this, this and that, with language Y I just have to do this!')

~~~
saltcod
Solid advice. It's taken me years of bouncing around just like that, but it's
finally sinking in. =)

------
kaeawc
It doesn't sound like you have mastered any one particular language. I would
recommend pursuing one of the ones you have some experience in (Rails, PHP, or
JavaScript) and making projects from scratch. Being able to build an entire
application or utility from nothing and understanding all the parts is a great
skill to have. I would not recommend learning any particular framework (web or
otherwise) except as a tool to gain mastery of a language. Frameworks are
scaffolding to allow you to use your understanding of a language to
effectively build your idea into working models, they should not be treated as
the be-all-end-all of a language. Limiting your learning to jQuery or Rails
instead of trying to learn JavaScript or Ruby themselves will not get you the
mastery you need to grow as a developer.

------
zemo
Python, because it's easy to learn and it's super versatile. I don't code
Python full time any more, but I still find a way to use it on a fairly
regular basis. It's a very handy thing to have in your tool belt, regardless
of what you wind up doing in the long term, and there's a lot of literature
related to learning programming that's taught with Python. Python is probably
the most average language you can find, which is why it works well for your
stated purpose of having a more solid foundation. Although it's not the best
tool for most jobs, it sounds like you don't entirely know what you want to
do, and Python is an adequate tool for a _lot_ of different things; it can
expose you to a variety of programming environments.

------
gremlinsinc
I was in the same boat as you, and I swore I was going to learn Rails - and
just 'go w/ it' -so I built an app in Rails..but when it came time to deploy
-- my host only supported a specific version of Ruby -- and I wasn't about to
pay $50 a month to host a hobby so to speak...

Then I decided I was going to try and duplicate it in php --which php is
extremely ugly--UNLESS you're laravel. I found laravel which I am getting
pretty darn good at, and I absolutely love it! It's Rails for php and has
taught me GOOD design principles for php(instead of spaghetti code, like how
to use namespacing and build my own packages, and their's a strong community
for it -- I highly recommend going to #laravel on freenode(irc) -- for help
when you need it.

------
ibstudios
Think of a project, pick the tools, and start building. If you don't stop
until it is done you will learn something.

I just did this with ruby and sinatra. When it was all done I ended up
learning ruby, sinatra, javascript, jquery, redis, passenger, rack, haml, and
how to edit gems in github.

Best of luck.

------
jcmoscon
I would study whatever you will study about programming plus study how to
persuade people by using your writing or your speech. Study classic rhetoric
(Greek) and modern persuasion techniques. This is very important to your
success in business and in live. Learn how to make people do what you want
them to do. This will help you when you are in a meeting with colleagues, when
you are selling your software, even when you are designing your website. By
learning how to persuade you will learn more about yourself and learn about
the others.

------
ronaldx
If you want to learn computer science more thoroughly, why don't you take a
university-level course? You can continue freelancing to pay your way through
it. That would give you broad-ranging skills and a good qualification to
present to clients/employers.

I'm not sure if this is the best option for you, but then I'd be curious why
that's not your first choice. Since you have a clear understanding of what you
need, you can pick a course that fits you and ignore the bullshit that comes
with it.

------
gbog
The next big thing will be the next flop. I'd advise you to learn one of the
good old things, like python.

------
JimmaDaRustla
I too see JS growing to be an all around general purpose language, and it is
definitely a good one to learn to break away from the standard class based
languages. The book Javascript - The Good Parts is a great and explains the
power and weaknesses of Javascript.

~~~
acheron
> I too see JS growing to be an all around general purpose language

Truly this is the darkest timeline.

~~~
JimmaDaRustla
Doomsday ;)

------
esalman
I learned C at school and self-taught myself enough PHP and JS to do web
development. I understand programming logic and OOP pretty well. Now I'm
reading Code Complete by Steve McConnell to gain a better perspective on
software engineering.

------
chuangtzu
Drupal. You already know wordpress, but with wordpress a fixed rate for a
basic site runs $600, premium site $1800-$2000. There are premium+ sites that
you get contract work for. But I've never heard of a boondoggle-scale
Wordpress site. With Drupal that's all there is, boondoggle rates. I've never
seen fixed rate sites done with Drupal, and there's a reason for that I
suppose.

~~~
issa
This cracked me up. But seriously, if you know some PHP and want to quickly be
able to work on larger projects, Drupal is a great idea.

------
dc_ploy
Whatever you do, pick one and OWN it.

------
quattrofan
[http://www.codecademy.com/](http://www.codecademy.com/)

------
VLM
If you went play framework w/ Scala it would be pretty hard to avoid learning
some OO and you could also learn some functional stuff. You've got enough
background to get over the initial hump, now start writing "interesting" stuff
not just yet another CRUD app.

You seem to have a database sized hole... The hard part about databases isn't
the syntax, or peculiarities of specific DBs, or even optimization tricks to
make things faster, but design. What is normalization? Why/When would you want
it? What tasks need a relational design, or not... Even if you never pivot
into being a DBA it helps alot to at least minimally speak a DBAs language
when you write a CRUD app talking to his DB.

Programming as in slinging code syntax stuff, or higher level design? Might
want to crawl inside algorithms for awhile with Knuth and other books. Much
like learning Algebra its not like you'll ever use it, its more to discipline
the mind to figure out other complicated stuff. You should really google for
and spend a lot of time at "project euler" if you're trying to learn higher
level programming. Many of the PE problems aimed at turning you into a better
mathematician can be hacked on brute force-ish to make you a better
programmer. As a hint the first problem you're not "supposed to" brute force
add those together, you're "supposed to" figure out the easy formula. But
writing the brute force adder is none the less an interesting experience if
you've never done it before in your language of choice. (edited to add, buy
and read and "do" the entire "little schemer" series, or at least the first
book)

I don't know if this would make you more employable, but in terms of extending
your greater computer-ish knowledge you could do worse than some embedded
stuff. Get an Arduino and some shields and some servos and some sensors and
make it do something really well. You claimed to know a little bit of C so
here's something fun to do with it.

You also seem to have an OS sized hole in your list of experience so some
systems programming type experience might be interesting. Get a couple free
machines (castoffs) and figure out how to use Puppet to make them jump thru
hoops. Since you have a cluster, there's a lot of fun you can have learning
how clustering/replication tech works and scales. Don't worry about using old
junk computers, there's absolutely no difference between clustering on new big
iron and on a free junkpile P3 other than the new stuff is faster. Make your
own DB host and a bunch of front ends and see what happens. Maybe try a
cluster of DB hosts and FEs talking to the DBs. Much like the DB thing you may
never become a sysadmin but learning to speak their language will help even if
you stick to webdev work.

------
presidentender
Where do you find clients?

------
qwerty_asdf
Using Eclipse to bootstrap into Java represents a pretty reasonable and
comfortable environment to wade into.

Go to: [http://www.eclipse.org/downloads/](http://www.eclipse.org/downloads/)

Download the Java EE version. Create a project with a class named Main.java in
a package like "com.example.test".

In the class:

    
    
      public static void main(String[] args) {
          if (args != null && args.length > 0) { 
              for (int i = 0;i < args.length;i++) {
                  System.out.println("Hi there!");
              }
          } else System.out.println("Hello.");
      }
    

Hey, presto! You're a Java programmer. Try compiling and running it.

To get your feet wet with web programming, here's some quick and dirty bare
bones code:

    
    
      TestServlet.java
      /******************************************************************************/
      package com.example.test;
    
      import java.io.IOException;
    
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
    
      public class TestServlet extends HttpServlet {
    
    	  private static final long serialVersionUID = 1L;
    	
    	  @Override
    	  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		  try {
    			  resp.getWriter().print("<html><body>Hello. <form action=\"\" method=\"POST\"><button>Hey!</button></form></body></html>");
    		  } catch(Exception e) {
    			  System.err.println(e.getClass().getName());
    		  }
    	  }
    	  @Override
    	  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		  try {
    			  resp.getWriter().print("<html><body>Hi there!</body></html>");
    		  } catch(Exception e) {
    			  System.err.println(e.getClass().getName());
    		  }
    	  }
      }
      /******************************************************************************/
    

And then...

    
    
      web.xml
      <!-- ####################################################################### -->
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
        <servlet>
          <servlet-name>main</servlet-name>
          <servlet-class>com.example.test.TestServlet</servlet-class>
        </servlet>
        <servlet-mapping>
          <servlet-name>main</servlet-name>
          <url-pattern>/</url-pattern>
        </servlet-mapping>
      </web-app>
      <!-- ####################################################################### -->
    

This will compile and run on Apache Tomcat, if you compile and deploy as a
ROOT.war file.

