Ask HN: I'm an incoming freshman to college for a CS major, what should I know?

187 points by fish45 ↗ HN
I've been coding since I was young, so I'm not worried about struggling academically, at least in my CS classes. I'm more interested in knowing what I should do now to give me an advantage in getting a job or otherwise.

All advice is appreciated!

277 comments

[ 5.1 ms ] story [ 157 ms ] thread
Learn your first (class's) language now, so when you are learning you can focus on concepts not syntax.

Learn bash and master the terminal, bash programming guide, advanced bash PG, https://github.com/hofstadter-io/jumpfiles

Consider Vim

Be involved in the CS groups, this is where the smartest people are

Talk to your faculty all the time

Get into research

Build things that aren't for class

Hit me if you like, email is in my profile

Good luck!

Underrated comment. Since everyone has the conceptual stuff down:

Learn about Wireguard. Nobody seems to be teaching it yet, curriculum always 3-5 years behind, and it's worth adopting into ed much sooner than that.

Our department had an unofficial policy of not teaching the latest tech and telling students that was something they can do on their own time.

That being said, with wireguard being merged into the kernel and it's huge significance to networking, I expect that tech to make it into the curriculum in some forum.

Also, thank you for the vote of support!

You should know why you want a degree in CS. Because if it's solely to get a job in software development, know that it's one of the longest and most expensive ways to reach that goal, especially since you've been coding for such a long time. There are many other reasons one would want to go to college, and if they apply to you, feel free to disregard this comment. But to reiterate, if your only goal is to be a software developer, I would try to see if someone will hire you with the experience you have now, or maybe do a bootcamp of sorts.

Let me add more nuance: I'm not trying to say that a CS major won't be valuable to a software developer, or that it doesn't have advantages over a bootcamp-like thing, or just raw experience. But there are tradeoffs, and I think a lot depends on what kind of software development you want to do.

To be honest, I would consider finding some sort of bootcamp type thing if not for my parents being pretty dead set on college. I do have a lot of stuff I want to learn which will, in my limited experience, be a lot easier to to understand with a formal education.

I've been looking for a software dev job for the past few months and almost everything I've found that's more than a WordPress/shopify job wants a bachelor's. Do you have any advice for getting a software dev job straight out of high school?

That depends on what type of job and career you are looking for, CS is a pretty broad field.

If you are looking for one of those high paying jobs in the top companies and want them without a degree, you will need to impress much more than your graduated peers.

Start with a WordPress/Shopify job and then look for ways to expand your horizons.

Struggling startups, small consulting companies, they also have more ability to bring someone in straight out of high school so even if they say "bachelor's required" still apply.

I graduated from high school in 1982, and already knew how to program. I was keenly interested in programming, and my mom was teaching intro CS courses at a local community college. Now her advice may be outdated, but it was that programming per se is too easy to justify 4 years of college study, if that's what you want to do for a living. Also at the time, many of the colleges didn't really have full blown CS departments.

I ended up teaching myself programming (and electronics) while doing a double major in math and physics, which led me to develop enough of an interest that I continued in physics through grad school.

I had a summer internship at a computing facility, which led me to think that a pure programming job would actually be kind of boring. Again, this was long ago, and is related to my interests and not yours.

Today, I program. A lot. In fact, if you walk past my office (my basement right now), you've got a 50% or better chance of seeing a code editor up on my screen. But I use programming as a problem solving tool, and am not employed as a programmer. Good programming skill is a "force multiplier" for virtually any occupation.

One thing about college is that many students change their majors. College is a place where you can be exposed to a whole variety of fields, and where you can soak up the vibe of a field and get excited about it. I don't know where I'd have found my love of physics at a coding boot camp.

CS attracts a lot of students who are interested in computers, or who hear that it's lucrative, but are not necessarily interested in computer science as an end unto itself. But, figuring this out is part of the college experience!

Disagree. Skip a CS degree and be instantly skipped over for coveted jobs. Sure you’ll still get a job. Ask me how I know.
I think these are good times for this theory of not needing a CS degree to be tested. I am thinking of Google's recent rescinding of offers to thousands of contractors, or the latest from https://layoffs.fyi/tracker . Lots of companies have frozen hiring.

I know I would not want to be among the "I did some coding on my own, and a bootcamp for a few months" brigade. Also someone is of this age and is not thinking of it, but in some years time how will they feel in tough times when they have no degree and have a mortgage and kids, and the wife just told them another kid is on the way, and their current job is shaky or they just got laid off?

Of course you can always point to outliers like John Carmack and what have you.

I don't see how getting a CS degree is "the longest" way to reach that goal. You will have to learn most of this stuff any how (unless you never learn it and want to be doing low level low paying CRUD work in thirty years). The only difference is you get a degree when doing it, plus professors with office hours, peers studying the same thing you are etc. College is flexible - you can study for four years, or you can get a full-time job and take one class a semester at night or on weekends. The latter way is longer, but eventually you graduate.

As far as expenses - you can go to an expensive private school, or you can go to an affordable but decent state school. And if you want an impressive college name at some point but money is an issue at the moment - get a Bachelor's from a state school, then get an advanced degree at a fancy, expensive school at some future point.

Look at all the layoffs and rescinded offers and hiring freezes and ask if you would prefer not to have a degree now. If you send your resume in but you don't get a response from a high percentage of them - maybe it's because they got a lot of resumes, and only kept the ones of people who had degrees.

> I know I would not want to be among the "I did some coding on my own, and a bootcamp for a few months" brigade.

Especially when the resume next to yours is someone from a top-20 CS program who's been at AirbnUberLyft for 4 years.

(comment deleted)
My masters degree took me 1 year to get and let me skip 3 years ahead in salary. It also gave me access to more senior level roles working along side senior level and executive level managers.

You’ll also want to do other things in your life besides work. You’ll find a college degree can impact how you’re perceived in many aspects of your life.

A college degree is like a save point in a video game. Once you achieve it, no one can ever take it from you.

It is, of course, possible to waste the time you’re in college or make bad financial decisions. However, that’s a separate issue. You’ll get out of it what you put into it.

College is more than just learning a vocation. Another goal is evolving yourself into a well rounded human being. Each quarter / semester take one course outside your comfort zone. Public speaking, improv theater, drawing, photography, music, philosophy, film production, drama, writing. Join a non-tech club. Learn new stuff, and how to relate to non-nerds. Expand your abilities, world view, and persistence.
I think more people who be apt to do this if electives were pass/fail. There were tons of interesting classes available that I could have taken but chose not to because I had a decent GPA in major reqs.
My university gives certain faculties a certain number of pass/fails for this very reason.
Find a language and learn it deep (at this point, I'd say probably Javascript).

Find opportunities to work on code someone else has written. Triaging bugs in open source projects (even if you aren't involved, but are just following along in issues) is great.

If you can become involved in open source, working on someone else's project, that's a great way to learn the communication skills needed to function in a career.

Learn CI/CD.

Learn SQL.

I'd strongly encourage you to minor in business.

Get as good as you can at public speaking, whether in coursework or on an extra-curricular basis.

start doing competitive programming as early as you can , enroll in ICPC https://icpc.baylor.edu/ and join competitive programming weekly group at you school (or start one if you don't find any)

this is a good book for preparation https://www.amazon.com/Competitive-Programming-3rd-Steven-Ha...

participate in contests on https://onlinejudge.org/, topcoder or similar on weekly basis (you will hear a lot about leetcode as a hard prerequisite to getting a job these days, but it's trivial for people who do competitive programming)

you will learn much more from doing that for a couple of years than any college can teach you

I second this. Competitive programming helps you develop skills that I find important in a career and that, in my opinion, had a strong influence on my current success.

There are many benefits and things where Comp. Programming can help you, but the most obvious one is how interview questions in FAANG (and similar) companies are easy compared to your weekly Comp. Programming contests.

This. After a couple years of serious effort on Codeforces, algorithms interviews are trivial. And perhaps more importantly, it becomes much easier to bang out a state machine, toss around some data structures, check for edge cases. You'll become really comfortable with that middle tier of software algorithms that are a non-trivial composition of standard ideas, but still fall short of needing a research paper, etc. (And you'll develop a sense for when a problem is actually-hard).
Biggest regret in college/HS/right now is not getting good at competitive programming.
Yeah I've recently been trying leetcode and codeforces and I'm way worse at it than I'd expected. It's fun though, so I'm working hard to improve.

Thanks for your advice!

I'd say choose an area to specialize in. Whether it's security, graphics, drones, something else...find what you like and don't just gravitate toward AI/machine learning/blockchain since that's what's hot.
Two main points. Care about the details, but don't get overwhelmed.

1) Care about the details. Programming languages are incredibly powerful, but there is a lot of subtle effects that even a tiny change of syntax can make (`*` vs `&` in C++ for instance). Try to pay attention to these details and their implications, because that is the key to get to being more productive and also to not making costly mistakes.

That being said, there is a limit to how many details you can keep in your head at one time, so:

2) Don't get overwhelmed. Just try to focus on the problems you're trying to solve, and take a first step towards solving it. IT WON'T BE PERFECT! Just keep going, and always acknowledge that there might be a better solution if you need to go back and improve on what you have. This is what I believe technical interviewers will be looking for: "Can this individual solve problems, and know the value of the trade-offs at hand. Do they know why choosing 'x' over 'y' is the better choice in this situation, and do they also know the cost of choosing 'x' now?". You can only spend so much time worrying about details if you have a deadline to meet, so sometimes you just have to make a decision and live with it.

Good luck and godspeed.

This probably sounds too cheesy, but don't forget to have fun! So, try different domains of CS, and see which one excites you the most!

There are a lot of subtleties of programming, algorithms and there are enough domains to choose from. So, don't follow the crowd, try enough new things to know what excites you, and then be a master at it!

My advice might be controversial, but here are some thoughts I have...

My big piece of advice: Major in something useful (CS, check!), minor in something fun. A lot of the computer science classes you take will be boring AF, or you'll start to bang your head against the desk wondering why you have to know how operating systems work when you just want to make iOS apps (or vice versa!). Some of the classes will be deeply math heavy. It can and will seem overwhelming at times. So minor in something fun. Pick something that has no bearing on your chosen career path. Minor in Theater or Music or Art or Literature or Physical Education. The best part about minors is that you generally get to take all the fun classes and not the terrible ones! You'll meet a whole bunch of people with diverse interests that aren't solely computer nerds.

As far as the CS stuff is concerned, focus on absorbing as much as you can. Contrary to what other people said, don't sweat the details. You should have a fundamental understanding of all the big areas (databases, languages, algorithms), but you don't need to be an expert in any of those things to get a job. In fact, 90% of the subject matter you learn in college won't be relevant to whichever job you get. BUT... the act of learning is important, and the fact that you have fundamental understandings of those things will get your foot in the door

Think of your college degree as a ticket to an interview, and your first job as the real education. Your degree is proof of two things: 1) that you can learn, and 2) that you can start, stick with, and complete a large, multi-year project. Nobody expects someone with a Bachelor's degree to be an expert programmer, but they _do_ expect critical thinking skills and the ability to learn. You'll learn more on the job in the first 6 months than you will in 4+ years of college education... so don't put too much stress on yourself there.

So... take it seriously, but not too seriously. Study hard, but take fun classes too. Make connections in your computer classes, but make friends across a wide variety of interests. Learn the fundamentals, but don't sweat the details.

(Also, pro tip: nobody gives a shit about your GPA. A 4.0 doesn't get you anything in the real world except a rude awakening. By all means, try to get all A's if you can, but don't burn yourself out by trying to get perfect grades.)

I read through this waiting to get to the controversial part and never found it. This is good advice not only for CS but for any rigorous degree. One of my favorite classes in undergrad was Ultimate Frisbee because it ensured I got some aerobic exercise each week and I got to experience playing UF with some really good people.

There are lots of other critical points casually shoved in here that could probably be expanded to book chapters if you wanted. The point about making connections is huge. Arguably the biggest difference between a state school and Ivy League education is the network available to you. Regardless of where you’re at, establishing connections is a major part of undergrad.

I took a Weight Training class as an elective and likewise found it really useful to improve my health. It forced me to work on strength training for 3 hours a week and I got stronger and dropped 20 lbs over the course of the semester.

Except for a handful of classes it was mostly just letting us lift weights for an hour, but the instructor helped improve my form and I learned how to prepare my own weight training program. A good amount of it has stuck with me 10 years later, although I'm out of the habit of doing it regularly now (kinda hard to get back into it now because of the pandemic, too, except a couple of kettlebells I own).

> minor in something fun

I agree. I double majored in CS and Acting specifically because I enjoy both topics and wanted to get better. It does take some dancing around with your schedule, but if you take the time to create some different alternative schedules it can be done. There were some semesters where I was more CS heavy, and others more Theatre heavy. I was able to walk out with both degrees in 4.5 years.

Despite my advice above, I actually did it the other way around. My major was Theater (Acting/Directing) and my minor was CS. I'm quite successful as a software engineer, so I don't really regret it, but if I could do it all over again, I would have majored in CS and minored in Theater... But yes, agree 100%
I've been thinking of minoring in physics or something, but maybe I'll try Art
If Physics is fun for you, go for it!
+1 for Physics. It's not easy, but you'll be learning some very powerful tools for thought and modelling complex systems, so totally worth it.

In case this is help, here is a short printable tutorial on mechanics fundamentals: https://minireference.com/static/tutorials/mech_in_7_pages.p... which is a condensed summary extracted from the No Bullshit Guide to Math & Physics a short book on mechanics and calculus. You can see an extended preview and sample chapter of it here: https://minireference.com/static/excerpts/noBSguide_v5_previ...

> Also, pro tip: nobody gives a shit about your GPA.

Well, no one except for grad programs.

I have found during my career that not many people people cared if you had your Masters or you didn't.
I guess I could clarify as "nobody outside of academia", but I thought that was a given... And in the CS field, a Masters doesn't really do much for you, unless you're an immigrant looking for a green card (and if that's the case, my advice is totally different...)
Not to imply you're not ready, but in response to "I've been coding since I was young, so I'm not worried about struggling academically":

"Computer science is no more about computers than astronomy is about telescopes."

Depending on the nature of what your department offers, be prepared to learn about, spend time on and potentially struggle with concepts that have nothing to do with coding or software engineering as you might be familiar with it, or even sitting in front of a computer.

Yeah I can totally see where you're coming from. I go (went?) to a STEM high school and since I'd already been coding for a while at that point I basically had the same attitude and then AP Computer Science ended up being one of my harder classes.
> Not to imply you're not ready, but in response to "I've been coding since I was young, so I'm not worried about struggling academically"

To add to this, I thought the same would apply to me when I went to uni. And it did, until about half way through second year. Then I discovered that the classes were passing the boundaries of what I'd self taught myself, and I had a big rush to catch up.

Make friends with the TAs. In a year or two, they’ll be able to refer you for internships.
Some thoughts I have as a CS student right now (for context, I grew up the in Bay Area and am a rising senior at UC Berkeley):

- I started coding when I was young, and I still struggled academically. There is a difference between knowing how to code and understanding computer science. For me, I found discrete math and formal proofs extremely difficult.

- It is very, very easy to get caught up in a constant mode of grinding CS hw/projects, especially if you're around a lot of studious people. Work smarter, not harder.

- Grades aren't everything! If your main goal is to get a job, you don't need straight A's. No recruiter or manager has ever asked for my GPA.

- Take classes outside of CS. Have hobbies outside of coding. Make friends who are studying different disciplines. You need outside perspectives to better understand the impact of technology on the world. Be aware of life outside the tech industry. Recognize software engineering as a tool to apply to issues.

- You'll meet people from so many different backgrounds. Some people come from high schools that taught Java and some people come from high schools that are not able offer any technology-related classes. Remember that some people are learning to code for the first time in their life!

For getting an internship (assuming you're interested in a SWE role):

- First of all, it's perfectly fine to not have an internship!! You can take classes, do research, work on side projects, etc.

- If you don't have prior job experience, spend some time on side projects (that are meaningful to you!!) to demonstrate your technical abilities.

- Have someone who is more experienced review your resume.

- You might hear that it's very difficult to get an internship straight out of freshman year. Honestly, at that stage, it's just a numbers game–the more online applications you throw your resume at, the more likely you'll get an interview.

- Don't discount career fairs on campus! I used to think they wouldn't be helpful because they were so crowded, but I got my internship after freshman year by talking to a manager at a career fair.

- Be able to clearly and succinctly describe yourself and your goals. What are your interests, and why? How do your hobbies and/or past experience support those interests?

In recent times I have been taking night and weekend classes to finish my CS bachelors along students half my age, so I will tell you what I told them.

One thing is we took CS classes, and also some English courses in writing. Even on the job, those writing classes are important. You will be writing e-mails, documentation etc. and being able to be clear and to the point is helpful.

Also, in my eyes, some students were not doing enough to get an IT job out of school, never mind a good IT job with an upward trajectory. One guy told me "I don't study for quizzes since they are only 10% of the grade". I studied for quizzes because they were 10% of the grade, but also because I wanted to keep up with the subject and know about it for the future. Then part-way through a semester, or after a semester, I would often manifest whatever I learned. So if I learned Java, I would write a project in Java for myself. Or at least go on Github or somewhere and fix an issue on a Java project. Or if I learned graphics programming I would write a graphics program, or at least contribute to a free/open-source one. Through this, I would take all the theory I had learned over some months and ground it and manifest it in real work.

Also you would probably do well to get on CS department mailing lists, and check the bulletin board or whatever for internship listings.

I was surprised how lackadaisical some kids took it. Maybe it was their youth. I have seen many people parlay their CS skills into everything from a well-paying job, to parlaying it into an enormous amount of money. So I went above and beyond. I recall one homework where we had to talk about process schedulers, something I was always interested in but never stopped to read about. I figure in the first half hour of work, I already had gotten an A, but I spent hours and hours reading about process schedulers before turning in my homework.

I recall speaking to a bunch of the brighter CS seniors, and I mentioned something about version control. "Version control?" one said. I said, "Yes, you know, like git". "Git?" he said. None of them knew what version control was. You should know things like that before your first job interview, taking classes is not enough. It's good to know what algorithms are linear big O, and which are exponential, but you are going to have to learn some things they won't teach you in class to get a job. I would suggest going to Github, finding a project that has merged pull requests from a number of contributors recently, and looking at contributing a pull request to that project. Then at least you'll get an idea of what work is - someone posts a bug to issues, you look at it, you fix it and put up a pull request, then someone with more (or equivalent) experience looks at it and either gives you some pointers, or merges your changes. At work you will be doing similar stuff.

take linear algebra ASAP. it's probably the single most useful course you can take at a university.
look into ACM aka ICPC programming competitions -- super-fun, you'll learn tons, & job interviews will seem easy in comparison
Let me start by sharing what I think is the most important advice. I would focus and really ensure you "learn" things. Don't worry about optimizing for exam scores. In my opinion, it's better to get a 75% on an exam and understand that 75% well as opposed to getting 95% on an exam but only because you "remembered" things without really understanding them.

When you study, spend time deeply thinking about the concepts. Yes you're going to learn CS, but it's not just about learning data structures, algorithms, compilers, etc. etc. College is an opportunity to think critically. It's okay to be wrong or to not understand things. Use the internet to reinforce concepts you don't understand well, or go speak with your professor or TA's in office hours.

Okay... with that out of the way, here are some other thoughts:

1. Don't index too heavily on advice folks give you on learning any specific programming language. Focus more on the concepts that translate from one language to another.

2. In the first year or two, do invest in understanding object oriented programming principles, as OOP is quite common today. You'll probably cover this in one of your introductory CS/programming courses anyway. Note: OOP is not the end all/be all.

3. If you've used Windows your whole life, great. I would encourage you to spend some time learning a Unix-based operating system. This isn't so much related to your CS degree/course work, but I will bet it comes in very handy later on.

4. Do take a compilers course if it's not required in your degree program. Many universities who have ABET accreditation require it but I recall at least one (several years ago) that didn't.

5. Do pay attention in your Operating Systems course. Take that course if it's not required. Threading, memory management, scheduling algorithms... you learn concepts here that will likely be very useful in your career.

Dug around until I could find a suggestion that I would recommend highly. As suggested above, taking a compilers course and an operating systems course will give you a view into how computers work (not the electrical parts, but the general software parts).

In addition, I'd recommend taking any programming language course offered: C, C++, Java, Python, Lisp, Prolog, (Ada, Cobol, Fortran, Basic, and on and on). Learning the other languages gives one a view into programming in general, not just in your favorite language.

My 2c.

Skill up in the humanities. Pick topics outside of technology that interest you, and learn how to communicate about them. Take as many seminar discussion and writing-heavy classes as you can.

From a career perspective, programming skill is relatively easy to come by. Programming AND speaking AND good writing will put you on a better career path. You won't get stuck after a job or two when you know the tools of the trade but not how to handle things outside the compiler.

But also, just as a person who has to make it in this world, you need more than one frame of reference to make sense of things. Humanities students are enriched by taking science and math classes, and getting a new way of seeing things. STEM undergrads who learn to tolerate ambiguity and learn some history are rounder humans.

I'll plus one this and recommend you also try doing things outside of class. Uni is an amazing time to try a load of hobbies and new non-academic skills. I personally did a ton of theatre and event planning for fun at uni and learned a loads of useful skills such as:

- How to coordinate a team - How to write a good email - How to interview people (helps for being interviewed) - How to clearly communicate my ideas to others - Public Speaking - How to give feedback - Conflict resolution

Beyond the basics technical skills tend to vary by job. Soft skills are universal.

On the flip side, if a degree program is at a liberal arts institution it may have plenty of humanities builtin and you may want to add a few extra CS courses to round things out.
>Programming AND speaking AND good writing will put you on a better career path.

This is very true. If you are a decent developer AND have this "speaking AND good writing skills" you will go much further - it really separates you from the pack...

I emphatically agree. Very few programmers are so talented that their soft skills don’t move the needle. For the majority of programmers, soft skills will be the single greatest differentiator between being a middle of the road software engineer or excelling and being _the_ engineer people adore.

An average programmers job is 90% writing code that anybody with a year of experience could write, it’s the 10% where you’re bridging the gap between technology and business that can realise a whole new world of value — and that depends on soft skills.

Man, to be honest I was looking forward to not having to take humanities classes now. I have my first advisor meeting for scheduling classes in a few days, so I'll be sure to find something with lots of writing. Thanks for the advice.
Engineering is at its essence communication of ideas between you and others, be they computers, or other people, or yourself at some future time.

Learn to communicate effectively, and you will not be sorry you did.

Totally understandable, but I'd strongly recommend challenging yourself. Of course I'm a little biased having done a CS/humanites major at a liberal arts college but there are so many great reasons that people have listed and I fully agree with them.

Sure there are very compelling professional arguments, but I would argue that the most important reason is that studying humanities can make you a more well-rounded person and give you diverse frameworks to look at the world with. Technology products have great benefits, but also great impacts on the world. Humanities can help you look beyond first-order technical rationale and link to historical, social, or political factors and themes that are relevant.

This is especially true if you, like many (though not all) people that study CS, come from a generally privileged environment.

edit: Also wanted to add that the "read a lot, discuss, write a paper, present the paper" grind can be hard at first, but really breeds good skills. Being able to read a text, synthesize it's meaning, and relate it to broader themes is one great skill. Then showing up to class and actively discussing the material is another great skill. Finally writing and presenting are skills that take a long time to build, but used continually throughout your professional life, both formally and informally.

Yes - people who only know technical things can become convinced that (a) only technical things are worth knowing, and (b) that their perfect logic can enable them to come to ideal conclusions about things they know nothing about. (I think some of the latter stems from experiencing years of education where a small number of factors needed to derive a perfect solution, as in a first-year physics problem. When you go to build things though, you discover that you have to understand the situation and its users to design and build what is really needed.)
Do side projects. Do internships, if possible. Aim for A's instead of A+'s. The time-savings will be enormous, and allow you to do other things.

EDIT> Join project teams, if possible. E.g. game development club, robotics club, rocketry club, etc.

Doing side projects is so key and very underrated. The downside of a CS degree is it tends to be heavily theory-skewed (which can be really great!), but it doesn't take much to forget the practical side of the craft.
1. Don't assume your CS classes will always be easy.

Having programmed a lot is a big advantage, but you're going to be learning a wide variety of things as a CS major that you may not have had to think about previously, and there is going to be a lot of it which isn't intuitive. Be prepared to study more than you have in the past and don't get cocky; sometimes it isn't until your junior or senior year that you get beyond what you already sort-of know and hit a wall.

2. Try to double major or minor in something completely unrelated to CS and math, unless you are really into CS or math.

Programming is a tool to make computers do stuff. A pure CS degree leaves you qualified to program compilers and IR systems and computer games. If you learn about something really hard, like chemistry or biology or whathaveyou, you'll also know what sort of programs chemists and biologists and whathaveyou need and have a domain to write programs in.

double majoring is a hilarious waste of time and money. don't do it.
Definitely not a waste of time. Learning to think in a non-CS way can be incredibly valuable. Will it make you a better programmer? Maybe not. Will it make you a more effective employee, founder, or person? Yes.
Why do you need to pay tens of thousands of dollars to for a second degree when you can just go to the source material yourself?

Project Gutenberg exists, as does Youtube, Khan Academy, and many other free resources.

In most (all?) universities/colleges in America a double major doesn’t cost extra financially. You might have to give up taking more electives in one or the other programs however.
Yeah I can't speak to other Uni's but I went to a very large school in VA, and we had plenty of extra credits for electives. With a some creative picks, and a couple of summer courses taken for fun, I was able to tack on a 2nd major and a minor.

Disclaimer: I was former military and had a GI bill, plus a job with reasonably flexible hours while in school. This might not be a universal case for folks with lots of loans in an isolated college town.

0 extra here where I live. I actually get paid to study (not enough to actually live full time on that). The only real expense I get is that I need to supply my income either by working or taking a student loan (with an interest rate of approx some ten-twenty dollars a year).

Also, when comparing what one would or wouldn't benefit from, I think money should be removed from the discussion. Obviously, you gotta live when you study and the longer you study, the less you're earning through work = time spent in school is a loss of income But as this is obvious, it's enough to focus on whether a double major is worth your time or not.

There are dozens and dozens of articles about students demanding their money back from colleges precisely because an online lecture where you can't or barely can interact with the professor is absolutely not the same thing as a classroom and campus setting. This is across the board in all majors. In a field like philosophy where discussions and exploring different viewpoints from others is one of the main points I can't imagine a more poor substitute.
False. I was a physics/philosophy double and I haven't regretted it for a second. Physics was profound (although somewhat disappointing!) but philosophy is the home of ethics, and lots of writing, and the study of both of those will serve you in good stead.
You don't need to double major in philosophy to be exposed to it. For a fraction of the money you paid, you could've tapped into free online resources and paid for a philosophy tutor to walk you through the classics.
How do you know how much money I paid? I was a bit of an overachiever and took a lot more units per quarter than average.
Why not major in one and minor in the other? Even though my only major was Computer Science, I still took enough English classes to minor in English. Took a class on the History of the English Language (learned how to read Old and Middle English), two American Lit classes, a Middle Eastern Literature class, the Technical Writing course I needed for CS anyway, and a couple of composition classes (maybe one or two others, I don't remember). And it didn't take any more time than I needed anyway.
It depends on what your goals are. Perhaps from a purely practical standpoint, there are diminishing returns, but we should also consider the plummeting job market people graduating in the next couple years will be coming into. Having something to help you stick out might be useful, even from the practical standpoint.

Of course, there are points of view outside this too, and it is ridiculous to dismiss these perspectives as objectively wrong. Some people actually enjoy the liberal arts, the fine arts, entrepreneurship, etc.

I mean, you can totally do fine as a straight CS major, and there are plenty of CS/math majors who can report successful, productive, profitable careers as a programmer in this very thread.

But there's a lot of programming to do where domain knowledge is absolute essential, and if it turns out you find one of those areas interesting, college is a great time to acquire that domain knowledge, in parallel with getting your certificate stamped that says you're safe to employ as a programmer.

Biology, chemistry, linguistics, cognitive science, every flavor of engineering. All of it comes with programming work to do. Protein folding, genetics, natural language processing, computer vision, CAD software, control software...

Being able to program is a useful skill, but you have to know what to program. And yes, there are plenty of companies who will happily hire a programmer to write SQL queries and copy fields from one protocol buffer to another. But those options don't go away because you also have a thorough understanding of, say, chemical engineering; you just also have another career path open to you where you can do a boatload of programming, just not with web frameworks.

Agreed. Taking non-CS classes? Definitely worth it. Getting the arbitrary extra words on your diploma? Less worth it
To be clear, I'm not advocating taking a bunch of random classes to be a well-rounded person, although, sure, why not.

I'm advocating taking enough classes in some other, specific topic that interests you (like, say, linguistics) that you can now apply for jobs where you program using your domain knowledge of this other field, as well as your CS skills.

At most colleges, taking a bunch of classes in a single subject usually results in a major or minor; additionally, the extra lines on your diploma that say you also know a lot about, say, structural engineering will help you when your resume is on the desk of a firm developing CAD software.

Oh yeah we're on the same page that taking classes in a different, specific topic is a great way to amplify your existing CS skills. I'm mostly making the point that going into college with the mindset of double major or bust can be counterproductive. The difference between a minor and a major can be a few extraneous courses, a lot more stress and a little less time to pursue your main interest.

I know I came into college determined to do a double major only to realize that I probably should have made that decision after taking a few courses and evaluating my level of interest in the two subjects.

I strongly second both of these points will provide some more color:

> 1. Don't assume your CS classes will always be easy.

Easy or quick. Some of my worst college experiences involved putting off CS work that, while still easy, had sneaky edge-cases that took many hours to cover. Don't be lazy with your CS projects and you will be in a comfortable place.

> 2. Try to double major or minor in something completely unrelated to CS and math

Sage advice. I know a few CS/SE majors who minored in psych. Each, without exception, left college with an understanding of what drives office politics and dynamics that surpassed their peers. Computers are easy in that they work in objective ways. It is hard to overstate how valuable a diverse education can be once you are in the real world dealing with real (read: flawed) humans.

> Easy or quick. Some of my worst college experiences involved putting off CS work that, while still easy, had sneaky edge-cases that took many hours to cover.

This still burns me at my actual job, more than a decade later. Stupid edge cases.

This is about test case generation. When it gets hairy, a *check library helps (quickcheck, rapidcheck, etc).
A diverse education will also help your relationship with the flawed person you interact with the most: yourself.
I think there is selection bias in number two here. I am really skeptical that taking psychology classes really would help many people's interpersonal skills, at least not very much.

I would be more inclined to believe that the kind of person who is interested in signing up for psych classes is already more interested in understanding how other people think in a way that naturally benefits them socially.

.. so the interest in psychology is useful, but not actually studying it?
No, that's not what they meant. What they mean roughly is that if you were a college student who were interested in signing up for classes in psych, you probably already have some interest in it (and related things), and that interest is what helps you become better (at understanding human dynamics etC). It's not a causal link, just highly correlated.
Yeah exactly. I had no issues in getting top marks for courses that covered things I had worked with before going into uni, but as I lacked a formal education, I had a very advanced skill level in specific areas but lacked the primers to other very relevant areas. This meant I either flunked my classes totally or I got an A without doing any work.

Dropping out, mental issues and life happened, I'm now back at the Uni and now I understand how to do the work. In my advanced programming class of 400 people, I managed to score in the top 1% solely because I put in almost double the required hours and tried to expand and extend every task and homework we were given. For the first time, I also feel like my grade was actually earned and I might not actually be totally dogshit at programming after all.

I think Point 1 bears emphasising: a computer science degree is not a vocational course on how to be a programmer. It's a course that gives the student a basic grounding in a scientific discipline. Being a programmer is a basic prerequisite for the degree, not the end goal. Also, the course should cover practical topics like testing and version control, but becoming a highly effective software-developer-for-hire isn't exactly the point.

It helps to already be a competent programmer, but fish45 comes across as overconfident in saying I'm not worried about struggling academically. A computer science degree covers plenty of topics they're unlikely to have ever dealt with, and one shouldn't count on easily breezing through all of them. Topics like complexity theory, compiler theory, formal methods, computer architecture, and AI.

I'd done some programming before my undergraduate studies, but I'd never heard of proof by induction, and I didn't know what a 'set' was. I had plenty to learn, right from day 1.

Look to other comments for short term advice. For long term, play to your strengths and work on your weaknesses. Those things you might never be good at - look around you. You are surrounded by all sorts of people with their own skills. Mingle - build a team, it will help getting thru all the ups and downs of college life and teach you about people

Jobs are mostly about connections. Volunteer. Mentor a freshman every year. Ask for help. Treat the lab guys well. Connect people.

Finally, the most important thing: screw up enough to get noticed.

> I've been coding since I was young

Same here, but that doesn't mean you won't struggle. If you have been coding since very young, you could very well be quite skilled at software engineering, the practical aspect of producing software, but not at computer science. I was fortunate enough that a middle school teacher found out I was interested in coding and decided to teach me real computer science instead. That's where I struggled a lot. I didn't even know why for example learning about heaps or binary trees was a necessary endeavor, when I could very well build websites or make DOS games on my own. It took until high school for me to truly grok these computer science concepts, mostly about algorithms and data structures. Even then I still learned a great lot in my undergrad CS classes beyond algorithms and data structures.

Computer science is a vast field; don't think that just because you have coding experience you can afford to coast along, instead there's always something new to learn. Go find your own subfield that you are interested in and go deep in it. I personally really enjoyed learning about type theory (going through Pierce's TAPL) for example. It may not be an undergrad course but still.

As for advice, I'd say go talk to the professors more often. They are generally willing to help. And if they sense that you are so much ahead of your peers, they could very well give you new work to challenge yourself. Perhaps even ask you to collaborate on a research project they are working on.

> Go find your own subfield that you are interested in and go deep in it.

Conversely, do know that this may not yield much appreciation from professors. BSc and MSc degree programs don't generally reward you for doing work that is so deep to be publishable. Even though you are at college to learn, you can't get carried away learning by yourself, if it is in the way of passing exams.

I find the opposite. My professors really did appreciate my deep work and involvement in PhD-level research. What doesn't appreciate my work is really the degree: regardless of whether you do so your degree just says BSc. It's more for learning for your own good.
Join your school's ACM Programming Contest or ICPC team. It will prepare you well for whiteboard coding interviews.

Also try to do at least two internships; they'll teach you a lot about what professional work is really like and once you've graduated a lot of companies will like seeing this experience on your resume.

I did 4, but the people OP will want to be compared with will have done 5 or 6. 2 is a bare minimum.
My advice as someone who was in the same position and has just done a year in industry and about to go back and do my final year of CS (UK), is make sure you enjoy yourself and learn how to manage your time as this will help dramatically. Then during this time if you can learn parts of the syllabus, so it's not the first time you hear about it when going into a lecture. Find your niche what interests you, and gets you excited, talk to your lectures about that stuff, that can help later, especially if you get bored or want to go into research. Overall spend time doing side projects, enjoying learning, part taking in clubs and societies and if you find it easy find something to challenge you! If you want to ask me anything more about my experience so far, feel free to send a message (email in bio)
Discrete math topics teach amazing way to think that most people never get to see in high school. Knowing stuff in free a book like [0] is immensely helpful. There are a ton of decent introductory discrete math books like the ones by Susanna Epp, Ed Scheinerman, Goranko bros and Gary Chartrand. Just google "list of discrete math book". What google spits out won't even scratch the surface of what's available out there. But modern CS folk will have to know much more than the basics of discrete math. For example, math analysis and probability theory are very helpful. This free book [1] gives a sampling of such topics. As preparation, one can start by looking at pre-real-analysis books like the ones by Lara Alcock and Jay Cummings, Linear Algebra by Kuldeep Singh and Probability Theory by Dimitri Bertsekas/Tsitsiklis. These books are very easy to read. There are also introductory books that give a bare-bones sampling of most undergrad math subjects from abstract algebra to topology like the ones by Gary Chartrand (separate from his discrete math book) and Steve Warner. Such books are designed to be as hand-holdy as possible. The more I type the more I realize there's more (much, much, much more) to say about the math side of things. Anyway, for another thing, google category theory just to be aware of it. There are a few undergrad/high school level books on the subject, but I am not sure how useful that is to a freshman.

[0] Book Of Proof by Richard Hammack

https://www.people.vcu.edu/~rhammack/BookOfProof/

[1]Foundations of Data Science by Avrim Blum, John Hopcroft, and Ravindran Kannan

https://www.cs.cornell.edu/jeh/book%20no%20so;utions%20March...

I've written a lot about this. If you want a job, start applying early. But don't feel like you have to get one immediately. If you're sufficiently motivated, consider taking time off to work on your own projects.

1. Don't take all CS classes. Try other subjects and diversify your knowledge. 2. Get good at sending emails. It can help you get a job, get contacts or just gather information. 3. Even though you should take non-CS courses, that doesn't mean you should get a double major. It's not always worth it. 4. Make sure you like CS. Having experience is a good sign, but people can be advanced or good at a subject they don't like. Make sure you like it even when it gets tough.

[1]: https://blog.torchnyu.com/2020/03/04/take-fewer-cs-classes.h... [2]: https://blog.torchnyu.com/2019/12/19/sent-from-my-iphone.htm... [3]: https://blog.torchnyu.com/2020/05/15/the-case-against-double... [4]: https://blog.torchnyu.com/2020/05/14/do-you-like-it.html