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!
All advice is appreciated!
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.
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.
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.
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.
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.
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!
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).
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.
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.
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.
Deleted Comment
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.
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.
> 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 would be more inclined to believe that the kind of person who is interested in signing up for psych classes is already more interested in understanding how other people think in a way that naturally benefits them socially.
Dropping out, mental issues and life happened, I'm now back at the Uni and now I understand how to do the work. In my advanced programming class of 400 people, I managed to score in the top 1% solely because I put in almost double the required hours and tried to expand and extend every task and homework we were given. For the first time, I also feel like my grade was actually earned and I might not actually be totally dogshit at programming after all.
This still burns me at my actual job, more than a decade later. Stupid edge cases.
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.
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.
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.
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.
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.
- 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.
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.
Learn to communicate effectively, and you will not be sorry you did.
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...
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'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.
"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".
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!
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.
"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.
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.
https://youtu.be/2Op3QLzMgSY
While there, SICP is not a bad way to augment a CS degree :-)
My big piece of advice: Major in something useful (CS, check!), minor in something fun. A lot of the computer science classes you take will be boring AF, or you'll start to bang your head against the desk wondering why you have to know how operating systems work when you just want to make iOS apps (or vice versa!). Some of the classes will be deeply math heavy. It can and will seem overwhelming at times. So minor in something fun. Pick something that has no bearing on your chosen career path. Minor in Theater or Music or Art or Literature or Physical Education. The best part about minors is that you generally get to take all the fun classes and not the terrible ones! You'll meet a whole bunch of people with diverse interests that aren't solely computer nerds.
As far as the CS stuff is concerned, focus on absorbing as much as you can. Contrary to what other people said, don't sweat the details. You should have a fundamental understanding of all the big areas (databases, languages, algorithms), but you don't need to be an expert in any of those things to get a job. In fact, 90% of the subject matter you learn in college won't be relevant to whichever job you get. BUT... the act of learning is important, and the fact that you have fundamental understandings of those things will get your foot in the door
Think of your college degree as a ticket to an interview, and your first job as the real education. Your degree is proof of two things: 1) that you can learn, and 2) that you can start, stick with, and complete a large, multi-year project. Nobody expects someone with a Bachelor's degree to be an expert programmer, but they _do_ expect critical thinking skills and the ability to learn. You'll learn more on the job in the first 6 months than you will in 4+ years of college education... so don't put too much stress on yourself there.
So... take it seriously, but not too seriously. Study hard, but take fun classes too. Make connections in your computer classes, but make friends across a wide variety of interests. Learn the fundamentals, but don't sweat the details.
(Also, pro tip: nobody gives a shit about your GPA. A 4.0 doesn't get you anything in the real world except a rude awakening. By all means, try to get all A's if you can, but don't burn yourself out by trying to get perfect grades.)
There are lots of other critical points casually shoved in here that could probably be expanded to book chapters if you wanted. The point about making connections is huge. Arguably the biggest difference between a state school and Ivy League education is the network available to you. Regardless of where you’re at, establishing connections is a major part of undergrad.
Except for a handful of classes it was mostly just letting us lift weights for an hour, but the instructor helped improve my form and I learned how to prepare my own weight training program. A good amount of it has stuck with me 10 years later, although I'm out of the habit of doing it regularly now (kinda hard to get back into it now because of the pandemic, too, except a couple of kettlebells I own).
I agree. I double majored in CS and Acting specifically because I enjoy both topics and wanted to get better. It does take some dancing around with your schedule, but if you take the time to create some different alternative schedules it can be done. There were some semesters where I was more CS heavy, and others more Theatre heavy. I was able to walk out with both degrees in 4.5 years.
Well, no one except for grad programs.
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...
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...
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.