I am converting some glBegin() / glEnd() code into using VBOs instead.

While reading various articles about VBOs, I found it rather confusing.
Some examples used element arrays to index into the buffer, some did not.
Some examples used VAOs, some did not.
Some used a vertex shader, some did not.
So it became difficult to wrap my mind around VBOs.

I got a sample working with just a simple dataset.
No element array of indexes. Since my data is already formatted for triangle strips and fans.
The index array would just be dumb list of
[0] = 0;
[1] = 1;
[2] = 2;
etc...
My buffer was not interleaved. It just had a block of a bunch of vertices in the first half and a bunch of color values in the second half of the block. A couple calls to glVertexPointer() and glColorPointer() told it where to look for those things in the buffer.
Then I just called glDrawArrays() and it worked.

Now I am trying to get it setup so that it works with interleaved data. (Where color would be included with the vertex on every point in the list. Rather than being 2 seperate lists)

For interleaved, what things are required and why?
Do you have to use a shader?
Do you have to use an element array?
Do you have to use VAOs?