1. 23

A lot of times I talk to older programmers (35+) and they complain about the barrage of new languages. Or how starting out with language X is not as good as starting out with language Y. I sometimes see where these people are coming from, but for a lot of students they didn’t get to choose which language they started out with. Thus, I was curious if you had to start over with a blank slate how would you go about learning? How would you go about learning data structures? How would you practice your skills?

Feel free to link to any resources you would use.


  2. 20

    Couple quick notes:

    • Learn stuff that you don’t like, a shallow disunderstanding can really impede mental growth. Studying stuff you like/know is transferring information not comprehension.
    • Learn as much as possible from the smartest people around you, if they say something you disagree with, keep your mouth shut and keep learning.
    • Be very goal directed, build things
    • Show up
    • Read the material beforehand (I mean this generically), continually prime yourself with new experience, see #1. One of the hardest part of bootstrapping new information is having no context.
    • Have a question you want answered, keep it unanswered, you will pay attention more
    • Summarize your new experiences soon after you have them, revisit those summaries.
    1. 8

      These are excellent methodologies. A slight perversion of #1 is: all future potential lies in the set of behaviors you currently reject.

      Do not expect your professors to inspire you, and do not hold them responsible for your failings. Data structures, algorithms, time/space complexity etc… are beautiful subjects, and proficiency in them will give you great power. Learn about some of the history of database data structures (how is leveldb different from berkely db, and why is it different?), real-time operating system specific kernel algorithms (how does FreeRTOS provide consistent performance?), and so on. For a bunch of real-world examples that probably have an impact on you and the people around you, check out this StackOverflow data structure/algorithm mega-post.

      Connect the things you are learning about with as much as possible. Make the mental connection graph as densely connected as possible to anchor new ideas to more familiar contexts, and make sure you revisit the connections over time, through summary or construction, and evict stale connections that your present experience can refine.

      1. 1

        all future potential lies in the set of behaviours you currently reject

        Out of curiosity, is this your phrasing? (I really like this statement and I want to be able to attribute it properly…)

        1. 3

          I read something to this effect when I was reading about the Jungian perspective on “the shadow”, and I think I interpreted it in a very general way. I don’t recall the exact writing. It’s pretty reductive, ignores rate of change of potential based on current behaviors, and ignores your potential that is dependent on external factors, but it may be a nice thought when you’re trying to modify your current decision mechanisms to connect with a future desired state.

    2. 4

      I wouldn’t worry so much about algorithms and data structures, at least beyond the basics - if you know the rough behaviour of a list, tree and hashmap that’s all that usually comes up, and they’re straightforward to learn on your own. I’d say learn by solving real problems; particularly software design type matters where the best practice makes no sense until you’ve seen a several-hundred-thousand-line codebase. If you can’t do that, try and calibrate your sense of what is and isn’t possible - maybe read through open-source library code, find the gnarly bits and see if you can rewrite them to be less gnarly (this is the key skill for professional programming). Sometimes it’s bad programming and sometimes it’s like that for a reason; being able to tell the difference at a glance will serve you very well.

      1. 1

        Totally agree with your sentiment except for interviews. I just finished a job search in San Francisco and some places in the Valley for a senior type position. I had one interviewer actually expect me to implement a totally functional LRU cache on a phone interview with no ability to google anything. I got dinged because I didn’t implement the most efficient cache removal algorithm on my first try (though I knew this was the hotspot and indicated how I would fix it).

        What I’m saying is, most of the Bay Area firms I talked to were very picky about hiring and intricate knowledge of data structures and algorithms were table stakes for the interview.

        1. 1

          I disagree.

          Learning data structures is pretty important, to me its what makes a difference between a decent and a good developer. Learning programing patters and best practices is something that develops overtime, but understand different data structures, their performance, best times to use this or that data structure in the end can make your design decisions much easier and the algorithms much simpler. Some data structures lend themselves to concurrency well while others don’t etc. You don’t need to be able to implement them, but understanding them is paramount.

        2. 1

          Q1: if you had to start over with a blank slate, how would you go about learning?

          A1: I would’ve kept it the same, but I would’ve done it with a lot more love and focus. I fell in love after a couple years of slogging and every year I spent not loving the craft is a year I regret. But I firmly believe that the moments you waste are important too, because they help you appreciate what you have that much more in hindsight and help guide you away from making bad choices.

          Q2: How would you go about learning data structures?

          A2: Simple data structures first, and gradually progress to more complex data structures. I would attempt to mock real world scenarios and see how certain data structures help aid you in those scenarios.

          Also, you wouldn’t learn to write a paragraph before learning how to write a sentence.

          Q3: How would you practice your skills?

          A3: I would write a lot of code that has the intent of having a purpose without worrying about whether or not I hit the mark. And after each failure I would learn from my mistakes and try again. If this process doesn’t hurt you, you’ve definitely found something you can love and enjoy for a long time.

          And honestly when I let myself have fun, I met other people who loved working hard and having fun too, and that made everything way more enjoyable. I have made a ton of mistakes, and I don’t regret a single one of them. To answer your question in the title, if I had a “redo” I would just try to make more mistakes and learn more.

          1. 1

            I’d definitely use an SRS as animatronic mentioned in his last point. In my experience forcing yourself to make the cards forces you to both pay more attention and also improves understanding, since its harder to produce a Q&A for something you don’t understand. Of course, remembering the material forever is the main benefit.

            I had more I was going to add but animatronic really covered it well, I want to emphasize the “show up” point. Don’t get too caught up in methodologies, make sure you’re actually spending a lot of time building and learning and not just thinking about it .