Ask HN: What advice would you give to a computer science undergraduate?
I am about to enter into the 2nd year of my CS course in university. The second year is when actual CS courses begin. I've had a basic C course. I have good knowledge of basic computer science, some algorithmic knowledge and a good experience with JavaScript and Node.JS. Yet, it would be great if I could get real advice / insights from professional computers scientists on things to explore ( in the CS field ) in college.
51 comments
[ 3.6 ms ] story [ 93.4 ms ] thread- Make 1 mobile application
- Make 1 desktop application
- Nothing fancy for the above just some that solve simple problems, good if they solve your problems!
- Learn to use a version control.
- Try to intuit with hands on coding a hard domain you will like: graphics, AI, compilers. The trick is if you like the hard parts, you most likely like it!
- See if you can work with some professor where you can learn how to implement code for papers published in the hard domain you like.
- By the time your internship arrives, you can build a decent portfolio.
- And eat, sleep, exercise.
I know the above can be a lot with your studies, hopefully you can pull it off. Good luck.
Using version control regularly gives you:
* Backups in case of mistakes/system failure (so long as you remember to sync/push your work to an external server)
* Room to experiment with various approaches to a problem (since you can always reset to a known good state)
* Experience in explaining and structuring your solutions to problems
Ideally you'd do your CS major in a liberal arts program rather than in engineering, but that might be impractical. Get as close as you can, though.
So, for instance, if you have 4 hours scheduled to implement some neural network to optimize X, it may take 30 minutes to type in the algorithm and get it working, but it will take 3 hours to get the environment set up, the version of Tensorflow or whatever up and running, and much longer to type up your results.
So, hopefully, if you expect this, you won't crumple in despair when you find your self 1.5 hours into the time and you haven't even got the right language working with your IDE for that hello world to come up. No, you're right on track, and just keep going.
You'll probably come out with a good understanding of gc'ed languages like Javascript and Python, but the interpreters for these languages still interface with the modern operating system with a systems language like Assembly, C, or Rust.
Maybe try bringing up a simple application on a Z80 or similar MCU that blinks an LED connected to a GPIO. Then switch to using the pulse-width-modulated output to blink the same LED but at different blink rates and potentially even make it fade in and out.
You will learn more about embedded systems from that project than you ever could from messing with Linux on a Raspberry Pi. And everything you learn will give you a better understanding of how computer systems actually work. You will also have to learn more about C and potentially C++ then you ever thought was possible.
You don't need to write an OS from scratch either. You can use something like https://freertos.org/. There's board support for widely-available platforms.
Being a coder means being a commodity; you're competing with people in countries where the GDP per capita is less than $2k. Unless you can quote chapter and verse from Knuth, and since you're mentioning Javascript, you probably can't, you're human chum to be exploited by oligarchs. Find something better to do, even if it's bullshit.
We really don't need to breed a new generation of code monkey slaves. You're better off studying watchmaking or leather working if you want a craftsman like profession involving science and engineering. Otherwise: be the boss.
Schools who sell sugar plum fairies should stake their students success. Are you willing to give this kid advice that you're on the financial hook for for the next 40 years?
- "Hey, I could make a bunch of easy money writing code!" So, off to school for a degree, not bothering to learn anything other than VM-based languages and web development.
- Get a job and never crack open a book (or read a paper) on software again.
- Only learn new stuff as it pertains to your immediate work.
I see this time after time in the resumes that I encounter. I think the half-life of a software career that follows this pattern is about 15 years and that's probably being generous. These people will spend most of their time either being taught the ropes as an industry newcomer (which is fine) or being told what to do by others (because they didn't keep their skills up). Their agency never really develops because their skills stagnate relative to the people who do get with a program.
I don't mean that someone should work all day then go home and commit like crazy on personal projects, that's also terrible advice. But it's not hard. For instance, if they spend an hour a week reading a conference paper then that's 50 papers a year and they're probably learning new things (or are at least aware of what they don't know); spread the subject matter around and after a few years of this they'll be in conversations like "Hmmm, this feature we want looks a lot like that consensus thingy I read about a few months ago, and they solved it by..."
"Wow, how'd you know about all that stuff?"
Reading a couple papers, maybe an hour or two a week, why?
The G-G-GP is terrible advice because someone who is even a little motivated and who exercises above-average career upkeep can do really, really well and have a long tenure writing software. People will want to work with them, even. Managers will ask their advice on a regular basis! Advising people who are technically inclined that getting an MBA is unconditionally better is just, well, wrong. I could be more forceful.
tl;dr; if you treat your software career like an actual career (and not some kind of easy con on the world that will continue to pay off for decades) then you'll probably get good results.
If a college student told me "I want to optimize for a career where I don't feel like a commodity, have lots of bargaining power (high wages, short hours, easy to switch jobs), and can easily start a business or consult on my own if I desire," I'd tell them: study computer science. SWEs I know at the big tech companies are being paid the same as my banker friends for half the hours (or less). The consultants and PMs are working longer hours for half the money and way less job security.
By definition if you're selling your labor on the job market you're being a commodity. I can't predict the future, but for now at least being a SWE seems the best way for a recent graduate to win some bargaining power back.
Go to meetups and well... meet people and potential investors / founders. If you do this you'll have a good set of potential mentors and likely not have issues finding interviews when it's time to look for an internship or job.
Another tip is to never speak negatively of anyone you've worked with as an intern to other potential employers. Once you're a professional, I'd air on the side of neutral if someone asks why you left a startup or your opinion of a specific ex-colleague.
You never know who you're talking to also knows... Been burned by that one when I thought I was just "being honest".
They are both very valuable and are extremely complementary but they are not the same thing. As you enter the workforce, understanding this distinction will serve you well.
[1]: All numbers made up.
2. Learn how to decompose big problems into a set of little problems. I'm not sure where (if) they teach this in CS but that's the skill that really lets you get somewhere interesting.
3. Find a group of friends and build something together. Most professional programming is a group activity and learning how to communicate and work with other people is super valuable.
Read a ton of code. You're going to be spending your entire career doing this, so you might as well get started.
My personal prejudice is to understand what's going on at all levels of a computer, from the silicon all the way to user experience. You don't need to know the gory details of transistor physics, but knowing in general what's happening at the major levels of things will be an invaluable.
Take a class on ethics. Most companies hiring CS majors today are sorely lacking in ethics and it would be good to know ahead of time which are which.
Learn how to ask questions to get good answers. In particular, learn how to write up an MCVE - Minimal, Complete, Verifiable Example [0]. The better the quality of the question, the better the quality of the answer. This is really hard when starting out using a technology you know nothing about. In those cases, describing what you're trying to do, what approach you're taking, and why you think that approach is useful will get you to answers about how to do it correctly more quickly.
Don't spend too much time on HackerNews. The articles posted here tend to attract a certain crowd with a certain viewpoint on any given subject and it's a bit of an echo-chamber.
[0] https://stackoverflow.com/help/minimal-reproducible-example
> A computer science program is like training for the Olympics only to coach your little cousin's softball team
In other words - it's going to be hard, it's likely going to over prepare you for the real world, but if you make it, you'll be fine.
- Find out which courses at your university require lots of coding, and make sure you take those. Often these will be known as some of the hardest courses in the department (although some hard courses are more theory-focused). Those classes will be your most direct preparation for the work you'd be doing if you took a job as a software engineer.
- Identify the smartest/most talented students who are in your classes, and look for opportunities to work with them. You don't necessarily have to be social friends, but you should aim to work on problem sets and group projects with them if possible. When you're working with them do not skimp and let them do all the work - put in the best effort that you can, so that they enjoy working with you. You'll learn a lot from them, and they will be a core part of your professional network after you graduate. Later in your career when you're looking to switch jobs, your former classmates will be happy to endorse you when you apply for a role at their company (and vice versa).
- Office hours are underutilized, and tend to be frequented by students who are asking for extra credit, deadline extensions, etc. For each of your professors, read their web page and skim some of their publications to get an idea of their research area. If the topic interests you, then come up with some questions to ask, go to office hours, and ask them. You will broaden your knowledge of CS, and you never know when something you learned this way might be useful in the future. Learning firsthand from experts in the field is a rare opportunity, and you don't even have to be graded on it. If you're particularly interested in the topic, it's normally pretty easy to get involved in research as an undergrad, since you you cost basically nothing.
- Make sure you take Linear Algebra, because it's really useful for stats, ML, etc. and it's a pain to learn by yourself.
- Don't forget to have fun! Get involved in 1 or 2 on-campus clubs or organizations with people that you enjoy spending time with. This doesn't have to be CS-related - any shared interest works well, whether that's outdoor activities, literature, sports, theater, photography, etc.
Other than that, know what interests you and what doesn't interest you. Don't be afraid to reevaluate your interests over time. Don't be afraid to ask questions. If you think you're correct, be confident and say it.
Some people will say a breadth of skills is important and they are. But don't seek undue skills just because people say they're important. Do what interests you and you'll find a way to make it work out. Though in general, having a base of knowledge in complexity, algo, and data structures will help you find a job quicker. Every computer science program will teach this though.
Fundamentals. Algorithms, efficiency.
Related maths that interest you and intersect with CS. Topology, graph theory, set calculus.
Get very good grades especially in math and cs. Do research for credit or money. Get a summer research position. Don't worry too much about authorships your first year; you will hopefully end up as an nth author. In later years you're going to want to get a few nice publications (either high profile as nth author or ok-levle as first author) to get into a good grad school.
If you want to go into industry:
Prioritize getting an internship with a good company over all else. Get good at solving algo/DS problems. The big household-name tech companies will open doors for you if you have them on your resume, and they have special programs for freshman-sophomore students.
Regardless:
Take academic courses instead of practical courses. University practical courses (e.g. web dev) usually lag behind industry, and you will have ample opportunity in your career to learn new practical skills. You will probably never be in a state of mind or environment where you can get as much out of academic subjects (e.g. statistics, AI, theory of computation, etc.) as you are in now. Always always always prioritize conceptual understanding over trivia you can just google.
I would caveat this with: Make sure you have some structured activity that forces you to write a bunch of code. If you're not competing in ICPC or doing something similar, you should be taking courses like Operating Systems, Compilers, etc. that require significant coding assignments almost every semester.
Theory classes like Discrete Math, Theory of Computation, Algorithms, etc. are great, but it's important to have structured practice to make sure you're developing your coding skills as well. Most students won't actually complete coding projects on their own time, so it's good to put yourself in situations that force you to do it.
Overall great advice though.