Ask HN: I'm an incoming freshman to college for a CS major, what should I know?
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 ] threadLearn 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!
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.
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!
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.
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?
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.
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 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!
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.
Especially when the resume next to yours is someone from a top-20 CS program who's been at AirbnUberLyft for 4 years.
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.
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.
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
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.
Thanks for your advice!
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.
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 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.)
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.
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).
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.
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...
Well, no one except for grad programs.
"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.
https://youtu.be/2Op3QLzMgSY
While there, SICP is not a bad way to augment a CS degree :-)
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.
- 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?
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.
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.
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.
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.
- 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.
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...
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.
Learn to communicate effectively, and you will not be sorry you did.
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.
EDIT> Join project teams, if possible. E.g. game development club, robotics club, rocketry club, etc.
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.
Project Gutenberg exists, as does Youtube, Khan Academy, and many other free resources.
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.
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.
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.
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.
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.
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.
> 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.
This still burns me at my actual job, more than a decade later. Stupid edge cases.
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.
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.
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.
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.
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.
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.
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.
[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...
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