Ask HN: What skills as a CS student should I focus on this summer?

36 points by aireo ↗ HN
Hello, everyone. I'm a first-time poster but a long-time reader here.

I've started my journey into CS, and I wanted to humbly tap into the collective knowledge and wisdom of HN. (I've seen other people ask questions similar to mine, and I've been repeatedly blown away at the quality and depth of the responses; it's wonderful to see.)

I recently completed the first semester of a four-semester diploma program in software development. I'm a mature student, in my mid-30s, and I went back to school because I've always loved technology, and because problem-solving through programming is deeply appealing to me. (Some of what I've read on HN pushed me to this career path, too.)

This summer, I want to focus on learning fundamental skills -- mostly technical, but I'm more than open to soft skills, too -- that will contribute to my success in this program and for my career. However, the amount of stuff out there combined with my inexperience has left me rather overwhelmed. It's difficult knowing where to start.

I'd love your feedback on where a novice like me can best focus his efforts. I have a few questions below, but I guess part of my problem is not knowing exactly what to ask other than: what skills, ideas, concepts, or knowledge should I spend my time on?

(For some context, my education background is in English Literature. I don't have a lengthly or particularly strong background in math or STEM. We ARE learning mathematics for computing and discrete math in our program.)

* Some questions *

-- In our first semester, we used Python as a gateway language to learn computational thinking and problem-solving. I like Python and want to continue with it, but because we're learning C next semester, and because I want to broaden my skills, I started learning C on my own by way of _C Programming: A Modern Approach_, by K. N. King (A fantastic read, btw). An instructor suggested doing both is fine. Do you agree? Or would it be better to focus on just one language?

-- It seems to me that algorithms and data structures are foundational skills worth focusing on. Would you agree? If so, what one, two, or three books would you consider (a) required reading and/or (b) excellent for beginners? What else in this space would help?

-- More generally, what top three to five skills, ideas, concepts, etc. should I be spending time on?

-- Any other recommendations / advice / suggestions / words of wisdom?

Thank you for considering my inquiry. I'm deeply grateful for any input you may have!

44 comments

[ 2.7 ms ] story [ 103 ms ] thread
The Missing Semester of Your CS Education

Classes teach you all about advanced topics within CS, from operating systems to machine learning, but there’s one critical subject that’s rarely covered, and is instead left to students to figure out on their own: proficiency with their tools. We’ll teach you how to master the command-line, use a powerful text editor, use fancy features of version control systems, and much more!

Students spend hundreds of hours using these tools over the course of their education (and thousands over their career), so it makes sense to make the experience as fluid and frictionless as possible. Mastering these tools not only enables you to spend less time on figuring out how to bend your tools to your will, but it also lets you solve problems that would previously seem impossibly complex. Topics include:

Shell Tools and Scripting, Editors (Vim), Data Wrangling, Command-line Environment, Version Control (Git), Debugging and Profiling, Metaprogramming, Security and Cryptography

@jodoherty and @somethoughts -- thank you.

This was my experience during the first semester. We were shown various tools to use, but little time was taken to show us _how_ to effectively and efficiently use them. Git and debugging were too major topics that were touched upon but, imo, needed more thorough explanation. I'll dive deeper into these topics.

Thanks again for sharing.

I agree that how to use tools like editors is super important.

But it's not "left out" of CS courses. Rather you're expected to figure that out yourself using any of millions of existing resources to do so.

In other words, instead of spending a week teaching you Git, you are shown the concept of version control and the course moves on. You are _expected_ to Google "how to use git". Precious CS time should be spent teaching concepts not products.

This has the advantage of making you flexible. You learnt Git at college but you got a job at a shop using Mecurial? No worries, you did it once you can do it again, just Google "how to use Mecurial".

It's the same for language. It really doesn't matter what language you learn, what matters is that you learn how to program. You can learn another language in a matter of days. (

At college level we once did 10 languages in 10 days, with an assignment in each, just to prove the point. Clearly we didn't turn into experts but it showed how the concept of language matters more than the syntax. Switching between functional (lisp like) and imperative (c like) is more interesting but by that point we already had exposure to both.

Just code. Python, C, doesn't matter. Learn both at once, learn 5 languages at once, or focus on one exclusively. Write a GUI app, or a web front end, or an assembler implementation of a parser tree, or a text adventure game. Whatever keeps you interested. People will tell you you have to do it this way or that, and they're all wrong, because they're not you. It doesn't matter at all how you do it, or what you choose to write, so long as (1) you can keep up your interest and (2) you're coding.
@ericbarrett -- thanks for this.

I've been reading a new Python book (_Introduction to Computation and Programming using Python_) and the aforementioned book on C, and I'm doing every exercise in the book. I'll continue coding each day.

Appreciate your input!

Absolutely agree. I find it easier to learn things when there is problem/goal to work towards.

My favourite projects have been the ones I know little about beforehand (for example llvm frontend for a toy language, gb emulator).

I agree with this, whatever keeps your motivation highest.

One tip if you're anything like me: make sure you have some people to learn with and form a group. Hell, even try to win their approval with how "smart" you are by completing projects, and be delighted with whatever they produced. Learning on my own is too soul-crushing, somewhat learning together and helping other people implement something specific that you understand is delightful.

What are your goals? I don't mean to be snarky when I say that learning to ask a structured question (or being more disciplined about asking them) should be high on your priority list. Book like the pyramid principle about top down communication would probably be helpful.

1. It's probably fine. Based on your self-description, based on your self-description I imagine you're still struggling with syntax and program structure. Programming in either language will improve your abilities in that regard and let you focus more on the underlying ideas in your classes. That said, if you can stick to 1 or 2 languages for most of your CS classes that is preferable.

2. Data Structures and Algorithms is useful, how useful depends on your goals. If you want to make the big bucks you should aim to be fluent in at least a textbook's worth of material. If you don't feel the need to aim for the top, you can get away with less. I would start with Skienna: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...

If you really want to be a master, you can then go for CLRS: https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press...

3. This depends on your goals. If you're aiming to be a top engineer now's one of your few chances to really focus in on lower level system stuff: Operating Systems, Networking, Compilers, or Databases. If you want a decent job fast of college, focus on data structures and algorithms and start trying to deploy code on something like digital ocean. That said you probably also want to do: https://missing.csail.mit.edu/

General advice: Dive deep, understanding a few things really well is better than understanding many things shallowly (you will retain more info over time).

A mistake many people make when reading textbooks is to guess what words mean. In technical texts this usually leads to misunderstandings and ultimately a slower learning process. Take the time to understand the words even if it takes hours (imminent deadlines notwithstanding), you will go faster. (I once took a month to get through a single page of a textbook because it had so many new words and concepts).

Start using version control (preferably git). Try to at least every hour if you have new code.

Try to start writing well structured code now. You probably won't do a great job at first but by trying earlier you'll do better.

Related to above, start writing tests for your code. Code that is testable is usually better structured.

Source: Senior engineer at one of the bigger tech companies and a former educator.

@Hermitian909, thank you for sharing your insight. I deeply appreciate it.

Points taken: I'll continue working with both languages (which has the added benefit of seeing the similarities and differences between the two). I'll begin diving into the algorithms -- in fact, I grabbed _Grokking Algorithms_, which is an interesting read, but I'll certainly pick up _The Algorithm Design Manual_.

And your point about asking clear, structured questions is a great one, as is taking the time to really, actually understand what I'm reading.

Thank you again for your time.

You have all the right ideas, in my humble opinion. You found an interest in Python, so that's worth pursuing. C is an amazing, powerful language that you should spend some time with. Other CS concepts like algorithms and data structures are valuable to learn.

If you like Python and want to learn C, you might want to check out CPython or Python packages written in C. Maybe try writing your own Python package in C. This would strengthen your knowledge of both languages.

Just my 2 cents :)

Thank you, @uneekname. This is a great idea. I'll check out those packages. Thanks for taking the time to share your input.
Don’t worry too much about whether to learn language A versus language B. They all do the same things. Focus on learning theory of computation. A bit of complexity theory is also very useful (but don’t get carried away with it).

Learn discrete mathematics. Learn differential equations. Learn topology and algebra. Don’t worry about it being too much, you’ll be surprised how similar they all end up being.

Read and understand The Analysis of Algorithms by Paul Purdom. It’s very dense, but it will serve you well.

Why differential equations, for one trying to learn CS? For that matter, why topology?
@togaen -- thank you for this.

I'll pick up _The Analysis of Algorithms_. And, luckily, we touch upon several of those mathematical concepts in our course. I appreciate this input!

I minored in CS and went into a non-programming role, but I wish my classes had covered GIT. Version control is ubiquitous, but not covered at every university. Usually you're just expected to learn it on your own. I'd suggest just focusing on C and possibly covering something like git or GitHub. Best of luck.
Thank you, @formerkrogemp. You're absolutely right -- GIT was touched upon, but only briefly. I've heard several people mention how important this is, so I'll focus on this. Really appreciate you sharing!
I think the fact that you're thinking ahead is a positive sign. Best of luck.
The single hardest thing in software development is brain-to-brain information transfer. It works really badly. But in software development (especially at larger scales), everything depends on it.

So work on writing technical information unambiguously. Not code, but written language. It's like a superpower in software development.

@AnimalMuppet, one of the classes I enjoyed most was technical writing, which we'll be continuing in the second semester. I agree that expressing ideas clearly and unambiguously is important -- I'll continue working on this. Thank you for sharing your input!
@aireo, one often heard advise to hone those technical writing skills is to start a technical blog where you document what you have learned/investigated. If you use GitHub pages (free) to host the blog, you’ll learn some git and static site generation based on markdown as well.

Viewing this blog as your own “external memory” or a place where you document your journey can help to overcome some of the factors that may be blocking when aiming to write for a general (developer) audience.

I love this idea. I also see the value in reflecting upon what's been learned. Appreciate this great input.
I would focus on the software engineering process. A CS degree will teach you the fundamentals but you need to understand how to put together a software application to get a job. I would go as far as picking a popular software and go thru the process of creating a clone. Don't get stuck on figuring out the best programming language. There is none. Just pick a language and go. I'll even pick it for you. Python! Oh, you say you need a software? Ok, copy Hacker news. You're welcome. What you copy doesn't matter. Just understand the process of putting it together really well. Now start....
I've been thinking about possible projects. So far, I've been reading about algorithms, which I want to practice via coding-challenge websites, but focusing on a larger project seems sensible. Thank you for sharing this!
* A-Levels Imperial College London sequence on edX

* Sedgewick & Wayne CS & DS/Algos books & accompanying Coursera courses (alternatively, IIT Bombay's C++ sequence)

* LAFF Linear Algebra sequence on edX

* Open-ended puzzle/system design games (SpaceChem, EXAPUNKS, Magnum Opus, TIS-100, Factorio, Shapez.io, Mindustry)

I've written all of these down. Thanks so much, @wly_cdgr.
Spend the summer reading "Building Git" by James Coglan. Why?

- You'll learn Ruby, a new language

- You'll understand Git at a pretty advanced level

- You'll get exposure to testing

- You'll get exposure to unix programming

The book is a full body exercise that starts from the basics and takes you on a pretty good tour of systems programming.

This sounds neat. I wonder if there is a Go equivalent.

I’m almost done with “Building Distributed Services in Go” and it’s also really cool. You build a distributed log service (ie Kafka) from scratch and it’s extremely informative for understanding systems. Also it was written by the coauthor of Kafka, so the dude definitely knows what he’s doing.

Great suggestion -- thank you. I've written this down.
I bet doing a few of the highest ranked courses on Udemy would help you quite a bit and give you a head start on some concepts you're likely to learn about the future.

I bring up Udemy, but any online course where they aggregate ratings can probably work.

What you're looking for is something most people like yourself found useful. That's about as strong of a signal as you can get for utility, short of an explicit, well-defined goal.

Makes sense. I'll take a look. Thank you for sharing, @DantesKite.
social skills - enjoying time with family and friends, forming new bonds. You're going to have a great summer, enjoy it
I recommend practicing real world projects. Avoid theory and reading and planning. Try to follow tutorials and repeat them until you can do the tasks from memory on your own.

Learn Django. It’s a solid web app framework and you can practice Python.

Contribute docs and code changes to some open source projects. It’s a process to figure out what you can do and even evaluate if someone will review and merge it.

There are plenty of packages for Django with “easy” languishing issues. Just ask in a comment if it’s still wanted before you put in time.

Learn modern JavaScript. Not react, just write little JS stuff to enable pages.

Get to know IDE, such as a jetbrains product like Pycharm or vscode. Tweak the key map as you learn about different features.

Try to find a community you can post your demos or progress to. Have fun with it.

This is wonderful. Thank you, @bredren, for sharing this.
The one thing I consistently see CS programs omit which drives me nuts with new hires. Zero knowledge of version control. Do yourself a favor and learn git now so you don't suffer later. It will help you all throughout your college classes too. TBH I'm not sure why this is such a glaring omission in CS degrees, I guess they just want to teach theory, not practical application but I've seen it consistently missing from new CS grads.
This is very practical advice, and something that several people, in this thread and elsewhere, have told me. I'm made a note of this and will consider it a priority skill. Thanks for taking the time to share this, @engineerDave.
IF you are stuck with "what" to program, in the mean-time before you figure out what project you would like to start or participate, go to one of the code ranking sites (leetcode, hackerrank) and get good.

Ultimately, this is all you really need to get a job- get good at these problems. Being able to solve them and explain them to an interviewer. Even if you never plan to get a job, it will force you to learn all of the basics that you should at least know about if you plan a career in software development.

As examples, here are some notes I received recently from Amazon and Meta that they send after your initial phone screen with a recruiter:

Amazon tech screen: ------

Technical Prep:

Our technical questions will test your ability to solve a technical problem. If you are rusty, you should study up on:

Trees (binary/red black trees/N-ary trees, tree symetric (inverse image), tree traversal, sorting trees, prefix tree, radix tree) hash maps, stacks/queues/heap/priority que link lists/reverse link lists (space vs time) recursion/recursive strings binary search Arrays - 2d/3d graphs/graph traversal Big O notation

Meta tech screen: -----------------

Tips/Things to Know: Your initial interview will last approximately 45 minutes. Most people study 1-2 weeks and practice on a coding competition website beforehand (Ex. Medium difficulty problems on a site like Leetcode or HackerRank). Discuss initial ideas and solutions with your interviewer, which will help you to clarify any ambiguity in the problems. Take hints from your interviewer to showcase your thought process and problem-solving ability. Generally, avoid solutions with lots of edge cases or huge if/else if/else blocks. Deciding between iteration and recursion is always an important step. Talk about different algorithms and algorithmic techniques (sorting, divide-and-conquer, dynamic programming/memorization, recursion). Your interviewer may hint that you’re heading in the wrong direction if you move towards one that’s not optimal. Think about data structures, particularly the ones used most often (Array, Stack/Queue, Hashset/Hashmap/Hashtable/Dictionary, Tree/Binary Tree, Heap, Graph, Bloom Filter, etc.) Don’t worry about rote memorization such as runtimes or API/native calls. It's good to know how to figure out approximate runtimes on the fly but the code you write is more important (call out optimizations at the end). You will be asked about o Memory constraints on the complexity of the algorithm you are writing (and its running time - O(N^2) to O(N) etc. Please prepare any questions you have before the interview and also be prepared to answer why you are interested in Facebook.

@88j88, this is fascinating. Thank you. I've heard several people mention these sites, so I'll check it out and start solving those problems. Thank you for sharing information -- it's very helpful.
Technical side of things: Pick up an open source project that you like and start contributing. Get involved in competitions through the university if you can, there should be plenty. Learn to work as part of the team, try to affect the team in a positive way, learn to accept others. "Google summer of code" is something I would consider at this stage.

Most important: Focus on soft-skills. Working in CS will inevitably make you socially awkward, try to fight this trend early. Focus on creating a network, that will be your future safety net when searching career opportunities. Make a habit of meeting ppl and keeping in touch.

Avoid social media for the sake of _social media_. Try to train yourself to focus for long stretches of time to a single thing e.g. reading "big books" is become an arcane art these days.

Study social sciences, literature and art in your free time. Your background is giving you a head-start. Pick-up books, read magazines. Learn how connect, strike conversations, how to talk to ppl on the opposing political spectrum. That will make you able to read signals and view the world with empathy. Expressing your opinions without upsetting the other party. Learn the art of public-speaking.

Learn a music instrument. The guitar is the most obvious choice, but find something you like. There are many hobbies out there, but music and dancing, especially folklores, have the added value.

Writing code is a good skill to have, but communicating effectively, connecting with peers and non-peers and having a positive world-view are traits that are hard to find amongst engineers.

Finally, since you're starting your career now, try to diversify! We live in a day and age that is highly unlikely we'll have "one career", strictly speaking. From personal experience, a diversified profile makes you "look smart" and sets you apart from the crowd.

@atmosx, this is great advice. I appreciate the focus on balance and diversification. It's something I've traditionally struggled with, leading to periods of unhappiness and burnout, and focusing on ways to avoid this cannot be overstated. Thank you.
the best tip i ever got was to learn to code 'assembly' (for some platform of your interest. - i just picked PC as i had a PC at home) even though it's not a super practical skill usually (most platforms bootstraps higher level languages, especially if uefi etc. is involved) it taught me tons about computers, code and operating systems etc. that i would not have learned otherwise, and benefit from daily. (programming). i dont code actually ever in assembly anymore, but i am happy i went down that rabbit hole at some point.