Ask HN: What skills as a CS student should I focus on this summer?
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 ] threadClasses 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
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.
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.
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!
My favourite projects have been the ones I know little about beforehand (for example llvm frontend for a toy language, gb emulator).
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.
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.
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.
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 :)
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.
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!
So work on writing technical information unambiguously. Not code, but written language. It's like a superpower in software development.
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.
* 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)
- 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.
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.
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.
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.
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.
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.