An Easy Way to Learn Hard Stuff
medium.com
medium.com
I won't dispute the strategy that works for him but that doesn't work for me.
For learning concrete languages & frameworks like his examples (React, Nodejs, Javascript), I prefer to read about motivations, architecture, and concepts, etc before downloading, experimenting, and typing any syntax. My brain needs internal "scaffolding" to strengthen the usage of unfamiliar syntax or else I'm just cargo culting. If I understand why React does what it does, it makes more sense why certain code goes in "this spot instead of that spot".
However, for learning other abstract topics such as monads, I would do the "learn it by many examples" approach the author recommends. I think the various metaphor-as-burrito tutorials for monads are not that successful for teaching. Instead, I suggest people just use monads like the Maybe Monad, Either Monad, IO Monad, etc. After a while, one will notice something in common with all those monads. That "common pattern" is the unexplainable monad. However, you can't get that understanding from reading monad metaphors -- instead, you extract that knowledge from the commonality of patterns hitting your brain at different angles.
I used to be more of a reading person, but I find that I am a bit faster to learn now if I lean more towards doing.
First I try to understand if something WORTH learning. For example, is R worth learning? Yes. Is React worth learning (for me)? Not sure yet but I'm keeping my eye on it.
Then I try to first get a "hello world" running without too much understanding. This can actually be the hardest part... building software is sometimes harder than understanding the ideas :) And once I have hit a wall playing with things, then I need to go back and read some more to figure out the concepts.
Once you've played with enough software, you can get surprisingly far just by doing things, and actually learn the concepts. Other times you can get stuck and need to go back and do some research.
With two caveats:
(0) There's absolutely no guarantee that you'll eventually see the pattern. Most people don't, no matter how many times they bash their heads against it.
(1) If your examples aren't “diverse enough”, you risk not grasping the full generality of the abstract pattern. This makes me wonder how many Haskellers think a monad is necessarily a monad in Hask.
Personally, it is sometime along the road of building something with the tool, the architecture starts making sense . I can hear all the conference videos and read the articles about the tool, but it won't feel awesome unless I start using it and find it better than what I did before.
Or if it's a "how-to" just make it a list. For example, I was trying to figure out how to do something in Windows the other day and all I could find were Youtube videos. Now I have to sit through someone's excessive intro for their channel with 382 subscribers and wait for them to get to the point.
I do use articles too, but I normally start out with videos. If it's too slow, YouTube fortunately has got the 1.5x speed option :)
Some text descriptions + pictures of how data structures function left my brain oozing out my nose, but an animation always clarified things for me.
But they're great for learning how to use an IDE, graphic design, music, athletic movements, etc.
My trick for getting through people's videos is 1.5x playback speed. use it. yeah I agree people ramble on and on and on.
You can't learn how to write like Stephen King by aping his methods. You're just never going to get there, doesn't matter how much effort you put in. Stephen King is uniquely suited to writing because he made himself uniquely suited for writing, and his method of writing is the product of decades of intensely personal iteration on not just "how he writes books", but also "how he lives life".
It didn't work for me at all. I found myself having gone through many, many tutorials (video and text) only to remember none of it when I came back to the subject months or years later. I never had any understanding because I was always following along and just googling when I ran into snags.
These days I do the complete opposite. I try to learn as much as I can. I never follow along with the learning material. Instead, I go through a section, taking notes, and then try to recreate it all from memory. Rather than focusing on what I need to know right now, I've learned to appreciate all of the little details. I try to do as much as I can with pencils and paper because it's slower, which forces me to spend more time with the information.
Indeed, I am very jealous of the author. It took me years before I learned how I learn. I wish that I was smart enough to use the author's strategy. Instead I found myself not knowing how any of my stuff worked, running into hours of frustration whenever I ran into a problem or a bug that StackOverflow couldn't answer. So if you've used the author's strategy and it didn't work, don't worry! We're not all geniuses! You will find out how you learn if you keep trying different things.
Also, the best thing to speed up the learning process was to play "live" in front of an audience! It's equivalent to building an actual product (such as a website or an app) that you can show off to your family and friends, and the feedback was invaluable.
Its a shame that even top tier true-blue software companies like Google/IBM/Oracle/Apple/Microsoft continue to hire below average programmers who churn out code that needs to be constantly patched and fixed. It seems like nobody teaches people to value code that can run for a year without crashing or leaking memory.
It's clear for me that the author states a way to getting things done. It wasn't a tutorial in "how to become a pro in everything in only 5 minutes".
Well, okay so I'll try and give you advice anyway :P What kind of program is it? Is it a library, console/gui app? Does it have a variable workload? What are the ways in which people interact with the code? Is it primarily a desktop or server side application? What kind of test framework do you have in place? Do you have any instrumentation that would allow you to generate code coverage numbers? Can you run fault injection/fuzzing/etc type testing on it? Is the program resource limited? If so, do you have a CPU/Mem budget that you regularly check against? How many libraries does your program interact with? Do you keep track and test those libraries for failures? Do you try to freeze third party library/SDKs to minimize external bugs harming your own software's reliability? Do you always hard-crash at every bug or do you need to keep the software limping along till shit really hits the fan? Do you regularly (when there is no bug to track) run your software under a debugger to get a good feel for what the call stack, arguments, etc look like in a practical scenario (so that you can train yourself to catch it when things seem out of place). Its a lot about asking yourself what your blind spots are. Sometimes you have to think super-practically and just "look at the bits" and sometimes you have to try to see the forest. It all depends on what you're doing. And sure experience is a mean teacher. Nothing like getting a call at midnight and someone asking you why your embedded code running on-site in another state isn't working right after 5 months of no issues :P
* simple machines
* highly regular, not littered with corner cases
* state isolation, fast and easy to restart
* linguistically and semantically simple
The affordances of Erlang are a good starting point, as they encourage simple machines with isolated state while the language lacks the ability paint oneself into a corner semantically.As someone that's started to put together video instructions, it also takes an hour to put together 5 minutes of content. Because, while the first time it seems fine, it takes countless revisions to iron out assumptions of the audience and thoroughly explain things.
But the end result is definitely worth it.
But, i don't believe this can be applied to subjects that have a lot of pre-requisites (a language, by definition, has no pre-requisits, if an infant can start learning it!). For example, you cannot learn calculus this way. You must learn the prerequisits (algebra in this case), otherwise it's too confusing and too complex.
This advice can only really be applied in areas where there are no legal, safety, cost or time barriers.
A civil engineer should have many fully understood failure modes under their belt.
https://github.com/perborgen/NeuralNetworkNoob/blob/master/n...
To add something to the topic: I find that I usually don't use algorithms that I don't understand even if they are available. So, before firing up that convolutional neural network in mxnet, I need to be really comfortable with the theory.
I'm actually planning to try and learn convolutional nets soon, and will try to setup a small study group online (basically just a repo with materials and a Slack/Gitter chat room), where people can help each other with learning it. Do you think that would help you to learn it?
I have since moved over to using Theano, Lasagne & nolearn. However, I almost find it just as hard, because it's so easy to step wrong and get errors, and so hard to debug. In addition, Lasagne & nolearn doesn't exactly have great documentation of tutorials available (they have some, but I like to try out many tutorials to get perspective and get a proper understanding).
I'm far from good enough to turn my implementations into frameworks :p
Particularly for numerical and scientific work, there is a huge tradeoff between code cleanliness/readability and performance. I normally start by just copying the "demo algorithm" from a research paper straight into whatever language I'm using. The goal is to simply get the code working properly, and then I begin tweaking it for speed. Once it's optimized though, the result usually looks nothing like the original algorithm and it is difficult to tell what the code is doing just by looking at it.
On the contrary, as everybody else does, you too do it all the time. There are thousands of algorithms hidden behind higher level APIs you use, which you don't understand.
If you want have been on the fence about learning app development, this should get you started right now.
You need to turn on the sound for the videos.
To figure out what to learn next you have to have some kind of filtering criteria or you will just be randomly jumping between technologies (which isn't a terrible idea for beginners, but would get highly wasteful for experts).
If something offers me an immediate concrete benefit, that provides a lot more motivation to learn it.