This page discusses features for ProgrammingLanguages, APIs, Frameworks, and OperatingSystems (which are really the same thing: ApiIsLanguage, FrameworkIsLanguage, LanguageIsAnOs). Examples of features can be found on pages such as OperatingSystemsDesignPrinciples, KillerUserInterface, GuiEngineGoals, KeyLanguageFeature.
Features are often discussed as though they were binary in nature. And, for objective features of digital artifacts on digital machines (i.e. ignoring features that name a user or programmer as a 'participant'), that often isn't too far from the truth. But even objective features tend to describe amalgamations of other, finer-grained properties. Even if these fine-grained properties are individually binary, the amalgamation is combinatorial and will appear from the two-foot head-to-monitor view to exist on a continuous scale.
This page discusses features appearing on such a continuum, and offers rubrics to discuss their 'level'. This page reflects FourLevelsOfCompetence. The FourLevelsOfFeature at increasing levels of feature are:
We all know about BondageAndDiscipline, of course. ManifestTyping, CheckedExceptionsAreOfDubiousValue, etc.
ElegantSimplicity is rare on a broad scale, in part because LifeIsaBigMessyGraph, but is still available for fine-grained features. DataflowProgramming and good DependencyInjection frameworks are candidates. AbstractFactory for PluginArchitecture, as used in browsers, is certainly up there, at least up to the point of safety and security concerns. ImplicitTyping with typeclasses or overloading, and especially Static DuckTyping (as in ScalaLanguage), seem to exist at this level. SoftwareTransactionalMemory certainly does; it allows arbitrary safe composition of concurrent access to data, and most code can be written entirely ignorant of it. GarbageCollection would also be at the ElegantSimplicity level, albeit with a few caveats for realtime systems (unless realtime-GC is achieved).
Not all features can be achieved simultaneously, and amalgamation features tend to be implied (e.g. for GarbageCollection, one assumes safety, security, maybe a certain amount of performance based on modern implementations, etc.) unless explicitly redacted, so there may be some need to issue explicit caveats.
Regarding the TuringTarpit, what if an interface to an app or scripting language can be made so that the cases the kit cannot handle can be custom programmed? This may not work with languages, but perhaps with API's.
AlternateHardAndSoftLayers is a powerful design option for apps, and a good scripting language or API can elevate some features to a higher level (ApiIsLanguage, after all), but this does not eliminate the possibility of features remaining at the TuringTarpit level. If you are continuously forced to reinvent or re-implement something in scripts or extensions with slight variations, for example, that is TuringTarpit level. Similarly if you are forced to explicitly weave code... e.g. to deal with GC, concurrency, transactions, error-handling, PolicyInjection, etc.
It is my opinion that to KeepItSimple, one may have to forgo portions of the higher-numbered levels. GoldPlating a nascent standard will often prevent it from being initially accepted. The market-place better accepts incremental improvements, even if this makes the final result less elegant than a 4-level-up-front kit. This is not a reality we can expect to change, only work within knowing its pattern. -t
That depends on the "it" in question - i.e. are you trying to keep it simple for the implementor? or are you trying to keep it simple for the users? Which decision is more economically sound depends on how many users and how many times they plan to use it - i.e. on the developer:user ratio - so can't be decided without more knowledge. Anyhow, the idea of achieving 'incremental improvement' is often restricted by practical concerns for BackwardsCompatibility, MindOverhaulEconomics, and CodebaseInertia?. It is fortunate for upgrades to higher-level features that the market-place, in practice, accepts periodic overhauls (i.e. new gaming consoles, new programming languages, RewriteCodeFromScratch, 'major' revisions, etc.) and continuously deprecates applications that can't keep up, otherwise old OperatingSystems and such could never be significantly upgraded, and we'd still have a choice only between Fortran and Lisp.