I've this too. When I learn something new like a language I often want to do it right, like be "pythonic" when learning Python. It can take long for me to write some simple piece of code because I'm constantly doubting if my code is pythonic. And when it takes to long I lose focus and I stop.
The same thing applies when I started a little Go web app, Go was rather new for me. I decided to use Docker and wanted to have a perfect solution with 3 containers(Nginx as reverse proxy , web app and API), auto rebuild and autoreload in developement mode etc. Than I started with writing in Go and everyone had to be tested perfectly, so I was looking for how to test things and how to run tests automatically after saving a file.
These things slowed me down to a point I where stopped. What did I want? I wanted to learn Go. What did I achieve? I learned how to create have production setup for a web app and api in Docker, I learned something about test suites in Go and I was frustrated because another learning project failed.
My advice, just start your project. You can't do it perfect because you want to learn it!
Exactly my current situation with Clojure.
There are times when you should read and learn every detail before actually starting a new activity. (e.g. ground school before flying) This is usually when the cost of failure is unacceptably high.
However, this is usually not the case, especially with things like programming, if that's what OP is talking about.
Advice to "just do it" may seem simple, but it is surprisingly effective. When you learn by doing, you setup a feedback loop where you try something, see if it works or not, and if it does not, find out why/where it went wrong and retry it. For most people, this is mentally stimulating and provides the necessary psychological rewards to keep you going. If you get stuck/frustrated, this is when you should take a break and perhaps go back to reading/researching after a while.
Don't worry about whether you're doing it the absolutely correct way, or whether what you've done is worthwhile to others. (What is "absolutely correct" is often subjective, anyways) Focus on the knowledge you gain, and take notes.
For example, I've also been recently learning Golang. I wrote a simple Golang game server (using a SockJS library) to serve as a backend for a simple, multiplayer online game. Looking back, the initial code I wrote was horrible and needs to be refactored; but that in and of itself will be another learning exercise. Did I need to use Golang for this, or is this the best use of Golang? Probably not - I could have written it using Java or Node.js much faster, but wouldn't learned as much.
For example, if the skill you want to learn is mountain climbing it's useful to read a few books before you climb a mountain - but what you get from a book is information to think about, not the skill to actually go out and do it. You learn mountain climbing by practising climbing mountains over and over again (preferably with a mentor). Every skill is like that - if you want to be good at it, keep doing it.
One more thing: If you really enjoy something you'll enjoy the process of getting better more than the end result, so if you don't enjoy it while you're rubbish at it you won't enjoy it when you're good at it either. Don't struggle with learning something hoping that you'll love it later. You probably won't.
I guess what it boils down to is that a lot of my self esteem is derived from being knowledgable and resourceful. It really embarrasses me when I don't even have a shallow depth of knowledge about a subject matter that could be potentially useful.
I don't really have much advice for you because I haven't really solved this one for myself, but one thing I try to do is concentrate on very short term goals. For example, when I was learning Angular a few years ago, I knew going into it that I wouldn't "get it" right away. After a few frustrating days I decided to break-up my learning into small goals, e.g. "what are promises and how do they work?" "What is the syntax?" "When should they be used?" I tried to avoid unrelated documentation and stack overflow posts because I knew that it would lead me into rabbit-hole after rabbit-hole. I wasn't 100% successful, but it did help me block out some of the cognitive dissonance.
The only other thing I'd say is that even though this is frustrating, I like to think that your anxiety is actually a good thing if you learn to channel it constructively. It's a good thing to want to know about a lot of stuff!
I've found that constant progress is key to keeping engaged with learning. It's tempting to try and learn multiple things at once but each new thing slows down progress exponentially. It's much easier to focus on one thing and get a constant stream of little victories.
Also it's a great idea to call it iterative deepening. Lower memory requirements but gets the job done anyway! I used to judge myself harshly for not getting something on the first read around, but going through multiple times is normal for me now.
I should start following this advice myself.
But don't make it more perfect - do the next project. Make your focus to make some money, get more customers, etc.
The beautiful code will follow from that. It doesn't matter how beautiful the code is if no one uses it. (Well, maybe if you need to pass an exam or open source the code or something like that, slightly different goals for the code to 'succeed'.)
Think of a project you can build with the technology you want to learn, and then learn the technology through actually building the project.
I generally feel more motivated with this approach because at the end of the effort, I'll actually have something to show for my time. If the project idea is good enough, you might even be able to turn it into a business, but don't let the lack of good ideas stop you, because your primary goal is still learning, and for that, even clones of existing products can work (and you might be able to find a good twist on it that can differentiate your own project as you build it).
And for me personally, no amount of reading and exercises can compare with real usage if I wanted to become truly proficient at a technology.
For point 1 - things should be like Python, not like resolving dependency hell in the 90's. Installation should be a double-click. Errors should not be easy to make, it should be obvious what things do, and error messages should be obvious. The people who design tools don't care about any of this stuff.
For point 2 - honestly, 99% of people - as in, 99 out of 100 people, who pick up a Rust tutorial have programmed literally 4 other languages - they have written working lines of code in 4 other languages. Look at this shit: https://doc.rust-lang.org/book/ (open the menu at top-left) - Guessing Game! The Dining Philosophers! "Let’s set up a new project. Go to your projects directory. Remember how we had to create our directory structure and a Cargo.toml for hello_world?" in just as many words that your poor audience has to read through you could have said: "semicolons terminate statements; blocks in curly braces; module import is use module::submodule::symbol; comment with // or /* */ which can nest." Look very very closely at my two strings in this paragraph: they contain literally just as many characters.
You could start by summarizing go in a sentence and get people going, not trace it back to the ENIAC. I hate this GOBS and GOBS of time people assume we have.
And back to point 1, tool writers assume we have like infinite time to follow 27-point directions that could be 100% automated. And tutorial writers assume we have infinite time to read all about the history of the world. I have to watch YouTube videos at 2x speed so that they're sounding like they're rapping, just so I can get to all the stuff I don't need.
Get to the point, people. Not everyone has a picnic following directions that shouldn't even exist.
An alternative explanation is that their audience is wider than your stated 99%.
Somewhat ironically, if you scroll down ~20 lines on the Rust book page you linked there is the deep water you are demanding.
Even when they ostensibly do that, "The main concept that makes Rust unique is called ‘ownership’. Consider this small example:" could be better-stated as a difference between Rust and (list the languages that don't have it.)
Tutorial authors and tool authors also waste INCREDIBLE amounts of time through dishonesty. For example, Functional Programming like Haskell is largely defined by the hoops you have to jump through syntactically and in program structure due to what it avoids. But a Haskell tutorial will NEVER make it obvious within the first two minutes that you are doing something fundamental different from C, Java, Python, C#, Perl, whatever - and that it has a whole concept, monads, just to get around this artificially imposed self-limitation.
They're just dishonest, waste incredible gobs of time, and don't get to the point.
When was the last time you picked up a language book that made it completely obvious in the first minute what it was and wasn't suited for, how many hours you would need to practice it before you made progress, and what the absolute bare minimum number of minutes you would need to invest before you could start doing anything in it was? It's a guessing game. "Wow, this only took me two minutes!" (json). "Wow this took me two weeks and I still can't do shit!" (haskell)
I Googled "I tried learning haskell for" to report on what I found. There happens to be one hit on that exact syntax. Guess how long the guy "tried" learning haskell for? A few months.
Someone who enjoyed math in various school classes will probably understand the basics of functional programming faster than someone who only worked their way through it. So one of them might be just as angry as you are at the bad advice in the front matter of the book.
It sounds like you should have started at "Syntax and Semantics". For me, I really enjoyed starting in "Learn Rust" because I'm more of a "learn by doing" kind of person, and I find that I cannot retain any information from pages of syntax descriptions.
Neither of us are wrong, we're just both different when it comes to learning.
They should replace their expectation of 20 hours with 20 well-chosen lines anyone can use to start. If the language doesn't do that because it's too high-context, change the language so it's easier. Baby steps in Rust, or any other language, shouldn't take any number of days.
Different learning resources have different goals. This is a book that is meant to be comprehensive, but also provides two different ways to approach learning the language. The target audience of this book was never intended to be someone who only wants to devote 20 lines of effort to learning a programming language. If that's what you want, read http://learnxinyminutes.com/docs/rust/
Edit: But when you realize you can't grok language semantics like borrow checking or sum types for results, you might have to spend more than 20 lines of code to understand the usage and benefits of those concepts. This is when you move from sawing to joinery.
Because my gripe isn't that joinery exists as a trade - it's that equipment that is so smart still won't do simple things for the user - on principle. People actively design their tools so they won't do something simple. Yes, really.
I can read considerably faster than you can speak. Please just give me written materials.
I think for IT breadth-first is better at the beggining, but you can stay half-competent for too long if you never bother to look up the detais that weren't needed so far (my main problem).
It's pretty short but covers some good strategies for learning that are backed up by current Neurobiology research.
Avoid procrastination 1 - Set aside time to study a little and often rather than trying to do huge sessions. Cramming doesn't work, your brain doesn't like it. 2 - Turn off your phone, shut down those facebook/email/reddit/imgur tabs so they're not tempting you. 3 - Don't get disheartened by thinking about the whole topic at once. How do you eat an elephant? One little bite at a time. 4 - Just get started, even for a few mins. You'll get into the flow after just a few mins.
Take your breaks 1 - Recall is greatly improved by taking a short breaks to let your brain digest the material you're learning. 2 - Try the pomodoro technique. Focussed work with zero distractions for 25 mins, then a 5 min break, repeat. For coding I prefer a longer work period to load the problem into my noggin but YMMV.
As part of the course we had to do up a few small blog entries explaining the material. Another good point: re-explaining the subject cements your understanding of it. Feel free to take a look at mine, I go into a bit more detail on the above items http://learnsmarternotharder.blogspot.ie/2015/01/so-much-to-...
When studying more general subjects it's not always easy to come up with a fun project and the books are usually not structured in a way that this techniques works. In those cases I try to find a good course online with a lot of reading material or a recommended course book because just watching videos and doing exercises is usually not enough to really learn the subject for me.
How I come to give this advice here is that years ago, a participant here on HN described how his programming career struggled until he got medical treatment for adult ADD. Now he can learn more effectively on the job, and he makes a lot more money with a much more stable employment history. You owe it yourself and to anyone else who has helped you develop as much as you have so far to check your attention regulation so that you can be as healthy and happy as possible.
It might not be as efficient as reading the chapter all at once but I think you'll feel like you're making continual progress by tackling the practice problems sooner.
As someone who has an extremely low attention span I've found that continual progress is the key to sticking with something. This is also why I try to only learn one thing at a time since you progress much faster than trying to learn multiple things at once.
If it is really severe, consider being evaluated for adult ADD. I probably have this in mild form and also what might be considered the opposite, obsessive compulsive personality disorder, which results in me veering between wanting to understand _everything_ and working obsessively on _one_ thing trying to get it textbook-perfect and understand it completely. This combination often intersects well with the requirements for my work but sometimes... not so much, as I either insist on solving a problem better that is already working well enough, or considering a whole range of possible approaches when I really just need to complete one, and quickly.
I've found that when I meditate for even just a few minutes a day, I'm much more focused and less distracted -- more focused on what I'm presently doing, right now.
http://www.open.edu/openlearn/education/learning-how-learn/c...
When I was 18 a tutor - who I didn't really know well - said to me in passing, and seemingly pretty randomly, "Your problem is that you want to run before you can walk with everything."
I had an epiphany over that and slowed down my "gets" for small, insignificant objectives and spent the time trying to really understand things.
From that point on I actually learned how to program properly rather than just doing enough to get by, for example.
As I've gotten older I've learned that my chasing the "gets" was a self-imposed restriction because there was always a small but sufficient reward for the accumulating of praise, etc. I've taught myself to very stringently prioritise (recent book suggestion: Procrastinate on Purpose) and categorise the things I "have to" do and instead of doing a hundred things that don't really matter (but they were easy and I get a "thanks") I work out which things I "have to" do will actually add value and make a difference, even if achieving them will take much more effort.
As my career has developed I've moved into being a specialist and now find myself coming back out into being a generalist but the "real" grounding in my skills sets me apart from "career generalists" and "credential whores" that my industry is plagued with nowadays.
EDIT: thinking about it, this "get" behaviour started when I was in junior school. I used to read encyclopaedias for facts and tell people. My parents used to praise me for what I knew, and my friends jokingly called me an "information magnet". I liked my cursory knowledge of "everything" and I guess I became addicted to it.
https://www.offensive-security.com/information-security-cert...
That's the core obstacle these days to picking up new skills and knowledge.
Mastery of any subject-matter ALWAYS takes practice and repetition. Simple, but those things require sustained repeated investments of your time and attention.
There is still much I don't understand at this point. This is natural since I haven't had an opportunity to apply the information to a personally meaningful context. This is the point at which I begin the practical phase. As most of what I need to know is documented in my notes, I will keep it on hand as a memory queue as I engage with specific questions or problems that interest me. And so when an issue comes up that I can't settle, I refer to the notes and also search around online to find out how I should apply the content in that particular problem situation. It's over the course of this process that I internalize the most vital details. That's where the learning happens, at least for me.
Another advantage to this approach is that you will have a type of mnemonic device to reboot your knowledge. As most people forget practically everything shortly after moving on to new subjects, it's critical to have a way to index the information you don't want to forget in the future. Something along the lines of a "memex" (or external memory system) is a good metaphor for what I'm talking about.
Especially with learning a Lisp language, you can be really frustrated by having to read so much before you can actually create something.
But slowly and surely I'm learning. I just re-read the chapter(s) I don't understand over and over again.
So my advice is don't try to skim over a whole book. Try reading as slow as possible, and if you don't understand something, take a break and then get back to that same shit once more. And of course, write some code as soon as possible.
The practice is important. I plow through books too but you need a project to become proficient. I bought a laptop and started working on some small scala projects on my laptop and reading books. That was enough to let me submit some janky scala for an interview and land a job as a scala engineer.
Some material is harder to learn, some of it is easy. I think it's better to defer reading books for a bit and get some familiarity with the basics so you have a point of reference while reading. The other day I was assigned a pretty big feature with a piece of the domain I wasn't too familiar with. I spent a few days writing a parser to get closer to the spec before starting to work on design docs etc. Having the familiarity then allows me to make sense of the research and existing design documentation so I think having a point of reference is a really important part of the reading/learning. If it's too far away from my current experience, I can't draw new pathways so it just falls out of my head. If I have that basic seed, I can grow some new pathways and expand my position with reading etc.
Ultimately, I think the best way to learn is to actually present the information again to other people. This is the culmination of practice and research together. To write a detailed article on a topic, you'll have to both write the code and also do a lot of reading. Any gaps in your knowledge you'll identify while you're writing and then it's a simple bit of google-fu to get a really solid level of understanding on a topic as you fill out your article.
Re-implementing things is also a terrific way to expand your knowledge. If you read a pattern book, you'll have some high level understanding of how the patterns fit together. Once you apply the pattern once, though, you'll never forget it and you'll see how it works at a very different level. So couple that with writing an article, etc, and it's a super effective approach to learning.
Why?
Well, logically, if you've started learning something I'm guessing its because you want to do something with it? So have some patience.
The fastest way to learn, say, Python, isn't to read a Python book as fast as possible. It's a lot of little steps in the form of "be able to write an if statement without referencing the documentation."
Somewhat expensive, but worth it, I've found.
If I'm just cruising through things at my own pace, it's all good.
Learning itself is pleasant. I think we're wire to enjoy it. If you had a judo lesson now and learned a simple trip, you would have fun. Give most people their first programming lesson and they'll enjoy jumbling up letters or whatever you do.
Not knowing is unpleasant. In your first lesson you have no expectation. In the second, you double your knowledge. On the 20th, you are dealing with forgetting and you've accumulated bits you find difficult. You are still a beginner, but now you have expectations.
You can trip or throw a cooperative opponent but you keep repeating mistakes, frustration. There is still a gulf between where you are and scoring on an uncooperative opponent. You can jumble words, add numbers or record form data in your db. But, the gulf between doing that and writing your spaced learning iWatch app is big. Basically, you suck and you are judging your performance by the standards of a programmer, judo player or whatnot. Sucking.. sucks.
I'm about 5 weeks into learning a language and I'm in this spot right now. week one was really fun. Every lesson meaningfully improved my vocal, grammar, etc. I know about 1200 words and a decent amount of the basic grammar. You need about 2500 words before you can understand a simple paragraph or video snippet. I'm nearly useless outside of the context f a lesson translating single sentences. I can't think in the language (I translate) which means (A) it's difficult and frustrating and (B) I might understand your first sentence as you wrap up your third…even if I know all the words. None of the gammer is natural to me. etc. etc.
Basically, there's a massive gap between where I am and where it felt like I would now after the first lesson. Massive. Even if I conjure up discipline I didn't need in week 1 and push hard this week, I'll still suck. My vocal might go up to 1500, but I'll regress on something. It's whack-a-mole time where revision is 75% of the work and 50 new words is a drop in the ocean.
Thinking of it, I realize I might have taken the wrong side of the debate. Learnings sucks. I hate it.
But, for the sake of it I'll keep arguing this point. This expectation/reality gap is as irrational as it is inevitable. You know it how long it will to learn things in advance. I know I can't get fluent in a language in 25 hours of practice, but it does create frustration.
Since I'm not going with the "learning sucks, I hate it" conclusion, lets wrap up with stoicism. Good as any, ne? Do thy duty though the the skies fall down upon thee. Seek not vain pleasures of the moment. Rather, take comfort each day knowing that thou hath done thy work. Focusing on your goals to much can make learning emotionally hard (frustrating, etc.), unless your goal can be achieved very quick. If your goal requires 100 hours over 2 months, when you are 46 hours deep, you feel like you aren't making any progress. You are probably wrong, but it doesn't feel like it. Don't focus on the end goal, just do your 2 hours and pat yourself on the head. Good stoic. Nice stoic. Here's a Senecan biscuit. Well done.
At home, I just try to work on my own projects as much as possible, but I don't have much time every day. It is hard. I exercise (gym) religiously as I find it helps to keep my mind somewhat in check.
Time is my biggest problem really, so this leads to the frustration you have described.
I also like to play challenging games (LoL) - and that is a HUGE time warp... :(