Picking a school is complicated and computer science is an outlier among other subjects. It's not quite rigorous enough to be a true engineering discipline, and some people aren't interested in that at all. At the upper end, there's computer scientists who basically just do a subset of math focused around computational limitations, and on the lower end you have glorified "coding bootcamps" that insist learning the basics of a language is enough to "start hacking" and get a job. In general, well regarded institutions of higher learning (including the four mentioned by >>2517
) tend to strike a balance. They start students with programming courses and some theory, usually with difficult "weeder" classes, and then those who survive are allowed to continue, at which point the theory gets more in depth but so does the hands-on application of code for real world scenarios. Of course, it's still very sterile and focused on issues that were relevant decades ago. You're unlikely you ever use a stack smashing vulnerability in the real world because most operating systems have mitigations, but it's still a good starting point for learning security vulnerabilities.
As far as other "good schools" go, I'd avoid most Ivy Leagues, which are oriented around liberal arts and networking (far more valuable outside of engineering). There's exceptions for MIT and Carnegie-Mellon, but just because Harvard is prestigious overall doesn't mean people hire scientists and engineers from there. As mentioned above, some state schools are pretty good. GeorgiaTech has a good program, especially for Masters students. CalTech is mostly better at other forms of engineering and science, but can hold their own. For that matter, most of the UCs have world class computer science departments, if you can handle living in California for 2-4 years. Of course, every university is pozzed to some degree, so how much worse could it be?
If you're actually going to attend then you should consider the cost and the value. The degree itself will not get you a job unless you put in extra time for projects and internships. "Better" schools have better connections and it's easier to get those opportunities and to network. Going to a local school will save you tons of money, though. Out of state or private colleges will take every last cent you will earn for a decade after graduating... if you'll let them. At the very least, consider finding a good community college to attend for the first two years. It no longer has a stigma attached and you'll save tends of thousands.
>is there anything you wish you would've done differently while studying computer science?
I think I did a lot right, but others didn't. Go to a community college, but be sure to plan your two years out in advance. It's very easy for two years to become four or more, and that's just to get an Associate's and transfer. Don't get stuck there, and don't get depressed when you have to take a lot of general education courses that will bore you to tears. Start doing programming and math right away and then pad your schedule with the general courses wherever they fit. Pick some decent universities and look up which courses transfer where. Another consideration is getting ahead of the curve. SICP is always a great book and MIT and Berkeley still use the material, albeit with a focus on Python instead of LISP. If you can learn to write scripts in Python, do a bit of functional programming in LISP, understand Apply/Eval, and also get some solid understanding of the standard library for C++ or Java then you'll have a much easier time in programming courses later.
That said, computer science is the easiest subject to self-study because all the contributors are happy to publish their work and recommendations online. Is it a mess of a field? Yes, absolutely. But it's also the one with the most material available. Currently, special interests are trying to undo that, but there's decades of historical material available for free. I think a combination of self-study and a university education, combined with some real world experience on the job, is the best way to hone skills. There's something you can learn from each of them that the others will not teach you.
I definitely think starting functional first is a great idea. Haskell is a huge learning curve, though. The type system is one of the most rigid out there. Great for building habits but a lot of people can't stick with it. Then again, if you can't stick with that and overcome it, maybe you shouldn't be trusted with weaker type systems. I still prefer LISP, but Haskell has matured a lot. Racket is very modern too, though.