I am not sure how much the “learning in depth” can be avoided. This may be a prejudice, but it seems to me that software development typically really has a lot of inferential depth compared with… I don’t know… plumbing.
In addition to this, software development is in motion. You can use the same screwdriver for decades, but software frameworks are developed so quickly that even remembering their names becomes a difficult task. (I can’t even remember all frameworks in Java.) So it’s not like they can’t be taught effectively… it’s more like there is so much of them that the few people able to teach them effectively didn’t have time to learn the topic and write a book on the topic yet. (Maybe they will do 5 years later, but then you will want to learn something different, or a new version different from the old one will appear.)
If—somehow—we could choose the best programming language, or just say best 10 programming languages, two or three frameworks for each of them, remove everything else, and freeze the progress… then within 20 years we would discover efficient ways of teaching them, so that how we learn them today would probably seem completely ineffective in comparison.
But that is not going to happen, for many reasons, at least during the following decades. (Some of those reasons are good, such as progress, some of them are bad, such as reinventing the wheel either because of ignorance or for profit.)
Anki decks are great when you don’t go into depth. Or when you go into depth using some other source (such as a book), and then use Anki decks to memorize what you learned there.
In my opinion, a good way to learn is to get a lesson from someone who really understands the topic, knows how to explain it, and especially is later available to answer your questions. A week of education this way easily beats months spent reading online tutorials written by people who overestimate their own understanding of the topic, or just don’t care and do it for adsense (w3schools, roseindia...). But in my experience people are usually averse to pay for this. (It’s like in their cost-benefit calculations they assign almost zero costs to their time and they horribly understimate how much time would they need.) The second best option is to read a book on the topic, or perhaps a few of them.
My current stack is linux, apache, python, django, dynamo, js, backbone
This does not provide as much information as it seems to do. I can install Linux (using the installation wizard) and run a few programs from the command line. Linus Torvalds invented Linux and probably knows everything. Where are you on this scale? Where are you on the Python scale: are you able to write “Hello World” or what exactly? How about the many things you did not mention here, such as: do you understand algorithms, computational complexity, formal languages, automata, functional programming, etc.? That could make a huge difference in choosing the right way to learn a new language.
Also… what exactly are you trying to achieve? Add a few keywords to your CV, or some other specific goal?
Linus Torvalds invented Linux and probably knows everything.
Doubt that very much. Linus is the creator of a kernel, which is only a small (though important) part of the whole shebang people call “Linux”.
For most people, it probably doesn’t matter all that much whether your “stack” includes Linux or FreeBSD or any of the other kernels you can find.
Similarly apache is going to be largely invisible to people who use a web framework at a higher level of abstraction than CGI (that would be most of today’s frameworks).
Bottom line—I agree that describing one’s “stack” in the above form is uninformative. Say not the names of products you had to memorize; say the things you can make them do.
The goal is to speedup becoming productive in that environment.
where productive =
desigining and implementing pieces of a big application (pieces 1K − 5K LOC, full project (50K LOC))
it implies making atleast ‘not-bad’ design and implementation choices and being able to think with the language/ frameworks with reasonable fluency to propose designs quickly.
giving meaningful feedback to other programmers who are doing similar activity.
i realize that it takes time to get really good at and knowing the internals of the whole stack. Looking for approaches wherein the time to productivity can be reduced.
Okay, I seem to get it. Originally it seemed to me like: “I want to know everything without having to actually understand everything (just give me the most important bits and I will memorize them).”
But now I guess you simply want the information well-ordered, meaning that if you invest e.g. 100 hours of your time into learning, you get the most value anyone could get from 100 hours. Where “value” could mean perhaps: how useful it would be for average programmer’s average task.
Two possible issues:
1) Maybe sometimes specialization provides better results. For example in 20 hours you could learn how to declare variables in 1000 programming languages, or… well, something else, that would be connected with what you already know, and would allow you to do some useful new thing. (Because knowing to declare variables in 1000 programming languages is rather useless.) So you could have different specialization paths. Perhaps too many of them.
Possible real-world examples: Using many programming languages / many frameworks, or becoming good at one or two of them. Learning many different things (algorithms, databases, GUI, networks, cryptography, etc.), or becoming a specialist for e.g. databases (or even e.g. Oracle databases).
2) Maybe it is important to know in advance how much time do want to spend totally. For example, let’s say that knowing an information A can bring you $1000 profit, information B can bring you $500, information C can bring you $200, but a combination of B+C can give you $2000. If you know at the beginning that you will take two lessons, you can take B and C, which gives you $2000. But if you go incrementally, the best choice for the first lesson is A, then the best choice for the second lesson is B, giving you only $1500.
Possible real-world examples: If you want to spend one day or one week learning, just learn Excel. If you want to spend one year, learn Python, or perhaps Java or C#. If you want to spend 10 years, learn mathematics, formal languages, computational complexity, and at the end apply the knowledge to the programming language(s) or your choice. -- In other words: the more time you have, the more meta you can go.
I have seen people starting with PHP, because it provided useful results after ten minutes; only to hear them complaining a few years later than they can’t keep up with all the new PHP frameworks, but they are scared to death from switching to another language. On the other hand, I have seen people who study theoretical computer science for years, but they would have problem to write a simple calculator app—but also they don’t need to, as they make money writing theoretical papers; and they would be able to make the calculator after a 3-days course in one language (and after a single 2-weeks course they could do it in 10 or 20 languages).
I am not sure how much the “learning in depth” can be avoided. This may be a prejudice, but it seems to me that software development typically really has a lot of inferential depth compared with… I don’t know… plumbing.
In addition to this, software development is in motion. You can use the same screwdriver for decades, but software frameworks are developed so quickly that even remembering their names becomes a difficult task. (I can’t even remember all frameworks in Java.) So it’s not like they can’t be taught effectively… it’s more like there is so much of them that the few people able to teach them effectively didn’t have time to learn the topic and write a book on the topic yet. (Maybe they will do 5 years later, but then you will want to learn something different, or a new version different from the old one will appear.)
If—somehow—we could choose the best programming language, or just say best 10 programming languages, two or three frameworks for each of them, remove everything else, and freeze the progress… then within 20 years we would discover efficient ways of teaching them, so that how we learn them today would probably seem completely ineffective in comparison.
But that is not going to happen, for many reasons, at least during the following decades. (Some of those reasons are good, such as progress, some of them are bad, such as reinventing the wheel either because of ignorance or for profit.)
Anki decks are great when you don’t go into depth. Or when you go into depth using some other source (such as a book), and then use Anki decks to memorize what you learned there.
In my opinion, a good way to learn is to get a lesson from someone who really understands the topic, knows how to explain it, and especially is later available to answer your questions. A week of education this way easily beats months spent reading online tutorials written by people who overestimate their own understanding of the topic, or just don’t care and do it for adsense (w3schools, roseindia...). But in my experience people are usually averse to pay for this. (It’s like in their cost-benefit calculations they assign almost zero costs to their time and they horribly understimate how much time would they need.) The second best option is to read a book on the topic, or perhaps a few of them.
This does not provide as much information as it seems to do. I can install Linux (using the installation wizard) and run a few programs from the command line. Linus Torvalds invented Linux and probably knows everything. Where are you on this scale? Where are you on the Python scale: are you able to write “Hello World” or what exactly? How about the many things you did not mention here, such as: do you understand algorithms, computational complexity, formal languages, automata, functional programming, etc.? That could make a huge difference in choosing the right way to learn a new language.
Also… what exactly are you trying to achieve? Add a few keywords to your CV, or some other specific goal?
Doubt that very much. Linus is the creator of a kernel, which is only a small (though important) part of the whole shebang people call “Linux”.
For most people, it probably doesn’t matter all that much whether your “stack” includes Linux or FreeBSD or any of the other kernels you can find.
Similarly apache is going to be largely invisible to people who use a web framework at a higher level of abstraction than CGI (that would be most of today’s frameworks).
Bottom line—I agree that describing one’s “stack” in the above form is uninformative. Say not the names of products you had to memorize; say the things you can make them do.
The goal is to speedup becoming productive in that environment.
where productive =
desigining and implementing pieces of a big application (pieces 1K − 5K LOC, full project (50K LOC)) it implies making atleast ‘not-bad’ design and implementation choices and being able to think with the language/ frameworks with reasonable fluency to propose designs quickly. giving meaningful feedback to other programmers who are doing similar activity.
i realize that it takes time to get really good at and knowing the internals of the whole stack. Looking for approaches wherein the time to productivity can be reduced.
Okay, I seem to get it. Originally it seemed to me like: “I want to know everything without having to actually understand everything (just give me the most important bits and I will memorize them).”
But now I guess you simply want the information well-ordered, meaning that if you invest e.g. 100 hours of your time into learning, you get the most value anyone could get from 100 hours. Where “value” could mean perhaps: how useful it would be for average programmer’s average task.
Two possible issues:
1) Maybe sometimes specialization provides better results. For example in 20 hours you could learn how to declare variables in 1000 programming languages, or… well, something else, that would be connected with what you already know, and would allow you to do some useful new thing. (Because knowing to declare variables in 1000 programming languages is rather useless.) So you could have different specialization paths. Perhaps too many of them.
Possible real-world examples: Using many programming languages / many frameworks, or becoming good at one or two of them. Learning many different things (algorithms, databases, GUI, networks, cryptography, etc.), or becoming a specialist for e.g. databases (or even e.g. Oracle databases).
2) Maybe it is important to know in advance how much time do want to spend totally. For example, let’s say that knowing an information A can bring you $1000 profit, information B can bring you $500, information C can bring you $200, but a combination of B+C can give you $2000. If you know at the beginning that you will take two lessons, you can take B and C, which gives you $2000. But if you go incrementally, the best choice for the first lesson is A, then the best choice for the second lesson is B, giving you only $1500.
Possible real-world examples: If you want to spend one day or one week learning, just learn Excel. If you want to spend one year, learn Python, or perhaps Java or C#. If you want to spend 10 years, learn mathematics, formal languages, computational complexity, and at the end apply the knowledge to the programming language(s) or your choice. -- In other words: the more time you have, the more meta you can go.
I have seen people starting with PHP, because it provided useful results after ten minutes; only to hear them complaining a few years later than they can’t keep up with all the new PHP frameworks, but they are scared to death from switching to another language. On the other hand, I have seen people who study theoretical computer science for years, but they would have problem to write a simple calculator app—but also they don’t need to, as they make money writing theoretical papers; and they would be able to make the calculator after a 3-days course in one language (and after a single 2-weeks course they could do it in 10 or 20 languages).