Adding needs: to a job converts the pipeline from stage-ordered execution to a directed acyclic graph for that job. It starts the moment the listed jobs complete, even if earlier stages still have jobs running. This is the intended speedup and it changes assumptions that stage ordering used to guarantee.
Two consequences. A job that implicitly relied on some unrelated earlier-stage job having run, for example one that seeds a database, now may start before it. And needs: also controls artifact download: a job with needs receives artifacts only from the jobs it names, not from every earlier stage, so a job converted to the DAG form can lose artifacts it was silently getting before.
needs: [] makes a job start immediately at pipeline creation regardless of its stage, which is the way to run a fast lint job first. Set needs: job: NAME, artifacts: false to express ordering without the download. The number of jobs a single job may list is capped by the instance, with 50 as the common default.