34 karma · joined February 25, 2008
https://youtube.com/playlist?list=PL9v9IXDsJkktefQzX39wC2YG0...
http://aggregate.org/AFN/ has more, including hardware designs.
I found the Klein book you mentioned more useful than Ericsson’s as well, that Fadde/Klein paper I mentioned was also pretty helpful. I need to reread both, and put them into practice more than I have. I read too much, and I don’t get the tacit knowledge that comes from experience...
Another good book is Surpassing Ourselves by Bereiter and Scardamalia. They studied how students developed writing skill. Their definition of expertise is a bit different than Ericsson’s, but I think it is more useful.
One tangent comment to go with this: One of Klein's occasional coauthors, Robert Hoffman, co-wrote a book on expert weather forecasters that I really liked. Weather is hard to predict, but one thing they found that what the best forecasters did was to look at the data before looking at what the computer models predicted. Once they had an idea of what they thought the weather might look like, they compared with the model. This kept their skills sharp and ensured that they continued to learn.
Seeing Like a Rover - Janet Vertesi
Human-Machine Reconfigurations - Lucy Suchman
Where the Action Is - Paul Dourish
Seeing Like a State - James C. Scott
Rapid prototyping/experimentation leads to rapid feedback, which in turn can lead to rapid learning.
>Programming is a way of thinking
If teaching programming is meant to teach a way of thinking, how do we ensure that it transfers to other areas? David Perkins discusses this in his book "Outsmarting IQ" (pg 224, http://books.google.com/books?id=kNbSvy4dQEUC&q=papert#v...). Latin was once thought to be a language that taught people how to think, but the studies didn't show any transfer between learning Latin and other skills. Obviously, programming isn't Latin, and I'm actually in support of the idea of teaching programming as a way to teach thinking skills, but any effort to do is going to have to address the problem of transfer. One way to potentially do this is motivation, I think Vygotsky advocated showing children why they could write (and how they might already be attempting to do so), which would then give them motivation to learn writing. They'd already understand a reason for using it...
> Alan Perlis wrote, "To understand a program, you must become both the machine and the program." This view is a mistake, and it is this widespread and virulent mistake that keeps programming a difficult and obscure art. A person is not a machine, and should not be forced to think like one.
There are cases where this is true, but putting it another way, "A teacher is not a student, and shouldn't be forced to think like one". Any time where a mind is trying to communicate some concept, there has to be some level of dialogue or shared context. One could argue that learning programming could help people understand that others may interpret what they say in a different way (and why that may occur). I think that is a pretty important concept.
Finally, the US military has funded a lot of research on intelligent tutoring systems. One of the things a lot of the successful programs have is a means of getting the user to think more like an expert. The tutor programs often do this in two ways: by prompting the trainee for a response and then getting them to compare to something an expert would do, and by providing feedback/hints (at the right level) as needed. Vygotsky discussed the latter in "Mind in Society", sometimes all a person needs is a little assistance at the right time, and then they'll understand why and how to do something. As far as computer based training systems, "Development of Professional Expertise" has some interesting papers, though it may not be the best source.
I think the biggest thing is to work on continuously improving/rewriting/refactoring code. You might even start by studying solid code from someone else and try to rewrite it from memory until you can match or improve the original. After each iteration of rewriting from memory, compare to the original and see how it measures up. What did they do differently and why? Obviously, this has to be code of a manageable size for your current ability. Ben Franklin did this with writing he admired, and Steve Wozniak did it with circuit layout.
Beyond this, I found a couple of papers/articles that might be useful.
http://web.coehs.siu.edu/units/ci/faculty/pfadde/Research/De... The first is about deliberate performance, which is a combination of deliberate practice with your typical work requirements. Try to make predictions about how things will work or how long they will take to complete and write it down. Check the accuracy of your predictions. What threw you off? How could you do better? If there were different constraints, what would that change? I've found writing down my thought process to be useful in problem solving. What do I know? What am I trying to do and how might I do it? What are the implications of that choice? Test driven development could be a useful tool in this process as well.
If there is someone who is more skilled, try to imagine what they might do. If things don't work as you expected, explain your thinking to them and ask what went wrong. Have people evaluate your code. One of the reasons really good programmers crop up in open source is that they have quick feedback on code quality, so contribute to a project like that.
http://www.newyorker.com/reporting/2011/10/03/111003fa_fact_... This second article is by Atul Gawande, it describes how coaching can be applied to medicine. If you can find someone to fill this role for you, ask them.
Finally look at these links from Quora/Stack Overflow... http://www.quora.com/How-does-one-systematically-go-about-be... http://www.quora.com/What-are-some-tips-for-advanced-writers... http://stackoverflow.com/questions/3605461/how-does-a-progra...
Wisconsin Arch: http://pages.cs.wisc.edu/~karu/qualwiki/
It is a good filter for low quality content, but it also filters out things I find interesting.