Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: I'm an incoming freshman to college for a CS major, what should I know?
187 points by fish45 39 days ago | hide | past | favorite | 273 comments
I've been coding since I was young, so I'm not worried about struggling academically, at least in my CS classes. I'm more interested in knowing what I should do now to give me an advantage in getting a job or otherwise.

All advice is appreciated!




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.


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


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


Thanks, I could've explained better, but that is exactly my point.


The thing with the FAANGs is that they can be rather unfulfilling. At first, when you are fresh out of the playground going in to commercial engineering, everything seems great, because you suddenly get paid to do a thing you like, and there is all this technology and information and people.

But that is not unique to FAANGs, and not unique to CS/IT. At some point you usually end up wanting more, either a more fulfilling job or a job that pays more. The former is probably going to have a human or societal component, the latter will drive you more to banks, economic institutions, insurance, government contractors, exchanges and similar jobs.


>the latter will drive you more to banks, economic institutions, insurance, government contractors, exchanges and similar jobs.

I worked for a gov't subcontractor (for the USAF) and a bank prior to moving to the bay and working at a FAANG. The opportunities to make 500k+/year don't exist, outside a few private funds that grind you to dust. If you are super well connected and you can start a military contract firm, you can make tons of money, but that has nothing to do with things you'd learn in a CS + X double major. Think tanks and other economic agencies don't compare with a good FAANG salary. You'll start at 50k and be lucky to make 200k by the end. 200k is a starting salary for a facebook engineer in most markets. I have two friends who are engineers at insurance cos, they certainly don't work there for the money.

If you're talking about jobs that don't involve CS applications, I wouldn't have any idea, but this isn't what OP was asking about.

Not everyone picks a job based one what "fulfills" them. Some people are trying to pay down college debt, support a family, support a lifestyle etc. And if what fulfills you working with very smart and driven individuals on very difficult and ambiguous problems, I think you'll enjoy working for a large tech company.


FAANGs don’t pay that salary because it’s difficult work, they pay that salary because they have trouble keeping turnover down. It’s much like investment banks where the pay is great and many people really want to leave.

It’s up to you how you want to spend your life, but everyone I know is much happier after the left.


You mean once they worked at FAANG, saved up enough FU money and then left?

Yeah, I'm sure they are much happier.


No, many left within 2 years.


The average for Google is 3.2 years. For most, that is not FU money.


Just long enough to open the doors of any other job interview and bail to a company that doesn't shuffle them and their team around the office like game pieces in a never-ending re-org, a company that makes actual products instead of surveillance advertising systems (as the latter is impossible without the former), or a company that makes decisions not to work with oppressive governments based on more factors than if it will earn more than the potential PR damage will cost.


So, approx. 3 years == disillusioned?

Unless it was a planned stepping-stone all along, to land the real "dream" job and have the credentials to command a more magnanimous compensation than they would without that Google tenure.


For 'beginners' they usually don't have the experience or the network to plan such a stepping stone ahead of time.

If you come in the side door (shift sectors, side-learn upgrade your capabilities) you may have the experience to plan ahead like that. But this was about beginners so I suppose that doesn't matter in this case.


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

Presumably this is considered a worst case by someone who values other aspects of life more than money.

Sure, the FAANG companies are great for highly technical meta-work. And this is good for some people. Other people may prefer a more direct, less corporate, less textbook environment.


Also some people don't particularly value FAANG tech. Speaking for myself and some of my co-workers advertising algorithms, consumer, enterprise and financial tech just aren't that interesting. Sure the engineering can be impressive, but all that effort for what? So Adsense can be better convince people to buy crap they don't need, Apple can make its products even less practical, Amazon can more efficiently abuse its warehouse staff and make AWS fees more opaque, and facebook can sell your information more effectively while it keeps you up to date with relatives' conspiracy theories? At least Netflix provides entertainment value.

Not saying that's all said companies do, and some people (whom I lovingly refer to as "puzzlers") would enjoy the extra complexity and challenge for its own sake. But I wouldn't say the FAANG companies have any particularly inspiring missions. Not that such missions are easy to find, and they almost never pay as well, but they certainly don't seem to exist at FAANG.


> facebook can sell your information more effectively while it keeps you up to date with relatives' conspiracy theories

The best one-line definition of FB I've ever read.


What's an example of a company with an interesting vision for you?


Well SpaceX/Tesla are easy ones to point to, Blue Origin as well although I'm not sure what's holding them up, Sarcos Robotics perhaps with their robotic exoskeletons, some medical device and defense industry work that isn't executed half-assed, basically anything that links back to the real world with real stakes beyond shareholder value and/or moves the technological ball forward. Probably a lot of mid-range companies I don't know about because they lack broad marketing budgets, for agricultural software/train coordination/power grid management and such.

To be fair the FAANG companies fit that description the early/mid 2000s, back when their various technological niches were less developed. They've since become the establishment, and some like Apple/Google/Facebook have started the descent into downright decadence and complacency.


I said worst case to mean "You paid attention to these things and then later found them to be not very valuable to you"


I am a fairly recent FAANG (guessing from your text, probably the same one as you) arrival after a while in startups. Happy with the change so far. Your comment rings true to me. Well said


I haven't thought about trying to be a developer in a non-IT field; it seems like something I'd really like to do.

I spend most of my time coding on side projects, so as it turns out I'm not great at algorithms. Recently I've learned that I can only really do easy problems on Leetcode/codeforces etc, and I've been trying to improve.

Thanks for the advice!


The key to doing this is to look at the economics: is it possible for my customer to pay me what I want to be paid?

This even applies internally, if your customers are other parts of your company.

MaxCompensation = UnitValue * NumberOfUnits

In tech companies, NumberOfUnits is commonly one million+.

In non-tech companies... it's much less.

So either deliver more value (petrogeology simulations!) or work for a specialized company that services multiple clients (healthcare software!). Be aware the former can be morally onerous, and the latter craven to protect their (relatively few) key clients.

That said, if done right, I find it way more interesting. Solving problems in {x field} with software means you get to learn about {x field} and software!

Just be sure to self-motivate on keeping your skills up to date. It's easy to get complacent and rust, given there's not the same competitive tech pressure (for better and worse).


The most fulfilling area I've ever worked was with wind turbines. Making software for things that actually mattered, as opposed to dumbass ad tech for ad tech's sake, was very enriching for me.

With respect to algorithms - nobody starts out good with them (except Knuth), it takes practice. Don't give up. Also recognize Leetcode for what it is - practice. It's okay to do a problem poorly/not figure something out. It doesn't actually determine anything about your intelligence or trajectory in the field.


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.


100% this. University exposed me to a much wider range of society than I’d ever encountered before. Those social interactions have been foundational to my career. The knowledge you learn in classes is secondary to the skills you learn living and working with people who are nothing like you. Embrace it.


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.


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.


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.


Social skills in a career context are not just getting along well in the office and being able to make small talk in the snack room. It's about creating a strong and deep network, and as an engineer, being able to interface effectively with business and other stakeholders on a social level. It's also about seeking out, recruiting, and fostering new talent, moreso at growing companies. I work at a unicorn tech company and very few engineers meet these criteria.


social skills are one part of a bigger whole - communication.

Looking back, two classes that I should have doubled down on at school are: written and oral communication.

Think of it as a multiplier for the skills of your tech tree.


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.


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

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

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

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

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


I think there is selection bias in number two here. I am really skeptical that taking psychology classes really would help many people's interpersonal skills, at least not very much.

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


.. so the interest in psychology is useful, but not actually studying it?


No, that's not what they meant. What they mean roughly is that if you were a college student who were interested in signing up for classes in psych, you probably already have some interest in it (and related things), and that interest is what helps you become better (at understanding human dynamics etC). It's not a causal link, just highly correlated.


Yeah exactly. I had no issues in getting top marks for courses that covered things I had worked with before going into uni, but as I lacked a formal education, I had a very advanced skill level in specific areas but lacked the primers to other very relevant areas. This meant I either flunked my classes totally or I got an A without doing any work.

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


A diverse education will also help your relationship with the flawed person you interact with the most: yourself.


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

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


This is about test case generation. When it gets hairy, a *check library helps (quickcheck, rapidcheck, etc).


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

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

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


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


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

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

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

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


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.


Why not major in one and minor in the other? Even though my only major was Computer Science, I still took enough English classes to minor in English. Took a class on the History of the English Language (learned how to read Old and Middle English), two American Lit classes, a Middle Eastern Literature class, the Technical Writing course I needed for CS anyway, and a couple of composition classes (maybe one or two others, I don't remember). And it didn't take any more time than I needed anyway.


You don't need to double major in philosophy to be exposed to it. For a fraction of the money you paid, you could've tapped into free online resources and paid for a philosophy tutor to walk you through the classics.


How do you know how much money I paid? I was a bit of an overachiever and took a lot more units per quarter than average.


Definitely not a waste of time. Learning to think in a non-CS way can be incredibly valuable. Will it make you a better programmer? Maybe not. Will it make you a more effective employee, founder, or person? Yes.


Why do you need to pay tens of thousands of dollars to for a second degree when you can just go to the source material yourself?

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


There are dozens and dozens of articles about students demanding their money back from colleges precisely because an online lecture where you can't or barely can interact with the professor is absolutely not the same thing as a classroom and campus setting. This is across the board in all majors. In a field like philosophy where discussions and exploring different viewpoints from others is one of the main points I can't imagine a more poor substitute.


In most (all?) universities/colleges in America a double major doesn’t cost extra financially. You might have to give up taking more electives in one or the other programs however.


Yeah I can't speak to other Uni's but I went to a very large school in VA, and we had plenty of extra credits for electives. With a some creative picks, and a couple of summer courses taken for fun, I was able to tack on a 2nd major and a minor.

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


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

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


It depends on what your goals are. Perhaps from a purely practical standpoint, there are diminishing returns, but we should also consider the plummeting job market people graduating in the next couple years will be coming into. Having something to help you stick out might be useful, even from the practical standpoint.

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


Agreed. Taking non-CS classes? Definitely worth it. Getting the arbitrary extra words on your diploma? Less worth it


To be clear, I'm not advocating taking a bunch of random classes to be a well-rounded person, although, sure, why not.

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

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


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

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


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

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

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


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

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


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

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

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


On the flip side, if a degree program is at a liberal arts institution it may have plenty of humanities builtin and you may want to add a few extra CS courses to round things out.


Yes - people who only know technical things can become convinced that (a) only technical things are worth knowing, and (b) that their perfect logic can enable them to come to ideal conclusions about things they know nothing about. (I think some of the latter stems from experiencing years of education where a small number of factors needed to derive a perfect solution, as in a first-year physics problem. When you go to build things though, you discover that you have to understand the situation and its users to design and build what is really needed.)


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.


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.


Engineering is at its essence communication of ideas between you and others, be they computers, or other people, or yourself at some future time.

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


>Programming AND speaking AND good writing will put you on a better career path.

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


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


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.


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.


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


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.


I don't exactly disagree, but the tension between points 1 and 5 is notable.

I'd say the "get you further" remark is true in the narrow sense of a career: you'll be more likely to beat the interview if you can write a recursive solution to a problem than if you can talk fluidly about python generators.

But being a productive engineer really requires both, they aren't separable skills, yet paradoxically they're actually poorly correlated! The world is filled with productive hackers who can get the wrong solution to "work" quickly, and insightful theoreticians who just can't produce working code.


#5 is invaluable.

"Hacker" or "tinkerer" mindset is very helpful. When hiring, especially at the entry level(s), those who hacker/tinker outside of their job usually standout and have a better understanding of how all the "things" we work with as Engineers connect because they are out there trying/failing outside of their 9-5.

The challenge with "hackers" is learning how to unplug, so make sure to develop skills/interests that are completely unrelated to "work".


#5 big time. A lot of CS grads struggle their first year or so working.

Try to code something everyday. Learn to use tools. Doesn't matter what you code or what tools you use really.

The idea is to get comfortable with not knowing all the answers and then get fast at figuring things out.

Most importantly, get enough sleep, exercise, and sun. Your mind needs to be sharp and that starts with maintaining your body. Good luck!


> Try to code something everyday. Learn to use tools.

fish45 made it clear they're already an experienced programmer, so I don't see that it makes sense to emphasise this.

They're more likely to struggle with theory than with their programming tools.


Disagree here, myself and many many peers considered ourselves "experienced" programmers before college (starting at 7 years old etc), and we were barely intern material in reality. Push yourself every day and learn tools (there are always new tools to learn) to be relevant--this goes for students, new grads, seniors, etc.


Sure, I think we agree really.

My point was that for the programming material, they're more prepared than many of their peers. For theoretical material, they're on the starting block with everyone else.

It's good to work on your developer skills beyond what your degree gives you, but no-one should expect that their undergraduate studies will be easy simply because they're already a programmer. That's like assuming your degree in pure math will be easy because you studied algebra in high school.

If you have a choice between doing well in your degree course, and learning additional developer skills, you should go with the former.


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.


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


Yeah I can totally see where you're coming from. I go (went?) to a STEM high school and since I'd already been coding for a while at that point I basically had the same attitude and then AP Computer Science ended up being one of my harder classes.


Such a timeless quote. I believe this is the source:

https://youtu.be/2Op3QLzMgSY

While there, SICP is not a bad way to augment a CS degree :-)


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

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

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

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

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

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


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

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


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

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


> minor in something fun

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


Despite my advice above, I actually did it the other way around. My major was Theater (Acting/Directing) and my minor was CS. I'm quite successful as a software engineer, so I don't really regret it, but if I could do it all over again, I would have majored in CS and minored in Theater... But yes, agree 100%


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

Well, no one except for grad programs.


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


I have found during my career that not many people people cared if you had your Masters or you didn't.


I've been thinking of minoring in physics or something, but maybe I'll try Art


+1 for Physics. It's not easy, but you'll be learning some very powerful tools for thought and modelling complex systems, so totally worth it.

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


If Physics is fun for you, go for it!


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.


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.


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.


"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.


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/


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.


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


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


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.


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".


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


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.


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.


'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.


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.


100% agree. Just have fun and be happy. You'll have your entire life to work after you finish college. Meet people, make friends, do stupid shit and party. Your college friends will be the last big influx of friends in your life so make lots of them. Also, you get to completely reinvent yourself aka grow, so don't worry about who you were in high school, you get to be an adult now. Enjoy!


> take it easy and do whatever makes you happy

Great advice if what makes you happy also happens to be lucrative. I did this, and it was a huge mistake I'm still paying for 7+ years later.


I was pretty sure we're still in the context of CS, which tends to be pretty lucrative.


> I've been coding since I was young

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

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

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


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

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


I find the opposite. My professors really did appreciate my deep work and involvement in PhD-level research. What doesn't appreciate my work is really the degree: regardless of whether you do so your degree just says BSc. It's more for learning for your own good.


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

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

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

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


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


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

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


Yeah I've recently been trying leetcode and codeforces and I'm way worse at it than I'd expected. It's fun though, so I'm working hard to improve.

Thanks for your advice!


Biggest regret in college/HS/right now is not getting good at competitive programming.


College is more than just learning a vocation. Another goal is evolving yourself into a well rounded human being. Each quarter / semester take one course outside your comfort zone. Public speaking, improv theater, drawing, photography, music, philosophy, film production, drama, writing. Join a non-tech club. Learn new stuff, and how to relate to non-nerds. Expand your abilities, world view, and persistence.


I think more people who be apt to do this if electives were pass/fail. There were tons of interesting classes available that I could have taken but chose not to because I had a decent GPA in major reqs.


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


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.


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


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.


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.


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.


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


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


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!


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


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.


Discrete math topics teach amazing way to think that most people never get to see in high school. Knowing stuff in free a book like [0] is immensely helpful. There are a ton of decent introductory discrete math books like the ones by Susanna Epp, Ed Scheinerman, Goranko bros and Gary Chartrand. Just google "list of discrete math book". What google spits out won't even scratch the surface of what's available out there. But modern CS folk will have to know much more than the basics of discrete math. For example, math analysis and probability theory are very helpful. This free book [1] gives a sampling of such topics. As preparation, one can start by looking at pre-real-analysis books like the ones by Lara Alcock and Jay Cummings, Linear Algebra by Kuldeep Singh and Probability Theory by Dimitri Bertsekas/Tsitsiklis. These books are very easy to read. There are also introductory books that give a bare-bones sampling of most undergrad math subjects from abstract algebra to topology like the ones by Gary Chartrand (separate from his discrete math book) and Steve Warner. Such books are designed to be as hand-holdy as possible. The more I type the more I realize there's more (much, much, much more) to say about the math side of things. Anyway, for another thing, google category theory just to be aware of it. There are a few undergrad/high school level books on the subject, but I am not sure how useful that is to a freshman.

[0] Book Of Proof by Richard Hammack

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

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

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


Let me start by sharing what I think is the most important advice. I would focus and really ensure you "learn" things. Don't worry about optimizing for exam scores. In my opinion, it's better to get a 75% on an exam and understand that 75% well as opposed to getting 95% on an exam but only because you "remembered" things without really understanding them.

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

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

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

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

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

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

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


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

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

My 2c.


Join your school's ACM Programming Contest or ICPC team. It will prepare you well for whiteboard coding interviews.

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


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


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.


Disagree. Skip a CS degree and be instantly skipped over for coveted jobs. Sure you’ll still get a job. Ask me how I know.


I think these are good times for this theory of not needing a CS degree to be tested. I am thinking of Google's recent rescinding of offers to thousands of contractors, or the latest from https://layoffs.fyi/tracker . Lots of companies have frozen hiring.

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

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

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

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

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


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

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


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

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

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

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


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?


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!


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

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


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

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


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!


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


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.


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.


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.


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.


Luckily I went to a really hard high school. I breezed through middle school and then completely flunked freshman year so I learned my lesson early.

I'm 100% sure that if I had not gone to such a hard high school I would've completely ignored your advice and failed at least a semester of college.


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


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!


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!


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.


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.


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

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

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


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.


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.


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.


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.


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.


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.


There is no speed limit. I wish I read this when I was younger:

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.


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


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.


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.


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.


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.


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.


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.


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 - and 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.


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


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 :).


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!


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)


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.


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.


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!


"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!


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

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


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.


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 it gives you a holistic view of a computer and it's operating system at every level of detail.


I’d recommend spending a few weeks this summer working through the nandtotetris course it was something I only stumbled upon after college and it helped glue all of the different classes together in a simple cognitively digestible example.


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


+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.


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.


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.


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.


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.


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


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.


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.


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.


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.


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!


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


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.


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 :)


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.


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


- Watch CS50 by Harvard alongside your freshman CS 100-level courses - it will help you with fundamentals. - Read Cracking the Coding Interview - a 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!


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?


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.


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.


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.


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.


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.


Two main points. Care about the details, but don't get overwhelmed.

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

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

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

Good luck and godspeed.


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

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


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.


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.


Don't play Empire. Or X Pilot. Or MUDs.

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


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.


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.


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.


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.


take linear algebra ASAP. it's probably the single most useful course you can take at a university.


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.


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.


I highly recommend the MIT Missing Semester Course. https://missing.csail.mit.edu/

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


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


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


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.


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.


Make friends with the TAs. In a year or two, they’ll be able to refer you for internships.


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.


Do side projects. Do internships, if possible. Aim for A's instead of A+'s. The time-savings will be enormous, and allow you to do other things.

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


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


Learn your first (class's) language now, so when you are learning you can focus on concepts not syntax.

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

Consider Vim

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

Talk to your faculty all the time

Get into research

Build things that aren't for class

Hit me if you like, email is in my profile

Good luck!


Underrated comment. Since everyone has the conceptual stuff down:

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


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

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

Also, thank you for the vote of support!


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!


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.


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 $.


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.


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.


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


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.


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.


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.


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.


Don't forget your social life. Don't forget to study.


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.


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.


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.



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


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


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


Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact

Search: