Ask HN: I'm an incoming freshman to college for a CS major, what should I know? - <AUTHOR> 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.<p>All advice is appreciated! <comment><USER5> CS is less about coding and more about thinking analytically about coding. I started coding at 11, but some of my college classes were still pretty difficult. I wouldn't assume your classes will be a cakewalk - definitely put the time into studying your material even if you think it's easy.

With respect to getting a job - I would think about programming as a tool. What industry do you want to use that tool on? I would think long and hard about that and consider double majoring/minoring in that new thing. Physics, math, business, whatever. Computer Science + some area of study where you can use CS for the betterment of an industry (outside of CS) will leave you in the best position to do well.

I would also suggest really focusing on Data Structures/Algorithms. Worst case, you'll be good at whiteboard interviews and can get a job at a FAANG company.

Network, hard. Your professors probably know lots of people, and your classmates (in your major) will go on to get jobs you might be interested in. Develop connections with the people around you, and become a person they want to work with in the future.

Above all, don't waste your college time. Actually give a shit about what you're learning. Try new things, make mistakes, have fun, but also work hard on your degree.

<comment><USER6> > Worst case, you'll be good at whiteboard interviews and can get a job at a > FAANG company.

Since when is this the worst case scenario for a CS grad? Last I checked, FAANGs value and compensate their engineers more than basically every other industry.

I double majored in economics and comp sci, then got a masters in cs/ml. I didn't plan on going to a FAANG until I realized a few things:

1\. Staying in academia was clearly not an option for me. I still have friends who are miserable trying to get through their postdocs and I can't deal with the hobnobbery that some departments exhibit, the political infighting etc. I felt like if I got into the wrong program for a PhD I'd miss out on 5-8 years of my 20s and early 30s.

2\. Did the startup thing. Found that most smaller startups are 90% talk and marketing and nothing really groundbreaking happens there. There are a few exceptions to that and if you're lucky enough to find one of those companies, good for you.

3\. Other industries that don't focus on software often don't value SWEs the same way. It wasn't until a few years ago that the IT guy who maintained everyones desktops at a small financial firm and the person who wrote the internal software were the same individual. There is nothing wrong with those roles, but if you have the skills most CS grads acquire, you can specialize much more if you find a more software focused role

4\. Starting my own thing isn't an option for me personally. I started some companies very early on when in doing my first degree (2009-11) and they failed, great experiences, don't need them again. If this is for you, then good, go for it.

5\. FAANGs and other large software corps give you the structure to focus on work, like a laser, and then turn off and still maintain a healthy work/life balance. There are still politics and other bullshit to deal with, but your chances of finding a good team that minimize bullshit are high, in my experience. This doesn't happen at most startups where you have to play many roles. At a FAANG if you are really into a project, you're free to dive into it 24/7\. If you're at a different phase in your life, say you just had your first child, you can take a step back and slow down for a bit. Nobody is going to ask "why haven't you pushed 50 diffs this week?" And obviously there is the pay.

<comment><USER7> >Since when is this the worst case scenario for a CS grad?

He said this in the context of advising him to focus on algos and data structures. As in, if you work hard on those things, the worst case scenario is you'll be really good at whiteboard interviews. The point is that even the 'worst case' is a good outcome. Very different than talking about the worst case scenario for cs grads in general.

<comment><USER5> Thanks, I could've explained better, but that is exactly my point.

</comment></comment></comment></comment><comment><USER8> In my experience, social skills tend to be far more important than ability of knowledge when it comes to getting a job. Personal connections are also very useful when it comes to finding internships and graduate jobs, I had a B- grade point average and still managed to get an internship that led on to full time work when I graduated, purely by knowing the right people (completely by luck in my case)

I'm not a bad programmer by any means (my poor academic performance was due to undiagnosed ADHD), but time and time again it's brought up by management that I'm a valuable asset because I'm a software developer with social skills. Apparently we're a rare breed.

Don't take only CS papers, thinking that non-CS papers are a waste of time, I did that and I regret it. Intro to computer graphics was just as much a waste of time as philosophy or any other arts paper would've been. It's had literally zero use in my career. Taking arts papers will help you avoid getting stuck in a CS bubble.

Remember that college/university isn't just a place where you learn things so that you can get a job (most of what you learn you won't use in practice). It sounds cheesy but it's also a place where you grow a lot as a person. College is the time where you'll have more freedom and spare time than any other point in your life, make the most of it. Make mistakes, fall in love, get your heart broken, learn from your mistakes, it becomes a lot harder to do these things when you've graduated and settled down.

<comment><USER9> You guys really exaggerate how much people lack social skills in our field. Most people have perfectly good social skills (at least those I'm friends with). Someone that exceeds you in technical skills is gonna snag that shiny internship away from you AND have the social skills to boot.

<comment><USER8> I guess I'm being unfair when I say that most software developers lack social skills, it's rare for me to run into another dev who I can't hold a decent conversation with (it's rare for me to run into another dev at all to be honest). It's more that most devs are usually bad at workplace communication with non-technical people.

Besides that, most software developers just aren't that great. By definition half of them are below average in their ability, so if you're an average programmer with good business communication skills you're ahead of the curve by a good margin.

At the end of the day, the best way to get an internship is to know the right people. My brother went to university with the lead developer of the company I got my internship at, it wasn't the only reason I got the job, but it was definitely a big contributing factor. My B- GPA definitely wasn't why I got the job, and I had literally zero experience with Ruby on Rails or JS at the time either.

Upon saying that, my experience doesn't necessarily map to everyone else. At the risk of sounding arrogant: I'm a very talented, although not necessarily motivated, programmer. I managed to get my degree without attending more than a week of lectures each semester, while at the same time feeding a pretty heavy drinking problem.

<comment><USER10> Building on this, I think good technical skills will definitely help get you in the door but won't get you that far up the ladder if your ambitions are management/executive track. And that's not for everybody, which is why larger companies have built individual contributor tracks.

</comment></comment></comment></comment><comment><USER11> 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.

<comment><USER12> double majoring is a hilarious waste of time and money. don't do it.

<comment><USER13> 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.

<comment><USER14> 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.

<comment><USER13> 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.

</comment></comment></comment></comment></comment><comment><USER15> 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.

<comment><AUTHOR> 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.

<comment><USER16> 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.

</comment></comment></comment><comment><USER17> 1\. Sweat the fundamentals. CS isn't a coding school. Algorithms, complexity theory, databases, operating systems, graph theory, compilers, math, etc. will get you further than any coding.

2\. Go for depth, not breadth. I know most US colleges make students do all sort of breadth stuff, which I don't get (I come from European undergrad, all our classes were CS/EE - coming to US for grad school, I was more prepared than others coming from top US undergrads). You have time to dive into other stuff after school. Do adjacent things like Biology or EE.

3\. Find grad students and see what they're working on. This is where you'll see the value of the fundamentals. Then work backwards and fill the gaps. Try to get a tiny part in a research project (ideally one that can lead to publication).

4\. Read timeless papers one each topic.

5\. Hack, hack, hack - the gap between theory and practice is small in theory but large in practice.

<comment> nv-vn I disagree on breadth vs. depth. Breadth will give you the tools to succeed in a wide variety of areas and prepare you to delve deeper on your own. If you go deep into ML for example that doesn't prepare you to work on operating systems, but if you have a broad understanding of both then you'll have the tools you need to find new resources and read research papers in both areas. (For the record, my school has a huge emphasis on depth over breadth and I feel like I'm sacrificing parts of my education by not being able to study more areas of CS).

<comment><USER17> Oh I meant depth as in take only CS-related courses, not European History, Greek Philosophy, Sociology, etc (which seems to be common in US universities). By all means go broad _within_ the field, from graph theory to transistors to DSP to anything really. I would venture out to STEM fields that seem interesting.

</comment></comment></comment><comment><USER18> 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.

<comment><USER19> > 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.

</comment></comment><comment><USER20> 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.)

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

Well, no one except for grad programs.

<comment><USER20> 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...)

</comment></comment></comment><comment><USER22> Programming in high school is quite different than the work you will be doing in a CS program. CS is a hard, but not impossible, major. Depending upon the school it will be perhaps easier than a Physics degree and maybe a bit more work but easier than a Math degree.

There is too much CS to learn in four years so every program leaves something out. For example, some schools will require a class in Artificial Intelligence while others may not but will instead require a course in Data Science. So it's hard to know exactly what you will be studying, but I can make a few suggestions that should be helpful for someone heading off to college and planning to study CS.

Generally, there is a lot of useful math that you may be required to learn. Usually one year of calculus, one semester of differential equations, one semester of linear algebra (matrices, etc.), one semester of statistics or probability, and one or two semesters of discrete math. It's easy to end up with a math minor on your way to a CS degree, and I recommend getting one if you are reasonably good at math. The good thing about this selection of math subjects is that they are all in different areas and are consequently to some degree "introductory" or lower division. The trick at this level for doing well in math classes is simply to put in the time to do all the homework, attend all the lectures, and prepare for tests by doing every problem (even the ones not assigned as homework) from the text book sections covered in your class. If there are problems (even unsigned ones) that you can't do, meet with the professor and get help. This is a pretty simple formula for getting A's in math classes. This really works I've done it myself; I was always good at math in High School, but it took me a while to understand that doing just the assigned homework was going to result in B's not A's. Doing extra practice by taking a couple of Saturdays to solve every problem in the book resulted in getting the highest grades in the class. No matter where you start out, extra practice will make you better. Great athletes achieve success the same way, through more practice than others.

CS homework often involves programming. In your web-design class, you will write programs that implement web-sites; in your data structures class you will write programs that implement different data structures. This kind of homework has a special property unlike history homework or chemistry homework. One can be short on time and do a crappy job on a history paper or maybe get only four out of five of the chemistry homework problems done, and this might get you an 80 on the history paper or chemistry homework. In CS, the programming assignments, sometimes called labs, are different. Doing 80% of the work required to finish a program generally means a program that isn't finished and a program that isn't finished often doesn't run at all or runs and produces the wrong answer. This could result in a 0 or maybe a 25 on the homework, not an 80. This means that you have to adopt a different approach to tackling labs. To avoid a disastrous grade, _start early_. If you finish your program a couple of days early you can go out and party, but I predict that you will almost always feel a lot of pressure as the deadline approaches because these labs will take more time than you think they will, so _start early_. Start on the first day, and put some time in on these projects every day.

Some of your classmates won't start projects early, there are two possible consequences. They won't be able to finish and will get a bad grade or they will realize that they aren't going to finish and will cheat by seeking the solution on the internet. There are only so many suitable labs for the subjects you will be studying so the programs can mostly be found on the internet. You will be making a grave mistake if you take the route of starting late and then making up for it by copying someone else's work. You have to practice programming on your own to develop your abilities and prepare yourself for a career in CS, so _start early_. By the time you are in your third or forth year, you will know which of your classmates have been doing it by themselves and which have been taking the easy way. By starting early and doing it yourself you will gradually become one of the best, and your professors and even your classmates will know it.

When I taught undergraduate CS classes while in grad school, I noticed two categories of students. Students that never came to see me during office hours for help and students that did come by for help. I was always happy to see someone that had obviously tried to solve a problem but was stuck or didn't understand. Go see your professors outside of class, they will be far less scary after you get to know them. Eventually, you should get to know two or three of your professors well enough that they can be of help when applying to grad school or when looking for a job. They may be able to help you get an internship or real job during the summer. If you have a question about something that comes up in lecture, sometimes you can get a quick clarification by just walking with your professor after class on the way back to another part of campus.

Sadly, books are very expensive. I've frequently used my text books after the course is over, so I don't recommend renting books. Used books are often almost new so I recommend keeping your books and saving money finding used books in good condition (make sure they are up to date). I have found few CS books that are as good online as the hardcopy books, so I recommend hardcopy books.

Team projects will come up in every CS program I've heard of. I hate these. (1) don't trust your teammates to get their work done on time. (2) don't trust them to turn the project in on time, (3) don't trust them to do their part correctly. So, start early! Give yourself time to straighten things out if you or your teammate doesn't get their part straight. If you have given yourself time, you can recover.

You are probably one of the best programmers amongst your peers if you are planning on going into CS. I was like that. There will be a great temptation to produce a fancy, faster, better, more feature-full solution in your programming assignments. That's a great goal, but remember, when programming, things will take longer than you anticipate. So in addition to starting early, make your goal the simplest program that will satisfy the requirements of the assignment. If you'd like to do more, add it at the end if you finish early. Don't add optional features at the beginning. Get the assignment done in time to add additional features at the end. For example, if the assignment is to write a program that will play legal chess moves, make your first goal a program that plays legal chess moves. Once that works perfectly, you can think about it making good moves.

If you can swing it, get yourself a second monitor in addition to the laptop you are likely planning on using for college. Having your work spread out on one screen and the assignment or java or python library documentation open on the other screen really helps. Don't program with social media open. Don't have your laptop open for lectures. So many students do it that it is widely accepted, but studies clearly show that hand written notes during lectures results in better retention and better grades.

Something you can do this summer is if you don't touch-type yet, get one of the touch typing games and learn touch typing. Just learn the standard US keyboard layout--don't bother with alternative layouts like Dvorak you will have to use other people's keyboards or keyboard in the library or in the computer labs and they will all be the standard US keyboard layout.

In college you will have to write some papers, for CS you may have to use LaTeX. This is a very old, but very good program for writing academic papers. Almost every serious paper in CS or Math or Physics is written using LaTeX instead of MS Word. Unfortunately, LaTeX is hard to learn. So, if you want to, try learning LaTeX. There are lots of free resources on the internet. Because it produces professional results, lots of the information is very technical and applies more to people writing math books. However there are simple tutorials and you can get by with a moderate set of features to write college papers. If you look at LaTeX and it looks like something you would rather not learn this summer, try a tool called markdown. There are free markdown programs available and you can write nice papers using markdown as long as they aren't too complex.

In addition to LaTeX or markdown you will need to get comfortable with a text editor of some kind. Emacs is free, old, has hundreds of built in commands, uses weird keys for things, and can do absolutely anything. Vim is also free, old and weird, but more programmers use it and it is very powerful. More modern alternatives, that you will be able to pick up faster because they do less and are not weird are Atom and Sublime Text. Each of these has it's advantages, I like Emacs. Pick one and start using it for your programming. You will eventually have to start using a professional text editor, one of these four will be fine. See [1] for a professor's Emacs lessons for his students, but there are many other YouTube tutorials on Emacs and these other editors.

[1] [https://www.youtube.com/watch?v=49kBWM3RQQ8&list=PL9KxKa8NpF...](https://www.youtube.com/watch?v=49kBWM3RQQ8&list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg)

<comment><USER8> My university was very accomodating when it came to code that didn't produce correct results, especially after first year. If your code looked close (e.g. the algorithm was fundamentally correct but you had an off-by-one error or your output formatting wasn't correct) they were generous with handing out part marks.

I never had to learn LaTeX for my degree either, and I don't think I ever had to write more than 2 pages of anything that wasn't code.

I feel like my university had a much more vocational feel to its CS degree than a others, they didn't have much focus on academia and preparing people for doing postgrad at all. I think it was almost discouraged.

</comment></comment><comment><USER23> Be mindful of your program's retention rate. My first CS class has a very bimodal distribution (this is common in CS classes), and about half the students weren't in the followup class next semester. We lost another third after that semester. The engineering program at my school was run similarly-- only about a third of students entering the program would graduate with an engineering degree.

Not every school is run like this, but it's something to be aware of.

Don't immediately freak out if you get a 70% on your first Physics exam. A lot of science and math classes are graded on curves, and professors don't want to see too many (or any) perfect scores. I had one class where 25% was the lowest passing score on an exam.

Especially at research universities, professors are often more interested in research than teaching. Even when it's not obviously that bad, they're worse at teaching and care less than the average high school teacher.

Try to get out and have some fun.

Also do something that's somehow very different than programming. I majored in CS, but got three minors (two in liberal arts), and even found time to take a golf class and a scientific glassblowing class. But even intramural sports are good.

<comment><USER24> How did you have time to get three minors? I got a 4 year business degree from a liberal arts college, and between the business school requirements, the major requirements, and the gen-ed requirements, I had maybe 2 open elective slots. And this was even with AP course waivers.

<comment><USER23> The CS courses got me half of the way to a Math minor, well-planned GEs did the same for English and History minors. Then I had a heavy load my last semester to finish them up (with one last CS course). I think I was two courses from an electrical engineering minor, too, and I did this in 8 semesters.

</comment></comment></comment><comment><USER13> Learn to meditate, find a sport that you like and do it regularly, take a class on how to learn (Coursera has a good one "Learning how to Learn"), and take a class on how to take good notes. You might also want to study up on personal organization and personal finance.

WRT study groups, YMMV. I found them incredibly stressful and counter- productive, but other people really seemed to like them. Eventually I actively avoided them.

Start your projects as soon as possible, and then put them aside. You'll come back with new eyes, but your brain needs time to chew on it. Sadly, I think a lot of college courses go too fast, and sometimes you'll have an "aha!" moment months, or even years later. Not sure if there is a solution to this.

Love is almost inevitable, and is almost always a huge disaster for everyone. It's possibly an even worse impact on study than video-game addiction. I would say try to avoid love, but honestly its wonderful. But if you feel lonely, feel lucky that you're not either distracted or heartbroken.

<comment> codemonkey-zeta Whoa, harsh take on love, but I understand it. I met the love of my life during my freshman year, and though there have been times I feel my focus and productivity suffered as a result, I would not have it another way. Love, and even heartbreak, are such fundamental and enriching parts of human life that I really think they are worth sacrificing for.

I can get past distraction. I still code don't I? I still learn. But to eschew love for fear of heartbreak is cowardice.

"Far better is it to have a stout heart always and suffer one's share of evils, than to forever be fearing what may happen." \- Herodotus

<comment><USER13> I didn't recommend to "eschew love for fear of heartbreak" though. I was really trying to ease an FOMO he might feel if he doesn't fall in love in college (which is pretty common, too, especially among the nerdy set, or at least was when I went to college in the 90's).

<comment> codemonkey-zeta I did not read your last paragraph that way. With this explanation I totally understand your advice now. I had friends who seemed dead set on finding a girlfriend as priority number one. I even had multiple friends express their jealousy to my face that I had found a person to love and they hadn't. I wanted to smack those friends and say "just live your life man! There's nothing stopping you from being happy except yourself."

The FOMO is real and I think your advice is great.

</comment></comment></comment></comment><comment><USER25> "Real life has no curriculum".

~80% of what I've learned vocationally, came after school, under the informal mentorship of seasoned practitioners.

Arguably the #1 exportable skill you gain from college is metacognition - learning how to learn. So that the next time you find yourself staring into a "I have no idea" moment, instead of being stuck, you'll be able to iteratively expand your mental map of the territory; form and test hypotheses; sketch out needed or missing tooling, etc.

<comment><USER25> i.e. remember this when you find yourself deep into some "am I ever going to really need this" curriculum. Directly, probably not. Indirectly, you are rewiring your neurons for generalized problem solving to the nth degree.

Also, this "missing course": [https://missing.csail.mit.edu/](https://missing.csail.mit.edu/)

</comment></comment><comment><USER26> 1\. A large (and growing) chunk of the industry considers object oriented programming to be absolutely terrible, but that's what they'll teach you in college. Learn functional programming and data-oriented programming in your spare time before your mind has completely set into OO. Make each of the three approaches intuitive. It will be way better for you down the road, and it will help you actually evaluate which approach is best. There's a lot of dogma on each side.

2\. In my opinion it's cliche to say "social skills are more important than just the ability to program". Totally depends on what you're actually doing. If your job is to optimise server farms, they're going to pay you based on how many CPU cycles you save, not your ability to present to management. If you measurably reduce power consumption, you could be completely mute and it would be fine. You'll earn crazy money.

Play to your strengths. If you have poor social skills, find a niche where that doesn't matter. A good heuristic is whether performance is measurable. If it is, it matters less that you have trouble communicating it.

3\. "Minor in Something Fun" is common advice & fine if your degree was cheap. It's _terrible_ advice if you're going into $150k of debt. If something goes wrong in that situation, you're screwed. Minor in something that you can fall back on.

What if you develop RSI and lose the ability to type large volumes of text? That's the point of a minor, it's a backup plan. Life is unpredictable, when you have $150k of non-dischargeable debt it's much better to have a minor in "engineering" than "ultimate frisbee".

<comment><USER27> > What if you develop RSI and lose the ability to type large volumes of text?

4\. Never ever let an employer work you to the point that you get RSI. Let them fire you first.

5\. Ditto your mental health.

6\. Learn to say no.

<comment><USER28> Man I wish preventing RSI was this simple. I have had growing RSI issues for nearly two years now and I just don't know what I can even do to stop it..

It isn't just using computers; so many things require using my hands. Reading a book causes it unless I use a stand, writing on paper causes it, using a phone causes it, cooking can cause it, sometimes I even get it from using knife/fork when eating.

When RSI is causing me trouble, I just can't do anything at all besides taking a walk or watching a movie, and sometimes I just need to _make_ something.

I've started to learn voice control software for my computer, but it is going to take a lot of practice and configuration until I can be productive this way.

</comment></comment></comment><comment><USER29> HN is probably the worst group to ask for advice. Most people here take their careers way too seriously.

You'll notice that most people here are telling you to do some specific set of actions but few of them overlap significantly. That's because there aren't "right" things for you to do. They're just pushing their biases on you.

I'd argue that you just take it easy and do whatever makes you happy. You can definitely still be successful that way.

I just finished my CS degree from a no-name state school with a below 3.0 gpa. But I still found a job making six figures (really good pay for my area) before I graduated. I attribute most of my success to the various pieces of software I wrote for fun. Just little things on my GitHub that helped me land a couple of internships.

<comment><USER30> 'Take it easy' seems like terrible advice. A computer science degree is the foundation of a tech career.

The opportunity to build a solid foundation shouldn't be squandered, even if you aren't planning on being a workaholic careerist. A strong degree opens doors.

<comment><USER29> You're totally entitled to feel that way but I personally think the social pressure to work yourself harder than necessary is just plain wrong. I know that's not a popular opinion here and that was my point.

I met so many people while earning my degree that were stricken with anxiety about making the "wrong" choices. Often times these people ended up suffering by spreading themselves thin and ultimately accomplishing less than they would have otherwise.

</comment></comment></comment><comment><USER31> > 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.

<comment><USER32> > 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.

<comment><USER31> 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.

</comment></comment></comment><comment><USER33> 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.

<comment><USER34> 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.

<comment><USER35> My university gives certain faculties a certain number of pass/fails for this very reason.

</comment></comment></comment><comment><USER36> You already have skill and hopefully passion in one discipline, use college as an opportunity to explore a different one, and get an edge up on your peers. Don't major in CS, major in something else that you care about for its own sake, even if that doesn't come with an especially marketable degree. You'll probably want to take classes from various disciplines to see what really drives you.

You'll want to do something that demonstrates that you have good coding skills. Try to get a part-time programming job or internship, or get involved with an open source project, in particular one that's likely to be used at companies that might hire you. You should also make sure that you pick up the fundamentals that you would learn in a CS program that you don't already have. Make sure that you know how to teach yourself math independently. Maybe pick up a Math or CS minor.

I took roughly this path with a Philosophy and Math double major from an average school and started working at a FAANG the Summer after I graduated.

<comment><USER37> I absolutely agree. I have a degree in Business Economics and got a job as a software engineer within 6 months of graduation. I started in the tech support help desk of my university, followed by a programming job within the school. I used that job to get a job doing automation for a large corporation and then got a job engineering for said company. No ragrets

</comment></comment><comment><USER38> For your non-CS electives - fill them up with classes that are much easier to learn in a college environment.

If there is an intro to law class (preferably one meant for non-lawyers, for example Intro to Business Law), you may find that useful.

Take 1 or 2 business classes. It doesn't have to be a minor or double major - just the basics of marketing, finance, economics, and entrepreneurship.

Get better at "presentation" \- speaking and writing. Public speaking (or debate) would be helpful. This could be an extracurricular like Mock Trial, it doesn't have to be a class (though if one is offered and fits in your schedule, that could be great).

Oh. Machine Learning. Make sure you know the basics of it, even if you don't want a job in ML.

</comment><comment><USER39> Math.

When I was a TA, the kids who struggled were most hurt by calculus.

The other thing is read up on how to do the college game. Participate in office hours, understand what drives your grades, etc. I had a hard time with this, as I was able to coast through high school with minimal effort.

</comment><comment><USER40> Most people already covered that it won't be easy and you should take a minor/second major in a non-related field.

But I'll add one more. Try to take a class from a famous professor outside CS. Usually they will teach a class that meets a gen Ed requirement.

I took a Poly Sci course from a famous professor at Berkeley, and it was great! It was like going to see a show twice a week. And some of the stuff he taught still sticks with me today. He predicted exactly what would happen in Iraq when Saddam was removed from power, six years before it happened.

My wife got to take Astronomy from a famous professor, and she really enjoyed that class too and learned a lot.

</comment><comment> daniel-thompson 1\. Don't worry if you don't get something immediately. Unless you have an IQ of 250, then perfect, efficient, bug-free code will not spring from your fingertips on the first try. That's OK. Get something that kinda-sorta works - even if it's bad - then dial it in piece by piece.

2\. Every programmer discovers topic they like and topics they don't like. These are different for everybody. It's hard to decide to spend time on things you don't like, but that's the only way you'll get good at them. Don't avoid hard things - plunge into them. It'll suck at first, but if you put in the effort it will almost always be worth it. Once you've developed a deep understanding of a topic you were dreading, it's not going to seem as hard to you as you thought it was.

3\. Learn what it takes to get other people to understand your ideas. Calibrate the technical content to your audience's level. Always start by giving background & context. Ask your audience if what you're saying makes sense to them.

4\. Differentiate yourself from the "full-stack" devs who have infested our industry like a plague of locusts. Understand how the machine works. Take an architecture class, take a compilers class, and learn at least one native/unmanaged language (preferably C).

</comment><comment><USER41> > I'm more interested in knowing what I should do now to give me an advantage > in getting a job or otherwise.

Always stay curious, challenge yourself, and have fun.

Take charge of your education, talk to your professors during class, visit them during office hours, interrupt the class to ask questions when you don't understand. I was always scared to be noisy in public, but finally discovered in a grad school math class that when I didn't get it and I spoke up, other people in the class would thank me later because they were in the same boat, and I learned faster.

Try to find an undergrad research project.

Do an internship between junior & senior year.

When you're a senior, start researching which companies you like. Read about job interviews and how to do well. Practice some job interviews! You'll be ahead of the majority of applicants if you do any practicing at all. Learn what companies want. (Hint: superior coding skills often aren't the top item in their list.)

Also, exercise (I'm not kidding, it doesn't matter how, but this will help your CS career, your life, and your job prospects.)

</comment><comment><USER42> A lot of the advice so far is general "what to do in college" type stuff, but to specifically address the OP's question, "what should I do now (entering a CS program) to give me an advantage getting a job"? It's a pretty shortlist:

1) Work on projects that matter. In college this would mean finding a professor who does research, and working your way into the lab. It could also mean building apps for friends, or helping out in open source. Just solve problems you think are important, and where the solution is visible.

2) Get good grades and take an academic approach to classes. Don't grade grub or complain, just try to learn.

3) If it hasn't happened during the above two tasks, make sure you learn a toolchain that is similar to the industry workflows people are using with source control, testing, deployment, et cetera. You don't have to do this, but it will be easier to hire you into jobs using X if you have used X non- trivially.

4) Look hard for summer internships, and if you can't find one you like, do a part time project over the summer.

Good luck!

</comment><comment><USER43> This is more of an aside, but since you've been coding for some time, please understand that concepts you already know need to be taught to those that do not. Concepts like a nested loop are often one of the hardest initial hurdles for many students. Your first CS courses will spend a lot of time on these types of concepts.

Please be patient and not become annoyed with how "slow" the class is going. Students that struggle with that first hurdle will continue to struggle as the class moves forward [1]. I would say, if you pick up or complete the homework without any issues to reach out to your peers and offer help. You don't need to share code, but something like a small whiteboard to explain concepts would be good.

[1] [http://www.ppig.org/sites/ppig.org/files/2014-PPIG-25th- Ahad...](http://www.ppig.org/sites/ppig.org/files/2014-PPIG-25th-Ahadi- Lister_0.pdf)

<comment><USER44> Building upon tsumnia's reply...

In my CS101 class students were penalized for skipping ahead. Remember that the instructor has put thought into how to sequence the course material. Follow the instructions for assignments. Focus on demonstrating what has been taught in lectures & do things by hand the long way before jumping ahead to use an advanced technique that saves time.

If you get done with an assignment early, consider putting time into formatting your output or improving the user experience (just as worth while for programs that run in a text-only terminal).

Go to office hours and get to know the professor. If you do well in the course, the professor may offer opportunities to get involved with research or even get paid to help with the course in a future semester.

</comment></comment><comment><USER45> 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/](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...](https://www.cs.cornell.edu/jeh/book%20no%20so;utions%20March%202019.pdf)

</comment><comment><USER46> 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.

<comment><AUTHOR> 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?

<comment><USER47> 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!

</comment></comment></comment><comment><USER48> 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.

<comment><USER49> I did 4, but the people OP will want to be compared with will have done 5 or 6. 2 is a bare minimum.

</comment></comment><comment><USER50> You squander a big benefit of going to college if you focus solely on academics.

This is one of the only times in your life you will have a ton of free time and proximity to a bunch of smart people your own age. Don't pass up an opportunity to do something fun, just because it doesn't have anything to do with school!

</comment><comment><USER51> CS undergrad will teach you principles and fundamentals, but won't teach you much of anything about actually writing software. Make sure you learn practical skills, like organizing large projects, deploying, scaling, tools, etc. You'll be exposed to some of this, but I've never met a CS grad who could hit the ground running unless they'd already been working as well. Get internships as early as possible. Work on large team projects and learn some structured planning and estimation skills. Learn Unix deeply. Don't skimp on the math and statistics, because while you might not need it for a decade (or ever), knowing math opens a lot of doors (NASA, finance, machine learning, and also general utility).

</comment><comment><USER52> Go to your professor's (for any class, not just CS) office hours whenever those hours _aren 't_ in demand (e.g. they are often in demand right before a midterm, so go other times).

A college degree is _expensive_ and one of those things you pay for is to have several subject-matter experts who are required to talk to students about their field of expertise for an hour if any students show up. People complain that being an SME doesn't necessarily make you a good teacher (which is 100% true) but one-on-one (which happened at least once per semester for me for any class with less than about 150 students), they usually _love_ talking about their field of expertise.

</comment><comment><USER53> 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.

</comment><comment><USER54> Do you know how to study?

No, I mean really? Was high school easy? CS won't be. Your math classes will force you to think in a new way, unless you had a very proof-oriented math education, which is exceedingly rare in the US.

A significant number of the smart kids that land in freshman engineering are smart enough that they never had to study in high school, and therefore never learned how to study hard things, on a deadline. A good number of those smart kids wash out, not because they aren't capable, but because they just don't have the study skills. Don't be that guy.

<comment><USER55> I'm not sure whether my math at HS was good or during my higher edu it was shitty, but what do you actually mean by "think in a new way"?

I don't see big difference between e.g math analysis in college and advanced math in HS. Except ofc complexity of concepts and tricks used there.

Only graph theory looks relatively different to that.

</comment></comment><comment><USER56> If you are not struggling academically, you can learn more by taking higher level classes. Talk to your advisor about balancing this.

Learning applied subjects is easier than learning theory, so make the most of your limited time with the professors by learning the most amount of theory.

But most importantly, go out. Find friends from as many departments as possible. Get into mamy clubs (you can just drop the ones you don't pike later). Much of the personal growth from college comes from being exposed to different perspectives, so don't miss out on that.

</comment><comment><USER57> 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.

</comment><comment><USER58> I majored in math with a minor in CS, now working as a software engineer. My favorite courses in university were a "World Regions" geography class (the professor was amazing and famous at the university) and "Morality & Justice" in the philosophy department, both non-CS non-math elective courses I only took to fulfill requirements. Maybe not the most practical advice, but don't be afraid to branch out of the CS bubble as you'll likely end up as a software engineer regardless, but university is a once in a lifetime thing (sure you can go back, but you probably won't want to once you're making money).

Also university is by far the easiest place to make friends (future connections) and date. Once you graduate, it gets way harder to meet people, and if you work in software engineering you're surrounded by men all day, so if you're a heterosexual single man it becomes significantly more difficult to find a potential partner. Take advantage of this by being proactive, outgoing, and joining clubs / pursuing activities.

In terms of getting a job, the best thing you can do is to get internships. Getting internships is basically just about having a high enough GPA to pass the resume screen, ideally having some side projects or some kind of experience (nobody's going to expect much from an undergrad), and passing the interview.

Good luck, and have fun!

</comment><comment><USER59> 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...](https://blog.torchnyu.com/2020/03/04/take-fewer-cs-classes.html) [2]: [https://blog.torchnyu.com/2019/12/19/sent-from-my- iphone.htm...](https://blog.torchnyu.com/2019/12/19/sent-from-my-iphone.html) [3]: [https://blog.torchnyu.com/2020/05/15/the-case-against- double...](https://blog.torchnyu.com/2020/05/15/the-case-against-double- majors.html) [4]: [https://blog.torchnyu.com/2020/05/14/do-you-like- it.html](https://blog.torchnyu.com/2020/05/14/do-you-like-it.html)

</comment><comment><USER60> 1) Care but don't care too much about your classes. Job recruiters and interviewers don't care much about what you specifically take, but they like seeing a CS, math, stats or physics degree. Shoot for 3.2 (maybe just 3... opinions vary) to 3.5. My school had options to do a BA (fewer hard requirements) or BSci (more hard requirements) in CS; in hindsight I would have just taken the BA. I think no one (or at least no one I think is important like FAANG or other bigco's) cares about the distinction, just get a bachelor's degree. Point is to give yourself some free time to enjoy college while also making sure you have a good GPA.

2) That said... you should still work on a technical pedigree. So put some time into each new field you discover (ie webdev, cybersec, systems programming/lowlevel stuff, machine learning, or other fields) to see what you like. Exercise your curiosity and imagination. As long as you land good internships and finish college with a few interesting projects to pad the resume, it should be very strong once you graduate.

3) I have no good advice for landing internships at top tech companies (FAANG) but you should shoot for one every summer, even freshman year (yes, getting to FAANG is doable in freshman year). At least do it for the shiny company name on the resume. Good prep would involve some combination of project work (in or outside of class... maybe a group project?) and the typical prep like algorithms.

4) Have fun and be social in college. Go out and do shit with your friends. It'll build your soft skills.

</comment><comment><USER61> 1\. Get to know your TAs and professors. This is important... Knowing how to ask for help is important. Make sure you prepare and walk through the steps you went through to assess any problem and where you are stuck.

2\. Enjoy the college experience. Join some clubs. Make friends from different walks of life from you. Take time to socialize.

3\. Treat school like your job. If you don't put effort into it you won't get anything out of it. Don't procrastinate if you can avoid it. Good habits now will pay off later in life.

</comment><comment><USER62> Hey there! Fourth year CS Major here. Great news that you're not worried academically. But as someone whose also been coding for a long time, really be careful to not get blindsided. I got very screwed over from that mentality -- like, knowing C still didn't guarantee an A in a C class. That kind of thing. In no particular order: \- Get social! Make friends. You'll need them when college gets hard and they can be invaluable for the rest of your life. Student clubs and hanging around the CS building are great ways to do this! Also ask around your dorm for fun things to do. Don't be afraid to try new things! \- PROJECTS. INTERNSHIPS. Your first internship will be nearly impossible to get no matter how good you are unless you get very lucky. It takes a lot of determination: keep at it! Best way imo is to do projects outside of class. Also, in terms of a tech stack, something ppl like and get REAL GOOD over time. Note that certain internships are much harder to find than others; iOS and Backend in particular. \- As a former dual degree seeker (BS CS and BM Music composition) I'm biased, but definitely take classes outside of CS. I took around a year of non CS classes and I have NEVER regretted a single one. (Maybe chemistry.) Things like economics, music theory, intro to law, philosophy -- these are what will pay dividends later on in your career in totally unexpected ways. \- Embrace chaos! And embrace change. Think of college as your time to try shit out and fail. If you fail... so what! Get good at getting over failure. Invest in yourself and figure out what you want to change. \- Finally, please dear god have fun. And truly best of luck given Covid!

</comment><comment><USER63> When I went into uni, I thought I was the shit. I had also programmed and done client work for a few years before that and had a lot of real-life work experience. What I didn't have though, was patience and the ability to sit through and do the work. The first two years I scored full marks on everything and I had basically already done work projects that I could directly apply for all of my course work. When I ended up in more advanced classes, despite already doing very well academically, I was totally and utterly lost. I struggled for a few years, barely finishing classes and dropped out.

I went into the work life and did very well considering my lack of degree and continued working for some 6 years or so.

What I'm trying to say is that even if you know programming, you might lack specific pieces of knowledge or a certain way of understanding concepts if you haven't had formal education before. You should do the work and clear even your 101 courses diligently. I don't know what the opposite of imposter syndrome is, but it'll be your undoing if you let it.

Now, at the age of almost 29, I'm a freshman at another university and I've finished my first semester with full marks, but instead of coasting along and doing the minimum I can foe the grades, I actually learned to value the process of learning and doing instead of just caring about creating the necessary work I need for the classes.

I have no idea if this resonates with you at all, but you're always welcome to hit me up if you have any questions. I've done a lot of different work in the IT sector and will gladly share my takeaway with you.

</comment><comment><USER64> Know that you should probably take this year off and just take classes on Udemy, because the classic universities really don't know how to teach classes online yet.

</comment><comment><USER65> 1) Consider taking a year off before you start to build things on your own -- I regret not doing this, and I don't know anyone who took a gap year and regretted it. If you've already gotten admitted, you can probably defer, especially given COVID.

2) Start showing up to grad classes, research seminars, and lab meetings from day 1 -- the experience of understanding, analyzing, and critiquing cutting- edge research with the help of grad students and professors who know what they're talking about is the most valuable intellectual experience research universities have to offer, and you shouldn't wait till later in undergrad to start.

3) When you find people you want to spend time with, actively make time to do that. Organize events to bring your friends and other interesting people together in a low-pressure social environment.

4) Look for people to work with whom you trust implicitly to (a) have your back and (b) make progress even when you're asleep.

5) Learn how to write by writing a lot and posting it publicly -- college gives you a built-in audience and lots of sources of constructive feedback.

6) Ignore what people think of you to the extent possible, and take more social risks than you're comfortable with.

</comment><comment><USER66> Depending on which University you go to, it may have a well oiled recruiting machine that funnels you into a few firms. Regardless of whether you want to work at these firms or others, you want to network as much as possible with upper classmen. They're the ones who have interned/will full time at these firms, and they're the ones that will pick your resume out of a pile.

Contrarily to w/e narrative people will tell you:

1\. Most college junior/seniors look similar on paper. Especially after they do some GPA cutoff.

2\. The recruiting process is a lot more about "fit" than you realize. The amount of "are you my kind" that goes on is more prevalent than you'd think. They can't admit to this of course. So a senior who vouch for you will go very far.

General advice: open your blinders and really get to know your classmates and professors. If you go to a to research school, your professors will often publish/collaborate w/ people on the R&D side of Google, Microsoft, etc. These jobs can be very differentiated, but the pipeline into these roles go through these professors. They do not go through your university cattle call machine.

</comment><comment><USER67> There is no speed limit. I wish I read this when I was younger:

[https://sivers.org/kimo](https://sivers.org/kimo)

I breezed through university and I could have made so much more of it if I'd just self-taught from the textbooks and started grappling with papers in my undergrad. Once your foundation of mathematics and CS is stronger than your peers you'll find so many doors open to you.

</comment><comment><USER68> A lot of great advice so far.

Right now, you don't need to know stuff. The point of college is to teach you stuff. You need to know _how to learn_ stuff.

Young programmers can get used to solving a problem by alternating between typing code and googling until it goes away. No, expect to use your brain on a different level. Be prepared to sit down with a pen and paper and just _think_ for a couple hours. To be stumped, and ask others for help. To spend time with textbooks and lecture notes trying to figure out what they mean and how they empower you to solve your problem. To be humbled, to have bad grades or struggle sometimes.

Find ambitious, excited, positive people with similar goals to yours. Help each other succeed. I agree with joining an ICPC team as soon as possible.

Many people don't question the standard course progression, but a college path is very customizable. Ask advisors or professors how you can do more. Sometimes you can take a graduate version of a class instead of an undergrad version. Make sure you get the math prereqs early and really nail those classes, don't just go through the motions.

</comment><comment><USER69> Lots of good advice in this thread about paths to learning in CS, etc. Two huge items for a software development career I haven't seen (near the top at least) and I don't know if are covered in college these days (they weren't for me):

1\. Learn version control. Work towards becoming adept at the different things you can do. Pick git to start.

2\. Learn overviews of various development methodologies - Scrum, Kanban, Waterfall, etc. Just the basics of the process and terminology.

Your git-fu could save you when working on projects for school, learn to incorporate using it as you do work. Knowing project management terminology will help you at least be conversant about these during interviews for internships or jobs after. You won't be in charge of what methodology a company uses - learn trade-offs for them all.

If you find the deep CS curriculum hard and wonder why you would care about compilers, assembly, etc. if say you want to be a web developer: they all help teach you how to think like the computer. When some new fad language comes out, the basics are still the same - processors, memory, disk, IO, etc.

</comment><comment><USER70> \- Find your school's computer club / computer society / IEEE-CS / etc and join it. If it doesn't exist, create it. Try to apply for a leadership position on your second year. Use this opportunity to engage with local businesses or run events.

\- Try to spend time with people a couple years older than you. The people you meet in college and make relationships will probably show up later in your life in unexpected ways.

\- Study hard and go to office hours. Listen to professors and try to catch them outside of class. Find out what they're most interested in.

\- Learn about many parts of CS, not just coding java applications. Learning linux and stuff covered in the "MIT Missing Semester" will help you so much.

\- Have some fun, go to parties, get in trouble once or twice. Try to make memories and stories you can tell your kids.

\- Join some club completely unrelated to engineering -- philosophy club, conservation club, dance, etc. You'll be seen as a boring person if all you learn about is CS. Go to some film screenings, attend protests, do toastmasters, and read some interesting books.

</comment><comment><USER71> In my CS undergrad, I took a few ethics courses, one in the CS program and one in another discipline (Mass Communication). I recommend something like this.

I also suggest looking into CS coursework you anticipate disliking. I had no desire to learn about compilers and languages, but I took a rudimentary introduction course and it turned out I enjoyed the topics significantly.

</comment><comment><USER72> Do some opensource work, from fixing typos, to small bugs. Go to <yourprogramminglanguages>-meetups/events, and talk with people there (if someone needs a coder for <yourlanguage>, and they remember you from there, they just might call you). If you have enough free time, try getting a student job (even on campus) that has you doing programming related stuff.

Also, use github! Need a script to do some random task? Publish it there. Made an android app, to show you (or post, or whatever) some crap... publish it! Script to create a single page gallery of your instagram feed? Post it!

When i worked in larger companies, and also had to read CVs and give my opinion on students and fresh graduates (I hated that), I always prefered someone who had a github profile full of random scripts they wrote, no matter what their grades were (because they were lazy and decided to automate stuff, and that's always good), than someone with great grades and not a line of code to be seen.

</comment><comment><USER73> For school: Get enough sleep, especially before exams. Work practice exams. Turn your work in on time (even if it conflicts with #1.) Take interesting classes outside your major. Go to office hours and get to know faculty members and grad students. Cultivate interests and extracurricular activities outside of CS.

For getting a job: get a campus research (or other) job during the year; take project courses and put the projects and skills on your resume; join github (and learn to use git) and upload code you wrote; contribute to open source projects (also consider Google Summer of Code possibly); do hackathons and "programming" competitions; build your own web site; apply for summer internships (and/or research programs if you want to go to grad school); apply for scholarships and awards if you can.

As another idea, writing an app and getting it into an app store could also help you with getting a job later on, and it could even be a job on its own.

</comment><comment><USER74> College is a place to learn social skills as well as technical skills. 75% of your effort should go to technical college work, 25% of your effort should go to socializing. Conversely, 75% of your leisure should go to socializing and 25% to non technical yet brain stimulating work.

I shouldn't have to state that this rule is better taken figuratively than literally.

</comment><comment><USER75> If the country is not stated, then it is presumed to be the US on HN? This advice is from another country, so check if it applies.

Take math extremely serious. I was TA for the math 101 module and out of 240 students, 140 registered for the exam with less than 40 passing. The big problem was complaciency. In the tutorial consisting of 20ppl students were probably ranking themselves, so I believe the thinking went like this: "well as it looks I am as good as almost all the other fellow students around here, well, maybe except these 4 guys in the first row, they seem to play a different game, well nevermind" Only these 4 mentioned guys passed. This is surprising for them, since in high school only the worst students failed. If your college forces the distribution to a bell curve, then nevermind (but still the math at uni is a different game). Actually what we saw in the exam results was a double peaked curve.

</comment><comment><USER76> Pick one programming language and learn the hell out of it.

One way of deciding which language to choose is by surveying the top ten languages over the last 5 years and comparing it to the most common language most of your courses will be taught in. If your school is teaching Pascal or COBOL, the survey of relevant programming languages will help you avoid making the mistake of learning a "useless" language.

Then pick a nice tome, (I personally use the Deitel series) and just go through it faithfully for the next few years of college and after until - <USER2> this is the important part - you complete it.

You want a book with complete examples - not snippets of code. You have to type out these examples and have it run. This works in the skill of being able to write complete code of up to 200+ lines without breaking a sweat. A very valuable skill to have going into your senior year and the first few years of work. You don't want to learn this on the job.

Learn the fundamentals of the language(loops, conditions, etc), learn data structures and algorithms and then learn to create GUI applications. Learn networking and databases. Learn everything in that one language. Again it's important that you pick a general-purpose language to learn. You are not picking a language for its speed or unique characteristics, you simply want a language in which you can do everything.

And after all this learn to make simple games in that particular language or any other broad projects that you find interesting. I recommend game programming because it usually brings every part of the language together in one application, helping to keep your broad skill set sharp.

I'm also going to throw in a schedule you can use. Ideally aim for one week to complete a chapter, meaning a minimum of 2 hours every other day within a week. This weekly consistency will probably set in after your first year but if you stick to it, I can promise you from personal experience that you will master programming.

</comment><comment><USER77> Join a social club - could be organized around an academic interest or purely social, but try to find one that has a large, active membership that includes upperclassmen. These are the people that will help you land a good internship and eventually a job if you don't already have a good network.

Don't count on a job fair.

Do a significant project, start a startup, or internship each year.

If you do a project or startup then do not do it alone. Find a cofounder/collaborator to help you make it bigger and better - could be another CS person or someone that brings something else to the table - design, marketing, sales.

Don't do an internship at a startup - do one at a big tech company if at all possible. Pay and perks will be better, better for your resume, more likely to convert to full-time offer, and in my experience will show you all the things you don't want and then you can enjoy startups that much more :D

<comment><USER78> Start a startup every year? How is that remotely feasible? Where are they getting this money and time from?

My advice to you would be to study hard and try to get decent grades. Work hard, network, go to all the Comp Sci professional organization meetings you possibly can (I think ACM) and ask every presenter from industry for help getting your first internship. Don't join any clubs or fraternities that will suck away your time and cause your grades to drop, but if ACM sponsors a competition, give it a go if you have the time as it will give you something to talk about with recruiters. Upperclassmen can help to get you internships too if you're serious (sometimes previous employers will reach out to them for new interns). It doesn't hurt to have something unique on your resume that all your classmates don't also have. If you can get some free certifications online or even experience with things other freshman/sophomore don't know about, but are crucial to modern businesses (SQL is everywhere) than that helps.

It's really hard to get an internship without any previous internships, but once you get one and can talk about it (provide references), you become less risky to potential employers, and it is much easier to get the second one. It's kind of the chicken and the egg problem. I once tried to get an internship at a company that I was uniquely suited to for a lot of reasons and it just so happened to have a headquarters 1/2 mile from my parents house. I sent lots of emails, knew all about their company, and was waiting to speak to them at career day and at professional organization meetings, but they kept hiring this one very questionable student in his 6th year still taking sophomore classes (weird situation). I was really interested in a certain industry though and an older girl (junior) gave my name to a company that asked her last minute for anybody interested in this niche field. The rest is history and it's been great since then, so keep your head up.

When dealing with employers, dress nicely, be humble and friendly, but confident. Persistent, but not annoying :).

</comment></comment><comment><USER79> 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)

</comment><comment><USER80> My advice is to keep in mind that CS doesn't directly get you a job. Software engineering (e.g. coding on a project) will get you a job.

Thus, it's important from day 1 that you work on projects, whether it be a project at a company you work for during school, or a project for your own personal interests or portfolio. Do some tutorials online, explore some languages and IDEs that pique your interest - make sure that you dedicate whatever time you have outside of school to this.

What CS does give you is the abstract theory that allows you to be a _great_ software engineer. The more you code, the more you'll appreciate the abstract concepts that comprise CS. And if you're coding from day 1, you'll explore the implementation of some of the CS concepts you've learned, which will truly make you love CS!

</comment><comment><USER81> 1\. Is your college a CS focused degree or a software engineering focused degree? 2\. With the possible exception of Physics, I've found that CS programs are the most time consuming. Programming just takes a lot of time even if you know exactly what you're doing. 3\. If you work on coding side projects, one complete side project is more impressive than a dozen half completed ones. Don't worry if the code is terrible if it works and you can demo it. People will have low expectations and just be impressed with its functionality. 4\. Your degree is a checkbox. Your GPA is a threshold to get past a filter. A 4.0 is a flag, not always a good one. Enjoy life, experience other things and domains, don't focus solely on school.

</comment><comment><USER82> Most of early CS is struggling through math. Take the courses, but I would recommend you look into Khan Academy or some other mastery-based tutorials (mastery is when you acre able to answer enough questions with accurate answer, only then do you move onto the next section). If you assume that just because you got a C that you can forget a topic (especially the early concepts), you will get bitten later.

Make friends with other students in your department. Engineering students tend to forget that humans are valuable resources, just like computers are.

Lots of programming (not necessarily CS) is "learn by doing". You will need to spend time struggling with a compiler/interpreter -- you can't substitute this by reading a book. You are lucky that they are much more mature and at least a little more user-friendly than when I started. Finding enjoyable programming projects which are not too easy nor too difficult will help you hone your skills/craft.

I would highly recommend you ignore your "cowboy" instincts once you get decent at writing code and learn Test Driven Development (where you think about what your function/class should do early and write unit tests before you write any code). This will help you think more about how your code should be structured.

Learn to use your tools. In computer science, there is always someone with a better (eg. more optimized/ergonomic) tool set. Occasionally seek to break out of your comfort zone and seek to change your editor/IDE, your keyboard, your window manager, browser extensions, macros, etc. If you start and stick with a really basic setup for too long, more efficient programmers will get progressively more efficient and you won't increase your efficiency.

Not specific to CS: Lots of people are willing to help you for free -- you just have to be brave enough to ask. I'm not talking about doing your homework for you. I mean help as in mentor or lend you a couch to stay on or a few bucks if you are hungry. The older I get, the more I see people who are worthy of assistance be too prideful to ask for it.

Good luck!

<comment><USER83> "where you think about what your function/class should do early and write unit tests before you write any code"

I'm 99% sure no one get this!

</comment></comment><comment><USER84> The best courses I took in Computer Science (3 years ago) were:

\- _Computer Systems_ : Building a computer system from scratch (virtually) logic gates to applications [https://www.nand2tetris.org/book](https://www.nand2tetris.org/book)

\- _Computer Networks and Applications_ : An overview of network protocols and layers, basically how the internet works.

\- _Event-Driven Computing_ : How to make GUI's, state-machines, event-driven systems are used everywhere.

\- _Computer Graphics_ : Understanding how graphics pipelines and OpenGL shaders work. Building a game from scratch in C.

They might not be interesting to everyone, but I felt these were the most fun and practical in learning how computers work and how to build software.

<comment><AUTHOR> Those are all classes I think I'd find very interesting. Recently I've tried to naively write my own game engine and OS and failed pretty miserably.

<comment><USER84> Don't feel bad, writing a game engine is one of the most ambitious projects you can do! As it involves many interdisciplinary skills; GUI, Graphics rendering, State management, Physics simulation, Coordinate systems, Sound systems, AI.

For writing your own OS, I definitely recommend looking at [https://www.nand2tetris.org/course](https://www.nand2tetris.org/course) it gives you a holistic view of a computer and it's operating system at every level of detail.

</comment></comment></comment><comment><USER85> Don't confuse coding with computer science. You need to learn about computational thinking and the mathematics of computation--but computer science is a tiny part of what you need to learn. You need to learn a lot about everything. Successful computer scientists are intellectual omnivores and are successful across disciplines. Learn physics, chemistry, mathematics, statistics, biological science, economics, history, English, geography, archeology, art, and so forth. Learn humility; eschew hubris. And bond with the joys of discovery and understanding. Knowing how to do stuff, knowing how the world works, and being able to communicate that knowledge will ensure a fulfilled life and economic returns.

</comment><comment><USER86> You're young and your brain is still rather plastic. So, learn everything. Textbooks for a CS curriculum is a great place to start. But also practical programming texts, the Unix classics, man pages galore, lots of math (esp discrete and linear algebra).

</comment><comment><USER87> Learn logic most of all. Learn procedural, functional, and object-oriented principles. Learn a variety of programming languages. Learn about the cloud (easy and free accounts exist on all platforms). Learn about data storage, but avoid religion: there are different ways to store and retrieve data for varying types of use (OLTP, Analytics).

Learn how to communicate well and manage your emotions. Learn how to be productive without guidance. Learn how to solve problems on your own, but also cultivate a group of people that can mentor you, along with understanding searching the Internet's resources.

When you finally look for work, find a place that aligns with your abilities and interests.

</comment><comment><USER88> +1 to everyone who recommended double majoring. CS is a problem solving tool, so having domain specific knowledge in any other field will be super useful, assuming that you're actually interested in said field. Alternatively, double major in computer engineering — many classes will overlap and you can probably finish both in 4 years while having a much deeper understanding of what makes computers tick.

Also I haven't seen this mentioned, but take advantage of the large number of resources at your disposal: labs, software, courses/seminars, office hours. It wasn't until I graduated that I realized I missed out on many learning and experimentation opportunities.

</comment><comment><USER89> I think the best thing I did back at university was doing lots of personal projects and doing more than asked for my term homeworks/projects to make them more presentable. Not only it helped me developing my skills but also I had lots of stuff I could put on my CV or talk in interviews. Especially when you are a new graduate, stuff like that can easily separate you from the rest.

I disagree with people that puts more emphasis on "social skills" "connections" etc. Good programmers are still hard to come by. If you are good and you can show that, that would be sufficient. Even grades are mostly irrelevant.

</comment><comment><USER90> Find Friends to work with. You will help them they will help you. Exams are not like coding they need practice despite how well you know the topics. Sitting down for hours by yourself is near impossible. Sitting with a group helps to maintain focus and gives you someone to explain this. It also gives you someone to explain things too. Nothing will sharpen your ability to clearly answer an exam question more than teaching someone that concept.

Those same friends will be the start of your professional network. The more contacts you have the better for you career.

Finally try to intern during your holidays. Work experience will help you land a job.

</comment><comment><USER91> As a CS professor, the main thing most incoming freshmen are lacking in is MATH skills. If the weed out courses of "can you think algorithmically" do not get them, the math department will. So many students too far behind in math.

I would second a number of comments on here like "study another subject" (most CS courses require a minor outside of CS, other than MATH, which you should get a minor in just due to the numbers)

I would also second the idea that CS in college is not coding, is not SW engineering, etc. It is learning fundamentals and how to prove your code is correct, mathematically and algorithmically.

</comment><comment><USER92> > I'm more interested in knowing what I should do now

Spend some quality time reflecting on high school over the next few weeks. What advice would you give an underclassman? How should they think about their four years of high school? What are the principles underlying your advice to them and the wisdom that applies beyond just surviving high school?

Folks here have had a lot to say about university, but it's equally important to understand how you succeed and what you wish you'd done better. Advice you give someone could be a good reflection of what you want from yourself.

</comment><comment><USER23> I'm trying to decide what the right call is if school is online-only in the fall. On one hand, a lot of what you're paying for is in-person instruction and all the other experiences you get in college. If it's online, it's not worth $5k-$10k for a semester. On the other, if a college says you can defer, there might not be room in a year because of how many people deferred, and the longer your break between high school and college, you're either less likely to actually go to college or less likely to graduate.

</comment><comment><USER93> 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.

</comment><comment><USER94> Not CS specific, but generally speaking, in college you should feel dumb. If you don't, you're not pushing the limits of your knowledge and skills. If you find yourself breezing through all the classes, speak to the teachers/professors about things you're interested in to find something that might challenge you. They might have a project you could work on.

Do it without coming off as being arrogant though.

And it will probably help if you've already aced a couple of courses before you approach them.

</comment><comment><USER95> Here are a few things that either I regretted not learning/being taught in my CompSci course, or that I see lacking in new juniors who start on my team:

\- How to actually build something entirely from scratch and host it somewhere so others can use it. I.e. do something 100% top-to-bottom where you not only design & write a bit of software then hand the assignment in, but actually set up a server, install what you need, deploy the software, monitor it etc etc - bonus points for getting your friends to try and use it have them file bugs for you to fix. Some suggestions - write a clone of Wordpress/StackOverflow/HackerNews or whatever and do the _whole thing_ yourself, right down to database schemas and installing and configuring nginx yourself. You will learn so much if you have never done this. Too much at school was compartmentalised so that you only had to "focus on the problem" and the other stuff was provided for you.

\- Source control: Git/Mercurial and other distributed ones, plus also still- in-use dinosaurs like Perforce/SVN. These days with Github everyone probably knows this, but I'll say it anyway since at school it is often just you working on your own.

\- Unit testing :-) Bonus points for continuous integration/deployment.

\- Basic project management: how things are run in teams, code reviews, bug handling etc.

\- web + networking fluently (answer the "what happens when I enter example.com in the browser" question from the initial DNS lookup through to the DOM rendering and everything in between)

\- fundamental *nix familiarity. Don't need to be l33t, but at least be able to get basic grunt work done with pipes and the like instead of having to resort to dumping data to excel and filtering it there. Sed, awk, grep, wc, uniq, sort, vi etc etc etc.

\- the obvious algorithms + data structures stuff.

\- These days: Cloud: the 12 Factor App thing is quite a good thing to read and internalise - it may change your perspective of how you think about approaching things. Probably worth having at least a basic understanding of docker + k8ns, as well as using at least one of the major cloud provider's services (they're all largely the same for the basics)

Otherwise my advice would be to just generally get stuck into stuff and just keep messing around with as much different stuff as you can to keep your horizons broad and experience varied. Don't try to focus too much on specific areas - there might be stuff you didn't even think about previously.

Have fun & good luck!

</comment><comment><USER96> In spite of having programmed for many years before starting my degree, there was a lot of academic challenge. There's a lot of theory that simply writing code does not teach you. There's a lot of course work that doesn't have to do with programming. Iteracting with people, project design, team management. If nothing else, it's 8-9 hours of work a week per class any way you look at.

Do the work, don't short-change yourself in your education.

</comment><comment><USER97> > I've been coding since I was young, so I'm not worried about struggling > academically, at least in my CS classes.

Lamentably, this sentence tells me you think coding == computer science, which betokens you are not prepared. How's your discrete math and computational theory? Coding is scratching the surface of CS. A programming language is a software engineering tool, software engineering is a branch of CS, but CS encompasses much more.

</comment><comment><USER98> You just have to know one thing- cs takes more time than you think. It's normal to spend 4 hours a night, your non-cs friends are going out, you can't. Everyone's going to the game, you can't. Don't get upset because it takes time. Literally, some homework may take 4 hours. Just accept that and you'll enjoy it and you'll do well. If you think it's an hour a night of work, you will fail.

</comment><comment><USER99> Apply for internships!

Consider doing Google Summer of Code next year, or similar. Later go for onsite internships.

Put something on your GitHub account, maybe contribute to some big name open source projects. LibreOffice and Mozilla are very contributor friendly.

In school consider taking hard theoretical CS classes. You'll rarely need the theory, but learning it on your own is near impossible. Improving your coding skills is easily done through practice, practice, practice.

Have fun :)

</comment><comment><USER100> Depending on your school, find clubs or orgs to join. Good way to meet people with similar interests and good professional networking opportunities

</comment><comment><USER101> 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?

</comment><comment><USER102> \- Watch CS50 by Harvard alongside your freshman CS 100-level courses - <USER3> will help you with fundamentals. \- Read Cracking the Coding Interview - <USER4> very useful book on data structures and algorithms. \- Use Viewert for building out your knowledgebase and stay on top of to-do items, it will help you remember things fast. \- Practice a lot, just build projects and iterate. \- Good luck!

</comment><comment><USER103> Keep writing programs, that's the ultimate skill and what you need to demonstrate at interviews. Second, if you are shy like a lot is us, take communications, meet other people. Try new things. You can find friends, ignore the cool kids if you have no connection. Also, this pandemic and violence will pass, hopefully we can improve society - but society will still be there.

</comment><comment><USER104> Computer Science is about writing software in the way that Astronomy is about telescopes.

Another way to put it is that Computer Science is a Mathematics field that is about the study of computation. You can do significant amounts of computation without a computer, and you can study pretty much every topic about computation with nothing more than a pencil and paper.

Programming is simply a convenient way to use these great devices we have to assist us in better understanding computation, and a good CS program will go _very_ deep in how modern computers work, what they can and cannot compute, and so on. You'll likely have changes to study computational complexity, queuing theory, grammars and regular languages, and so on.

For all this you need a _really_ strong foundation in mathematics. For an undergrad, you should be able to handle just about anything in single and multi-variate Calculus, Linear Algebra, Discrete Mathematics, and be able to build proofs and if you really want to push as an undergrad more advanced classes. If you can't hang with this coursework, you can't do CS.

It's okay, you might be better suited to a Software Engineering degree or and Information Systems degree where programming and engineering practices are favored. To be honest, these degrees are far more practical for the regular old software developer than is CS. Most programming jobs aren't trying to invent an algorithm, or determine the runtime efficiency of some system.

</comment><comment><USER105> Anything over 90% is gravy. If you have 97% in your algorithms class and 82% in your history class, you should try to spend more effort on history. And that will be hard to do, because there's less positive feedback from the other side of that engagement. Learning how to do what you don't like as much is hard, but worth doing.

</comment><comment><USER106> 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.

</comment><comment><USER107> 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!

</comment><comment><USER108> Make sure you get out often, have fun every week, meet people. I wish I'd have come out of college with a group of close friends and more people to talk to about jobs.

Also, go to the career fair every year and attend other employment events. Having interview experience and a couple internships under your belt will help a lot after graduation.

<comment><USER108> Oh, and maybe get to know your professors a little bit, especially if you're interested in research or a higher degree.

Consider being a TA, it's a good way to learn/demonstrate interpersonal and teaching skills.

</comment></comment><comment><USER109> That you should do student activities. That you should join or start clubs that have nothing to do with science.

Going to parties and having parties is good for you. It's okay to get in trouble but not serious trouble.

Taking electives that are interesting and not obvious ones for cs students will make the education more memorable.

It is good to go on dates and have fun.

</comment><comment><USER110> 1: Understand the difference between software engineering and computer science. A lot of "computer science" will help you write a compiler, but you probably won't write a compiler on the job. Software engineering will help you when you're trying to make a bulletproof, scalable application.

2: Seek out internships.

</comment><comment><USER111> Don't play Empire. Or X Pilot. Or MUDs.

Hmm... I have a feeling that what I learned in university has become somewhat dated...

</comment><comment><USER112> Learn to learn on your own. Don't be afraid to look at the material that the instructor gives you and say, "I don't think this is doing a great job explaining it, I am going to see if I can find a better explanation elsewhere." This is something you probably never had to do in highschool.

</comment><comment><USER113> Enjoy your college life. Socialize. Revel in the extracurriculars, don't treat them as an obligation to be endured. Join some clubs. Don't just hole up in the lab. Being well-rounded from your college experience will improve your life in many ways, your career being just one aspect.

</comment><comment><USER114> take linear algebra ASAP. it's probably the single most useful course you can take at a university.

</comment><comment><USER115> If your school offers an opportunity to study abroad, ideally in a country with a culture that you have personal interest in, please consider it strongly. I regret not doing this in college, as doing the equivalent nomad type experience is much more difficult after graduating.

</comment><comment><USER116> keep up with your math classes and finish your math requirements as soon as you can. You'll be happy you did. Also, CS does not mean you are a software engineer or that you can get a job after you're finished. Get a part-time job the teaches you what companies need from a software engineer or the type of job you want to target after you are done with college.

Keep in mind, tech types aren't really the ones that change the world. Tech types do the work but they need a humanities type to inspire them to do it. Look for inspiration from your elective classes or look to someone to inspire you outside tech so make friends with people in your elective classes that aren't majoring in one of the STEM majors.

</comment><comment><USER117> I highly recommend the MIT Missing Semester Course. [https://missing.csail.mit.edu/](https://missing.csail.mit.edu/)

It's a glue which is not covered anywhere specifically, but it'll make your life a lot easier.

</comment><comment><USER118> Most CS programs skip the details of software engineering, such as Linux, command line, editors, IDEs. Maybe you can check out this course from MIT to get a head start:

[https://missing.csail.mit.edu](https://missing.csail.mit.edu)

<comment><AUTHOR> I've read through that course!

Luckily I accidentally installed Ubuntu when I was in 6th grade because I read it would give me higher fps in Minecraft and it had an exe installer so I didn't realize it was a whole OS. I've been Linux only since then and learned all the other stuff there as a result

</comment></comment><comment><USER119> The hardest part about getting & changing software jobs is the algorithms interview part. Really dive deep and get good grades in your algorithms class and you will have a foundation that will help you change jobs and get more pay for years to come.

</comment><comment> heresie-dabord As rewarding in many ways as the computing field is, you should know that you are self-selecting for a narrow understanding of people, history, and economies. You will need to find the time to condition yourself to be a thinking, compassionate human.

</comment><comment><USER120> Coding is to Computer Science as plumbing is to fluid mechanics. Knowing how to program won't necessarily make your CS courses easy, especially if they involve theory or software engineering. And I strongly recommend you take courses in both.

</comment><comment><USER121> One opinion I have about studying technical subjects in general: don't let yourself believe you understand something until you are confident you could teach/explain it to someone else. And do that (modestly) when you get the chance to.

</comment><comment><USER122> Make friends with the TAs. In a year or two, they'll be able to refer you for internships.

</comment><comment><USER123> 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.

<comment><USER124> 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.

</comment></comment><comment><USER125> 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](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!

<comment><USER126> 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.

<comment><USER125> 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!

</comment></comment></comment><comment><USER127> Be prepared to accept that you might not actually like CS, and there could be something else that really takes your fancy. This happened to me, and several other people I know. Life can take you in some interesting directions!

</comment><comment><USER128> Overall the advice in this thread is really good.

I'll add something though: take one class in GAAP accounting, one class in sales and/or marketing. These skills will be immensely useful when you actually enter the workforce.

</comment><comment><USER129> Paying for mooc courses from your University is going to suck. I would defer if I was you assuming your University will be having some sort of crazy online or hybrid thing in the fall due to covid19.

</comment><comment><USER130> Lot of good advice here. Another is: take courses in accounting and management.

First of all, the path up from being a coder is to lead a group of coders. Second-- who knew? -- a lot of this stuff is interesting.

<comment><USER131> Not necessary, people management is a different path. One can successfully stay as an individual contributor.

</comment></comment><comment><USER132> This! You should never lose the curiosity and drive that made you ask a question here. I would argue this is the most important thing you need for good first steps in your career and in life.

</comment><comment><USER133> Double major in something more meaningful, like Finance. The last thing you want to do is take a hobby you love, make it your career, and burn out from being worked to death in your CS job.

</comment><comment><USER134> Don't forget your social life. Don't forget to study.

</comment><comment><USER135> Don't spend a bunch on a new gaming rig and claim it's for CS; you probably don't need more than a $100 dollar laptop for most CS classes.

Basically, be smart with your $.

</comment><comment><USER136> Your experience can be measured in the amount of problems you've observed. So gain experience, observe problems. Then in the future, you will have the answers.

</comment><comment><USER137> People like us are tempted to take intro classes on pure ego. It doesn't get you as far as you think. Rule of thumb: study for two hours per credit-hour in class.

</comment><comment><USER138> Learn with an aim to create. It's the only thing that will keep you sane and interested in what will hopefully be a long and productive career.

</comment><comment><USER139> Nobody cares if you try your best or not, nobody except your future self. Put in the sweat and labor now, so you don't have regrets later.

</comment><comment><USER140> look into ACM aka ICPC programming competitions -- super-fun, you'll learn tons, & job interviews will seem easy in comparison

</comment><comment><USER141> My two cents [https://missing.csail.mit.edu/](https://missing.csail.mit.edu/)

</comment><comment><USER35> Hackathons! Check out Major League Hacking. It is a ton of fun and the prizes have been quite useful when job searching.

</comment><comment><USER142> the quality of job you receive is based on 3 categories:

1\. being friendly / assuming good intent 2\. raw experience coding 3\. algorithms / CS

school generally takes care of 3 and a bit of 2. 1 is arguably the most important in transitioning from junior -> senior level and beyond

</comment><comment><USER143> Let me cut through the BS.

The only thing you have to know to get a job is "Leetcode"

Everything else is optional.

</comment><comment><USER144> How to differ admission for 1 year.

Seriously. College is going to be a shit show this year with covid-19.

</comment><comment><USER145> don't go straight through college fast as possible. take some internships along the way. If I see a resume that only includes class based projects, it is an immediate skiperino.

<comment><USER44> If you're lucky enough to not work during college, then internships are far more valuable and will likely challenge you to do much cooler things. Intern lots of places & try out different work environments and even locations.

</comment></comment><comment><USER146> Which college if I may ask :) - I'm sure we have alumni here

</comment><comment><USER147> > I've been coding since I was young

but not leetcoding. get on it.

</comment><comment><USER148> Smash as much puss as you can while you're young.

</comment><comment><USER149> Get as many internships as possible. All that matters.

</comment><comment><USER150> that getting the degree is one thing but learning how to ship a project (aka "make it live") is another

</comment><comment><USER151> Build things for fun throughout college. Great way to meet people, solve your own problems, and a perfect excuse to reach out to almost anyone in the world with an edu email address (wish I took more advantage of this). But at the same time, wouldn't try plan everything out. Enjoy it! Wasn't expecting anything, but my project from college (Levels.fyi) has become my full time job now.

"There are few sources of energy so powerful as a procrastinating college student." \- Paul Graham

</comment><comment><USER152> (Some general advice in the last few paragraphs)

One thing you should absolutely put on your radar: are you at all interested in grad school?

You have plenty of time to actually make the decision to go to grad school (plenty of people don't decide until years after graduating), but if you think it might even be a remote possibility, there are two things you absolutely need to do:

(1) Get STELLAR letters of recommendation. This is the most important thing to know, and you should consider that you'll need between 3 and 6 depending on your program.

(2) Keep your GPA above ~3.5 (landing something lower won't break your application, but it will make your life harder).

Lots of the career advice I've seen maps to getting SWE jobs in industry, where things like your undergrad GPA, research experience, and letters of recommendation don't matter as much. You can be a phenomenal engineer at a "prestigious" company (whatever that means to you) with a huge variety of undergrad track records (including not even going to college!). But just like getting a referral from someone who works at a certain company is a higher- signal (and easier) way to select an applicant to interview than trying to sort through a stack of resumes, getting a "referral" from a professor in the form of a letter of recommendation is a higher-signal way to filter applications than basically anything else. For research, grad school admissions committees tend to not care too much about internships / work experience, unless they're tied to research in some way. If you're interested in this, read the link at the end of this post [0].

Also, considering COVID-19's impact on engineering hiring right now, if you're having trouble finding an internship, doing a summer of undergraduate research can be a great backdoor to getting some hands-on experience, work with a professor, and

Generally, on the career side of things, I'd say spend a good chunk of time exploring what types of work you enjoy and find engaging. It's hard to predict what this will be when you're coming in, so do lots of small experiments to try to figure this out. Build small projects, reach out to professors and try your hand at research, join clubs and find other students who share your interests.

The last thing I'll say here is realize that there might be a whole set of career options you didn't even know existed coming in. Amongst my friends, the most common "discovered" post-graduate plan was (management) consulting, which virtually none of my friends knew existed coming into college, and many ended up getting excited about while there.

Overall, you'll be hard-pressed to find another space where you're surrounded by thousands of other people your age who are excited about learning, meeting each other, and working on ambitious stuff. There's way more to do and discover than there was in high school, but you'll also have to be much more active in finding and leveraging opportunities instead of waiting things to come to you. Work hard and explore, but also remember to make friends, let loose, find some parties, go on dates, stay healthy, and keep an open mind throughout. It's a wild ride, and it can be an incredibly rewarding handful of years. Good luck!

[0] [https://www.cs.cmu.edu/~harchol/gradschooltalk.pdf](https://www.cs.cmu.edu/~harchol/gradschooltalk.pdf)

</comment><comment><USER153> Enjoy your youth! Now!

</comment><comment><USER154> TL;DR. I would say find an internship or programming job ASAP. Practical experience in the field is generally more beneficial than classroom learning.

Pro Higher Ed: Programming classes are great for repetition and rote memorization. I had one class that was 70% Bash and VI (not VIM) - just the basics. Labs were agonizingly mundane, drilling the same commands over and over, but now at my job I'm considered an SME (subject matter expert) on random Linux servers because the basics were drilled into me. I was hired as a developer, but my general understanding of system led me to become more valuable

Pro Maybe Not Higher Ed: My sophomore year our IT department was hiring for two student programmers, and I was accepted (though including me, only two applied). However in my first 3 weeks of training I think I learned, in the field, 90% of what was taught for my junior and senior years (Web design, database design, SQL, data structures, and the most important (since I was hired after my senior year): institutional knowledge.

Working in a professional environment, even as an intern or student, you get to learn how project timelines and management work, how businesses calculate/expect returns on their requests (and maybe react to critical successes of failures), analyzing and modifying legacy code bases, integrating, deployment workflows, source management, how frustrating it is when vendors have terrible APIs, bureaucratic nonsense and pace, etc. All of this is critical knowledge you need at some point, so get it early (and pad that resume). If you can publicly contribute or distribute code/solutions via GitHub or whatever, that's an asset for sharing with employers (if it's semi- decent).

I will and ask you a question I ask student developers in interviews: "In what field do you want to be working in in 10 years". I get answers like "Machine Learning", "AI", "Web Development", "Networking", etc. All CS categories. So I push back and say: "Ok, but for what purpose?" and list off some broad options "education, health, entertainment, gaming medical, financial, legal, political, industrial, environmental, etc?".

Very few have a good answer to that question. They "like to code", or say "anything really". I encourage everyone to look at CS a tool towards a cause or a goal. Find a field, locality, or business you believe you'd like to one day make an impact on, and keep thinking about how what your lessons can contribute to that.

But again, please look for real-world experience.

</comment><comment><USER155> Get enough sleep.

</comment><comment><USER156> Take ECON 101.

</comment><comment><USER157> 1\. Use your uni time to build up a portfolio as well as your grades. Bonus points for anything that is being used in practice to solve a real problem for someone other than you, because that's one kind of thing that a business can make money with. If you have time for any side-projects, include them - obviously include any coursework/projects too. I got my first job because of a combination of doing well at uni, and working as a teaching assistant where I got fed up with a complicated excel-and-email-based system for tracking people's engagement and grades, and I wrote a database application with a web UI to make everyone's life easier. Back in those days CGI (common gateway interface) was all the rage and XHTTPREQUEST hadn't been invented yet, but it did the job. The interviewers were impressed that I'd already written "real code" and that set me apart, because one question they're trying to answer is "what will the candidate be able to do" and a good answer is "here's examples of what I've done already".

2\. Learn how to build a web-based database front end application properly. This is a kind of bread-and-butter job that's not the most interesting thing in the world on its own, but is fundamental for a lot of things that create business value. There's a whole stack of technology behind this, and it pays to know what's going on "under the hood" of tools like ORMs, "reactive" JS frameworks, dependency injection etc.

3\. Spend some serious time on at least one thing that is not CS.

4\. On the CS knowledge side, algorithms/data structures and compilers are two things to take seriously to the point where you've achieved mastery, not just passed the class (even with a good grade).

5\. Learn and use tools. At a not-too-bad uni I've still seen students in their penultimate year e-mail ZIPs of their code to each other ... version control, continuous integration, unit testing, linting etc are all things that happen in professional software development, but (mayby I'm just being Europe- centric here) especially at some good unis, they think this stuff isn't worth teaching and students can just find it out themselves. Knowing all this stuff is a huge plus in an interview, but even before then, it will make your life easier when you're doing coursework projects.

6\. There are situations where an IDE is the right tool for the job and you shouldn't turn your nose up at it. Find one that suits your taste and learn how to use it, things like debugging, "go to declaration" or "find usages".

7\. Finally, decide where your personal moral compass lies. Some people want to write AIs for self-targeting missiles, other's don't; same for "ad tech". You want to work in a sector and company that's a good culture fit for you.

</comment><comment><USER158> You should take a serious look right now to make sure you're going to a college with a good program for getting a job.

From someone who went through a school with effectively no program, I definitely wished I'd considered this before devoting 4 years and 100k to one particular school.

So here's some actionable questions you can ask your career center right now to see if you're getting your money's worth.

 __Does the university protect you against exploding offers? __An exploding offer is when a company offers you a job offer, but you have to decide immediately or within a short time period (like a day or two). In the "real world" this can make sense because the company may actually need someone immediately. For students though, this practice is a bit scummy, since no company immediately needs an intern. Typically it's just manipulating someone who might not know any better. To prevent this, any college worth it's tuition will require all companies recruiting students to follow some form of [offer guidelines]([https://ecs.engineering.illinois.edu/career- resources/offer-...](https://ecs.engineering.illinois.edu/career- resources/offer-guidelines/)).

If they _don't_ have this sort of guideline, it likely means they don't have any leverage or industry connections. For example, most schools will just blacklist companies from their career fairs that don't follow their guidelines. If the companies don't care, then the career program is pretty bad.

And on that note, __does the school have regular career fairs attended by tech companies you 've heard of? __

In some schools the vast majority of students get their internships or new- grad jobs from career fairs. In others, there won 't be a technical career fair. Or if there is, there won't be any CS/programming jobs that show up.

One hack to figure this out is to check if the school is _charging companies_ money for STEM career fairs. For example, San Jose state charges $850 a table the last time I checked. If a school isn't charging, it often means they can't actually get anyone to come. (though obviously YMMV)

 __Does the school have course offerings for technical interviews? __Many, many schools these days are creating classes specifically to help students pass their technical interviews. For example, here 's [Boise State's class]([https://github.com/BoiseState/CS- HU390](https://github.com/BoiseState/CS-HU390)).

If the school _doesn't_ have a course like this at some point, it may mean they are disconnected to the real world and have little to no support for you in general. It is not a hard thing for CS professors to setup a class for extra practice with algorithms & data structures.

 __Do students have access to investment capital or startup support? __Many schools have some form of a "student startup" program specifically around CS students. If they don't, there may also be a "college student" specific VC fund nearby, such as [Contrary Capital]([https://contrarycap.com/](https://contrarycap.com/)), [Dorm Room Fund]([https://www.dormroomfund.com/](https://www.dormroomfund.com/)), or [Rough Draft VC]([https://www.roughdraft.vc/](https://www.roughdraft.vc/)).

_You_ may not start a business, but one of your peers might, and that creates a network that can help you get a job in the future. Plus, this opens up opportunities you may not have considered before.

It's important for you that these are heavily associated with the computer science program and not uniquely available to the business students. Some schools only allow biz kids to do these; the money comes from a grant that's only allocated for biz students.

 __Does the school have access to hackathons? __Hackathons may be for you, or they may not be. (I personally dislike them) But you should seek out a place where they exist or you have access to them. They encourage students to actually build things, which is the type of environment you want to be in. You should surround yourself with other people who are actually using their CS skills rather than just passing their classes.

Does the university host a hackathon? If not, is it in the local area? If not, does it sponsor students to go? If not, have _any_ students gone?

You'd be surprised how many schools with a CS program where all of those answers are "no".

 __In general, you should a baseline goal in your university. __There 's obvious benefit to learning as much as you can in many different subjects while you have the time. But get a job at the end.

</comment><comment><USER159> 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.

</comment><comment> bra-ket start doing competitive programming as early as you can , enroll in ICPC [https://icpc.baylor.edu/](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...](https://www.amazon.com/Competitive- Programming-3rd-Steven- Halim/dp/B00FG8MNN8/ref=sr_1_3?dchild=1&keywords=competitive+programming&qid=1590954026&sr=8-3)

participate in contests on [https://onlinejudge.org/](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

<comment><USER160> 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).

</comment></comment><comment><USER161> 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.

<comment><USER162> 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.

</comment></comment><comment><USER163> This is a great time to be in school and make as many friends as you can—networking has paid off far more than attending class did (though I am very grateful I showed up to my algorithms and theory classes).

</comment><comment><USER164> Focus on (deep) machine learning and load up on math classes.

You will be equipped with a totally unique perspective for solving problems and, if things continue to grow as they are now, a very in demand and lucrative career, if you have the chops for it.

</comment><comment><USER165> Ignore 90% of the advice in this thread, although well intended is just unrealistic.

Work on yourself, your knowledge, start creating things, no matter how shitty at first. Do not drink the Kool Aid of any professor, company, open source leaders, youtubers, etc. Remember they are for themselves no matter how altruistic they sound. You are an adult so you can have all the rights of any person, dont get intimidated by older/more experienced people.

If you sell your soul to the devil it is OK, but please dont pretend it was because of a noble goal. It is OK to like money but it is rarely if ever compatible with making the world a better place, no matter what the Zuckerbergs and Gates of this world say.

</comment><comment><USER49> I think this is a question that fundamentally depends on which college/CS program.

</comment><comment><USER166> Do as many drugs and have as much sex as possible

<comment><USER148> Agreed 100%. This should be the #1 answer.

</comment></comment><comment><USER167> The best advice I can give is _do not_ take advice from anyone who graduated college more than 10 years or so ago. The problem is that their advice is woefully out of date and even worse, they're incredibly confident that it's still useful advice.

Most people are wrong about most things most of the time. Keep that in mind when listening to any advice (yes I am aware of the irony).</comment>