I like the initiative but not the direction.
I do not believe that asking people what are their problem with learning can be used as an guidance. It is like asking what the phone should look like in pre-iphone era. Surveys will direct you wrong way. At the same time we do have users forum which contains endless amount information on what people struggle with and why they ended up being confused or were not able to find relevant information. Also, there were some threads discussing this exactly question, if you have mastered Rust, how did it happen? Those are way more valuable because it contains reflection of people who are already knowledgeable in Rust and thus it makes it much more valuable source of insights. Just search "learning rust" on the forum. Is yet another survey expected to bring more objective result than this? Search results for 'learn rust' - The Rust Programming Language Forum
Goals sound a little bit strange to me. First, "information obtained by the project group to be useful ... as well as to Rust educators". I do not see how this is possible. Shouldn't the help be directed the other way? Educators are the ones who have first-hand knowledge about learning problems and they gain this knowledge directly from the students, whereas this project is going to gain it from surveys. Surveys are much more inferior source of knowledge than personal experience.
I do not understand what this one is at all. The first precondition for any project to succeed is to have concrete goals and success criteria and I do not feel they were set here. How do you evaluate either "assisting" was successful or not?
Questions to be researched are either already known or irrelevant. For example, why does it matter which background makes it easier to learn rust? Are we going to tell Javascript developers, sorry, your background will make it harder, we wish you'd had C++ background? We just need to provide resource which anybody capable and willing can use. That's it. It does not require a research to know that OOP developers will have to learn how to use traits instead of classes, automatic memory management background will make it harder to explain what stack allocation means and lifetime should capitalize of existing intuition of what variable scope is and develop from here. It also does not require a research to learn that many times developers can not comprehend error message compiler generates.
In my opinion there are several directions coordinated effort to impoove learnablility can take.
First one is documentation (of course). We need honest assessment, does The Book achieve its goals? And what is the success criteria for documentation anyway? I propose the following definition for documentation success: Given reasonably competent software developer, documentation will produce reasonably competent Rust developer
. It means that after reading the documentation the person is capable of writing simple but useful and practical application.
This definition is important in Rust case because current book sweeps under the carpet so many complex matters that it creates false illusion that you understood rust whereas it is nowhere close to the truth. It is acceptable to skip and simplify during the learning but what is not acceptable is to hide blind spots because it creates frustration later on.
Rust specific is such that you can not write even very simple practical application without quite deep understanding of very complex matters, like lifetimes and how lifetimes are interacting with other features. How this project is going to deal with this? This is hard question. And I feel like initial direction is going after simple yet irrelevant questions like "which background makes it easier to learn rust".
Is documentation sufficient? Rust's traits are brilliant but little known to masses. Understanding traits is not hard, but developing working techniques takes time, trail and errors. Your OOP thinking will be in the way for long time. Should we admit that developing proper use of traits can not be achieved by OOP exposed developers without practical exercises? Should we create koans as essential part of Rust training? When to use dyn
is also an intuition which comes with experience, despite concept itself being simple, can koans be helpful here too?
Generally speaking, what is the list of areas where documentation gives false sense of knowledge and koans is the recommended way of learning? Should koan path be incorporated into documentation? Saying something like: here is the explanation of the concept, but we are sure you will not understand how to use it until you complete those koans.
Documentation fragmentation is a problem too. Rust by example is great, but for student it increase time to learn when you have to scan multiple sources. Should we promote The Book to be central resource for comprehensive learning? Should it absorb best material from other sources? What's the strategy?
Next one is the compiler. Best example I've seen is Elm compiler. Error messages are so great that even in the most complex situations it becomes a tool of learning the language or a tool helping you to understand the structure of your program. I clearly remember I've learned some language features from compiler errors. And I remember reading Elm author saying that it was conscious effort requiring modifications to the compiler to carry relevant structures around to be able to produce good quality error messages. So just "let's be better at error messages" will not work. It requires designing compiler in certain way. I think I remember reading somebody from rust compiler team, saying similar things, that there is a dilemma, errors are created after de-sugaring, that's why compiler messages are cryptic, because at this stage compiler sees not what programmer sees. So, what is the strategy here?
In general, I can see a tendency for compilers to acquire more metaprogramming features. Great, it allows solving many problems in more elegant and performant way than runtime reflection. But the drawback is that metaprograming has no debugging no troubleshooting. With complex type system much more decisions are made by compiler at compile time, but compiler is not capable of communicating them in efficient way, if at all. Current compiler error handling is still rooted in "dragon book" approach (at least it feels this way). What is strategic direction here?