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!
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.
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.
So work on writing technical information unambiguously. Not code, but written language. It's like a superpower in software development.
* 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.
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.
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 :)
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.
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.
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.