I'll extend what I said earlier.
I find over-use of names very unnatural. Outside of programming, I get through most sentences, even most paragraphs, sometimes even full days, without using specific names for objects, people, places, or data. I might speak of a hammer, a nail, a chair, a workbench - but these things are not specifically named; they are simply available in context. I sometimes wonder whether this experience could be made part of programming.
The word "tacit" means "to be understood without being stated". Tacit programming really is a step closer to a more natural environment in which we manage objects without explicitly naming them. When I extended the tacit environment with a user-model - with hands, navigation, and an ability to extend our models further - I believe I took another giant leap forward to natural programming. (I recently discussed this on the augmented-programming and fonc-vpri mailing lists.) At this point, we can almost *directly* write programs in a AR/VR environment in terms of simple gestures, without ever using a name.
Another powerful tacit approach is the use of zippers and document-like objects: we can represent documents, diagrams, game-worlds, higher-order programs or IDEs, tree-structured databases, spreadsheets, cellular automata, etc.. - and we can navigate and manipulate artifacts without naming them. Again, we would rely on structure - e.g. tags in a document - but a lot of structure can be repeated, and a lot of operations can be implicit relative to our location, or potentially to cursors or flags we place.
I had initially considered a zipper as the basis for Awelon's environment, but I decided against it. I didn't like the intuition of wandering around a gigantic programming environment, potentially losing track of where you left your tools, so now I simply have the current stack, hand, and a list of named stacks.
However, there is still a use for zippers: I can easily model an "open document" at the top of the current stack. Instead of navigation, the intuition becomes: I am a demented data-surgeon, sifting around an open document, occasionally transplanting, cloning, or removing the still-beating live data. I can perform transclusion surgery with the open documents on one of my other named stacks.
But names aren't useless.
Names are useful when I have objects I don't use often, but that I want readily accessible at all times. A uniqueness source is a good example. So is a clock signal, if one isn't an ambient authority. Global information about preferences, configurations, etc. could all be accessed by name. Indeed, it is these roles for which I decided to support named stacks as a standard part of Awelon's environment.
I had mentioned keyword arguments, but I think those require too much use of names. Keywords are often too specialized for their use-case, and thus the data-plumbing that builds the keyword list becomes highly specialized. Something closer to a document-passing style, where we have a single document-like structure used by a whole library of words, seems more compositional because it doesn't require specialized data manipulation for each use case.
Names for complex types are a terrible mistake. I had mentioned this is true for linear types, but linear types really just shove the issue in our face. Names for complex types are a mistake even without linear types, because they hinder operating on intermediate structures in a type-safe way. I can't even imagine naming the environment-types of Awelon. Now, programmers do have a *reason* to name these types: to help understand them. But names aren't necessary to understand types. One could provide assertions on structure, render in an IDE, or use unique values or sealer/unsealer pairs to ensure certain data flows expectedly.
If I can cut explicit name usage - relative to Java, C++ - down to 5%, I think that would be a great thing for a more natural programming experience. If names can be cut down further than that, we might even manage to integrate PL with AR/VR such that every single gesture can be understood as a program extension (perhaps rewriting the history to eliminate redundancies).
Best,
Dave