14 votes

Self-directed learners of programming, sysadmin topics and so on: what is your approach to material that is too advanced?

First post: hello Tildeans!

In fairness, the title question no doubt applies to those on traditional courses/paths too - such is software.

Anyway -- in my experience, reading technical material which is too advanced is without a doubt the most intellectually confusing, emotionally damaging, and personally rewarding part of learning about software development. How about you?

I started basically from scratch last September without any knowledge about programming or Linux except a very brief stint in 2010. I'm a somewhat disorganised person (to say the least), and my learning habits have reflected that: I've followed my nose and impulse, reading pretty much whatever I've felt like. But I've ended up with a presumably ridiculous ratio of hours reading about code vs hours actually coding.

I'm a lazy person, so I'd rather sit and struggle with something I am definitely not ready to understand than go sit in front of a REPL, working from the ABCs til I can do the A-Zs. But the longer I look into things, and the more I play, the more I realise how much coding is like an instrument -- you really do have to just sit down and practice your damn scales! My experiences also support the argument for that 'T-shape' style of mastery (learn one thing very well, then branch). 20-odd Project Euler problems in a week or two has taught me far more than several months half-reading or half-listening to online material.

(Though, I think my 'inverse-T' approach simply has it's own set of trade-offs, rather than being plainly weaker, but that's for another discussion...)

The most ridiculous thing about this field is that there is no end to things you've never heard of: and I hate not having heard of things. My usual style when getting into a new obsession is to read very widely, but it feels like this is at best wasted effort here, if not actively counter-productive. It takes just a few clicks through HackerNews (or say, a read of some of the comments on Systems Programming topics) to find a paragraph that is entirely impenetrable to me. Man, that pisses me off. I think maybe as an ego-defense thing, I've always tried to get a 'gist' of the conversation or topic, but I reckon now this probably just breeds half-formed misunderstandings at best (Alexander Pope, "a little learning is a dangerous thing" etc etc).

Over the past couple months I've made far more visible progress than in any before, and I think a large part of that is learning how to admit when I am completely unable to access some sentences written in English, and how that's totally fine. My path is a lot clearer, and a visceral notion of sub-goals and stages of learning is a really nice thing to have. It's very relaxing to skim a blog post that goes completely over my head and think 'NBD'.

So, what are your experiences? Blocked by hubris/a short attention span like me? Or perhaps the opposite problem - finding you could grasp way more than you gave yourself credit for, after sticking too long with what you already knew? (These questions definitely intersect with things like perfectionism and imposter syndrome.)

I'm really curious to hear how you've dealt with things you feel you 'should' understand -- or how you manage the sheer volume of potentially-useful information out there (RSS, Pocket, something else?). Thanks for reading.

10 comments

  1. meghan
    Link
    this is actually something I've been dealing with lately to a degree. there's a app I want to make. which would normally be no issue but I do 95% of my work on the front end and while I've made...

    this is actually something I've been dealing with lately to a degree. there's a app I want to make. which would normally be no issue but I do 95% of my work on the front end and while I've made somethings on the back end, tbh it's been a while and it was mostly in PHP. Then comes along Tildes, doing things "the right way™". Containers, mature frameworks, python, all of it. I am not blaming any one for this but in a small way it's kind of broken me, in the sense that instead of doing what I know and building up like I've always done, I've spent all this time trying to figure out vagrant, and docker, and synced vm folders, and python.

    The part that really got to me about it was that I was for once experiencing the content overload I hear folks talk about all the time. They feel like we've lost touch because to even get started you need npm, and webpack, and gulp, and babel, and react, etc. And the answer there is the same one as I'm getting on the back end. No you don't. You don't need any that to make a good service. But I got so caught up in looking forward that I forgot to actually write any code.

    I guess the point I was trying to say is: try not to worry about it. Research as much as you can, but remember you don't always need to invent the universe when you just want to make an apple pie.

    8 votes
  2. [2]
    what
    Link
    To give a quick, general answer: much like programming, break it down into smaller pieces, and learn by doing. My favourite way to learn any new language, library, framework, tool, technology, etc...

    To give a quick, general answer: much like programming, break it down into smaller pieces, and learn by doing.

    My favourite way to learn any new language, library, framework, tool, technology, etc is to make a project with it.

    To use your example of Tildes, you might start with serving web pages, so you’ll learn a web server library (Pyramid). Now you want to let people make accounts and posts, so you learn a database & database library (Postgres and SQLAlchemy). Now you want a simple, clean way to serve customized html to users, so you learn a templating engine (jinja). Then Markdown support, so you use a Markdown library. Then you want to make the development setup and deployment easier for others, so you learn Vagrant.

    It’s a lot overall, but by breaking it down, you learn and implement incrementally, so it never seems like that much. And remember that, generally, when I say “learn” a library or framework, it usually means “learn the bare minimum to implement your current feature”. We use so many libraries now that there’s no time to completely learn everything, so you learn only what you need, and later on, when you have time, you can learn more in-depth.

    4 votes
    1. GoingMerry
      Link Parent
      I completely agree with you, and I'd add: use software to solve problems you have. I see so many learners right now jump into learn-to-code sites, trying to learn some optimized algorithms and...

      I completely agree with you, and I'd add: use software to solve problems you have. I see so many learners right now jump into learn-to-code sites, trying to learn some optimized algorithms and data structures. These are the same people who lose motivation after awhile.

      If you're solving problems you have, you're more likely to follow through and accomplish something. This also means you're more likely to stick with it in the long term.

      2 votes
  3. Akir
    Link
    You may have heard a phrase about science that goes something like "My work is on the shoulders of giants", in reference to how you keep building knowledge up from past discoveries. That applies...

    You may have heard a phrase about science that goes something like "My work is on the shoulders of giants", in reference to how you keep building knowledge up from past discoveries. That applies to computer science too. Your problem is very likely that there is a basic concept you don't understand. You can't make a quilt until you know how to sew, and you can't sew until you learn how to thread a needle.

    But from my experience learning how to program, it's often best if you take a class or get tutoring. You can learn a lot on your own, but there are some things that are simply too hard to put into words, which means that you can't learn them from reading. There are also many intangible concepts that seem like they are extraneous if you are self-taught, but once you've started using them you will see that they are invaluable. To that end, I would recommend taking a community college class. They usually aren't terribly rigorous generally, and they are usually fairly inexpensive.

    2 votes
  4. lol
    Link
    I just take it one step at a time, try not to get overwhelmed when you see paragraphs of nonsense. What I do in these situations is to choose the first thing I don't understand and Google it...

    I just take it one step at a time, try not to get overwhelmed when you see paragraphs of nonsense. What I do in these situations is to choose the first thing I don't understand and Google it (except don't actually use Google because they suck) to figure out what it actually means, and then keep doing that until I understand what I'm reading. It's also very important to remember that any complex topic is just a bunch of incredibly simple premises put together, nothing is unlearnable, but you have to put in the work. I think success in this field really has more to do with endurance then raw intelligence

  5. Amarok
    Link
    I smash my head into the topic until either it yields or I pass out. Brute-force all the way. Mostly for me this is sysadmin work, so I'm always learning new technologies. I find the best way is...

    I smash my head into the topic until either it yields or I pass out. Brute-force all the way.

    Mostly for me this is sysadmin work, so I'm always learning new technologies. I find the best way is to just build it and play with it. Set up a sandbox on the network, follow guides to set up a functional instance of whatever it is to use for learning, read the whitepaper and best practices guide, then skim a forum or two on the subject to see what's been on the minds of people using this technology.

    The thing with tech is, there's an initial learning curve that is program/system agnostic... basically training yourself to understand the stack, from hardware to program to network. Programming languages all share the same fundamentals - loops, functions, objects, etc. That fundamental stack almost never changes and if it does, it's gradual. Eventually once you've internalized it, your instincts start working and you can figure things out much more easily even if you've never seen that particular technology before.

    There's a specific moment when you'll be learning and you'll notice it only took you a day, instead of a week like last time. You won't know it's coming until after it happens. That feeling of cresting the difficulty curve is quite wonderful.

  6. crius
    Link
    Forgive me for the short answer, I'm on mobile. I'm in the field since... 2001 I think at this point. At the beginning it was the same for me, after several years you come to realise that is just...

    Forgive me for the short answer, I'm on mobile.

    The most ridiculous thing about this field is that there is no end to things you've never heard of: and I hate not having heard of things.

    I'm in the field since... 2001 I think at this point. At the beginning it was the same for me, after several years you come to realise that is just the way it is. If there is one example of world collaborative scientific advancement without geographical barrier, boy, you found it.

    Everyone that step into this field that we generically call IT automatically becomes a contributors as soon as it writes even just a comment on a website.

    Why?

    Because even a simple comment can sometimes be the hint for someone far more experienced to find a better way to do things. I experienced this first hand and it has become such an important part of my professional culture that I make that clear that it's a requirement for me to work for you, that you don't have bullshit "that's a junior, he doesn't need to be in the meeting".

    Having said so, you already said it, everything in IT is a tool. The only important things are two:

    • what are the scope and constraint of your project. Choose the best tool you know but don't use an hammer when you need a screwdriver. Look for the weakness of your tools.
    • how your write the code is not that important. How you design your code, that's the real thing. A good organised design will let you expand it without becoming fubar and will let others jump in and help you. A badly written function can be rewritten. A badly organised software must be thrown away and made from scratch.

    If you really want, there is a corollary that I try to follow always.

    • elegant code, not cool code

    What it means it's that you shouldn't abstract too much because the computer will always knows how it works. You, in 6 months, will not.

    All of the above are things you learn from experience anyway, sunny obsess over it :)

  7. 39hp
    Link
    I’ve been self-teaching python for a few weeks. I’ve definitely hit some of the blocks you’ve described. For my part, I would absolutely take a course if I could spare the time solely based on how...

    I’ve been self-teaching python for a few weeks. I’ve definitely hit some of the blocks you’ve described.

    For my part, I would absolutely take a course if I could spare the time solely based on how much I enjoy coding and wanting to get formal training in it. However I can’t currently spare the time.

    My approach to things that are too advanced is to find an existing code that does something close to what I’m trying to do and then breaking it into its component pieces.

    I add a print(list) any time a list is made, even if it’s inside a loop. I try to figure out what every line is asking my computer to do.

    This has helped me get through ~90% of my roadblocks so far.

    If that doesn’t work, I add it to the list of things to ask when I have time to take a class.

  8. Ash
    Link
    Any programming or sysadmin problem is nothing more than a collection of smaller, more easily-overcome problems. Every problem is surmountable if you break it down into its component parts. And...

    Any programming or sysadmin problem is nothing more than a collection of smaller, more easily-overcome problems. Every problem is surmountable if you break it down into its component parts.

    And when you come across material that's "too hard", find or invent a project for yourself that incorporates that new concept. Practical application is the best learning method in programming and sysadmin (and probably other things, too).

    I know this comment is "broad strokes", but it's simple and gets me through all the learning materials and problems I come across in this area of expertise.

  9. jgb
    Link
    It's important to keep in mind that the primary objective of the archetypical Hacker News commentator is to make everyone else think they're smart, to the exclusion of other goals such as clarity...

    It's important to keep in mind that the primary objective of the archetypical Hacker News commentator is to make everyone else think they're smart, to the exclusion of other goals such as clarity and persuasiveness.